Discourse AI - 情感

:bookmark: 本主题涵盖 Discourse AI 插件的情感功能配置。

:person_raising_hand: 所需用户级别:版主

Sentiment 通过分析帖子来跟踪您的社区,并提供情感和情绪分数,让您在任何时间段内对社区有一个整体的了解。这些见解有助于确定在您的社区中发帖和相互互动的用户类型。

功能

  • 整体情感:比较被归类为正面或负面的帖子数量
  • 条形图展示可切换的正面、负面和整体分数的数值
  • 情绪:按时间范围分组的、被多种情绪分类的话题和帖子数量
    • 今天
    • 昨天
    • 过去 7 天
    • 过去 30 天
  • 可随时通过设置访问的报告
    • 年度
    • 季度
    • 月度
    • 周度
    • 自定义范围
  • 仅适用于管理员用户

启用情感

配置

对于托管客户,情感功能默认启用。手动步骤请参见下文。

  1. 转到 Admin 设置 → Plugins → 搜索或查找 discourse-ai 并确保其已启用
  2. 启用 ai_sentiment_enabled 以进行情感分析
  3. 前往 /admin/dashboard/sentiment 查看各自的报告

:information_source: 启用后,Sentiment 将会分类所有后续帖子以及过去 60 天内的帖子。要分类您网站的所有历史帖子,必须从控制台运行回填任务。

:discourse2: 由我们托管?

请联系我们 team@discourse.org,我们将为您处理。

:mechanic: 自行托管?

./launcher enter app
rake ai:sentiment:backfill

技术常见问题解答

话题/帖子数据是如何处理的?分数是如何分配的?

  • Sentiment 具有“每帖”的精度。对于每个帖子,我们都能确定其情感,然后可以从多个角度(按标签/类别/时间等)对这些数据进行细分。它比较被归类为正面或负面的帖子数量。这些是在正面或负面分数大于设定的阈值分数时计算的。

是否有计划支持其他语言?

  • 未来会的!通过添加多语言简单机器学习 (ML) 模型,以及使用多语言大型语言模型 (LLM) 来分类数据,而不是使用专用模型。

Sentiment 使用哪些模型?

注意事项

  • 被归类为中性(非正面也非负面)的帖子不显示
  • 私信 (PM) 不包含在计算中
10 个赞

帖子已合并到现有主题:Problems with Sentiment Backfill

帖子已合并到现有主题:Sentiment Backfill 问题

OP 已更新,新增了一个视频,展示了 Sentiment 的更新功能,包括更多的情绪以及了解哪些主题/帖子与每种情绪相关联。

我使用从 LLM 设置中复制的模型名称、端点和 api_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'
状态: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,而是使用专门针对情感分类进行微调的模型。如果您想在自己的环境中运行这些模型,相关文档请参见 Self-Hosting Sentiment and Emotion for DiscourseAI

3 个赞

@Falco 我刚注意到情感分析从2025年1月开始停止运行。我的猜测是有一个新的设置 ai_sentiment_model,正如上面链接所解释的,它用于运行你自己的专用情感模型/图像。我注意到在更新 discourse 后,现在 ai_sentiment_model_configs 都是空白的(它应该是空的吗?)。当我尝试运行 backfill rake 时,出现错误:

rake ai:sentiment:backfill
rake 中止!
ActiveRecord::StatementInvalid: PG::SyntaxError: 错误:在或附近的语法错误")" (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 插件中的情感分析功能时遇到了严重问题。似乎有两个独立的问题阻碍了其正常工作。


问题 1:Hugging Face 模型响应格式不匹配

我已经为情感分析配置了 Hugging Face 的 cardiffnlp/twitter-roberta-base-sentiment 模型。虽然我的 API 密钥有效,并且我可以使用 curl 命令从 Discourse 实例成功调用 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)没有考虑到这个外部数组层。这导致在尝试将 Symbol 转换为 Integer 时出现 TypeError

错误消息(来自 Job Exception):

无法将 Symbol 隐式转换为 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…`

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'
\u003cinternal:kernel\u003e: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'
无法将 Symbol 隐式转换为 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...

问题 2:Microsoft Azure 模型配置导致 Hugging Face 错误

当我尝试在 Discourse AI 设置中切换到 Microsoft Text Analytics 模型时,我遇到了 404 Resource not found 错误,令人惊讶的是,回溯仍然指向 hugging_face_text_embeddings.rb

错误消息(来自 Job Exception):

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 设置的截图,以展示配置:

这些问题使得情感分析功能实际上无法使用。看来该插件需要更新以处理新的 Hugging Face 响应格式,并在配置了不同的情感提供商时正确路由请求。

非常感谢您在这些问题上的任何帮助或指导。

谢谢!

2 个赞

我想知道其他人是否也遇到了情绪报告的问题,或者是我配置有误。我想知道还需要检查或配置什么才能启用情绪报告,因为我仍然遇到同样的问题。

1 个赞

我们正尝试从我们自托管的 Discourse 实例使用 Azure AI Language 来使用此功能(因为我们已在使用我们的 Azure 订阅将 GPT-4.5 与 Discourse 集成(用于摘要和聊天机器人功能):

……但我们在情绪仪表板中没有看到任何数据,并且在日志中可以看到这些错误:

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

1 个赞

那么,使用此功能的唯一方法是设置您自己的模型实例(这需要资源密集型的 GPU 实例,成本很高)吗?此功能看起来非常有用,但似乎设置它的成本比我实际的 Discourse 托管成本还要高。

是的,支持的模型是 OP 中列出的那些。

我们最终将为那些不介意成本的人添加使用 LLM 进行分类的支持。

嗯,整个功能都是围绕使用 ML 模型对帖子进行分类而构建的,所以是的,你需要一个地方来运行它们。

而且,由于 Discourse 可以在最便宜的 VPS 上运行,运行 ML 模型确实更昂贵。如果你想以最便宜的方式使用该功能,可以在只有少量 CPU 核心的服务器上运行它,只要有足够的 RAM 来加载模型即可。

1 个赞

抱歉,如果这个问题以前问过,但我找不到在哪里可以配置阈值分数 :sweat_smile:

1 个赞

不幸的是,阈值分数不是用户或管理员可以配置的内容。它是在代码库中设置的一个特定值。

1 个赞