Discourse AI - センチメント

:bookmark: このトピックでは、Discourse AI プラグインの Sentiment 機能の設定について説明します。
:person_raising_hand: 必要なユーザーレベル: モデレーター

Sentiment は、投稿を分析し、感情と感情のスコアを提供することで、コミュニティの動向を把握し、任意の期間におけるコミュニティ全体の感覚を提供します。これらの洞察は、コミュニティ内で投稿し、互いに交流しているユーザーの種類を判断するのに役立ちます。

機能

  • 全体的な感情: ポジティブまたはネガティブに分類された投稿の数を比較します。
  • ポジティブ、ネガティブ、および全体的なスコアの数値値を切り替え可能な棒グラフで表示します。
  • 感情: 複数の感情によって分類されたトピックと投稿の数。期間別にグループ化されます。
    • 今日
    • 昨日
    • 過去 7 日間
    • 過去 30 日間
  • 設定からアクセスできる任意の期間のレポート
    • 年次
    • 四半期
    • 月次
    • 週次
    • カスタム範囲
  • 管理ユーザーにのみ適用されます。

Sentiment の有効化

設定

ホストされているお客様の場合、Sentiment はデフォルトで有効になっています。手動の手順については、以下を参照してください。

  1. 管理設定 → プラグイン に移動し、discourse-ai を検索または見つけて、有効になっていることを確認します。
  2. Sentiment Analysis の ai_sentiment_enabled を有効にします。
  3. /admin/dashboard/sentiment に移動して、それぞれのレポートを表示します。

:information_source: 有効にすると、Sentiment は今後すべての投稿と過去 60 日間の投稿を分類します。サイトのすべての履歴投稿を分類するには、コンソールからバックフィルタスクを実行する必要があります。

:discourse2: 私たちによってホストされていますか?

team@discourse.org までご連絡いただければ、実行いたします。

:mechanic: セルフホストですか?

./launcher enter app
rake ai:sentiment:backfill

技術 FAQ

トピック/投稿データはどのように処理されますか?スコアはどのように割り当てられますか?

  • Sentiment は「投稿ごと」の精度を持っています。各投稿について、感情を判断し、そのデータを多くの形状(タグごと/カテゴリごと/時間ごとなど)にカットできます。ポジティブまたはネガティブに分類された投稿の数を比較します。これらは、ポジティブまたはネガティブのスコアが設定されたしきい値スコアを超えたときに計算されます。

他の言語のサポートを追加する計画はありますか?

  • 将来的にははい!単純な多言語機械学習 (ML) モデルを追加することと、専用モデルの代わりに多言語大規模言語モデル (LLM) を使用してデータを分類することの両方によって実現します。

Sentiment を強化するために使用されているモデルは何ですか?

注意事項

  • 中立(ポジティブでもネガティブでもない)と分類された投稿は表示されません。
  • プライベートメッセージ (PM) は計算から除外されます。
「いいね!」 10

投稿が既存のトピックにマージされました: Problems with Sentiment Backfill

投稿が既存のトピックにマージされました: Problems with Sentiment Backfill

OPは、感情の更新された機能を紹介する新しいビデオで更新されました。これには、さらに多くの感情と、各感情に関連付けられているトピック/投稿の理解が含まれています。

センチメントモデルの設定で、LLM設定からコピーした model_nameendpointapi_key を使用して設定しましたが、テストはパスするものの、/logs で以下のエラーが発生します。

(しかし、センチメントが設定済みのLLMのいずれかを使用しないのは、私の理解が正しくないからかもしれませんが。)

claude-3-5-sonnet を使用しています。


{"type":"error","error":{"type":"invalid_request_error","message":"anthropic-version: header is required"}} (Net::HTTPBadResponse)
/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:71:in `classify'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:142:in `request_with'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:78:in `block (4 levels) in bulk_classify!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1593:in `evaluate_to'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1776:in `block in on_resolvable'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:359:in `run_task'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:350:in `block (3 levels) in create_worker'

internal:kernel:187:in `loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:341:in `block (2 levels) in create_worker'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `catch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `block in create_worker'
Status: 400

{"type":"error","error":{"type":"invalid_request_error","message":"anthropic-version: header is required"}} (Net::HTTPBadResponse)
/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:71:in `classify'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:142:in `request_wit...

