DiscourseAIの感情と情緒のセルフホスティング

Discourse AIプラグインは、新しい投稿の感情/センチメント分類をリクエストする機能をサポートしており、これはデータベースに保存され、レポートや管理者ダッシュボードで使用できます。

Discourse AIは2種類の分類をサポートしており、それぞれに独自のモデルが必要です。

  • センチメント (Sentiment) — 投稿をポジティブ、ネガティブ、またはニュートラルに分類します (cardiffnlp/twitter-roberta-base-sentiment-latestを使用)
  • 感情 (Emotion) — 喜び、怒り、驚きなど28の感情ラベルに投稿を分類します (SamLowe/roberta-base-go_emotionsを使用)

ダッシュボードでセンチメントと感情の両方のデータを取得するには、両方のモデルを実行する必要があります。

HuggingFace TEIを使用した実行

HuggingFaceは、すぐにセットアップできる優れたコンテナイメージを提供しています。

センチメントモデル

mkdir -p /opt/tei-sentiment-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-sentiment-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id cardiffnlp/twitter-roberta-base-sentiment-latest

これにより、ローカルインスタンスとしてcardiffnlp/twitter-roberta-base-sentiment-latest(投稿をポジティブ/ネガティブ/ニュートラルに分類できるオープンモデル)が起動します。

動作を確認するには、以下で確認できます。

curl http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    -d "{ \"inputs\": \"I am happy\" }"

正常に動作していれば、各ラベルの信頼度を示す配列が返されるはずです。

感情モデル

感情分類も取得するには、感情モデルを使用して2番目のコンテナを実行します。

mkdir -p /opt/tei-emotion-cache
docker run --rm --gpus all --shm-size 1g -p 8082:80 \
  -v /opt/tei-emotion-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id SamLowe/roberta-base-go_emotions

サポートされているモデル

Discourseインスタンスでの利用を可能にする

多くの場合、GPUのスピードアップのため、専用サーバーでこれらを実行することになります。その場合、リバースプロキシを実行し、TLS終了処理を行い、Discourseインスタンスのみが接続できるようにエンドポイントを保護することを推奨します。

Discourse AIの設定

Discourse AIには、オープンソースモデルの推論サーバーを設定するためのサイト設定が含まれています。ai_sentiment_model_configs設定を使用して、サーバーを指す必要があります。

この設定は、モデル構成のJSON配列を受け入れます。各エントリには以下が必要です。

フィールド 説明
model_name HuggingFaceモデルID(例: cardiffnlp/twitter-roberta-base-sentiment-latest
endpoint TEIインスタンスのURL(例: https://your-server:8081
api_key エンドポイントのAPIキー(不要な場合は空欄のままにできます)

センチメントと感情の両方のダッシュボードを取得するには、実行しているモデルのエントリを追加します。例えば、両方のモデルをローカルで実行している場合:

  • エントリ1: model_name cardiffnlp/twitter-roberta-base-sentiment-latest、endpoint https://your-server:8081
  • エントリ2: model_name SamLowe/roberta-base-go_emotions、endpoint https://your-server:8082

その後、ai_sentiment_enabledを切り替えて分類を有効にします。

「いいね!」 3

英語以外の言語の他のモデルをサポートする計画はありますか?

「いいね!」 1

@Falco、もしこれをDiscourseを実行しているのと同じサーバーで実行することにした場合(例えば、数千件の投稿がある非常に小規模なデプロイメントの場合)、以下の手順を更新していただけますでしょうか。

  1. HuggingFace TEIコンテナイメージのローカルインスタンスとDiscourseを連携させる方法
  2. 上記を実行するために必要な追加のRAM/ディスク容量の提案(例えば、ベースのDiscourseが2GB RAMと20GBディスクで実行されている場合)

新しいセルフホストのDiscourseインスタンスを設定し、センチメントをセットアップしようとしています。これが私の ai_sentiment_model_configs です。

キー
model name cardiffnlp/twitter-roberta-base-sentiment-latest
endpoint https://my_own_instance
api_key [blank]

そして、それはある程度機能し、センチメントの棒グラフが表示されます。

しかし、感情のテーブルが空です。このドキュメントは不完全か、私が理解するには言葉足らずのようです。

別のDockerコンテナを、異なるモデルID(roberta-base-go_emotions?)で実行する必要がありますか、それとも何か他のことですか?感情のテーブルを埋めるために何をする必要がありますか?

可能であれば、これらのサービスをセルフホストしたいです。誰かが私を正しい方向に向かわせてくれれば幸いです。

感情については、以下を実行する必要があります。

も。

「いいね!」 3

ありがとうございます。それでは、次のようにいくつかの調整を加えて、2番目のDockerコンテナを実行します。

mkidr -p /opt/tei-cache2
docker run --detach --rm --gpus all --shm-size 1g -p 8082:80 \
  -v /opt/tei-cache2:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id SamLowe/roberta-base-go_emotions

そして、ai_sentiment_model_configsに新しいエントリを追加すると、すべて正常に動作するようになります。ありがとうございました。 :slight_smile:

「いいね!」 1

GPUなしでこれをEC2インスタンスで動作させようとして、自分が何をやっているのか全く分からないというレンガの壁に顔面から突っ込んだ。少なくとも、私の非常に限られた能力と理解の範囲では、CPUのみのインスタンスでこれをやろうとすると、理解できないほど多くの設定作業が必要になる。ghcr.io/huggingface/text-embeddings-inferencecpu バージョンは、どちらのリスニングモデルもロードしようとしない。ClaudeとGPT5は両方とも、Pythonツール一式を使ってONNXモデルに変換する必要があると言っており、そこで私はギブアップした。

(私が単に愚かで、明白なステップを見逃している可能性も非常に高い!)

私たちが計画していることの一つは、LLMをセンチメント分析として利用できるようにすることです。

そうすれば、Gemini Flash 2.5(あるいはNano)のような安価なモデルを接続して、センチメント分析に使用できます。

「いいね!」 6

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

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

Discourse AI: Errors during bulk classification: Failed to classify 208 posts (example ids: 2256, 909, 2270, 2260, 2797) : JSON::ParserError : An empty string is not a valid JSON string.

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

ありがとうございます。

N

はい、私たちは非常に特殊な実装をしており、それをより汎用的にする方法を考えています。

LLMにセンチメントの構造化された出力を返させることには非常に前向きです。なぜなら、それは多くの選択肢を開くからです。そして、トレンドとして「超特化型」APIは、LLMが提供する「超汎用型」APIに取って代わられつつあると感じています。

「いいね!」 3

自己ホスト型WordPressでセンチメント分類用のインスタンスをセットアップせずにこれを簡単に実行する方法はありますか?

サム、ありがとうございます。それは素晴らしいでしょう。それまでの間、Azure VMでサポートされているHuggingFaceモデルのいずれかを実行することを検討します…