Self-Hosting Embeddings for DiscourseAI

Discourse AI 插件有许多需要嵌入才能工作的特性,例如相关主题、AI 搜索、AI 助手类别和标签建议等。虽然您可以使用第三方 API,例如 配置 OpenAI API 密钥配置 Cloudflare Workers AI API 密钥配置 Google Gemini API 密钥,但 Discourse AI 从第一天起就不是为了被锁定在这些服务中而构建的。

使用 HuggingFace TEI 运行

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

例如:

mkd ir -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 http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    "{ \"inputs\": \"Testing string for embeddings\" }"

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

使其可供您的 Discourse 实例使用

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

配置 DiscourseAI

Discourse AI 包含用于配置开源模型推理服务器的站点设置。您应该在 AI 插件的管理员设置的“嵌入”选项卡中将其指向您的服务器。

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 支持的所有模型。其他项目似乎也嵌入了它。