1. 本地推理端点为什么总在 FastGPT 里连不通
OLLAMA 装完、qwen2.5:3b 也拉下来了,ollama run qwen2.5:3b在终端里聊得挺顺,可一旦把 FastGPT 接上去,知识库索引就卡在「索引中」,问答接口报 500,日志里翻来覆去就是连接被拒绝或者模型不存在。这个场景我遇到过不止一次,问题基本不在 OLLAMA 本身,而在「谁去访问谁」这层网络关系上。
FastGPT 跑在 Docker 容器里,OLLAMA 跑在宿主机上,容器里的localhost指的是容器自己,不是你的 Windows 主机。所以你在 OneAPI 渠道里填http://localhost:11434,容器发起请求时找的是它自己那个 11434 端口,当然连不上。同理,M3E 向量模型如果没和 FastGPT 放进同一个 Docker 网络,FastGPT 也解析不到m3e这个主机名。
这篇手记要解决的就是这条链路:OLLAMA 提供本地推理、M3E 提供向量化、FastGPT 做知识库编排,中间用 OneAPI 做统一模型网关,最后把本地推理端点改到 TaoToken 通道,让本地部署和统一 API 通道协同工作。适合已经在本地跑通 OLLAMA、但卡在 FastGPT 接入环节的人,也适合想把本地模型和云端通道混用、做统一出口的开发者。
核心检索词先摆出来:OLLAMA 本地推理服务、FASTGPT 知识库、M3E 向量模型、大模型本地化部署、统一 API 通道对接。这几个词贯穿全文,你按顺序操作就能复现。
先说清楚整体数据流,不然后面配置容易乱。用户提问进入 FastGPT,FastGPT 把问题发给 OneAPI,OneAPI 根据模型名路由:对话类请求转发给 OLLAMA 的 11434 端口,向量化请求转发给 M3E 的 6008 端口。知识库索引阶段,FastGPT 调 M3E 把文档切片转成向量存进 pgvector;问答阶段,FastGPT 先用 M3E 把问题向量化,检索出相关片段,再连同问题一起发给 OLLAMA 生成回答。
这条链路里任何一个环节的地址写错,表现都是「索引不动」或「问答超时」。所以下面每一步我都会把地址和端口写全,你照着填就行。
另外提一句,本地 OLLAMA 的并发和上下文能力有限,3b 模型做知识库问答够用,但如果你的文档量大、问题复杂,可以考虑把对话模型这一层切到 TaoToken 通道,本地只保留 M3E 做向量化,这样既省本地显存,又能用上更强的模型。这个切换在 OneAPI 里就是改一个渠道的 Base URL,后面会讲。
2. TaoToken 通道与本地 OLLAMA 的接入准备
在动手改配置之前,先把 TaoToken 这条通道准备好。它的作用是给 OneAPI 提供一个统一的 OpenAI 兼容出口,这样 FastGPT 侧不用关心背后到底是本地 OLLAMA 还是云端模型,只认 OneAPI 的地址就行。
先拿 Key。打开 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=apikeys ,登录后创建一个 API Key,复制出来存好。这个 Key 就是后面 OneAPI 渠道里的密钥,格式一般是sk-开头的一串字符。
然后确认你要用的模型 ID。不同通道支持的模型名不一样,别凭记忆填。打开模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=chat ,在模型选择里看一下当前可用的模型标识,比如常见的对话模型 ID。这个 ID 要原样填到 OneAPI 的渠道模型列表里,大小写和连字符都不能错。
Base URL 这块要记牢:OneAPI 里配置 TaoToken 渠道时,Base URL 填https://taotoken.net/api,注意结尾不要多加/v1,也不要加 UTM 参数。很多 401 就是因为把带参数的完整链接粘进去了,网关认不出来。
如果你打算长期用这条通道跑编码类任务或者 Agent 流程,可以顺手看一下 Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=codingplan ,里面有适合持续调用的方案说明。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc ,遇到参数疑问可以对照查。
准备工作就三样:一个 API Key、一个确认过的模型 ID、一个正确的 Base URL。这三样齐了,后面 OneAPI 里加渠道就是几分钟的事。
这里要提醒一个容易踩的坑:TaoToken 是统一 API 通道,不是让你把本地 OLLAMA 替换掉。本地 OLLAMA 继续跑你的私有模型,TaoToken 通道作为补充出口,两者在 OneAPI 里是并列的渠道。FastGPT 侧看到的都是 OneAPI 的地址,具体走哪条路由由模型名决定。这样设计的好处是,你可以在同一个知识库里,用本地模型做向量化省钱,用通道模型做生成提质。
还有一点,OneAPI 的渠道测试功能很好用。每加一个渠道,点一下测试,通了再往下走。别等 FastGPT 报错了才回头查,那样排查成本高得多。
3. 可复制的 OLLAMA、M3E 与 OneAPI 配置片段
这一节是全文最干的部分,所有配置我都给成可直接复制的片段,路径和原文保持一致。你按顺序改,改完重启容器。
先确认 OLLAMA 在宿主机上监听正常。默认安装后它监听127.0.0.1:11434,容器访问不到。需要让它监听所有网卡。Windows 下设置环境变量OLLAMA_HOST=0.0.0.0:11434,然后重启 OLLAMA 服务。验证命令:
curl http://host.docker.internal:11434/api/tags能返回模型列表就说明宿主机端口通了。注意这里用的是host.docker.internal,这是 Docker Desktop 自动在容器 hosts 里生成的域名,指向宿主机。你在 OneAPI 渠道里填 Base URL 时就用这个域名,别填localhost,也别填局域网 IP,实测局域网 IP 会提示连接被拒绝。
接下来是 OneAPI 里加 OLLAMA 渠道。登录 OneAPI,地址http://localhost:3001,默认账号 root,密码 123456,登录后立刻改密码。进入渠道页面,新建渠道,类型选「自定义渠道」,Base URL 填:
http://host.docker.internal:11434模型列表里填你本地拉下来的模型名,带参数,比如qwen2.5:3b。密钥随便填一个非空字符串即可,OLLAMA 本地不校验。填完点测试,通了再保存。
然后是 M3E 渠道。M3E 用 Docker 启动,并且要加入 FastGPT 所在的网络。先查网络名:
docker network ls找到 FastGPT 用的那个网络,通常是fastgpt_fastgpt或者类似名字。启动 M3E:
docker run -d --restart always -p 6008:6008 --name m3e --network fastgpt_fastgpt stawky/m3e-large-api有 GPU 的话加--gpus all。启动后在 OneAPI 里新建渠道,类型选「自定义渠道」,Base URL 填:
http://m3e:6008模型名填m3e,密钥填sk-aaabbbcccdddeeefffggghhhiiijjjkkk。同样点测试,通了再保存。
再配 TaoToken 渠道。新建渠道,类型选「自定义渠道」,Base URL 填:
https://taotoken.net/api模型列表填你在模型对话页面确认过的模型 ID,密钥填你创建的 API Key。测试通过后保存。
三个渠道都通了,去创建令牌。选无限额度、永不过期,复制生成的令牌。这个令牌要填到 FastGPT 的 docker-compose.yml 里。文件位置在d:\fastgpt\docker-compose.yml,找到这两行:
- OPENAI_BASE_URL=http://oneapi:3000/v1 - CHAT_API_KEY=sk-你的令牌OPENAI_BASE_URL保持指向 OneAPI,注意结尾有/v1。CHAT_API_KEY换成你刚创建的令牌。
最后改config.json,加入本地模型和向量模型。llmModels 部分:
"llmModels": [ { "model": "qwen2.5:3b", "name": "ollama-qwen", "avatar": "/imgs/model/openai.svg", "maxContext": 125000, "maxResponse": 16000, "quoteMaxToken": 120000, "maxTemperature": 1.2, "charsPointsPrice": 0, "censor": false, "vision": false, "datasetProcess": true, "usedInClassify": true, "usedInExtractFields": true, "usedInToolCall": true, "usedInQueryExtension": true, "toolChoice": false, "functionCall": false, "defaultConfig": {}, "fieldMap": {} } ]vectorModels 部分:
"vectorModels": [ { "model": "m3e", "name": "m3e", "avatar": "/imgs/model/openai.svg", "charsPointsPrice": 0, "defaultToken": 700, "maxToken": 3000, "weight": 100, "defaultConfig": {}, "dbConfig": {}, "queryConfig": {} } ]改完重启容器:
docker-compose down docker-compose up -d重启后等一分钟,让 OneAPI 和 FastGPT 都起来。这一步别急着测,先看容器日志有没有报错。
4. 一次完整问答请求验证本地链路
配置改完,得验证整条链路真的通了。我习惯分三步测,从底层往上,哪步断了立刻能定位。
第一步,直接测 OLLAMA。在宿主机终端执行:
curl http://localhost:11434/api/chat -d '{ "model": "qwen2.5:3b", "messages": [{"role": "user", "content": "用一句话说明什么是向量检索"}], "stream": false }'返回里有message.content字段就说明 OLLAMA 正常。如果这里就报错,别往下走,先解决 OLLAMA。
第二步,测 OneAPI 路由。用你创建的令牌,调 OneAPI 的对话接口:
curl http://localhost:3001/v1/chat/completions \ -H "Authorization: Bearer sk-你的令牌" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:3b", "messages": [{"role": "user", "content": "你好"}] }'返回正常的话,说明 OneAPI 到 OLLAMA 这段通了。如果报模型不存在,回去检查渠道里的模型名是不是和请求里的一致。
第三步,测 M3E 向量化。这个接口是 OpenAI 兼容的 embeddings:
curl http://localhost:6008/v1/embeddings \ -H "Content-Type: application/json" \ -d '{ "model": "m3e", "input": "测试文本" }'返回里应该有data[0].embedding数组。如果连不上,检查 M3E 容器是不是和 FastGPT 在同一个网络。
三步都通,进 FastGPT 界面。地址http://localhost:3000,账号 root,密码 1234。先建知识库,选通用知识库,索引模型选 m3e,文件处理模型选 ollama-qwen。然后上传一个小的文本文件,比如几百字的说明文档。上传后状态会从「索引中」变成「已就绪」,这个过程就是 FastGPT 调 M3E 把文档向量化存进 pgvector。
索引就绪后,创建一个应用,关联这个知识库,模型选 ollama-qwen。然后在对话里问一个文档里明确写过的问题。比如文档里写了「本系统支持三种登录方式」,你就问「支持哪些登录方式」。如果回答能引用到文档内容,说明检索和生成都通了。
实测下来,3b 模型在知识库问答上响应挺快,但回答质量一般,复杂问题容易答偏。这时候可以把应用里的对话模型换成 TaoToken 通道里的模型,向量化继续用本地 M3E。切换后重新问同样的问题,对比一下回答质量。这就是本地部署加统一通道混用的价值:向量化这种量大但要求不高的活留给本地,生成这种要求高的活走通道。
验证过程中如果问答返回空或者报错,先看 FastGPT 容器日志:
docker logs -f fastgpt日志里会明确写出是调哪个地址失败、返回什么状态码。比在界面上瞎猜快得多。
5. 常见报错排查:401、local proxy failed 与 reading choices
这一节把几个高频报错单独拎出来,每个都给现象、原因、解法。你遇到报错先来这里对号入座。
401 Unauthorized。现象是 OneAPI 渠道测试或者 FastGPT 问答时报 401。原因通常是三种:令牌没填对、Base URL 带了多余路径、Key 过期。先检查 OneAPI 渠道里的密钥是不是你从 TaoToken 复制的那个,注意别把前后空格带进去。再检查 Base URL 是不是https://taotoken.net/api,如果写成了带/v1或者带 UTM 参数的完整链接,网关会认不出来。最后去 API Keys 页面确认 Key 还在有效期内。这三个都排除了,401 基本就消失了。
local proxy failed。这个报错一般出现在 OneAPI 日志里,意思是它尝试连上游地址失败了。如果是 OLLAMA 渠道,检查 Base URL 是不是http://host.docker.internal:11434,以及 OLLAMA 是不是设了OLLAMA_HOST=0.0.0.0:11434。如果是 M3E 渠道,检查 M3E 容器是不是和 OneAPI 在同一个 Docker 网络,Base URL 是不是http://m3e:6008。如果是 TaoToken 渠道,检查服务器能不能正常访问外网,以及 Base URL 有没有写错。这个报错的关键是看日志里它到底连的哪个地址,地址对了再查网络。
reading choices 相关报错。现象是 FastGPT 问答时报类似cannot read property 'choices' of undefined或者reading 'choices'。这说明上游返回的响应结构不是标准的 OpenAI 格式,FastGPT 解析不到choices字段。常见原因是模型名填错,OneAPI 路由到了一个不存在的模型,返回了错误信息而不是正常响应。回去检查渠道里的模型名和 FastGPT 应用里选的模型名是否一致。另一个原因是流式和非流式设置不匹配,FastGPT 默认用流式,如果你的渠道不支持流式,也会出这个错。在 OneAPI 渠道里确认一下流式支持情况。
OAuth 相关报错。如果你在配置过程中看到 OAuth 字样,通常是某个渠道用了需要 OAuth 认证的类型,但你没走完授权流程。本地 OLLAMA 和 M3E 都不需要 OAuth,TaoToken 通道用的是 API Key,也不需要 OAuth。所以看到 OAuth 报错,先检查是不是渠道类型选错了,选成了需要 OAuth 的类型。改回「自定义渠道」加 API Key 就行。
索引一直卡在「索引中」。这个不是报错,但很常见。原因是 FastGPT 调 M3E 向量化失败,或者 pgvector 写入失败。先看 FastGPT 日志,确认它调 M3E 的地址对不对。再确认 M3E 容器健康,docker ps看状态是不是 Up。如果 M3E 正常,检查 pgvector 容器有没有起来,docker-compose ps看所有服务状态。pgvector 没起来的话,知识库没法存向量,索引自然卡住。
问答超时。现象是问题发出去很久没响应。本地 3b 模型一般不会超时,除非你的机器资源被占满。检查一下 CPU 和内存占用,OLLAMA 跑模型时吃内存比较凶。如果切到了 TaoToken 通道还超时,检查网络连通性。另外 FastGPT 有个请求超时设置,默认可能偏短,大文档检索加生成可能需要更长时间,可以在配置里适当调大。
排查的核心思路就一条:从下往上,先确认 OLLAMA 通,再确认 OneAPI 通,再确认 M3E 通,最后看 FastGPT。每层都有独立的验证命令,别跳步。
6. 把本地端点稳定接到统一通道的后续做法
链路跑通只是开始,要让它稳定跑下去,还有几件事值得做。
第一件,把 OLLAMA 和 M3E 都设成开机自启。M3E 启动命令里加--restart always已经解决了。OLLAMA 在 Windows 下可以设成服务,或者用任务计划程序在登录时启动。这样机器重启后不用手动拉一遍。
第二件,给 OneAPI 的渠道加上失败重试和超时配置。OneAPI 支持在渠道里设置重试次数,本地 OLLAMA 偶尔会因为显存不足返回错误,重试一次往往就好了。TaoToken 通道也可以设重试,网络抖动时能自动恢复。
第三件,定期检查模型 ID 有没有变化。TaoToken 通道支持的模型会更新,如果你在 OneAPI 里填的模型 ID 下线了,请求会报模型不存在。养成习惯,隔一段时间去模型对话页面确认一下当前可用的模型标识,有变化就同步更新 OneAPI 渠道。
第四件,知识库文档更新后记得重新索引。FastGPT 支持增量索引,新上传的文件会自动处理,但如果你替换了已有文件,最好手动触发一次重新索引,确保向量是最新的。
第五件,如果你打算把这个部署分享给团队用,OneAPI 的令牌可以按人分配,设置不同的额度。FastGPT 侧也可以建多个应用,分别关联不同的知识库和模型。这样本地 OLLAMA 做私有数据处理,TaoToken 通道做对外问答,各司其职。
最后说一个实际经验:本地部署最大的价值是数据不出内网,但本地小模型的能力上限摆在那里。比较务实的做法是混合使用,敏感数据用本地模型处理,通用问答走统一通道。OneAPI 这层网关正好让这种混合变得透明,FastGPT 侧不用改任何代码,只改模型名就行。你按这篇的配置走一遍,应该能体会到这种灵活性。后面如果要把这套接到 Claude Code 或者 Cline 这类编码工具上,思路是一样的,都是通过 OneAPI 暴露一个 OpenAI 兼容端点,工具侧填 Base URL 和 Key 即可。接入文档里有针对不同工具的说明,遇到问题可以去 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc 对照查。