1. FastGPT 知识库检索链路为什么要接 M3E 和 bge-reranker-large
FastGPT 的知识库检索分两段:第一段是向量召回,把用户问题转成向量,去向量库里找语义相近的 chunk;第二段是重排,把召回的一批候选按与问题的相关度重新打分排序,取 topN 喂给大模型。向量模型决定「能不能找得到」,重排模型决定「找得准不准」。很多人的 FastGPT 检索效果差,不是知识库切得不好,而是向量模型用了默认的通用 embedding,中文语义匹配偏弱,加上没有重排,top3 里混进一堆不相关片段,大模型自然答偏。
M3E 是中文场景下表现稳定的开源向量模型,bge-reranker-large 是 BGE 系列里重排效果比较扎实的一档。把这两个接进 FastGPT,检索命中率和答案质量会有肉眼可见的变化。这篇聚焦 FastGPT 知识库检索链路,交付可复制的 config 骨架与 settings.json 配置片段,并给出检索命中率与重排效果的验证动作,目标是一次跑通接入流程。
适合谁看:已经在本地或容器环境跑着 FastGPT、想替换默认向量模型和加重排的开发者;用 Docker Compose 部署 FastGPT、对 config.json 和 OneAPI 配置不陌生的同学。如果你还没部署 FastGPT,建议先把基础环境跑起来再回来看这篇。
TaoToken 在这里的角色是统一 Key 和 API 通道管理。向量模型和重排模型如果都走本地容器,Key 是本地随便设的;但一旦你想把部分模型调用切到在线通道,或者团队里多人共用一套模型入口,就需要一个统一的 Key 管理点。TaoToken 提供 OpenAI 兼容的 API 通道,把模型调用收敛到一个 Key 上,config 里改 requestUrl 和 requestAuth 就能切换,不用每个模型单独维护一套凭证。
2. TaoToken 前置准备:Key、通道与 config 的关系
先说清楚 FastGPT 里模型配置的层次,不然后面改 config 容易懵。FastGPT 的模型定义在config.json里,每个模型条目包含 model、name、requestUrl、requestAuth 等字段。requestUrl 指向实际提供服务的地址,requestAuth 是访问凭证。OneAPI 是 FastGPT 默认的模型网关,它把多个上游模型的 Key 统一成一套 FastGPT 内部 Key,FastGPT 只认 OneAPI 的地址和 Key。
TaoToken 的定位和 OneAPI 类似,都是 OpenAI 兼容的模型通道,区别在于 TaoToken 把 Key 管理和通道切换做得更轻。你可以把 M3E 和 bge-reranker-large 的调用都指向 TaoToken 的 API 地址,用同一个 Key 鉴权,config 里只维护一份 requestAuth。这样做的直接好处是:换模型、加模型、调额度都在 TaoToken 控制台完成,FastGPT 侧只改 model 名。
需要准备的东西:
- 一个 TaoToken 账号,拿到 API Key。控制台地址:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- FastGPT 已经跑起来,能进 config.json 所在目录
- Docker 环境,能拉镜像、能进 FastGPT 所在网络
- 如果走本地 M3E 容器,确认机器有 GPU 或愿意用 CPU 模式
API Key 的创建入口在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,创建后复制保存,后面 config 里的 requestAuth 要用。注意 Key 只在创建时完整显示一次,丢了就重新建一个。
注意:TaoToken 的 API 基础地址是 https://taotoken.net/api ,不带任何路径后缀。config 里的 requestUrl 要拼到具体端点,比如向量模型是 /v1/embeddings,重排是 /v1/rerank。别把基础地址直接填进 requestUrl,会 404。
3. 可复制配置:M3E 向量模型接入
M3E 有两种接法:本地容器跑 m3e-large-api,或者走 TaoToken 的在线 embedding 通道。本地容器适合数据不出内网、有 GPU 的场景;在线通道适合不想维护容器、想快速验证的场景。两种都给出配置。
3.1 本地容器跑 M3E
先拉镜像并重命名,方便后面引用:
docker pull registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api docker tag registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api stawky/m3e-large-api docker rmi registry.cn-hangzhou.aliyuncs.com/fastgpt_docker/m3e-large-api启动容器,把它加入 FastGPT 所在网络。网络名一般是fastgpt_fastgpt,用docker network ls确认一下:
# GPU 模式 docker run -d -p 6008:6008 --gpus all --name m3e \ --network fastgpt_fastgpt stawky/m3e-large-api # CPU 模式(没有 GPU 时用这个) docker run -d -p 6008:6008 --name m3e \ --network fastgpt_fastgpt stawky/m3e-large-api容器起来后,在 FastGPT 的 config.json 里加向量模型条目。找到vectorModels数组,追加:
{ "model": "m3e", "name": "M3E", "price": 0.1, "defaultToken": 500, "maxToken": 1800, "requestUrl": "http://m3e:6008/v1/embeddings", "requestAuth": "sk-aaabbbcccdddeeefffggghhhiiijjjkkk" }这里的 requestAuth 是本地容器随便设的,m3e-large-api 默认不校验,填个占位符就行。requestUrl 里的m3e是容器名,因为两个容器在同一 Docker 网络里,可以直接用容器名当域名解析。
3.2 走 TaoToken 在线通道
如果不想跑本地容器,把 requestUrl 指向 TaoToken,requestAuth 换成 TaoToken 的 Key:
{ "model": "m3e", "name": "M3E", "price": 0.1, "defaultToken": 500, "maxToken": 1800, "requestUrl": "https://taotoken.net/api/v1/embeddings", "requestAuth": "你的 TaoToken API Key" }model 字段要填 TaoToken 侧支持的模型名,具体以控制台模型列表为准。这样 FastGPT 调 embedding 时走 TaoToken 通道,Key 统一管理,后面加重排模型也是同一个 Key。
3.3 重排模型 bge-reranker-large 配置
本地容器方式,先拉镜像重命名:
docker pull registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-large:v0.1 docker tag registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-large:v0.1 jokerwho/bge-rerank-large docker rmi registry.cn-hangzhou.aliyuncs.com/fastgpt/bge-rerank-large:v0.1启动容器,注意 ACCESS_TOKEN 要和 config 里的 requestAuth 一致:
# GPU 模式(推荐) docker run -d -p 6006:6006 --gpus all --name reranker \ -e ACCESS_TOKEN=sk-aaabbbcccdddeeefffggghhhiiijjjkkk \ --network fastgpt_fastgpt jokerwho/bge-rerank-large # CPU 模式 docker run -d -p 6006:6006 --name reranker \ -e ACCESS_TOKEN=sk-aaabbbcccdddeeefffggghhhiiijjjkkk \ --network fastgpt_fastgpt jokerwho/bge-rerank-largeconfig.json 里加reRankModels数组:
{ "reRankModels": [ { "model": "bge-reranker-large", "name": "检索重排-large", "charsPointsPrice": 0, "requestUrl": "http://reranker:6006/v1/rerank", "requestAuth": "sk-aaabbbcccdddeeefffggghhhiiijjjkkk" } ] }如果走 TaoToken 在线重排通道,requestUrl 换成https://taotoken.net/api/v1/rerank,requestAuth 换成 TaoToken Key,model 填 TaoToken 侧支持的重排名。这样向量和重排共用一个 Key,config 里只维护一份凭证。
改完 config.json 后重启 FastGPT:
docker-compose down docker-compose up -d或者用 Docker Desktop 手动 pause 再 restart。重启后进 FastGPT 后台,知识库的索引模型和检索重排模型下拉框里应该能看到新加的条目。
4. 验证请求与成功结果
配置改完不代表生效,得实际发请求验证。分三步:先验向量模型,再验重排模型,最后验检索链路。
4.1 验向量模型
直接 curl 本地 M3E 容器:
curl http://localhost:6008/v1/embeddings \ -H "Content-Type: application/json" \ -d '{"model":"m3e","input":"FastGPT 知识库检索"}'成功返回里会有data[0].embedding数组,长度是 1024(m3e-large 的维度)。如果返回 404,检查 requestUrl 是不是漏了/v1/embeddings;如果连接拒绝,检查容器是否在运行、端口是否映射。
走 TaoToken 通道的话,把地址换成https://taotoken.net/api/v1/embeddings,Header 加Authorization: Bearer 你的Key:
curl https://taotoken.net/api/v1/embeddings \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的TaoToken Key" \ -d '{"model":"m3e","input":"FastGPT 知识库检索"}'4.2 验重排模型
curl http://localhost:6006/v1/rerank \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-aaabbbcccdddeeefffggghhhiiijjjkkk" \ -d '{ "model": "bge-reranker-large", "query": "FastGPT 怎么接入向量模型", "documents": ["FastGPT 接入 M3E 的步骤", "今天天气不错", "bge-reranker-large 配置方法"] }'成功返回里results数组按相关度排序,第一条应该是「FastGPT 接入 M3E 的步骤」,第二条是「bge-reranker-large 配置方法」,「今天天气不错」排最后。如果顺序不对,说明重排模型没生效,检查 requestUrl 和 requestAuth。
4.3 验检索链路
进 FastGPT 后台,建一个测试知识库,上传一份包含明确事实的文档,比如「TaoToken 的 API 基础地址是 https://taotoken.net/api 」。然后在知识库搜索框输入相关问题,看返回的 chunk 是否命中。开启重排前后各测一次,对比 top3 的相关性。
实测下来,开启 bge-reranker-large 后,top3 里不相关片段的占比明显下降。你可以用同一个问题测 10 次,记录命中正确 chunk 的次数,算个粗略命中率。这个动作比看日志直观。
5. 本篇常见错排查
接入过程里踩的坑集中在几个地方,按报错现象对照排查。
404 Not Found:最常见。requestUrl 拼错,比如只填了http://m3e:6008没加/v1/embeddings,或者 TaoToken 通道只填了基础地址没加端点。检查 config 里每个模型的 requestUrl 是否完整。
401 Unauthorized:requestAuth 和实际服务的 Key 不一致。本地重排容器启动时-e ACCESS_TOKEN=设的值,必须和 config 里 requestAuth 完全一致。走 TaoToken 通道时,确认 Key 没复制错、没过期。
容器名解析失败:config 里写http://m3e:6008但 FastGPT 容器和 m3e 容器不在同一网络。用docker network inspect fastgpt_fastgpt看两个容器是否都在里面。不在的话,docker network connect fastgpt_fastgpt m3e手动接进去。
重启后配置没生效:config.json 改了但没重启 FastGPT,或者改的是错误的 config 文件。FastGPT 的 config 一般在projects/app/data/config.json或 Docker 挂载卷里,确认路径。
重排不生效:知识库的检索配置里没勾选重排模型,或者reRankModels数组格式写错。检查 JSON 语法,数组里每个对象字段完整。
GPU 模式启动失败:机器没装 NVIDIA Container Toolkit,或者驱动版本不匹配。先用 CPU 模式跑通流程,再折腾 GPU。
向量维度不匹配:换了向量模型后,旧知识库的向量维度对不上,检索报错。换模型后需要重新索引知识库,这个动作在 FastGPT 后台知识库设置里触发。
提示:排查时优先看 FastGPT 容器日志
docker logs fastgpt,请求失败的具体原因一般会打出来,比猜快。
6. 统一 Key 管理与后续接入
把 M3E 和 bge-reranker-large 接进 FastGPT 后,模型调用链路就通了。如果两个模型都走 TaoToken 通道,config 里只维护一份 requestAuth,换模型、调额度、加新模型都在控制台完成,FastGPT 侧只改 model 名。这种收敛对团队协作尤其有用,不用每个人手里攥一堆上游 Key。
后续如果要接更多模型,比如换更强的 embedding 或者加一个 rerank 备选,流程一样:在 TaoToken 控制台确认模型可用,config 里加条目,重启 FastGPT。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有各端点的参数说明和示例。
如果你还在用 OneAPI 管 Key,可以先把重排模型切到 TaoToken 通道试水,验证没问题再把向量模型也切过来。切换过程不影响已有知识库,只要模型名和维度对得上,检索链路不用重建。