Discourse Disorder

:warning: 此功能现已成为 Discourse AI 的一部分。此插件已被弃用。

| :discourse2: | 摘要 | Disorder 通过自动标记 Discourse 论坛上潜在的有毒内容来帮助版主。 |
| :hammer_and_wrench: | 仓库链接 | https://github.com/xfalcox/disorder |
| :open_book: | 安装指南 | 如何在 Discourse 中安装插件 |

如果您正在使用我们的官方托管服务,请联系我们的支持部门以注册您对该插件的兴趣。

毒性

正如 @hawkDealing with Toxicity in Online Communities 中所说,管理社区中的毒性至关重要。

虽然 Discourse 开箱即用地提供了许多不同的工具来帮助管理社区中的毒性,但我们一直在研究进一步改进的方法。特别是,我一直在研究机器学习和人工智能在在线论坛中的潜在应用。现在,这是一个实验性插件,所有社区都可以使用。

插件

Disorder 利用人工智能和机器学习来帮助您管理社区,让您的版主团队更容易掌握潜在的问题内容,甚至可以选择在用户发布有毒帖子之前对其进行提示,让他们进行修改。

这是将自托管 ML 模型用于 Discourse 的首次尝试,虽然它是一个简单的模型,但它为将来应用更复杂的模型奠定了可重用的模式。

功能

后台标记

这是 Disorder 的主要运行模式,对您的用户完全透明,他们不会意识到任何更改。

每当创建新帖子(或使用 Discourse Chat 的聊天消息)时,它都会被异步放入分类队列。如果分类结果超过可配置的阈值,该帖子/聊天消息将被标记,以便您的版主团队收到警告,并可以做出最终标记决定。

新帖子干预

如果您认为预防是最好的良药,您可能会对这种更积极的选项感兴趣。

您可以启用对任何新帖子的同步分类,如果其毒性超过可配置的阈值,将触发对新帖子流程的干预,要求用户审查并修改可能超出社区规则设定的界限的消息。

这只会发生一次,关闭模态框后,用户将可以正常发帖。

工作原理?

该插件集成了 Detoxify 的开源模型,使用远程 API 调用模型,允许管理员根据每个社区的需求正确扩展推理速率。

我们提供了一个简单的镜像,提供了一个精简的 HTTP API,Discourse 将调用该 API 来执行内容分类,该 API 可以在运行 Discourse 的同一台服务器上运行,也可以在另一台服务器上运行。

Discourse 插件侦听新帖子/新聊天消息事件,并在后台队列中排队一个分类作业。结果存储在数据库中,以便您可以提取报告,我们使用单独的机器人用户标记内容,以便我们可以跟踪其标记准确性。

选项

首先,该插件开箱即用,因此无需立即更改任何设置。但是,如果您想更改插件的行为,可以使用一些选项。

我们提供 3 种不同的分类模型供您在插件选项中选择:

  • unbiased(默认):一个试图减少毒性分类中意外模型偏差的模型。

  • multilingual:一个可以对意大利语、法语、俄语、葡萄牙语、西班牙语和土耳其语进行分类的模型。

  • original:最简单的模型。

您还可以调整插件是否会:

  • 自动标记
  • 启用对有毒帖子的同步干预(带警告)(实验性)
  • 启用对有毒帖子的同步干预(不推荐)

以上所有操作仅在评论被分类为高于每种分类类型的阈值时发生:

  • toxicity(毒性)
  • severe_toxicity(严重毒性)
  • identity_attack(身份攻击)
  • insult(侮辱)
  • threat(威胁)
  • sexual_explicit(露骨的性内容)

您可以调整自动操作的每种分类阈值。

分类服务

该插件预先配置为开箱即用。为此,它会联系 Discourse (CDCK) 运行的服务来对用户内容进行分类。该 分类器 API 服务是开源的,如果您需要,可以运行自己的服务副本。

39 个赞

仅出于好奇,“Disorder” 和 Discourse 对 Google Perspective API 的实现之间有什么区别?

7 个赞

从代码上看,它们是完全不同的插件。

