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 是否适用于多语言(或非英语)网站?
Falco
(Falco)
3
是的,我在它被悄悄分享到 GitHub 的那周就试用了,效果很好。还在等它登上 MTEB 排行榜,因为我上次看的时候还没有。
不过,我们有大型托管的 Discourse 实例在使用该插件附带的多语言模型 e5,它的表现非常好。
1 个赞
谢谢,你们有计划为嵌入式内容启用开源自定义端点吗?我正尝试在 Huggingface 上使用这些模型。
Falco
(Falco)
5
抱歉,我不太明白您的意思。本主题是关于如何为 Discourse AI 嵌入运行开源模型的指南。
哦,抱歉。我正在尝试使用 HuggingFace 自定义端点的一个开源模型,我想知道这是否可行,或者在不久的将来是否有计划支持 
fokx
7
要检查它是否正常工作,以下命令对我来说是有效的(使用 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 个赞
Isambard
(Isambard)
9
为了节省空间,可以使用量化嵌入吗?我想使用二进制量化嵌入来真正减小存储大小。经过一些测试,我获得了超过 90% 的性能,存储空间减少了 32 倍!
1 个赞
Falco
(Falco)
10
几周前,我们开始默认使用半精度(存储空间减半)来存储嵌入,并对索引使用二进制量化(小32倍),因此只需将您的站点更新到最新版本,即可大幅减少磁盘使用量。
3 个赞
Falco
(Falco)
12
我们计划以与 LLM 相同的方式使 embeddings 可配置,因此任何模型将很快兼容。
4 个赞
Isambard
(Isambard)
13
如果其他人遇到本地网络上的端点(例如 192.168.x.x)问题——似乎这些端点被 discourse 阻止了(大概是为了安全原因),需要绕过阻止。我花了几个小时才弄明白这一点!
1 个赞
Isambard
(Isambard)
14
@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 来包含新模型,还是我需要更改其他东西?
Isambard
(Isambard)
15
@Falco 我尝试添加了模型并提交了一个拉取请求。如果我做错了什么,请原谅,因为我并不是真正的软件开发人员。我希望你能看看它是否可以被包含进来。
不幸的是,我无法让它与 TEI 一起工作。我可以让 all-mpnet 与 TEI 一起工作,但我认为我为让 mxbai 工作所做的事情有些不对。
顺便问一下,有没有可能支持 https://github.com/michaelfeil/infinity 作为嵌入服务器?
编辑:我看到这将会很混乱,因为数据库中的 HNSW 索引似乎是硬编码的,所以新的模型需要附加在最后,以避免干扰顺序,并且每个新模型都需要添加自己的索引。
Falco
(Falco)
16
Isambard
(Isambard)
17
我没有跟进 TEI,所以不会提及我最近未测试过的优势,但就我最近看到的几点而言:
- 硬件支持:infinity 比 TEI 拥有更好的 GPU 支持
- infinity 服务器可以在单个服务器上托管多个嵌入模型(除非我在 TEI 中错过了这一点)
这非常好。如果你还没有尝试过,你应该看看!
1 个赞
sam
(Sam Saffron)
19
你好 Michael 
@roman 正在忙于重构我们的 embedding 配置,地址是:
我们很快就会完成,一旦完成,添加对 inifinity 的支持将是微不足道的。
我仍然在思考多模型 embedding,当尝试对 PDF 进行 RAG 时,它会为你提供一个捷径,因为你只需将其处理成图像并嵌入每个图像,从而避免了对 OCR 或昂贵的、由 LLM 驱动的图像到文本的需求。
一旦我们完成这个 PR,我们将非常乐意在 embedding 配置中添加 infinity 支持(以及多模型支持)。
感谢你的出现 
4 个赞
Isambard
(Isambard)
20
我想知道构建 LiteLLM 支持是否可以提供捷径,因为这样您就可以受益于 LiteLLM 支持的所有模型。其他项目似乎也嵌入了它。