Discourse Disorder

:warning: この機能はDiscourse AIの一部となりました。このプラグインは非推奨です。

|||-|
:discourse2: | 概要 | Disorder は、Discourse フォーラム上の潜在的に有害なコンテンツを自動的にフラグ付けすることで、モデレーターを支援します。
:hammer_and_wrench: | リポジトリリンク | https://github.com/xfalcox/disorder
:open_book: | インストールガイド | Discourse でプラグインをインストールする方法

公式ホスティングサービスをご利用の場合は、このプラグインへの関心をお知らせいただくためにサポートにご連絡ください。

有害性

@hawkDealing with Toxicity in Online Communities で述べたように、コミュニティ内の有害性を管理することは非常に重要です。

Discourse は標準で、コミュニティ内の有害性を管理するためのさまざまなツールを備えていますが、私たちは常にそれをさらに改善する方法を研究しています。特に、オンラインフォーラムにおける機械学習と AI の可能な応用について研究してきました。これは現在、すべてのコミュニティで利用可能な実験的なプラグインです。

プラグイン

Disorder は人工知能と機械学習を活用してコミュニティのモデレーションを支援し、モデレーションチームが潜在的に問題のあるコンテンツを把握しやすくし、さらにはユーザーが有害な投稿を送信前に修正するように促すこともできます。

これは Discourse でセルフホストされた ML モデルを使用する最初の試みであり、単純なモデルですが、将来的にさらに複雑なモデルを適用するためのパターンとして再利用できます。

機能

バックグラウンドフラグ付け

これは Disorder の主な動作モードであり、ユーザーには完全に透過的で、ユーザーは何も変更に気づきません。

新しい投稿(または Discourse Chat を使用したチャットメッセージ)が作成されると、非同期に分類キューに入れられます。分類結果が設定可能なしきい値を超えた場合、投稿/チャットメッセージはフラグ付けされ、モデレーションチームに警告され、最終的な決定を下すことができます。

新規投稿介入

予防が最善の薬だと考えるなら、このより積極的なオプションに興味があるかもしれません。

新しい投稿の同期分類を有効にすることができます。この分類が有害性の設定可能なしきい値を超えた場合、新しい投稿フローで介入がトリガーされ、ユーザーにメッセージをレビューしてコミュニティのルールで定められた境界外のものを修正するように求められます。

これは一度だけ発生し、モーダルを閉じると、ユーザーは通常どおり投稿できるようになります。

仕組み

このプラグインは、Detoxify のオープンソースモデルを統合し、リモート API 呼び出しモデルを使用して、管理者が推論レートを各コミュニティのニーズに合わせて適切にスケーリングできるようにします。

Discourse がコンテンツ分類を実行するために呼び出す単純な HTTP API を提供するイメージを提供します。これは、Discourse を実行しているのと同じサーバー、またはまったく別のサーバーで実行できます。

Discourse プラグインは、新しい投稿/新しいチャットメッセージのイベントをリッスンし、バックグラウンドキューに分類ジョブをエンキューします。結果はデータベースに保存されるため、レポートを抽出でき、フラグの精度を追跡できるように、別のボットユーザーを使用してコンテンツにフラグを付けます。

オプション

まず、プラグインはすぐに動作するため、すぐに設定を変更する必要はありません。ただし、プラグインの動作を変更したい場合は、いくつかの調整可能なノブがあります。

プラグインオプションで選択できる 3 つの異なる分類モデルを提供しています。

  • unbiased (デフォルト): 有害性分類における意図しないモデルバイアスを減らそうとするモデル。
  • multilingual: イタリア語、フランス語、ロシア語、ポルトガル語、スペイン語、トルコ語を分類できるモデル。
  • original: 最も単純なモデル。

また、プラグインが以下を行うかどうかを調整できます。

  • 自動フラグ付け
  • 有害な投稿に対する同期介入(警告付き)(実験的)
  • 有害な投稿に対する同期介入(推奨されません)

上記はすべて、コメントが各分類タイプのしきい値を超えていると分類された場合にのみ発生します。

  • toxicity
  • severe_toxicity
  • identity_attack
  • insult
  • threat
  • sexual_explicit

自動アクションの各分類しきい値を調整できます。

分類サービス

プラグインはすぐに動作するようにプリセットされています。そのため、ユーザーコンテンツを分類するために Discourse (CDCK) が実行しているサービスに連絡しています。classifier API サービスはオープンソースであり、必要に応じてサービスの独自のコピーを実行できます。

「いいね!」 39

単なる好奇心ですが、「Disorder」と Discourse の Google Perspective API の実装との違いは何ですか?

「いいね!」 7

コード的には、全く異なるプラグインです。

