Discourse AI - 嵌入

:bookmark: 本主题介绍 Discourse AI 插件的 Embeddings 模块的配置。它解释了什么是嵌入 (embeddings),它们如何使用,以及如何设置它们。

:person_raising_hand: 所需用户级别:管理员

嵌入是 Discourse AI 插件的关键组成部分,它支持 相关主题AI 搜索 等功能。本指南将引导您完成在您的 Discourse 实例中设置和使用嵌入的过程。

什么是嵌入 (Embeddings)?

嵌入是文本的数值表示,用于捕捉语义含义。在 Discourse 中,它们用于:

  1. 在主题页面底部生成相关主题
  2. 实现语义搜索功能

设置嵌入 (Embeddings)

对于托管客户

如果您是托管客户,嵌入已预先配置好。您可以简单地启用依赖于它们的 AI 功能。

对于自托管实例

如果您是自托管,请参阅 Discourse AI 自托管指南 以获取详细的设置说明。

配置嵌入定义 (Embedding Definitions)

嵌入模型现在在管理员 UI 中配置为 嵌入定义 (Embedding Definitions)。导航到 AdminAI pluginEmbeddings 选项卡。添加新的嵌入定义时,您可以从预配置的 预设 (presets) 中选择,或手动配置一个。

可用预设包括:

  • text-embedding-3-large (OpenAI)
  • text-embedding-3-small (OpenAI)
  • text-embedding-ada-002 (OpenAI)
  • gemini-embedding-001 (Google)
  • bge-large-en (Hugging Face)
  • bge-m3 (Hugging Face)
  • multilingual-e5-large (Hugging Face)

每个嵌入定义包括:显示名称、提供商、URL、API 密钥(或 AI Secret)、分词器 (tokenizer)、维度、距离函数、最大序列长度以及可选的嵌入/搜索提示。

配置嵌入 (embeddings)

导航到 AdminPluginsDiscourse AI,确保启用以下设置。

  1. ai embeddings enabled:开启或关闭嵌入模块
  2. ai embeddings selected model:选择要用于生成嵌入的模型定义

可以调整的可选设置……

  • AI embeddings generate for pms:决定是否为私人消息生成嵌入
  • AI embeddings semantic related topics enabled:启用或禁用“相关主题”功能
  • AI embeddings semantic related topics:要显示的相关主题的最大数量
  • AI embeddings semantic related include closed topics:在相关主题结果中包含已关闭的主题
  • AI embeddings semantic related age penalty:对相关结果中的主题应用指数级年龄惩罚(0.0 禁用,值越高对旧主题的惩罚越大)
  • AI embeddings semantic related age time scale:年龄惩罚计算的时间尺度(以天为单位)(默认:365)
  • AI embeddings semantic search enabled:启用全页 AI 搜索
  • AI embeddings semantic quick search enabled:在搜索菜单弹出窗口中启用语义搜索选项
  • AI embeddings semantic search use hyde:为语义搜索启用 HyDE(假设文档嵌入)
  • AI embeddings semantic search hyde agent:启用 HyDE 时用于扩展搜索词的 AI 代理

提供商 (Providers)

Discourse AI 支持多种嵌入提供商:

  • OpenAI
  • Google
  • Hugging Face(用于开源/开放权重模型)
  • Cloudflare Workers AI

对于托管客户,Discourse 提供开箱即用的预配置(预置)嵌入定义。

功能 (Features)

相关主题 (Related Topics)

启用后,“相关主题”部分会出现在主题页面底部,链接到语义相似的讨论。

AI 搜索 (AI Search)

嵌入为全页搜索界面上的语义搜索选项提供支持。

语义搜索可以选择使用 HyDE(假设文档嵌入)。当通过 ai embeddings semantic search use hyde 启用时,搜索词会使用 ai embeddings semantic search hyde agent 中配置的 AI 代理进行扩展。然后,扩展后的搜索会被转换为向量,用于查找相似的主题。此技术会增加搜索的延迟,但可以提高结果质量。

在为 HyDE 选择代理时,请选择一个快速的模型,如 Gemini Flash、Claude Haiku、GPT-4o Mini 或最新的可用模型。

生成嵌入 (Generating embeddings)

嵌入会为新帖子自动生成。要为现有内容生成嵌入:

  1. Discourse 将通过每 5 分钟运行的计划作业自动填充旧主题的嵌入
  2. 填充过程按最近活动的顺序处理主题

常见问题 (FAQs)

问:相关主题是如何确定的?
答:相关主题完全基于嵌入,这些嵌入包括标题、分类、标签和帖子内容

问:我能从相关主题中排除某些主题吗?
答:是的,有一个站点设置可以将已关闭的主题从结果中移除

问:嵌入对历史帖子有效吗?
答:是的,系统会自动为您的所有内容填充嵌入

附加资源

17 个赞

干得好,首先感谢您,但我似乎看不到“主题”下的相关主题,我的设置是这样的,我添加了一个 openai 密钥。语义搜索有效,但如何才能在主题下显示相关文章?

如果您想使用 OpenAI 进行嵌入,则必须将 ai embeddings model 设置为 text-embedding-ada-002

3 个赞

生成嵌入式作业的计划是什么?从代码来看,嵌入式似乎仅在查看页面且缺少嵌入式时生成。有没有办法在启用该功能时为整个站点生成嵌入式?

