1. 从单机跑通到服务化:本地大模型为什么需要一套体系
很多人第一次接触 AI 大模型,都是直接在笔记本上装个 Ollama,敲一行ollama run就开始对话。这一步确实爽,但很快就会撞墙:模型只能自己用,同事想调一下得重新装一遍;换个模型要改代码;知识库问答更是无从下手。单机跑通和服务化落地之间,隔着一整套工程链路。
我这次要搭的,就是一条从「本地推理」到「可复用服务」的完整路径。核心思路是把职责拆开:Ollama 只负责模型推理,Docker 负责环境隔离和编排,One-api 做统一的多模型 Key 与调用入口,FastGPT 承接知识库问答应用。这样拆完之后,任何上层应用只需要认 One-api 一个地址,底层换模型、加模型都不用动业务代码。
这套体系适合谁?如果你是想把本地大模型接进自己项目的开发者,或者团队里需要给多人提供一个统一模型入口,再或者你想搭一个私有知识库问答但不想把数据传到外部,那这套组合基本就是当前最省心的开源方案。它不依赖任何特殊网络手段,全部组件都能在本地 Docker 里跑起来。
整条链路的数据流是这样的:用户或应用请求先到 One-api,One-api 根据渠道配置转发给 Ollama,Ollama 在本机完成推理后原路返回。FastGPT 作为应用层,通过 One-api 拿到对话和向量能力,把知识库检索和问答串起来。下面我按组件逐个给可复制的配置,最后附一套从容器启动到问答链路打通的验证清单。
2. 前置准备:Ollama 拉模型与 Docker 环境就位
在动手编排之前,有两件事必须先落地:Ollama 里得有模型,Docker 得能正常跑容器。这两步是后面所有配置的地基,地基不稳后面全是报错。
先说 Ollama。安装完成后,第一件事是改模型下载位置,默认放在系统盘,模型动辄几个 G,很容易把 C 盘撑爆。在设置里把模型目录改到数据盘,保存后重启 Ollama 生效。然后拉模型,我选的是deepseek-r1:14b,14B 参数在 10G 显存上能跑,显存吃紧时 Ollama 会自动把部分数据放到共享内存。命令很简单:
ollama pull deepseek-r1:14b拉完之后用ollama run deepseek-r1:14b验证一下能正常对话。这里有个细节:Ollama 默认监听11434端口,后面 Docker 里的容器要访问它,靠的是host.docker.internal这个域名,它指向宿主机网络。所以 Ollama 必须保持运行,且不能被防火墙拦掉本地回环访问。
再说 Docker。Windows 上装 Docker Desktop,一路默认即可。装完如果提示 WSL 版本太低,用管理员权限打开终端执行wsl --update,然后重启 Docker。进 Docker 之后先改镜像加速地址,默认拉取国外镜像会很慢。在设置里加上国内镜像源,配置大概长这样:
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://reg-mirror.qiniu.com" ] }改完点 Apply & Restart。到这里,Ollama 有模型、Docker 能拉镜像,前置条件就齐了。接下来进入编排环节,我会用 docker-compose 把 One-api 和 FastGPT 一起管起来,比一条条docker run好维护得多。
3. 可复制配置:docker-compose 编排 One-api 与 FastGPT
这一节是整篇的核心,所有配置都可以直接复制。我先把 One-api 单独用一条命令跑起来验证,再上 docker-compose 把 FastGPT 全家桶拉起来。之所以分开,是因为 One-api 要先配好渠道和令牌,FastGPT 才能连上它。
先看 One-api 的启动命令,这条命令把数据持久化到本地目录,时区设为上海:
docker run --name one-api -d --restart always \ -p 3000:3000 \ -e TZ=Asia/Shanghai \ -v C:\docker-data\one-api:/data \ justsong/one-api参数逐个说明:--restart always保证 Docker 重启后容器自动拉起;-p 3000:3000把宿主机 3000 映射到容器;-v把数据挂到本地,容器删了数据还在。启动后浏览器访问127.0.0.1:3000,默认账号root,密码123456,进去第一件事改密码。
登录后先建令牌,再建渠道。渠道是关键,它决定了 One-api 去哪里拿模型。添加渠道时类型选 Ollama,Base URL 填http://host.docker.internal:11434,模型名填deepseek-r1:14b。注意 Ollama 没有密钥,密钥栏留空即可。提交后页面不会自动刷新,需要再点一次渠道列表才能看到。然后点测试,第一次会慢一点,跑通就说明 One-api 到 Ollama 的链路通了。
接下来是 FastGPT。它组件多,官方推荐用 docker-compose 部署。先准备两个文件:config.json和docker-compose.yml。config.json里要加上本地模型配置,这是让 FastGPT 认识 Ollama 的关键:
{ "feConfigs": { "lafEnv": "https://laf.run", "mcpServerProxyEndpoint": "" }, "systemEnv": { "datasetParseMaxProcess": 10, "vectorMaxProcess": 10, "qaMaxProcess": 10, "vlmMaxProcess": 10, "tokenWorkers": 30, "hnswEfSearch": 100, "hnswMaxScanTuples": 100000 }, "llmModels": [ { "model": "deepseek-r1:14b", "name": "DeepSeek R1 14B", "provider": "ollama", "baseUrl": "http://host.docker.internal:11434", "type": "chat" } ], "vectorModels": [ { "model": "nomic-embed-text", "name": "Nomic向量模型", "provider": "ollama", "baseUrl": "http://host.docker.internal:11434", "type": "embedding" } ] }向量模型要先拉下来,知识库靠它把文字转成向量:
ollama pull nomic-embed-textdocker-compose.yml里有一处必须改:minio 的地址原本写死成 IP,要改成服务名fastgpt-minio,否则容器间解析不到。改完在文件所在目录执行:
docker compose up -d启动前建议先把单独跑的 One-api 容器停掉,避免端口冲突。等所有容器 healthy 之后,访问127.0.0.1:3000就能看到 FastGPT 登录页,默认账号root,密码1234。
4. 验证请求:从容器启动到问答链路打通
配置写完不代表能用,必须逐段验证。我习惯从下往上验,先确认 Ollama 本身没问题,再验 One-api 转发,最后验 FastGPT 问答。这样任何一段出问题都能快速定位。
第一步,验 Ollama 直连。在宿主机终端执行:
curl http://localhost:11434/api/tags返回模型列表里有deepseek-r1:14b和nomic-embed-text就对了。再发一条对话请求:
curl http://localhost:11434/api/chat -d '{ "model": "deepseek-r1:14b", "messages": [{"role": "user", "content": "你好"}], "stream": false }'能返回message.content说明推理正常。
第二步,验 One-api 转发。在 One-api 后台渠道页点测试,看到绿色成功提示即可。也可以用 curl 直接打 One-api 的接口,把令牌换成你创建的:
curl http://localhost:3000/v1/chat/completions \ -H "Authorization: Bearer sk-你的令牌" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-r1:14b", "messages": [{"role": "user", "content": "用一句话介绍你自己"}] }'返回结构里有choices数组就说明网关通了。这一步如果卡住,多半是渠道 Base URL 写错,或者 Ollama 没在跑。
第三步,验 FastGPT 问答。登录 FastGPT 后新建一个知识库,上传一个测试文档,等向量化完成。然后新建应用,模型选DeepSeek R1 14B,关联刚才的知识库。在对话里问一个文档里才有的问题,如果回答引用了文档内容,整条链路就打通了。我实测下来,14B 模型在知识库问答上的响应大概几秒到十几秒,取决于文档量和问题复杂度。
验证清单可以记成四句话:Ollama 能直连、One-api 能转发、FastGPT 能登录、知识库能引用。四步全绿,这套私有体系就算落地了。
5. 常见报错排查:401、local proxy failed 与 reading choices
搭这套体系,报错基本集中在几个固定位置。我把踩过的坑按现象列出来,对照着查能省不少时间。
401 Unauthorized。这个最常见,出现在 One-api 或 FastGPT 调用时。原因通常是令牌没填对、令牌过期,或者请求头里Authorization格式写错。正确格式是Bearer sk-xxx,中间有空格。还有一种情况是 One-api 里渠道的密钥填了但实际不需要,Ollama 渠道密钥必须留空,填了反而会 401。
local proxy failed / connection refused。这个报错说明容器访问不到宿主机。核心原因是host.docker.internal没生效,或者 Ollama 没监听在0.0.0.0。检查两点:一是 Ollama 是否在运行,二是容器里能不能解析这个域名。可以在容器内执行curl http://host.docker.internal:11434/api/tags测试。如果解析不了,在 docker-compose 里给对应服务加extra_hosts: - "host.docker.internal:host-gateway"。
reading choices 报错 / 返回结构异常。这个通常出现在 FastGPT 调 One-api 时,返回体里没有choices字段。原因可能是模型名对不上——One-api 渠道里填的模型名,必须和 FastGPT 请求里发的模型名完全一致。比如渠道填deepseek-r1:14b,FastGPT 里也得是这个名字,差一个字符都会失败。另外 One-api 的渠道如果没启用,也会返回异常结构。
OAuth / 登录相关报错。FastGPT 首次登录如果提示 OAuth 或认证失败,多半是config.json里feConfigs配置不完整,或者容器启动时没读到这个文件。确认config.json和docker-compose.yml在同一目录,且 compose 里正确挂载了它。默认账号root密码1234,如果改过密码忘了,可以清掉数据库卷重新初始化。
向量化失败 / 知识库一直转圈。检查nomic-embed-text是否拉下来了,以及config.json里vectorModels的baseUrl是否指向 Ollama。向量模型和对话模型是两个独立配置,少配一个知识库就用不了。
排查时记住一个原则:从下往上查。先确认 Ollama 直连正常,再查 One-api 转发,最后查 FastGPT。哪一层断了,问题就在那一层,不要一上来就怀疑最上层。
6. 把入口统一起来:用 TaoToken 管理多模型 Key 与调用
本地这套体系跑通之后,你会发现一个现实问题:Ollama 只是众多模型来源之一。团队里可能还要接云端模型,不同模型有不同的 Key 和 Base URL,如果每个应用都单独配一遍,维护成本会很高。这时候需要一个统一的模型接入层,把本地和云端的调用入口收敛到一处。
TaoToken 就是干这个的。它提供统一的 API 入口,把多个模型的 Key 和地址管理起来,上层应用只认一个 Base URL 和一个 Key。对于已经用 One-api 的体系来说,两者定位类似,但 TaoToken 更偏向把模型调用这件事标准化,省去自己维护渠道的麻烦。你可以把它理解成模型调用的统一门面。
接入方式很简单,Base URL 填https://taotoken.net/api,Key 在控制台创建。创建好之后,在应用里把模型请求指向这个地址即可。如果你在 FastGPT 里想同时用本地 Ollama 和云端模型,可以把云端模型通过 TaoToken 接入,本地模型继续走 One-api,两边互不干扰。
对于长期做编码和 Agent 的场景,Coding Plan 更适合,它把常用模型的调用额度打包,不用每次单独申请。如果你只是想先验证模型效果,可以直接用模型对话页面试一下,确认返回正常再接入到自己的体系里。
几个常用入口我列一下,方便按需取用:模型对话在https://taotoken.net/models,Coding Plan 在https://taotoken.net/coding-plan,控制台在https://taotoken.net/console,API Keys 管理在https://taotoken.net/api-keys,接入文档在https://taotoken.net/doc。需要提醒的是,接入文档里对 Base URL 和鉴权头的说明要仔细看,格式写错一样会 401。
把本地体系和统一接入层结合之后,你的架构就变成了:Ollama 提供本地推理,One-api 做本地网关,TaoToken 做多模型统一入口,FastGPT 做应用层。任何一层换实现,上层都不用大改。这套结构我用了挺久,最大的好处是扩展性——今天加一个云端模型,明天换一个向量库,都只是改配置的事,不用动业务代码。