Discourse AI - Stimmung

> :bookmark: Dieses Thema behandelt die Konfiguration der Sentiment-Funktion des Discourse AI Plugins.
>
> :person_raising_hand: Erforderliches Benutzerniveau: Moderator

Sentiment behält Ihre Community im Auge, indem es Beiträge analysiert und Sentiment- und Emotionswerte liefert, um Ihnen ein Gesamtbild Ihrer Community für jeden Zeitraum zu vermitteln. Diese Einblicke können hilfreich sein, um die Art der Benutzer zu bestimmen, die in Ihrer Community posten und miteinander interagieren.

Funktionen

  • Gesamtsentiment: Vergleicht die Anzahl der Beiträge, die als positiv oder negativ eingestuft werden.
  • Balkendiagramm, das umschaltbare numerische Werte für positive, negative und Gesamtwerte anzeigt.
  • Emotionen: Anzahl der Themen und Beiträge, die nach mehreren Emotionen klassifiziert und nach Zeiträumen gruppiert sind.
    • Heute
    • Gestern
    • Letzte 7 Tage
    • Letzte 30 Tage
  • Berichte für beliebige Zeiträume, auf die über die Einstellungen zugegriffen werden kann.
    • Jährlich
    • Vierteljährlich
    • Monatlich
    • Wöchentlich
    • Benutzerdefinierter Bereich
  • Gilt nur für Administratoren.

Sentiment aktivieren

Konfiguration

> Sentiment ist für gehostete Kunden standardmäßig aktiviert. Für manuelle Schritte siehe unten.

  1. Gehen Sie zu Admin-Einstellungen → Plugins → suchen Sie nach discourse-ai und stellen Sie sicher, dass es aktiviert ist.
  2. Aktivieren Sie ai_sentiment_enabled für die Sentiment-Analyse.
  3. Gehen Sie zu /admin/dashboard/sentiment, um die jeweiligen Berichte anzuzeigen.

> :information_source: Sobald Sentiment aktiviert ist, werden alle nachfolgenden Beiträge sowie Beiträge der letzten 60 Tage klassifiziert. Um alle historischen Beiträge Ihrer Website zu klassifizieren, muss eine Backfill-Aufgabe von der Konsole aus ausgeführt werden.
>
> :discourse2: Von uns gehostet?
>
> Kontaktieren Sie uns unter team@discourse.org und wir erledigen das für Sie.
>
> :mechanic: Selbst gehostet?
>
> ./launcher enter app
> rake ai:sentiment:backfill

Technisches FAQ

Wie werden Themen-/Beitragsdaten verarbeitet? Wie werden die Werte zugewiesen?

  • Sentiment hat eine “pro Beitrag”-Genauigkeit. Für jeden Beitrag können wir das Sentiment ermitteln und diese Daten dann in vielen Formen aufschlüsseln (pro Tag / Kategorie / Zeit usw.). Es vergleicht die Anzahl der Beiträge, die als positiv oder negativ eingestuft werden. Diese werden berechnet, wenn die positiven oder negativen Werte den festgelegten Schwellenwert überschreiten.

Gibt es Pläne, Unterstützung für andere Sprachen hinzuzufügen?

  • In Zukunft Ja! Sowohl durch Hinzufügen von mehrsprachigen einfachen Machine-Learning-Modellen (ML) als auch durch die Verwendung von mehrsprachigen Large Language Models (LLMs) zur Klassifizierung der Daten anstelle von dedizierten Modellen.

Welche Modelle werden zur Stromversorgung von Sentiment verwendet?

Vorbehalte

  • Beiträge, die als neutral (weder positiv noch negativ) eingestuft werden, werden nicht angezeigt.
  • Private Nachrichten (PMs) sind von der Berechnung ausgeschlossen.
10 „Gefällt mir“

Ein Beitrag wurde in ein bestehendes Thema eingefügt: Probleme mit Sentiment Backfill

Ein Beitrag wurde in ein bestehendes Thema zusammengeführt: Probleme mit Sentiment Backfill

Der OP wurde mit einem neuen Video aktualisiert, das die aktualisierten Funktionen von Sentiment zeigt, darunter deutlich mehr Emotionen und die Zuordnung von Themen/Posts zu jeder Emotion.

Ich habe die Konfiguration des Sentiment-Modells mit einem model_name, endpoint und api_key konfiguriert, die aus den LLM-Einstellungen kopiert wurden, wo es den Test besteht, aber ich erhalte die untenstehende Fehlermeldung in /logs.