センチメントモジュールは、一般的なLLMではなく、センチメント分類に特化してファインチューニングされたモデルを使用します。これらのモデルを自分で実行したい場合は、DiscourseAIのセンチメントと感情のセルフホスティングで文書化されています。

「いいね!」 3

@Falco 気づいたのですが、2025年1月以降、感情分析が動かなくなっています。推測では、新しい設定のai_sentiment_modelがあるようで、上のリンクが説明しているように、独自の専用感情モデル/画像を実行するためのものです。ディスコースを更新した後、ai_sentiment_model_configsがすべて空白になっているのに気づきました(空白のはずですか?)。バックフィルの rake を実行しようとするとエラーが発生します:

rake ai:sentiment:backfill
rake aborted!
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  構文エラーです、 near ")" (ActiveRecord::StatementInvalid)
LINE 1: ...e_upload_id", "posts"."outbound_message_id" FROM () as posts..

プラグインは、テストを容易にするために私がセットアップしたDigitalOceanにあるサーバーにデフォルトで設定されていました。

その後、プラグインのデフォルトをクリーンな状態に変更しました。AI分類が必要な場合は、Metaのドキュメントに従ってサーバーを実行する必要があります。

確かに、しかし私たちはテスト目的でそのコストを支払っていました。すべてのセルフホスティングユーザーにそれを提供するというのは持続可能ではありません。

GPUアクセラレーテッドサーバーでこの分類サービスを提供していることは、私たちのホスティングサービスの一部として言及する価値があります。

「いいね!」 2

Discourse AI 感情分析の問題:Hugging Face モデルの形式と Azure エンドポイントの障害


Discourse コミュニティおよび開発者の皆様、

フォーラム内の Discourse AI プラグインで感情分析機能を設定および使用しようとすると、重大な問題に直面しています。正しく機能しないようにしている問題が 2 つあるようです。


問題 1:Hugging Face モデルの応答形式の不一致

Hugging Face の cardiffnlp/twitter-roberta-base-sentiment モデルを感情分析用に設定しました。API キーは有効で、Discourse インスタンスから curl を使用して API を正常に呼び出すことができますが、Discourse AI プラグインは、Hugging Face モデルの出力形式の変更により、応答を正しく解析していないようです。

私の curl コマンド(有効な API キーと新しい形式を確認):

Bashcurl -X POST https://api-inference.huggingface.co/models/cardiffnlp/twitter-roberta-base-sentiment \ -H "Authorization: Bearer hf_xxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d "{\"inputs\": \"I love Discourse!\"}"

curl からの出力(新しいネストされた配列形式を示しています):