2 个赞

您还可以运行 rake ai:embeddings:backfill 来预先生成所有主题的嵌入。

8 个赞

建议

有时阅读一个主题,你对大部分背景知识都了解,但也有一些提及的内容是你不知道的。虽然有总结功能可以总结到目前为止的整个主题,但还有一个有用的功能是人工智能选项,它可以在顶部附近插入该主题的词汇表,并且如果用户选择一个词或短语希望人工智能将其包含在词汇表中,则会更新该词汇表。


今天阅读这个主题时,有一个我不知道的参考资料,所以我查了一下,并回复了一个参考资料。虽然我知道其余的参考资料,但我确定还有其他参考资料,特别是那些对大型语言模型等不熟悉的人,他们会不知道许多提及的参考资料,如果人工智能能帮助他们,他们会更频繁地访问该网站。

虽然我知道这个起始帖子中的 RAG 是什么意思,但有多少人真正知道呢?

什么是 RAG (点击三角形展开)

领域特定的聊天机器人如何工作?检索增强生成 (RAG) 概述


注意:不知道应该将此帖子发布到哪个主题,但由于它需要嵌入才能工作,所以发布在这里。如果发布到其他地方更合适,或者随着 Discourse AI 插件的变化,请移动此帖子。

1 个赞

确定“相关主题”时,嵌入是唯一的变量吗?还是会考虑其他因素(例如作者、主题分数、主题年龄、类别等)?

3 个赞

只有嵌入,但它们包含标题、类别、标签和帖子。还有一个站点设置可以从结果中删除已关闭的主题。

5 个赞

7 个帖子被拆分到一个新主题:Is full page semantic search only in English?

2 篇帖子已拆分为新主题:AI 语义搜索与关键字搜索之间的搜索延迟差异

我希望几个月前就能找到这个。我已经使用 bge-small-en-v1.5 创建了嵌入,并将它们托管在外部数据库中。

我将看看是否能将其“硬塞”到这个“标准”设置中!

我在最近的版本中发现了一个小错误,导致 rake ai:embeddings:backfill 失败:

root@nbg-webxj:/var/www/discourse# rake ai:embeddings:backfill
rake aborted!
NameError: uninitialized constant Parallel (NameError)

  Parallel.each(topics.all, in_processes: args[:concurrency].to_i, progress: "Topics") do |t|
  ^^^^^^
/var/www/discourse/plugins/discourse-ai/lib/tasks/modules/embeddings/database.rake:27:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => ai:embeddings:backfill
(See full trace by running task with --trace)

我怀疑罪魁祸首是 parallel gem 没有安装在这个插件中,也没有安装在 Discourse 核心中(只在 if ENV["IMPORT"] == "1" 块中找到一个: gem "parallel", require: false)。

我发现 ruby-progressbar gem 也需要执行 rake ai:embeddings:backfill

我在 Github 上做了一个简单的 PR:

2 个赞

请注意,根据 GitHub 上 Falco 的说法,此 rake 方法似乎已被降级/半弃用:

感谢您的 PR @fokx,但我无意中遗漏了它们,因为 rake 任务已不再受欢迎,只有经验丰富的操作员在极少数情况下才能使用,他们可以轻松地在带外安装它们。

语义搜索选项是否不再显示在该下拉菜单中,而是通过 AI 开关来理解或启用?

1 个赞

您能否为我确认一下,嵌入式功能是安装后才对帖子生效,还是也能用于对历史帖子进行语义搜索?我希望是后者!谢谢。

1 个赞

稍后进行,因为它将自动回填您所有内容的嵌入。

4 个赞

我正在尝试使用 Gemini Flash 设置 AI Embeddings,但无法使其正常工作。我找不到所有设置字段的详细说明/示例,因此我可能错过了一些重要的字段。我不知道“ai_embeddings_model”设置是否是必需的,但如果我将其设置为“gemini”,我会收到以下错误……

我找不到 ai_gemini_api_key 设置。我已经将 Gemini Flash 设置为一个带有 API 密钥的 LLM,并且它在其他地方(例如摘要)可以正常工作,但我假设它需要在这里的其他地方输入 API 密钥?

我想这也能与OpenAI一起使用,对吗?

如果能支持他们的Batch API(有50%的折扣)那就太好了。

是的,但现在我们会在后台自动进行回填,所以这不是强制性的。

对于注重价格的用户,我们支持很棒的开放权重模型,您可以在自己的硬件上运行它们。

1 个赞

谢谢。我是否正确地理解,回填(backfill)是指进行向量化?在模型之间切换时,是否需要重新计算向量(它们是“专有的”)?我猜是的。

了解使用 OpenAI API 的成本与投资带 GPU 的服务器和开源解决方案的成本如何对比,将会很有用。是否有公式或任何方法可以估算使用的 token 数量?我们只将 API 用于向量化帖子,而不是用于计算向量距离,对吗?那么,使用的 token 数量取决于我们有多少内容,对吗?

我假设对于相关主题和 AI 驱动的搜索,所有帖子只需要向量化一次,因此我可以计算帖子表中单词的总数并推导出所需的 token 数量。每天添加帖子也适用相同的过程。我现在暂时忽略搜索短语。