(Aber vielleicht verstehe ich es nicht richtig, denn warum verwendet Sentiment nicht eines der konfigurierten LLMs?)

Verwendet 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...

Das Sentiment-Modul verwendet keine allgemeinen LLMs, sondern Modelle, die speziell für die Sentiment-Klassifizierung feinabgestimmt wurden. Wenn Sie diese Modelle selbst ausführen möchten, finden Sie die Dokumentation unter Self-Hosting Sentiment and Emotion for DiscourseAI

3 „Gefällt mir“

@Falco Ich habe gerade bemerkt, dass der Sentiment seit Januar 2025 nicht mehr läuft. Ich vermute, dass es diese neue Einstellung ai_sentiment_model gibt, die, wie im obigen Link erklärt, für das eigene, dedizierte Sentiment-Modell / Bild gedacht ist. Ich habe nach einem Update von Discourse bemerkt, dass ai_sentiment_model_configs jetzt völlig leer ist (sollte das leer sein?).Wenn ich versuche, ein Backfill-Rake auszuführen, erhalte ich einen Fehler:

rake ai:sentiment:backfill
rake abgebrochen!
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  Syntaxfehler bei oder in der Nähe von ")" (ActiveRecord::StatementInvalid)
LINIE 1: ...e_upload_id", "posts"."outbound_message_id" VON () als posts..

Das Plugin verwendete standardmäßig einen Server in DigitalOcean, den ich zum einfacheren Testen eingerichtet hatte.

Ich habe seitdem die Standardeinstellungen des Plugins auf einen sauberen Stand zurückgesetzt, und wer KI-Klassifizierung wünscht, muss Server gemäß der Dokumentation hier auf Meta betreiben.

In der Tat, aber wir haben diese Kosten für Testzwecke getragen. Es ist nicht nachhaltig, dies für jeden Self-Hoster anzubieten.

Erwähnenswert ist, dass wir diesen Klassifizierungsdienst auf GPU-beschleunigten Servern als Teil unseres Hosting-Services anbieten.

2 „Gefällt mir“

Probleme mit der Stimmungsanalyse in Discourse AI: Hugging Face Modellformat & Azure Endpunktfehler


Hallo Discourse Community und Entwickler,

Ich stoße auf erhebliche Probleme bei der Konfiguration und Nutzung der Sentiment-Analyse-Funktion im Discourse AI Plugin auf meinem Forum. Es scheint zwei verschiedene Probleme zu geben, die verhindern, dass es korrekt funktioniert.


Problem 1: Format-Inkompatibilität der Hugging Face Modellantwort

Ich habe das Modell cardiffnlp/twitter-roberta-base-sentiment von Hugging Face für die Sentiment-Analyse konfiguriert. Während mein API-Schlüssel gültig ist und ich die API erfolgreich von meiner Discourse-Instanz mit curl aufrufen kann, scheint das Discourse AI Plugin die Antwort falsch zu parsen, da sich das Ausgabeformat des Hugging Face Modells geändert hat.

Mein curl-Befehl (bestätigt gültigen API-Schlüssel und neues Format):

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

Ausgabe von curl (zeigt das neue verschachtelte Array-Format):

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