从宏观上看,它们满足了相同的需求,但它们的实现方式不同:

  • Disorder 可用于聊天和帖子,Perspective 仅用于帖子

  • Perspective 依赖于专有的第三方 API,这带来了隐私、可靠性和透明度方面的影响。

  • Disorder 建立了一个模式,可以轻松添加新模型,因此我们可以改进服务,甚至添加全新的功能。

  • Disorder 的自托管 API 提供了灵活性,摆脱了按 API 调用付费和速率限制的束缚。

  • Disorder 的前端界面相对较小,因此它在 Discourse 更新时应该更具弹性。

16 个赞

太棒了。我们应该在哪里以及如何联系?

5 个赞

请发送邮件至 team@discourse.org :slight_smile:

6 个赞

无需在此回复,但如果您正在寻找下一步的建议,基于主题文本的 AI 标签建议器可能会很有用。我想象它类似于 Soundcloud 在分析上传内容后建议音乐流派标签的方式。这对于在繁忙的网站上组织用户生成内容很有用。

9 个赞

我是否正确理解,应该启动 disorder API 实例来配合该插件?有一个预填充的设置 disorder inference service api endpoint,预设为 https://disorder-testing.demo-by-discourse.com。然而,还有一个 disorder inference service api key,默认是空的。

我们有兴趣测试这个插件,因为我们面临用户之间的大量不良行为,这些行为最终通过标记和版主帮助得到解决,但我们希望主动阻止用户传播负面帖子,如果可能的话,这个插件似乎可以扮演这样的角色。

我们是否可以使用任何现成的端点来试用?请注意,我们每天有约 15 万次页面浏览量,这可能会导致一些未经准备的服务器堵塞。

我们是独立的。

4 个赞

虽然您可以运行自己的 API 服务器,但该插件预先配置为指向 https://disorder-testing.demo-by-discourse.com/,因此可以开箱即用。

请为您的实例使用此端点,因为它正是为希望试用此插件的自托管实例提供的。在默认配置中,所有 API 调用都在后台进行,因此 API 宕机不会以任何方式影响您的网站,因此使用它是安全的。

api key 设置是可选的,只有在您的 API 服务器启用了它时才需要。公共实例 https://disorder-testing.demo-by-discourse.com/ 没有启用它。

6 个赞

谢谢!听起来很完美,我将在未来几天试试 :heart:

4 个赞

未来是否计划有其他 ML 应用?

2 个赞

我试用了一周,它标记帖子的行为极其激进。我建议只有在你的网站规模庞大且版主不足的情况下才使用它。希望 AI 能有所改进,但目前还远远不够。

6 个赞

这是非常棒的反馈!您是否愿意分享一些调试统计数据,以帮助我确切了解发生了什么?

例如,在此处或 PM 中提供以下内容的输出:

SELECT
  pcf.value,
  p.raw
FROM
  post_custom_fields AS pcf
INNER JOIN
  posts AS p ON p.id = pcf.post_id
WHERE
  pcf.name = 'disorder'

将非常有帮助。

5 个赞

啊是的,我把那事儿都忘了!给你。其实没多少,但它们就是不必要的,成员和管理员们觉得它们很烦人。我也对它扫描私信(DM)存疑,我知道如果有人通过私信骚扰别人,那可能会有价值,但大多数时候,这只会让人们因为知道我们在看他们的私信而感到不适。

1 个赞

您使用聊天吗?所有烦人的标记都在帖子/私人消息中吗?

我们确实使用聊天,但我很确定所有的标记都在帖子和私人消息中。

1 个赞

首先,我非常感谢您提供的反馈和数据,这些数据让我能够进一步调试。

现在是我的发现!

本周,非员工用户发布了 1942 篇新帖子。这是一个非常活跃的社区!但是,我不会说 AI “标记帖子的行为非常激进”,因为只有 7 篇帖子被标记

话虽如此,在这 7 篇中,一半是由于默认阈值太低而触发的明显误报,另一半是 AI 难以理解上下文(称呼你的对话者是混蛋 vs 讲述一个关于今天你在购物时有人对你很混蛋的故事),还有一篇,依我看,是正确的标记。