[[{\"label\":\"LABEL_2\",\"score\":0.9891520738601685},{\"label\":\"LABEL_1\",\"score\":0.009014752693474293},{\"label\":\"LABEL_0\",\"score\":0.0018332178005948663}]]

問題: twitter-roberta-base-sentiment モデルは、以前は ラベルとスコアのハッシュの単一の配列を返していました:[{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]. しかし、現在はネストされた配列 [[{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]] を返します。

Discourse AI プラグインのハードコードされた解析ロジック(具体的には、バックトレースで示されている classification[\"label\"][/\\d+/].to_i)は、この外側の配列レイヤーを考慮していません。これにより、シンボルを整数としてアクセスしようとすると TypeError が発生します。

エラーメッセージ(ジョブ例外から):

シンボルから整数への暗黙の変換はありません (TypeError)
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:in transform_result' の block/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:ineach’
/var/www/discourse/plugin…`

Hugging Face 問題の完全なバックトレース:

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1268:in `raise'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1268:in `wait_until_resolved!'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:998:in `value!'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:93:in `bulk_classify!'
/var/www/discourse/plugins/discourse-ai/app/jobs/scheduled/sentiment_backfill.rb:27:in `execute'
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform'
/var/www/discourse/app/jobs/base.rb:299:in `each'
/var/www/discourse/app/jobs/base.rb:299:in `perform'
/var/www/discourse/app/jobs/base.rb:379:in `perform'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:137:in `process_queue'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:77:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads'
internal:kernel:187:in `loop'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:341:in `block (2 levels) in create_worker'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `catch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340:in `block in create_worker'
シンボルから整数への暗黙の変換はありません (TypeError)
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:in `block in transform_result'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:163:in `each'
/var/www/discourse/plugin...

問題 2:Microsoft Azure モデルの設定が Hugging Face エラーを引き起こす

Discourse AI 設定内で Microsoft Text Analytics モデルに切り替えようとしたところ、404 Resource not found エラーが発生し、驚くべきことに、バックトレースは依然として hugging_face_text_embeddings.rb を指していました。

エラーメッセージ(ジョブ例外から):

Job exception: 416 errors
{"error":{"code":"404","message": "Resource not found"}} (Net::HTTPBadResponse)

関連するバックトレーススニペット(Microsoft モデルが選択されているにもかかわらず Hugging Face を指しています):

/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:76:in `do_request!'
/var/www/discourse/plugins/discourse-ai/lib/inference/hugging_face_text_embeddings.rb:51:in `classify_by_sentiment!'
/var/www/discourse/plugins/discourse-ai/lib/sentiment/post_classification.rb:156:in `request_with'

観察: これは、Microsoft モデルのエンドポイントと API キーを選択して設定した場合でも、Discourse AI プラグインが、異なる感情分析プロバイダーが設定されている場合に、感情分析リクエストを Hugging Face 固有のロジックまたはエンドポイントを介してハードコードまたは誤ってルーティングしているように見えることを示しています。これにより、Microsoft モデルがまったく使用できなくなります。


設定スクリーンショット:

設定を示すために Discourse AI 設定のスクリーンショットを添付しました。

  • AI 感情分析モデルの詳細な設定(Hugging Face と Microsoft の両方のモデルが表示されています)- Hugging Face または Microsoft モデルのみの設定でテストしましたが、結果は同じでした。

これらの問題により、感情分析機能は事実上使用できなくなっています。プラグインは、新しい Hugging Face 応答形式を処理し、異なる感情分析プロバイダーが設定されている場合にリクエストを正しくルーティングするために更新が必要なようです。

これらの問題に関する支援やガイダンスをいただければ幸いです。

ありがとうございます!

「いいね!」 2

センチメントレポートが他のユーザーでも機能しているのか、それとも私が何かを誤って設定したのか気になっています。センチメントレポートを有効にするために他に確認または設定する必要があることがあれば知りたいです。まだ同じ問題が発生しています。

「いいね!」 1

Azure AI Language (セルフホストの Discourse インスタンスから) を使用してこの機能を利用しようとしています。すでに Azure サブスクリプションを使用して、GPT-4.5 を Discourse (要約およびチャットボット機能用) に統合しているためです。

しかし、センチメントダッシュボードにデータが表示されず、ログに次のエラーが表示されています。

Discourse AI: バルク分類中のエラー: 208 件の投稿を分類できませんでした (例: ID: 2256, 909, 2270, 2260, 2797): JSON::ParserError : 空文字列は有効な JSON 文字列ではありません。

バックトレースは、Discourse が HuggingFace を使用しようとしている可能性を示しています。現時点では、これらが唯一サポートされているモデルですか?

よろしくお願いします。

N

「いいね!」 1

それで、この機能を使用する唯一の方法は、モデルのインスタンスを自分でセットアップすることですか(これはリソースを大量に消費するGPUインスタンスを必要とし、コストがかかります)。この機能は非常に便利そうですが、実際のDiscourseホスティングよりもセットアップに費用がかかるようです。

はい、サポートされているモデルは OP に記載されているものです。

将来的には、コストを気にしないユーザー向けに LLM を使用した分類のサポートを追加する予定です。

ええと、この機能全体は ML モデルを使用した投稿の分類を中心に構築されているため、はい、それらを実行する場所が必要です。

そして、Discourse は最も安価な VPS でも実行できるため、ML モデルの実行は確かに高価です。可能な限り安価に機能を持たせたい場合は、モデルをロードするのに十分な RAM があれば、CPU コアが数個しかないサーバーで実行することも可能です。

「いいね!」 1

以前に尋ねられた質問かもしれませんが、閾値スコアをどこで設定できるか正確に見つけられませんでした😅

「いいね!」 1

残念ながら、しきい値スコアはユーザーまたは管理者によって設定できるものではありません。コードベースで設定された特定の値です。

「いいね!」 1