大まかに言うと、同じニーズに対応していますが、エンジニアリングが異なります。

  • Disorder はチャットと投稿に対応し、Perspective は投稿のみに対応します。
  • Perspective は、プライバシー、信頼性、透明性に関するすべての影響を伴う、独自のサードパーティ API に依存しています。
  • Disorder は、新しいモデルを簡単に追加できるパターンを設定しているため、サービスを進化させたり、まったく新しい機能を追加したりできます。
  • Disorder のセルフホスト可能な API は、API 呼び出しごとの支払いとレート制限からの柔軟性と自由を提供します。
  • Disorder のフロントエンドサーフェスはかなり小さいため、Discourse のアップデートに対してより耐性があるはずです。
「いいね!」 16

クール。どこでどのようにすればよいですか?

「いいね!」 5

Email team@discourse.org :slight_smile:

「いいね!」 6

返信の必要はありませんが、今後の方向性について提案をお探しであれば、トピックのテキストに基づいてAIタグサジェスターが役立つかもしれません。Soundcloudがアップロードされたコンテンツの分析後に音楽ジャンルタグを提案する方法に似ていると想像しています。これは、賑やかなサイトでユーザー生成コンテンツを整理するのに役立ちます。

「いいね!」 9

正しく理解しているか確認させてください。プラグインを補完するために disorder API インスタンスを起動する必要がありますか? disorder inference service api endpoint には https://disorder-testing.demo-by-discourse.com がプリセットされていますが、disorder inference service api key はデフォルトで空になっています。

このプラグインをテストすることに興味があります。ユーザー間の有害な行動に多く直面しており、最終的にはフラグ付けとリーダーの助けによって解決されていますが、可能であれば、ユーザーが否定的な投稿を広めることを積極的に防止したいと考えています。このプラグインはそのような役割に合っているようです。

試すために、既製のЯ эндпойнтを使用できますか?注意点として、1日のページビューは約15万件あり、準備ができていないサーバーを詰まらせる可能性があります。

私たちはスタンドアロンです。

「いいね!」 4

APIサーバーを自分で実行することもできますが、プラグインはhttps://disorder-testing.demo-by-discourse.com/を指すように事前設定されているため、すぐに使用できます。

このプラグインを試したいセルフホストインスタンスにまさに提供されているため、このエンドポイントをご利用ください。デフォルトの設定では、すべてのAPI呼び出しはバックグラウンドで行われるため、APIがダウンしてもサイトに影響を与えることはありません。そのため、安全に使用できます。

api keyの設定はオプションであり、APIサーバーで有効になっている場合にのみ必要です。https://disorder-testing.demo-by-discourse.com/のパブリックインスタンスでは有効になっていません。

「いいね!」 6

ありがとうございます!完璧に聞こえます。数日中に試してみます :heart:

「いいね!」 4

他に将来的に計画されているMLアプリケーションはありますか?

「いいね!」 2

これを1週間試しましたが、投稿をフラグ付けするのが非常に攻撃的でした。モデレーターが十分にいない大規模なサイトでない限り、これを使用することはお勧めしません。AIが改善されることを願っていますが、まだそこまで到達していません。

「いいね!」 6

これは素晴らしいフィードバックです!何が起こったのか正確に理解するのを助けるために、デバッグ統計を共有していただけますか?

たとえば、以下のような結果をここに、またはPMで共有していただけると非常に助かります。

SELECT
  pcf.value,
  p.raw
FROM
  post_custom_fields AS pcf
INNER JOIN
  posts AS p ON p.id = pcf.post_id
WHERE
  pcf.name = 'disorder'
「いいね!」 5

ああ、そうでした!どうぞ。それほど多くはありませんでしたが、不必要で、メンバーやモデレーターをイライラさせていました。DMをスキャンすることについても確信が持てません。DMで誰かを嫌がらせしている場合に価値がある可能性があることは知っていますが、ほとんどの場合、私たちがDMを見ていることを知って人々をイライラさせるだけでしょう。

「いいね!」 1

チャットを使用しますか?すべての迷惑なフラグは投稿/PMにありましたか?

チャットも使用しますが、すべてのフラグは投稿とプライベートメッセージにあったと確信しています。

「いいね!」 1

まず、フィードバックと、デバッグのために共有していただいたデータに非常に感謝しています。

さて、私の調査結果です!

この1週間で、スタッフ以外のユーザーから1942件の新しい投稿がありました。非常に活発なコミュニティですね!しかし、フラグが付けられたのはわずか7件なので、AIが「投稿のフラグ付けが異常に攻撃的」だとは言えません。

