离线安全研发的刚性需求
在涉密项目、金融核心系统或无外网连接的机房环境中,调用云端 LLM API(如 OpenAI、Anthropic)是严格禁止的。
随着开源模型(如 Qwen-2.5-Coder、Llama-3.3)在工具调用(Function Calling)能力上的飞跃,完全可以在本地消费级显卡或 Apple Silicon 芯片上跑通完整的 MCP 工具链。
需要先把预期对齐:本地方案的目标是代码不出机器,而不是复现云端旗舰模型的全部能力。在工具链跑通之后,决定体验上限的是模型的上下文长度与工具调用的稳定性,这两点也正是下文要逐项验证的内容。
0. 硬件与模型档位怎么选
下表是 4-bit 量化下的经验值(含推理时的 KV 缓存余量),用于估算起步配置,实际显存占用会随上下文长度上升:
| 模型规模 | 显存/统一内存 | 典型表现 |
|---|---|---|
| 7B–8B | 约 6–8 GB | 单文件改动、脚本类任务够用 |
| 14B | 约 12–16 GB | 本地做 Agent 的性价比甜点 |
| 32B | 约 24 GB 以上 | 需要 4090 级显卡或大内存 Mac |
| 70B | 约 48 GB 以上 | 一般只在多卡或高配统一内存上跑 |
Apple Silicon 的要点是统一内存直接当显存用,内存 ≥ 模型体积 + 8GB 才有舒适余量。
1. 选用支持工具调用的开源模型
在终端拉取对工具调用针对性微调过的模型:
ollama pull qwen2.5-coder:14b
ollama run qwen2.5-coder:14b
关键一步是确认它真的会调用工具,而不是只会把工具意图写成自然语言。最直接的验证是问一个必须借助工具才能回答的问题(例如"列出当前目录下的文件名"),观察返回里是否出现结构化的工具调用意图。如果模型只是"描述"了要执行什么命令,说明该模型档位对工具调用的微调不足,应当换模型或换更大的尺寸,而不是继续往下配。
2. 启动并验证 OpenAI 兼容端点
Ollama 默认在 11434 端口提供 OpenAI 兼容接口,MCP 客户端正是通过它对接本地模型:
curl http://127.0.0.1:11434/v1/models
能列出模型清单,说明端点可用。若这一步失败,通常是服务未启动、端口被占用,或者 OLLAMA_HOST 绑定在了别的地址上。
这一步在离线环境尤其要提前验证:客户端与 Ollama 必须在同一台机器或同一内网可达网段,任何"跨机器调用"都需要显式配置监听地址,而这在合规审查里通常是需要单独报备的暴露面。
3. 把上下文窗口调够
这是本地方案最容易踩的坑:Ollama 的默认上下文窗口远小于模型本身支持的上限,而 MCP 客户端会把全部工具 Schema 注入提示词,两者叠加后上下文会在几轮之内被截断,表现为模型"忘记"了工具或反复调用同一个接口。
以修改模型参数的方式显式抬高它(例如 16384 起步),并按显卡余量上调。代价是 KV 缓存占用与首字延迟同步上升,所以不要一次给到最大。
4. 连接 MCP Client 与本地模型
使用支持自定义 OpenAI-compatible 端点的 MCP 客户端(如 Continue、LibreChat 或自定义 Python 脚本),将端点指向 http://127.0.0.1:11434/v1。
客户端会自动将 MCP Server 提供的工具 Schema 转化为模型可理解的 Tools 提示词,并在模型产生 tool_calls 时由本地驱动执行,实现真正的零数据出境。
以支持 mcpServers 配置的客户端为例,形态大致如下(字段名以各客户端文档为准,Continue 等工具的配置结构并不相同):
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/srv/project"
]
}
}
}
配置完成后按这个顺序验证,能快速定位问题出在哪一层:
- 客户端里能否看到工具列表(看不到 → MCP Server 没起来);
- 让模型调用一个最轻的工具(能返回 → 链路通);
- 观察是否出现重复调用(是 → 多半是第 3 步的上下文截断)。
5. 完全断网环境的额外准备
离线机房真正麻烦的不是模型,而是依赖:
- 模型要预先落盘。
ollama pull需要联网,离线环境必须在允许联网的机器上拉好后,把~/.ollama/models整体拷贝过去,或者用Modelfile导入已有的 GGUF 权重。 npx -y在断网时不可用。上面的示例依赖 npm 在线拉包,离线环境要改为预先npm install到本地目录并用绝对路径启动,或者把 Server 打包进镜像。- Python 类 Server 需要预置 wheel 缓存或内网镜像源。
- 系统时间必须同步。证书校验失败会让本地 HTTPS 与部分客户端授权流程莫名报错。
6. 常见故障速查
| 现象 | 大概率原因 | 处理 |
|---|---|---|
| 端点 404 | 路径少了 /v1,或服务未监听 | 用 /v1/models 复核基址 |
| 模型不调用工具 | 模型未针对工具调用微调 | 换 Qwen2.5 / Llama3.1-70B 等支持尺寸 |
| 工具列表为空 | MCP Server 启动失败 | 手工执行启动命令看报错 |
| 答非所问、频繁遗忘 | 上下文窗口过小被截断 | 抬高上下文长度,精简工具数量 |
| 首轮极慢、之后变快 | 模型正在加载进显存 | 配置常驻(keep-alive)避免反复卸载 |
| 输出被中途截断 | 生成长度上限或显存不足 | 降低并发、换更小量化档位 |
小结
本地 MCP 工具链的搭建本身只有几十分钟工作量,真正决定能不能长期用的是三件事:模型是否稳定产生合法的工具调用、上下文窗口是否装得下全部工具 Schema、离线依赖是否在封锁前就准备完毕。把这三项当作验收清单逐条验证,比一开始就追求更大的模型要有效得多。