| 摘要 | Discourse 的原始 AI 聊天机器人 | |
| 代码库链接 | GitHub - merefield/discourse-chatbot: An AI bot with RAG capability for Topics, Chat & Customer Support in Discourse, currently powered by OpenAI · GitHub | |
| 安装指南 | 如何在 Discourse 中安装插件 | |
| 赞助 | 请考虑成为我开源工作的持续赞助者,赞助金额请根据您的或您组织的资源和需求来决定,以确保该插件得到应有的维护,并能在未来继续为您的站点服务。 |
喜欢这个插件吗?请在 GitHub 上给它点个
吧! ![]()
由于这是一个独立贡献的插件,请在此主题中提出支持、Bug、用户体验和功能请求。注意:此插件不提供于 Discourse.org 托管服务。如果您是自行托管,或者可能在第三方托管上(请咨询您的提供商),则可以安装它。
这是什么?
- Discourse 的原始 AI 聊天机器人!
- 您可以使用此机器人处理一些客户支持信息任务(参见此指南 Building a technical support chatbot
- 在任何主题或聊天频道中与机器人对话,一对一或与他人一起!支持线程。
- 自定义机器人的性格以适合您的论坛!
- 希望它听起来像威廉·莎士比亚或温斯顿·丘吉尔?没问题!
- “RAG 模式”机器人可以:
- 搜索您的论坛**以获取答案,使机器人成为您论坛主题的专家。
- 重新排序搜索结果,以偏向特定的作者群体或主题标签
- 不仅了解当前主题或频道中的信息。
- 私下询问用户他们未完成的必填用户字段。
- 渲染和编辑 AI 图片
- 搜索维基百科
- 搜索当前新闻*
- 搜索 Google*
- 爬取远程站点*
- 返回股票当前的收盘市场数据。*
- 准确执行“复杂”数学运算(没有编造或“幻觉”答案!)
- 这些“工具”可以通过插件扩展,见下文。
- 搜索您的论坛**以获取答案,使机器人成为您论坛主题的专家。
- 视觉支持 - 机器人可以看到您的图片并回答相关问题!
- 自动回复特定类别中的新主题
- 使用尖端的 Open AI API 及其卓越的、行业领先的大型语言模型(LLM)的功能。
- 包含一个特殊的配额系统来管理对机器人的访问:更受信任的和/或付费成员可以拥有更大的机器人访问权限!
- 按查询或按令牌计量使用情况。
- 也支持 Azure 和代理服务器连接。
- 使用第三方代理进程来翻译调用,以支持替代 LLM,如 Gemini,例如 这个
*需要注册外部(非关联)API 服务。链接在设置中。
RAG 模式非常智能,知道您论坛上发布的事实:
基本机器人模式有时会出错,但由于它对大型语言模型的调用较少,因此运行成本更低:
(对不起,中国!
**机器人的“视觉” - 它能看到(潜在共享)的内容和隐私 
此机器人可用于您论坛的公共空间。为了使机器人在那里特别有用,有 RAG 模式(每个机器人信任级别一个设置)。默认情况下未设置。
在此模式下,默认情况下,机器人可以看到信任级别 1 用户能看到的所有内容,基于以下设置:
因此,如果在面向公众的主题中与机器人互动,如果您倾向于通过类别权限在信任级别 0 或 1 级别限制内容,机器人可能会“泄露”信息。选择此级别是因为通过经验,大多数站点通常不会在低信任级别限制敏感内容,但这取决于您的具体需求。
为此模式,请确保您至少有一个信任级别 1 的用户,且没有超出自动化组的额外组成员身份。(请记住,机器人将知道信任级别 1 用户知道的一切,并可以分享)。如果您有一个信任级别 0 的用户,且没有超出自动化组的额外组成员身份,您可以选择降低 chatbot embeddings benchmark user trust level。
或者:
- 将
chatbot embeddings strategy切换到category,并将chatbot embeddings categories填充为您希望机器人了解的类别。(请注意,如果您添加任何私有类别,机器人应该了解这些类别,并且机器人在任何地方公开说的任何话都可能泄露给权限较低的用户,所以在添加时请小心)。 - 仅在普通模式下使用机器人(但机器人将看不到任何帖子)
- 通过审核来缓解
此外,请注意,它“看到”的任何内容都会与 Open AI 共享。
您可以看到这种设置是一种妥协。为了使机器人有用,它需要对您站点上的内容有所了解。目前,机器人无法选择性地阅读仅限成员的内容并仅与成员共享,一些管理员可能会觉得这有限制,但在机器人能够在公共场合交谈的同时,没有简单的方法来解决这个问题。如果您有特殊需求并希望赞助这方面的工作,请联系我。带有语义搜索的机器人权限是一个非平凡的问题。系统目前针对速度进行了优化。注意:机器人永远不会读取私人消息。
注意事项
- 可能不适用于多站点安装(未明确测试),但欢迎 PR 以改善支持

- 由于需求高,Open AI API 响应在更高级的模型上有时会变慢。但是,聊天机器人支持 GPT 3.5,它快速响应且完全有能力。
- 可扩展并支持其他云机器人(因此插件名称通用),但目前仅支持与 Open AI 大型语言模型(LLM)如 GPT-4 的原生交互。如果您希望添加其他机器人类型或希望支持我添加更多,请联系我。欢迎 PR。虽然可以通过代理服务器访问其他服务而无需更改代码!
- 可扩展以支持搜索当前提供集之外的其他内容。
设置
先决条件
除了 对 app.yml 的正常更改 外,您需要注意以下几点:
要使用聊天机器人或 AI 主题摘要 构建,您需要至少 0.5.1 版本的 pgvector postgres 扩展。
大多数人已经拥有至少这个版本。然而,偶尔有些安装会安装较旧的版本。这将导致构建失败,出现类似以下错误:PG::UndefinedObject: ERROR: access method "hnsw" does not exist
首先确保您的容器正在运行:
./launcher restart app
然后进入您的容器
./launcher enter app
然后进入数据库并更新 pgvector 的版本:
:/var/www/discourse# su postgres -c 'psql discourse'
\dx
ALTER EXTENSION vector UPDATE;
\dx
exit
现在使用 exit 离开容器
您现在应该能够重新构建。
创建嵌入
如果您希望聊天机器人了解您站点上的内容,请打开此设置:
chatbot_embeddings_enabled
仅当您想使用 RAG 类型的机器人并确保它了解您论坛上的内容,而不仅仅是当前主题时,才需要此设置。
最初,我们需要为所有范围内的帖子创建嵌入,以便机器人可以找到论坛信息。启用此设置后,这将在后台发生,您无需执行任何操作。
对于非常大的站点,此播种作业可能需要几天的时间。
嵌入范围
这由几个设置决定:
chatbot_embeddings_strategy可以是 “benchmark_user” 或 “category”chatbot_embeddings_benchmark_user_trust_level为前者设置相关的信任级别chatbot_embeddings_categories如果设置为category策略,则使机器人有权考虑指定类别中的所有帖子。
如果您更改这些设置,随着时间的推移,嵌入的群体将发生变化。
加速填充
进入容器:
./launcher enter app
并运行以下 rake 命令:
rake chatbot:refresh_embeddings[1]
目前由于未知原因会运行两次(抱歉!欢迎 PR),但 [1] 确保第二次运行时只会添加缺失的嵌入(即第一次运行后立即没有缺失),因此有些多余。
在不太可能的情况下,您被 OpenAI 限制速率(不太可能!),您可以通过以下方式完成嵌入:
rake chatbot:refresh_embeddings[1,1]
这将填充缺失的嵌入(因此错误不会导致任何丢失),但会更谨慎地继续,在每次调用 Open AI 之间放置 1 秒的延迟。
与机器人交互相比,创建嵌入并不昂贵,但无论如何请留意您 Open AI 仪表板上的使用情况。
注意:嵌入仅针对帖子创建,且仅针对信任级别 1 用户有权访问的帖子创建。这似乎是一个合理的妥协。它不会为仅限信任级别 2+ 访问的内容的帖子创建嵌入。
监控嵌入填充的有用数据浏览器查询
@37Rb 写道:“这是我使用 Data Explorer 插件来监控和验证嵌入的 SQL 查询……以防对其他人有帮助。”
SELECT e.id, e.post_id AS post, p.topic_id AS topic, p.post_number,
p.topic_id, e.created_at, e.updated_at, p.deleted_at AS post_deleted
FROM chatbot_post_embeddings e LEFT JOIN posts p ON e.post_id = p.id
尝试为太多字符获取嵌入时出错。
您可能会遇到如下错误:
OpenAI HTTP Error (spotted in ruby-openai 6.3.1): {"error"=>{"message"=>"This model's maximum context length is 8192 tokens, however you requested 8528 tokens (8528 in your prompt; 0 for the completion). Please reduce your prompt; or completion length.", "type"=>"invalid_request_error", "param"=>nil, "code"=>nil}}
这是解决方法 …
根据您的错误消息,嵌入模型的限制为:
8192 tokens
然而您请求了 8528
您需要将此设置的当前值降低:
chatbot_open_ai_embeddings_char_limit:
大约降低 4 倍的差值,看看是否有效(一个令牌大约是 4 个字符)。
因此,在此示例中,4 x (8528 - 8192) = 1344
因此,为了安全起见,将 chatbot_open_ai_embeddings_char_limit 的当前值降低 1500。但是,默认值是根据大量英文帖子测试设置的,但对于其他语言,可能需要降低。
这将截断更多文本并请求令牌,希望嵌入能够通过。如果不成功,您需要确认差值并相应地进一步减少。最终它会足够低,您无需再查看它。
如何切换嵌入模型
您无需执行任何操作,只需更改设置:后台作业将逐渐处理事情。
如果您真的想加速这个过程,请执行:
- 将设置
chatbot_open_ai_embeddings_model更改为您新的首选模型 - 最好先删除所有当前嵌入:
- 进入容器
./launcher enter app - 进入 rails 控制台
rails c - 运行
::DiscourseChatbot::PostEmbedding.delete_all exit(返回容器内的 root)
- 进入容器
- 运行
rake chatbot:refresh_embeddings[1] - 如果由于任何 Open AI 方面的原因中途失败,请再次运行,直到达到 100%
- 已知新模型更准确,因此您可能需要降低
chatbot_forum_search_function_similarity_threshold,否则您可能得不到结果 :)。我将默认值从0.8降低到0.6,但您的情况可能不同。
机器人类型
花点时间阅读所有插件设置。chatbot bot type 设置是关键,每个聊天机器人“信任级别”都有一个:
RAG 模式更优越,但会对 API 进行更多调用,可能会增加成本。话虽如此,其最终输出“幻觉”的倾向减少,可能使您能够从 GPT-4 降级到 GPT-3.5,尽管输出的有用性和可靠性显著增加,您最终可能会花费更少。GPT 3.5 基于响应时间也更适合代理类型。潜在的双赢!实验吧!
要使聊天机器人在聊天中工作,您必须启用聊天。
如何让机器人回应
基本规则
- 如果在插件设置中获得权限,机器人将在主题或聊天频道中仅有一个用户时回复每个帖子或消息,直到更多人加入。
- 如果您 @ 提及它,机器人将始终被调用
每个类别的特殊自动回复
- 每个类别,您可以让聊天机器人回复每个新主题,并且您可以给它关于做什么的特殊指令,由您在类别设置中设置的类别特定提示控制。
应该以类似以下内容开头:
“通过说你好并自我介绍来欢迎我。通过使用本地论坛搜索与我第一篇文章相关的论坛上的 5 篇文章分享给我,包括链接”
即您需要以第一人称编写,就像用户在寻求帮助一样。它不是系统提示。它不是描述机器人应该如何行为(那是系统提示的作用,系统提示仍然会发送)。它是用户请求特定帮助(尽管是隐藏的)。基本上,您编写它就像用户帖子一样,无需提及机器人。
机器人的响应速度
这主要由一个设置控制:chatbot_reply_job_time_delay,您有自由裁量权。
拥有此设置的目的是:
- 保护您免受 Open AI 的速率限制
- 保护您的站点免受想要垃圾邮件机器人并花费您金钱的用户。
- 允许 Discourse 足够的时间上传热链接图片,以便机器人可以看到它们。
现在默认为 ‘2’ 秒,现在可以减少到零
,但请注意上述风险。机器人视觉(如果您正在使用)对此设置特别敏感。如果您发现机器人看不到您的图片,请尝试增加此值。
将此设置为零,机器人即使在“代理”模式下,也会变得非常“敏捷”。
显然,这有点人为,没有真正的人实际上会打得这么快……但根据您的口味和钱包大小设置。
注意:我无法直接控制 Open AI API 的响应速度——并且通常使用的规则是,您设置的模型越复杂,响应通常越慢。现在更普遍的情况是,“迷你”模型往往更快。
AI 驱动的用户字段收集(实验性)
如果用户有一些当前为空的可选用户字段,启用此设置将导致机器人开始向用户询问信息。它将逐步完成未完成的用户字段,直到完成,然后恢复为正常行为。

(抱歉响应缓慢 - 这是在开发环境中录制的)
注意:此功能仅支持:
- 文本
- 下拉菜单
- 确认
多选尚不支持。
字段必须是可选
用户字段的顺序决定优先级。
Ollama & llama3 支持
Ollama 对(完全 AWESOME!)llama3 的支持现已发布:
这是当机器人在开发环境中本地运行或在云端与 ollama 服务器一起运行时……以及基本模式下:
- 确保模型是
llama3:
- 需要设置自定义 URL
http://localhost:11434:

如果您有足够的服务器,您可以在云端托管 ollama。
DeepSeek 炒作 
加入聊天机器人的行动 ![]()
您至少可以在基本模式下使用机器人来访问 V3 和 R1
我使用了:
(无关联)
他们托管他们的模型。
设置如下:
确保设置基本机器人模式并替换您的密钥。
但是,如果您可以访问他们的网站进行注册,您可能能够直接使用 DeepSeek AI ![]()
基本 URL 将是 “https://api.deepseek.com”。
OpenAI
您必须从 https://platform.openai.com/ 获取 令牌 才能使用当前机器人。设置了默认语言模型(最复杂的之一),但您可以尝试更便宜的替代方案,列表在此
设置中有一个自动化部分:添加到 Discourse 后,插件当前设置一个具有以下属性的 AI 机器人用户
- 名称:‘Chatbot’
- 用户 ID:-4
- 简介:“嗨,我不是真人。我是一个可以与您讨论事物的机器人。不要太认真。有时,我甚至对事情是正确的!”
- 组名称:“ai_bot_group”
- 组全名:“AI Bots”
您可以随意编辑名称、头像和简介(参见管理员 → 自定义 → 文本中的区域设置字符串),但使其易于提及。
它不是免费的,所以有一个配额系统,您必须设置这个
最初没有人可以访问机器人,即使是工作人员。
在初始免费分配到期后,调用 Open AI API 不是免费的!因此,我实施了一个配额系统来控制这一点,降低成本并防止滥用。这些小交互的成本并不疯狂,但如果变得流行,可能会累积。您可以在 他们的定价页面 上阅读有关 OpenAI 定价的更多信息。
为了与机器人互动,您必须属于已添加到三个信任级别组集(低、中、高信任组集)之一的组。您可以在相应的设置中修改每个信任组集每周允许的交互次数。
您还必须填充组。该配置完全由您决定。它们开始时是空的,所以最初没有人可以访问机器人:
在此示例中,我使 staff 具有高信任访问权限,而 trust_level_0 具有低信任。他们在三个额外设置中获得相应的配额。
注意:用户根据其所属的最高信任组获得配额。
“提示工程”
有几个区域设置文本“设置”影响机器人接收的内容以及机器人的响应方式。
您应该考虑更改的最重要一个是机器人的 system 提示。每次您与机器人说话时都会发送此提示。
对于基本机器人,您可以尝试像这样的系统提示:
“你是一个极端的 F1 车迷,你喜欢与赛车运动及其高辛烷值兴奋水平相关的一切”,而不是默认值。
(对于 rag 机器人,您必须保留“你是一个乐于助人的助手。”之后的所有内容,否则可能会破坏代理行为。如果遇到麻烦,请重置它。再次实验!)
尝试一个最适合您论坛主题的。发挥创意!
注意:现在每个机器人类型有两个系统提示。一个 .open 用于在“公共”场合与机器人交谈。另一个 .private 用于在私人消息或直接消息聊天中与机器人交谈。这样您就可以自定义私人行为,例如支持机器人。
更改这些区域设置字符串可以使机器人的行为非常不同,但不能实时修改。我建议只更改系统提示,因为其他提示在代理行为或提供谁对机器人说了什么的信息方面起着重要作用。
注意:在主题中,除了帖子窗口(由回看设置确定)外,还会发送第一个帖子和主题标题,以给机器人更多上下文。
您可以在管理员 → 自定义 → 文本下的 chatbot.prompt. 中编辑这些字符串,其中最重要的是系统提示,位于:chatbot.prompt.system.
支持帖子和聊天消息!
机器人支持聊天消息和主题帖子,包括私人消息(如果配置)。
您可以通过回复它或 @ 提及它来提示机器人响应。您可以设置机器人向后查找多远以获取响应上下文。值越大,每次调用的成本越高。
有一个浮动快速聊天按钮,可立即将您连接到机器人。其样式有点实验性(修改您移动设备上的基础论坛的一些 z-index 值),可能在某些页面上冲突。这可以在设置中禁用。您可以选择是否将机器人加载到一对一聊天或私人消息中。
现在您可以选择您喜欢的图标(默认
),或者如果设置留空,将采用机器人用户的头像! ![]()
头像:
或图标:并且请记住,您还可以自定义展开时出现的文本:

… 使用管理员 → 自定义 → 文本
(虽然您可能需要自定义一些 CSS 以适应您想要的颜色和大小)。
一些调试帮助
- 确保设置
chatbot include inner thoughts in private messages为 ON - 确保设置
chatbot enable verbose rails logging为 ON - ssh 到您的服务器
cd /var/discourse/shared/standalone/log/rails- 并行在 PM 中问机器人一些东西
- 立即回到控制台
- 查找此类消息:
- 一般聊天 =
tail -n 2000 production.log | grep {\"model\":\" - 视觉调用 =
tail -n 2000 production.log | grep {\"type\":\"image_url\"
- 一般聊天 =
- 检查 PM 中的“内心想法”
通过插件扩展聊天机器人的工具集
聊天机器人插件有能力在单独的插件中添加其他功能,因此您不必维护聊天机器人代码库的分叉。
示例功能插件在此:
但当然您可以将其添加到任何插件 …
此功能在此 PR 中添加
如果您需要帮助扩展聊天机器人,您可以雇佣我帮助您。
卸载插件 - 重要!
由于最近简化插件的努力,卸载插件所需的唯一步骤现在是删除克隆语句。
感谢您对插件的兴趣!
免责声明:我不对机器人的响应负责。请将插件视为 Beta 阶段,事情可能会出错。它会随着反馈而改进。但不一定是机器人的响应
请了解 LLM 的优缺点以及它们的能力和限制。它们非常擅长创建令人信服的文本,但经常在事实上出错。
重要隐私说明:您在论坛上写的任何内容可能会作为机器人扫描最后几篇帖子的一部分转发给 Open AI,一旦提示它回复(显然这仅限于当前主题或聊天频道)。虽然几乎肯定不会将其纳入其预训练模型,但它们会在其分析和日志记录中使用数据。请务必将此事实添加到您论坛的服务条款和隐私声明中。相关链接:https://openai.com/policies/terms-of-use, https://openai.com/policies/privacy-policy, https://platform.openai.com/docs/data-usage-policies
版权:Open AI 在此处发表了关于版权的声明:https://help.openai.com/en/articles/5008634-will-openai-claim-copyright-over-what-outputs-i-generate-with-the-api
TODO/路线图项目
- 添加前端和后端测试

- 添加“机器人打字”指示器和“响应流”(@Aizada_M, @MarcP)

- 忘记提及机器人?让机器人回应添加其 @ 提及的编辑(@frold)
- 添加徽章?您确实提到了 @botname(@frold)
- 添加设置以包含类别和置顶帖子提示?(@Ed_S)
- 同样,每个消息历史提示的简介?(@Ed_S, @codergautam)。这甚至有效吗。让我们看看证据。
- 使用此更好的代码库更新 Discourse Frotz?
转向使用。pgvector而不是pgembedding进行向量搜索,因为前者现在支持快速 HNSW 查找
添加语义搜索,以便机器人可以阅读您的论坛帖子并成为“专家”

添加代理行为以减少幻觉并利用可靠的事实信息。
添加额外逻辑将疑似用户名转换为 @ 提及(@frold)
添加 GPT-4 支持(当 Open AI 认为我值得访问时!
)
添加自定义模型名称支持。
添加选项在将文本传递给 API 之前从帖子中删除引号。
改善 Open AI 返回错误状态时的错误透明度和处理
添加超时 API 请求的重试功能
添加对 ChatGPT 的支持
将插件 Lint 到 Discourse 核心标准
添加 CI 工作流
添加设置以影响机器人响应的性质(例如,有多疯狂)。
包含主题标题和第一个帖子以提示
添加设置从原始帖子/消息数据切换到 cooked,以潜在地更好地利用网络训练数据(@MarcP 的建议)。注意:可能会花费更多并限制返回的内容,因为输入令牌被计数且 cooked 大得多。我想我们放弃了这个想法
鸣谢:
- 感谢 @MarcP 的热情支持和详细的测试反馈。
- 为 新兴的 Open AI Ruby API 标准 做出贡献的家伙,这利用了它
- 浮动按钮设计主要取自 Discourse 自己的 https://github.com/discourse/material-design-stock-theme(所以它们目前不兼容,哎呀!)
- 夹具代码基于 @vinothkannans 的工作 在此
- 如果 @P16 没有在很久以前雇用我帮助他制作聊天机器人,这可能不存在
*它仍然使用 OpenAI 的聊天 GPT 引擎,但现在可以利用本地功能和来自 API 调用的数据来限制幻觉。















