Discourse AI - Sentiment

:bookmark: Ce sujet couvre la configuration de la fonctionnalité de sentiment du plugin Discourse AI.

:person_raising_hand: Niveau d’utilisateur requis : Modérateur

Sentiment garde un œil sur votre communauté en analysant les publications et en fournissant des scores de sentiment et d’émotion pour vous donner une idée générale de votre communauté sur n’importe quelle période. Ces informations peuvent être utiles pour déterminer le type d’utilisateurs qui publient dans votre communauté et interagissent les uns avec les autres.

Fonctionnalités

  • Sentiment général : compare le nombre de publications classées comme positives ou négatives
  • Graphique à barres présentant la valeur numérique basculable pour les scores positifs, négatifs et généraux
  • Émotion : nombre de sujets et de publications classés par plusieurs émotions, regroupés par période
    • Aujourd’hui
    • Hier
    • 7 derniers jours
    • 30 derniers jours
  • Rapports pour toute période accessible via les paramètres
    • Annuel
    • Trimestriel
    • Mensuel
    • Hebdomadaire
    • Plage personnalisée
  • Applicable uniquement aux utilisateurs administrateurs

Activation du sentiment

Configuration

Le sentiment est activé par défaut pour les clients hébergés. Pour les étapes manuelles, voir ci-dessous.

  1. Accédez aux paramètres AdminPlugins → recherchez ou trouvez discourse-ai et assurez-vous qu’il est activé.
  2. Activez ai_sentiment_enabled pour l’analyse de sentiment.
  3. Rendez-vous sur /admin/dashboard/sentiment pour voir leurs rapports respectifs.

:information_source: Une fois activé, le sentiment classera toutes les publications à venir et celles des 60 derniers jours. Pour classer toutes les publications historiques de votre site, une tâche de remplissage doit être exécutée depuis la console.

:discourse2: Hébergé par nous ?

Contactez-nous à team@discourse.org et nous le ferons pour vous.

:mechanic: Auto-hébergé ?

./launcher enter app
rake ai:sentiment:backfill

FAQ technique

Comment les données des sujets/publications sont-elles traitées ? Comment les scores sont-ils attribués ?

  • Le sentiment a une fidélité “par publication”. Pour chaque publication, nous pouvons déterminer le sentiment, puis découper ces données de nombreuses manières (par tag / catégorie / temps, etc.). Il compare le nombre de publications classées comme positives ou négatives. Celles-ci sont calculées lorsque les scores positifs ou négatifs sont supérieurs au score seuil défini.

Y a-t-il des projets pour ajouter la prise en charge d’autres langues ?

  • Oui, à l’avenir ! En ajoutant des modèles d’apprentissage automatique (ML) simples multilingues et en utilisant des grands modèles de langage (LLM) multilingues pour classer les données, au lieu de modèles dédiés.

Quels modèles sont utilisés pour alimenter le sentiment ?

Mises en garde

  • Les publications classées comme neutres (ni positives ni négatives) ne sont pas affichées.
  • Les messages privés (MP) sont exclus des calculs.
10 « J'aime »

Un message a été fusionné dans un sujet existant : Problèmes avec le remplissage rétroactif des sentiments

Un message a été fusionné dans un sujet existant : Problèmes avec le remplissage rétrospectif des sentiments

Le message initial a été mis à jour avec une nouvelle vidéo présentant les fonctionnalités mises à jour de Sentiment, notamment beaucoup plus d’émotions et la compréhension des sujets/publications associés à chaque émotion.

J’ai configuré la configuration du modèle de sentiment avec un model_name, un endpoint et une api_key copiés des paramètres LLM, où cela passe le test, mais je reçois l’erreur ci-dessous dans /logs.

(Mais peut-être que je ne comprends pas correctement, car pourquoi le sentiment n’utilise-t-il pas l’un des LLM configurés ?)

Utilisation de 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'
Statut : 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...