とはいえ、その7件のうち、半分はデフォルトのしきい値が低すぎたために発生した明らかに誤検知であり、残りの半分はAIが文脈を理解するのが難しいものでした(相手を軽蔑する言葉を使うこと vs 今日買い物中に誰かがあなたに軽蔑的な態度をとったことについての物語を語ること)。そして、私の意見では、1件は正しい検出でした。

もしもう一度試していただけるなら、すべてのしきい値を85に引き上げ、originalモデルに切り替えることで、これまで発生したほとんどのトリガーハッピーなフラグ付けの問題が解決する可能性があります。また、一部のコミュニティでは迷惑になる可能性があるため、PMをスキップできるようにサイト設定を追加します。

「いいね!」 8

ファルコさん、ありがとう。攻撃的すぎると言ったことを謝罪します。すでにサイトで多くのドラマが起きており、フラグが追加されたことで、その時はかなりイライラしていました。

提案に感謝します。もう一度試してみます。質問ですが、「disorder flag automatically」を無効にするとどうなりますか?投稿が秩序を乱していると判断された場合、何らかの方法で通知されますか?これにより、投稿がフラグ付けされることなく、どの設定が機能するかをテストして理解することができます。

「いいね!」 4

その設定がない場合、投稿はAIで実行されますが、何もアクションは実行されません。そのままにして、そのデータエクスプローラークエリを実行して、偽陽性/偽陰性率を分析することができます。

また、スキップリストにグループを追加できる別の設定もあります。例えば、TL4/3からの投稿の分類をスキップすることができます。これも役立つかもしれません。

Falco様

Disorderのテストを開始しました。全体的なフィードバックは肯定的です。不適切なものを検出する一方で、コミュニティが許容する多くのものを誤ってフラグ付けしています。このプラグインをテストしているフォーラム(アダルト)の性質上、コミュニケーションにはDisorderが多くの投稿にフラグを立てる原因となるいくつかの側面が含まれています。貴殿のSQLクエリは、調整すべきしきい値を確認するのに役立ちますが、フラグ付けされた各投稿のReviewable Scoringテーブルにそれらを追加することを提案してもよろしいでしょうか?

これ

プラグインがこのビューに独自のデータをもたらすことができるかどうかわかりませんが、スタッフが誤検知の結果を減らすために調整すべき基準を理解するのに大いに役立つでしょう。私が考える方法は、トリガーされた基準の内訳を示すドロップダウンをこのビューに追加することです。値が0の基準を含める必要はありません。0を超えるもののみが存在するべきですが、現在の設定しきい値を超えるもののみが太字/赤でマークされるべきです。

Disorderスコアリング例
  • Toxicity 65% [1]
  • Insult 73% [2]
  • Threat 12% [3]
  • Sexual explicit 2% [4]

必要であれば、SQLクエリの結果を提供できます。フラグキューのレビューを終えるにはまだ程遠いです。
多言語モデルを使用しており、他のモデルは試していません。一部のユーザーが母国語で投稿することを好むことを考慮すると、まずこれを使用するのが良いと判断しました。


  1. 超過、赤字 ↩︎

  2. 超過、赤字 ↩︎

  3. 通常、通常のフォント ↩︎

  4. 通常、通常のフォント ↩︎

「いいね!」 1

こんにちは、

Disorderの「original」モデルを使用している際にログにエラーが発生していることをお知らせします。違いがあるかどうかを確認するために、多言語モデルに切り替えました。

Job exception: nil:NilClass に対して =>= が未定義のメソッドです @classification[label] >= SiteSetting.send(“disorder_flag_threshold_#{label}”) ^^

詳細

/var/www/discourse/plugins/disorder/lib/classifier.rb:39:in `block in consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `filter’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:25:in `classify!’

/var/www/discourse/app/jobs/regular/classify_post.rb:14:in `execute’

/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform’

rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in with_connection' /var/www/discourse/app/jobs/base.rb:236:in block in perform’

/var/www/discourse/app/jobs/base.rb:232:in `each’

/var/www/discourse/app/jobs/base.rb:232:in `perform’

sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job’

sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke’

/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke’

sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local’

sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in module:Sidekiq

sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats’

sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call’

sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global’

sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare’

sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one’

sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run’

sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog’

sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread’

[details=“詳細 2”]
|ホスト名||
|—|—|\n|process_id|65460|\n|application_version|2f8ad17aed81bbfa2fd20b6cc9210be92779bd74|\n|current_db|default|\n|current_hostname||\n|job|Jobs::ClassifyPost|\n|problem_db|default|\n|time|1:52 pm|\n|||\n|opts||\n|post_id|604063|\n|current_site_id|default|\n\n[/details]

追伸:はい、多言語モードではこれらのエラーは発生しません。バイアスのかかっていないモデルでもエラーは発生しません。

「いいね!」 1