如果您愿意再试一次,将所有阈值移至 85 并切换到 original 模型,几乎可以解决您迄今为止遇到的所有过于敏感的标记问题。我将添加一个站点设置来允许跳过私人消息,因为我可以看到这对某些社区来说可能很烦人。

8 个赞

谢谢 Falco,我很抱歉说它过于激进。我已经有很多网站上的麻烦了,标记只是火上浇油,当时我非常生气。

我很感谢你的建议,我会再试一次。问题是,当你禁用“自动禁用混乱标记”时会发生什么?如果帖子被视为混乱,我还会以某种方式收到通知吗?这样我就可以测试并找出哪些设置有效,而不会有帖子被标记。

4 个赞

如果不进行该设置,它将运行帖子以供 AI 分析,但不会采取任何行动。您可以将其保留原样,然后运行该数据探索查询来分析误报/漏报率。

还有一个设置允许您将组添加到跳过列表中,例如,您可以跳过 TL4/3 的帖子不进行分类。这可能也有帮助。

尊敬的 @Falco

我们开始测试 Disorder。总体反馈是积极的——它确实能检测到不当内容,但同时也标记了我们社区可以接受的许多内容。由于我们测试该插件的论坛性质(成人),交流涉及多个方面,这会触发 Disorder 标记许多帖子。您的 SQL 查询 确实有助于检查要调整的阈值,但我是否可以建议将这些添加到每个被标记帖子的“可审查评分”表中?

这个

我不知道插件是否可以将自己的数据引入此视图,但这将极大地帮助工作人员了解要调整哪些标准以减少我们的误报。我的想法是添加一个下拉菜单,其中包含此视图中触发的每个标准的细分。无需包含等于 0 的标准。那些大于 0 的标准应该在那里显示,但只有那些超过当前配置阈值的标准才应标记为粗体/红色。

Disorder 评分示例
  • 毒性 65% [1]
  • 侮辱 73% [2]
  • 威胁 12% [3]
  • 性暗示 2% [4]

如果需要,我可以为您提供 SQL 查询结果。我们离完成审核标志队列还差得很远……
我们正在使用多语言模型,还没有尝试过其他模型。考虑到我们有一些用户更喜欢使用他们的母语发帖,我们决定从这里开始是个好主意。


  1. 超出,红色字体 ↩︎

  2. 超出,红色字体 ↩︎

  3. 正常,正常字体 ↩︎

  4. 正常,正常字体 ↩︎

1 个赞

你好,

想通知你,我们收到了与使用“original”模型的 Disorder 相关的日志错误。我已将其切换回多语言模式,看看是否会有所不同。

作业异常:nil:NilClass 未定义方法 `>=’ @classification[label] >= SiteSetting.send(“disorder_flag_threshold_#{label}”) ^^

详细信息

/var/www/discourse/plugins/disorder/lib/classifier.rb:39:in `block in consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `filter’

/var/www/discourse/plugins/disorder/lib/classifier.rb:38:in `consider_flagging’

/var/www/discourse/plugins/disorder/lib/classifier.rb:25:in `classify!’

/var/www/discourse/app/jobs/regular/classify_post.rb:14:in `execute’

/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform’

rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in with_connection' /var/www/discourse/app/jobs/base.rb:236:in block in perform’

/var/www/discourse/app/jobs/base.rb:232:in `each’

/var/www/discourse/app/jobs/base.rb:232:in `perform’

sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job’

sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke’

/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke’

sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke’

sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local’

sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in module:Sidekiq

sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats’

sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call’

sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global’

sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch’

sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare’

sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch’

sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process’

sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one’

sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run’

sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog’

sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread’

详细信息 2
主机名
process_id 65460
application_version 2f8ad17aed81bbfa2fd20b6cc9210be92779bd74
current_db default
current_hostname
job Jobs::ClassifyPost
problem_db default
time 1:52 pm
opts
post_id 604063
current_site_id default

附注:是的,多语言模式不会产生这些错误。无偏见模型也不会产生错误。

1 个赞