Le module de sentiment n’utilise pas de LLM généraux, mais des modèles spécifiquement affinés pour la classification des sentiments. Si vous souhaitez exécuter ces modèles vous-même, la documentation se trouve ici : Auto-hébergement du sentiment et de l’émotion pour DiscourseAI

3 « J'aime »

@Falco Je viens de remarquer que la sentiment analysis a cessé de fonctionner à partir de janvier 2025. Je pense qu’il s’agit de ce nouveau paramètre ai_sentiment_model qui, comme l’explique le lien ci-dessus, est destiné à faire fonctionner votre propre modèle/image de sentiment. J’ai remarqué qu’après la mise à jour de Discourse, la configuration ai_sentiment_model_configs est toute vide (est-ce que cela devrait être vide ?).Lorsque j’essaie d’exécuter un rake de backfill, cela me donne une erreur :

rake ai:sentiment:backfill
rake aborté !
ActiveRecord::StatementInvalid : PG::SyntaxError : ERREUR : erreur de syntaxe près de ")" (ActiveRecord::StatementInvalid)
LIGNE 1 : ...e_upload_id", "posts"."outbound_message_id" FROM () as posts..

Le plugin utilisait par défaut un serveur situé à DigitalOcean que j’avais mis en place pour faciliter les tests.

J’ai depuis réinitialisé les paramètres par défaut du plugin et les personnes qui souhaitent une classification par IA doivent exécuter des serveurs en suivant la documentation ici sur Meta.

En effet, mais nous supportions ce coût à des fins de test. Il n’est pas viable d’offrir cela à tous les auto-hébergeurs.

Il convient de mentionner que nous proposons ce service de classification sur des serveurs accélérés par GPU dans le cadre de notre service d’hébergement.

2 « J'aime »

Problèmes d’analyse de sentiment avec Discourse AI : Format du modèle Hugging Face et échec du point de terminaison Azure


Bonjour Communauté Discourse et Développeurs,

Je rencontre des problèmes importants lors de la configuration et de l’utilisation de la fonctionnalité d’analyse de sentiment dans le plugin Discourse AI sur mon forum. Il semble y avoir deux problèmes distincts qui empêchent son bon fonctionnement.


Problème 1 : Inadéquation du format de réponse du modèle Hugging Face

J’ai configuré le modèle cardiffnlp/twitter-roberta-base-sentiment de Hugging Face pour l’analyse de sentiment. Bien que ma clé API soit valide et que je puisse appeler l’API avec succès depuis mon instance Discourse en utilisant curl, le plugin Discourse AI semble analyser la réponse de manière incorrecte en raison d’un changement dans le format de sortie du modèle Hugging Face.

Ma commande curl (confirmant la clé API valide et le nouveau format) :

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!\"}"

Sortie de curl (affichant le nouveau format de tableau imbriqué) :

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

