为 DiscourseAI 自托管嵌入内容

Discourse AI 插件有许多功能需要嵌入(embeddings)才能正常工作,例如“相关话题”、“AI 助手”、“分类和标签建议”等。虽然您可以使用第三方 API,例如 配置 OpenAI 的 API 密钥配置 Cloudflare Workers AI 的 API 密钥配置 Google Gemini 的 API 密钥,但 Discourse AI 自第一天起就被设计为不局限于这些服务。

使用 HuggingFace TEI 运行

HuggingFace 提供了一个出色的容器镜像,可以帮助您快速启动并运行。

例如:

mkdir -p /opt/tei-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-en-v1.5

这应该可以帮助您使用本地实例的 BAAI/bge-large-en-v1.5 运行起来,这是一个性能非常好的开源模型。

您可以使用以下命令检查它是否正常工作:

curl -X POST \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings" }'

在正常运行情况下,这应该会返回一个浮点数数组。

使其可用于您的 Discourse 实例

大多数情况下,您会因为 GPU 加速而在专用服务器上运行此服务。在这样做时,我建议运行一个反向代理,进行 TLS 终止,并保护端点,使其只能被您的 Discourse 实例连接。

配置 DiscourseAI

Discourse AI 现在使用一个完全可配置的嵌入定义系统,类似于 LLM 的配置方式。要设置您的自托管端点:

  1. 导航到 管理 → 插件 → Discourse AI → 嵌入(Embeddings)
  2. 点击 新建(New) 以创建一个新的嵌入定义。
  3. 选择一个与您的模型匹配的 预设(preset)(例如 bge-large-enbge-m3multilingual-e5-large),或选择 手动配置(Configure manually) 以用于任何其他模型。
  4. URL 设置为指向您的自托管 TEI 服务器(例如 https://your-tei-server:8081)。
  5. 使用 测试(Test) 按钮在保存前验证连接性。
  6. 保存后,将 ai_embeddings_selected_model 设置为您新的嵌入定义。

配置完成后,Discourse 将通过计划的后台作业自动回填现有话题的嵌入。如果您有大量积压工作,可以增加隐藏设置 ai_embeddings_backfill_batch_size(默认值:250)以更快地处理话题。

11 个赞

模型 bge-m3 是否适用于多语言(或非英语)网站?

是的,我在它被悄悄分享到 GitHub 的那周就试用了,效果很好。还在等它登上 MTEB 排行榜,因为我上次看的时候还没有。

不过,我们有大型托管的 Discourse 实例在使用该插件附带的多语言模型 e5,它的表现非常好。

1 个赞

谢谢,你们有计划为嵌入式内容启用开源自定义端点吗?我正尝试在 Huggingface 上使用这些模型。

抱歉,我不太明白您的意思。本主题是关于如何为 Discourse AI 嵌入运行开源模型的指南。

哦,抱歉。我正在尝试使用 HuggingFace 自定义端点的一个开源模型,我想知道这是否可行,或者在不久的将来是否有计划支持 :slight_smile:

要检查它是否正常工作,以下命令对我来说是有效的(使用 BAAI/bge-m3 模型):

curl -X 'POST' \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings"}'

顺便说一句,您也可以使用 Swagger Web 界面:http://localhost:8081/docs/

2 个赞

这是一个不错的嵌入式服务器:

1 个赞

为了节省空间,可以使用量化嵌入吗?我想使用二进制量化嵌入来真正减小存储大小。经过一些测试,我获得了超过 90% 的性能,存储空间减少了 32 倍!

1 个赞

几周前,我们开始默认使用半精度(存储空间减半)来存储嵌入,并对索引使用二进制量化(小32倍),因此只需将您的站点更新到最新版本,即可大幅减少磁盘使用量。

3 个赞

请也添加:

到支持的嵌入模型中?

我们计划以与 LLM 相同的方式使 embeddings 可配置,因此任何模型将很快兼容。

4 个赞

如果其他人遇到本地网络上的端点(例如 192.168.x.x)问题——似乎这些端点被 discourse 阻止了(大概是为了安全原因),需要绕过阻止。我花了几个小时才弄明白这一点!

1 个赞

@Falco 太好了。在此期间,如果我想尝试添加一个新的嵌入模型,我只需要添加:

 lib/embeddings/vector_representations/mxbai-embed-xsmall-v1.rb
 lib/tokenizer/mxbai-embed-xsmall-v1.rb
 tokenizers/mxbai-embed-xsmall-v1.json

并修改 lib/embeddings/vector_representations/base.rb 来包含新模型,还是我需要更改其他东西?

@Falco 我尝试添加了模型并提交了一个拉取请求。如果我做错了什么,请原谅,因为我并不是真正的软件开发人员。我希望你能看看它是否可以被包含进来。

不幸的是,我无法让它与 TEI 一起工作。我可以让 all-mpnet 与 TEI 一起工作,但我认为我为让 mxbai 工作所做的事情有些不对。

顺便问一下,有没有可能支持 https://github.com/michaelfeil/infinity 作为嵌入服务器?

编辑:我看到这将会很混乱,因为数据库中的 HNSW 索引似乎是硬编码的,所以新的模型需要附加在最后,以避免干扰顺序,并且每个新模型都需要添加自己的索引。

强烈建议等待几周,直到我们发布对可配置嵌入的支持。

当我们发布可配置嵌入时,这应该可以正常工作,但出于好奇,与 GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models 相比,它会带来什么?

我没有跟进 TEI,所以不会提及我最近未测试过的优势,但就我最近看到的几点而言:

  • 硬件支持:infinity 比 TEI 拥有更好的 GPU 支持
  • infinity 服务器可以在单个服务器上托管多个嵌入模型(除非我在 TEI 中错过了这一点)

这非常好。如果你还没有尝试过,你应该看看!

1 个赞

一位朋友刚刚给我发了这条线索的私信。

一些优点/缺点:

  • Infinity 支持多模态嵌入(即发送图像/音频)
  • AMD GPU 支持
  • 同一个容器中支持多个模型(通过 model 参数控制模型)。
  • 更多数据类型,例如权重的 int8 量化(这大多无关紧要,激活内存更大)
  • 新模型通常通过 Hugging Face 存储库中提供的“自定义建模代码”发布。Infinity 在需要时会读取此 PyTorch 代码。这将帮助您避免持续的“你能支持 xyz 模型吗”的问题)
  • 支持更多模型(例如,用于 MixedBread 的 debertav2)

缺点:

  • TEI 的冷启动时间更好
3 个赞

你好 Michael :wave:

@roman 正在忙于重构我们的 embedding 配置,地址是:

我们很快就会完成,一旦完成,添加对 inifinity 的支持将是微不足道的。

我仍然在思考多模型 embedding,当尝试对 PDF 进行 RAG 时,它会为你提供一个捷径,因为你只需将其处理成图像并嵌入每个图像,从而避免了对 OCR 或昂贵的、由 LLM 驱动的图像到文本的需求。

一旦我们完成这个 PR,我们将非常乐意在 embedding 配置中添加 infinity 支持(以及多模型支持)。

感谢你的出现 :hugs:

4 个赞

我想知道构建 LiteLLM 支持是否可以提供捷径,因为这样您就可以受益于 LiteLLM 支持的所有模型。其他项目似乎也嵌入了它。