Problem: Das Modell twitter-roberta-base-sentiment gab früher ein einzelnes Array von Label-Score-Hashes zurück: [{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]. Jetzt gibt es jedoch ein verschachteltes Array zurück: [[{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]].
Die hartcodierte Parsing-Logik des Discourse AI Plugins (speziell classification[\"label\"][/\\d+/].to_i, wie im Backtrace angegeben) berücksichtigt diese äußere Array-Ebene nicht. Dies führt zu einem TypeError, wenn versucht wird, ein Symbol als Integer zu verwenden.

Fehlermeldung (aus Job-Ausnahme):

no implicit conversion of Symbol into Integer (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…`

Vollständiger Backtrace für das Hugging Face Problem:

/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'
no implicit conversion of Symbol into Integer (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...

Problem 2: Konfiguration des Microsoft Azure Modells führt zu Hugging Face Fehler

Als ich versuchte, zum Microsoft Text Analytics Modell in den Discourse AI Einstellungen zu wechseln, erhielt ich einen 404 Resource not found Fehler, und überraschenderweise verweist der Backtrace immer noch auf hugging_face_text_embeddings.rb.

Fehlermeldung (aus Job-Ausnahme):

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

Relevanter Backtrace-Ausschnitt (verweist auf Hugging Face trotz ausgewähltem Microsoft Modell):

/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'

Beobachtung: Dies deutet darauf hin, dass selbst wenn ich den Endpunkt und den API-Schlüssel des Microsoft Modells auswähle und konfiguriere, das Discourse AI Plugin anscheinend hartcodiert ist oder die Anfragen zur Sentiment-Analyse fälschlicherweise über Hugging Face spezifische Logik oder Endpunkte leitet. Dies verhindert, dass das Microsoft Modell überhaupt genutzt werden kann.


Konfigurations-Screenshots:

Ich habe Screenshots meiner Discourse AI Einstellungen beigefügt, um die Konfiguration zu zeigen:

  • Detaillierte Konfiguration für KI-Sentiment-Modelle (zeigt sowohl Hugging Face als auch Microsoft Modelle) - Ich habe mit nur Hugging Face oder nur Microsoft Modellkonfigurationen getestet, mit demselben Ergebnis

Diese Probleme machen die Sentiment-Analyse-Funktion praktisch unbrauchbar. Es scheint, dass das Plugin ein Update benötigt, um das neue Hugging Face Antwortformat zu verarbeiten und Anfragen korrekt zu leiten, wenn verschiedene Sentiment-Anbieter konfiguriert sind.

Jede Hilfe oder Anleitung zu diesen Problemen wäre sehr willkommen.

Vielen Dank!

2 „Gefällt mir“

Ich bin neugierig, ob die Sentiment-Berichterstattung für andere funktioniert oder ob ich etwas falsch konfiguriert habe. Ich möchte wissen, was ich noch überprüfen oder konfigurieren muss, um die Sentiment-Berichterstattung zu aktivieren, da ich immer noch dasselbe Problem habe.

1 „Gefällt mir“

Wir versuchen, diese Funktion mit Azure AI Language (von unserer selbst gehosteten Discourse-Instanz) zu nutzen – da wir bereits unser Azure-Abonnement zur Integration von GPT-4.5 mit Discourse (für Zusammenfassungs- und Chatbot-Funktionalität) verwenden:

…aber wir erhalten keine Daten im Sentiment-Dashboard und sehen diese Fehler in den Protokollen:

Discourse AI: Fehler bei der Stapelklassifizierung: 208 Beiträge konnten nicht klassifiziert werden (Beispiel-IDs: 2256, 909, 2270, 2260, 2797): JSON::ParserError: Ein leerer String ist kein gültiger JSON-String.

Der Backtrace zeigt, dass Discourse möglicherweise versucht, HuggingFace zu verwenden – sind dies im Moment die einzigen unterstützten Modelle?

Danke,

N

1 „Gefällt mir“

Ist der einzige Weg, diese Funktion zu nutzen, die Einrichtung eigener Instanzen der Modelle (die ressourcenintensive GPU-Instanzen benötigen, die kostspielig wären)? Diese Funktion sieht sehr nützlich aus, aber es scheint, dass die Einrichtung mich mehr kosten würde als mein eigentliches Discourse-Hosting.

Ja, die unterstützten Modelle sind die, die in der OP aufgeführt sind.

Wir werden irgendwann die Unterstützung für die Klassifizierung mit LLMs für Leute hinzufügen, deren Kosten keine Rolle spielen.

Nun, die gesamte Funktion ist darauf ausgelegt, Beiträge mit ML-Modellen zu klassifizieren, daher benötigen Sie irgendwo, um diese auszuführen.

Und da Discourse auf dem billigsten VPS laufen kann, ist das Ausführen von ML-Modellen tatsächlich teurer. Wenn Sie die Funktion auf die billigste Art und Weise haben möchten, ist es machbar, sie auf einem Server mit nur einer Handvoll CPU-Kernen auszuführen, solange Sie genügend RAM haben, um die Modelle zu laden.

1 „Gefällt mir“

Entschuldigung, falls diese Frage bereits gestellt wurde, aber ich konnte keine Referenz darauf finden, wo genau der Schwellenwert konfiguriert werden kann :sweat_smile:

1 „Gefällt mir“

Leider ist der Schwellenwert keine vom Benutzer oder Administrator konfigurierbare Einstellung. Es handelt sich um einen spezifischen Wert, der in der Codebasis festgelegt ist.

1 „Gefällt mir“