Problème : Le modèle twitter-roberta-base-sentiment renvoyait auparavant un seul tableau de hachages label-score : [{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]. Cependant, il renvoie maintenant un tableau imbriqué : [[{\"label\": \"LABEL_2\", \"score\": 0.98}, ...]].
La logique d’analyse codée en dur du plugin Discourse AI (spécifiquement, classification[\"label\"][/\\d+/].to_i comme indiqué par la trace d’appels) ne tient pas compte de cette couche de tableau externe. Cela entraîne une TypeError lorsqu’il tente d’accéder à un Symbole comme un Entier.

Message d’erreur (provenant de l’exception de tâche) :

conversion implicite de Symbol en Integer impossible (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…`

Trace d’appels complète pour le problème 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'
conversion implicite de Symbol en Integer impossible (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...

Problème 2 : La configuration du modèle Microsoft Azure conduit à une erreur Hugging Face

Lorsque j’ai tenté de passer au modèle Microsoft Text Analytics dans les paramètres de Discourse AI, j’ai rencontré une erreur 404 Resource not found, et de manière surprenante, la trace d’appels pointe toujours vers hugging_face_text_embeddings.rb.

Message d’erreur (provenant de l’exception de tâche) :

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

Extrait de trace d’appels pertinent (pointant vers Hugging Face malgré la sélection du modèle Microsoft) :

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

Observation : Cela indique que même lorsque je sélectionne et configure le point de terminaison et la clé API du modèle Microsoft, le plugin Discourse AI semble être codé en dur ou acheminer incorrectement les requêtes d’analyse de sentiment via une logique ou des points de terminaison spécifiques à Hugging Face. Cela empêche l’utilisation du modèle Microsoft.


Captures d’écran de la configuration :

J’ai joint une capture d’écran de mes paramètres Discourse AI pour montrer la configuration :

  • Configuration détaillée des modèles d’IA pour le sentiment (montrant les modèles Hugging Face et Microsoft) - J’ai testé avec uniquement la configuration du modèle Hugging Face ou uniquement celle du modèle Microsoft avec le même résultat

Ces problèmes rendent la fonctionnalité d’analyse de sentiment pratiquement inutilisable. Il semble que le plugin nécessite une mise à jour pour gérer le nouveau format de réponse Hugging Face et pour acheminer correctement les requêtes lorsque différents fournisseurs de sentiment sont configurés.

Toute aide ou orientation sur ces problèmes serait grandement appréciée.

Merci !

2 « J'aime »

Je suis curieux de savoir si le reporting de sentiments fonctionne pour d’autres, ou si j’ai mal configuré quelque chose. J’aimerais savoir ce que je dois vérifier ou configurer d’autre pour activer le reporting de sentiments, car je rencontre toujours le même problème.

1 « J'aime »

Nous essayons d’utiliser cette fonctionnalité avec Azure AI Language (depuis notre instance Discourse auto-hébergée) - car nous utilisons déjà notre abonnement Azure pour intégrer GPT-4.5 à Discourse (pour la fonctionnalité de résumé et de chatbot) :

…mais nous n’obtenons aucune donnée dans le tableau de bord des sentiments, et nous pouvons voir ces erreurs dans les journaux :

Discourse AI : Erreurs lors de la classification en masse : Échec de la classification de 208 messages (exemples d'ID : 2256, 909, 2270, 2260, 2797) : JSON::ParserError : Une chaîne vide n'est pas une chaîne JSON valide.

La trace montre que Discourse pourrait essayer d’utiliser HuggingFace - sont-ce les seuls modèles pris en charge pour le moment ?

Merci,

N

1 « J'aime »

Alors, la seule façon d’utiliser cette fonctionnalité est de configurer vos propres instances des modèles (qui nécessitent des instances GPU gourmandes en ressources qui seraient coûteuses) ? Cette fonctionnalité semble très utile, mais il semble qu’elle me coûterait plus cher à mettre en place que mon hébergement Discourse actuel.

Oui, les modèles pris en charge sont ceux listés dans le premier message.

Nous ajouterons éventuellement la prise en charge de la classification à l’aide de LLM pour les personnes dont le coût n’est pas un problème.

Eh bien, toute la fonctionnalité est construite autour de la classification des messages à l’aide de modèles ML, donc oui, vous avez besoin d’un endroit pour les exécuter.

Et comme Discourse peut fonctionner sur le VPS le moins cher du marché, l’exécution de modèles ML est en effet plus coûteuse. Si vous voulez avoir la fonctionnalité de la manière la moins chère possible, il est possible de l’exécuter sur un serveur avec seulement une poignée de cœurs de processeur, tant que vous avez suffisamment de RAM pour charger les modèles.

1 « J'aime »

Désolé si cette question a déjà été posée, mais je n’ai pas réussi à trouver une référence à l’endroit exact où le score seuil peut être configuré :sweat_smile:

1 « J'aime »

Malheureusement, le score seuil n’est pas configurable par les utilisateurs ou les administrateurs. C’est une valeur spécifique définie dans la base de code.

1 « J'aime »