资讯动态

本地大模型+Claude Code:离线AI编程助手部署全攻略

发布时间:2026/10/18 12:18:00 来源:尧图企业网站定制
前几天把一台尘封的备用工作站翻了出来装了张二手显卡折腾了一整天成功跑通了GLM-4.5-Air量化版Claude Code RouterClaude Code这条本地开发链路。整套流程走下来感受最深的是本地大模型 编码助手的组合已经把“离线写代码”这件事推进到了真正可用的阶段。这篇文章就完整复盘一下当时的方案选型、部署过程和踩过的坑给想复现的朋友一条尽量顺的路径。先说清楚这套组合能干什么。GLM-4.5-Air 量化版跑在本地给你一个可控的基础模型服务Claude Code Router 负责把 Claude Code 发出的 API 请求路由到本地模型同时保留对官方接口的切换能力Claude Code 本身则是那个真正在你终端里干活的 Agent读代码、改代码、跑命令、提交 PR全都能在命令行里完成。合在一起相当于你在不依赖外部付费 API 的情况下拥有了一套隐私安全、成本可控的 AI 编程辅助环境。适合谁看如果你手头有一台内存不低于 16G、显存 6G 以上的机器想尝试本地大模型编程助手又不想被各家 SaaS 的订阅费绑住这篇就是照着做的。1. 内容整体设计与思路拆解1.1 为什么选 GLM-4.5-Air 而不是其他模型选模型之前我先把需求理了一遍写代码为主、中英文混合、需要一定的长上下文理解能力、单机部署不能太吃配置。市面上能本地跑的选择不少Qwen 系列、DeepSeek 蒸馏版、Llama 系列都试过一圈最终留下的是 GLM-4.5-Air。原因很直接首先是模型体积和效果的平衡点。GLM-4.5-Air 的激活参数量较小对推理资源的要求显著低于同档位的稠密模型量化之后更是把内存占用压到了很舒服的位置。我在这台工作站的 24G 内存 8G 显存环境下跑 Q4_K_M 量化版生成速度稳定在 20 token/s 左右日常补全和对话完全感觉不到卡顿。其次是对中文的理解质量。它不是简单的“能说中文”而是在中文代码注释、技术文档的语境下语义理解很准确。我用几个典型的工程场景实测过比如让它重构一段嵌套过多的函数、解释一段晦涩的正则表达式、把 Python 代码翻译成 Go 风格表现都超出了我的预期很少出现答非所问的情况。还有一个关键点GLM-4.5-Air 在 Agentic 场景下对工具调用的响应质量足够好。Claude Code 这类编码 Agent 不只是聊天它需要模型理解结构化指令、输出 JSON 格式的调用参数、在多次交互中保持状态。这个模型在这些方面的能力是过关的。1.2 Claude Code Router 的定位一个值得自己掌控的转发层Claude Code 原生的后端预期连接的是 Anthropic 的官方 API。你直接用ANTHROPIC_BASE_URL指到本地模型服务大概率会发现协议对不上因为官方 API 的请求格式和本地推理服务的暴露接口不是一回事。Claude Code Router 就是解决这个不匹配问题的一层居中系统。我的做法是在本地起一个轻量代理服务默认监听 127.0.0.1 的某个端口Claude Code 的所有请求都被它接收到然后经过协议转换、模型名映射、密钥填充转发到 Ollama 的本地接口。这样有几个明显的好处不改 Claude Code 本身的代码所有适配逻辑都收敛在 Router 里升级 Claude Code 后不用重新适配可以随时切换后端。想用本地免费模型时就指到 Ollama想用官方模型了就改一行配置Router 自动把流量转到官方 API两条路都走得通能在转发层做日志、限流和用量统计。这一点在长期使用中非常重要能帮你发现某次对话为什么会话上下文过长、哪个文件触发了大量请求。所以这个项目的整体架构是三层Claude Code客户端 Agent → Router协议适配与路由 → Ollama GLM-4.5-Air本地推理。清晰、可控、易扩展。1.3 Claude Code 在本地链路里的角色和价值Claude Code 是 Anthropic 出品的终端编程 Agent可以在命令行里直接交互。它的核心能力不只是“聊天写代码”而是真正能读写你的项目文件、调用终端命令、跨多个文件执行修改任务。举例来说你给它一个任务“把项目中所有使用旧日期库的调用迁移到新库”它会自己遍历代码、定位引用、修改实现、跑测试验证全程不需要你手动打开编辑器。在本地部署方案里Claude Code 依然是这套链路的最大亮点。它提供了很好的终端 UX——支持快捷键、支持把大段代码贴进去提问、支持配置的持久化。即便后端换成 GLM-4.5-Air这些体验都还在。但我也必须提醒Claude Code 的部分高级功能依赖特定的模型能力比如长上下文记忆、多步骤工具调用的稳定性。本地量化模型的上下文窗口和精度有限实际体验会比官方模型打一些折扣。所以我在后面的配置里做了很多参数调整目标是“能用、稳定、不报错”而不是“跑满全部功能”。2. 环境准备与工具选型细节2.1 硬件需求的真实门槛很多人问“跑量化 GLM-4.5-Air 到底需要什么配置”网上说法不一我这里直接给一个实测的梯度参考硬件配置量化等级可用性16G 内存无独显Q4_K_M纯 CPU 推理可用但速度较慢约为 2-5 token/s16G 内存 6G 显存Q4_K_M显存加速速度可达 15-25 token/s推荐入门32G 内存 8G 显存Q5_K_M效果和速度均衡长上下文更稳推荐日常64G 内存 12G 显存Q6_K甚至 FP16基本无压力可以开更长上下文我实际用的是 8G 显存 24G 内存的机器。装好驱动后显存里能完整放下 Q4_K_M 的模型权重剩余的层走 CPU 计算速度完全够用。2.2 推理框架选型Ollama 与 vLLM 的取舍本地跑模型的推理框架主流是 Ollama 和 vLLM。如果你只追求“快速跑起来”Ollama 是最省事的一条命令下载模型、一条命令启动服务内存管理也做得好适合单机单人使用。vLLM 的优势在高并发下的吞吐量但配置和部署门槛明显更高而且对显存的要求更苛刻。考虑到 Claude Code 通常是单用户交互、请求频率不高我选了 Ollama 作为推理后端。它自带的 OpenAI 兼容接口/v1/chat/completions天然好对接Router 那头少写很多转换代码。提示如果你计划多人共用一套服务或者要做压测可以直接在 Router 配置里把后端从 Ollama 换成 vLLMRouter 层的存在让这种替换只改一个 URL。2.3 关键技术点量化等级与上下文长度在确定模型版本时我重点关注两个参数量化等级和上下文长度。量化等级直接决定模型文件大小和推理质量。我在 GLM-4.5-Air 的 GGUF 版本里对比过 Q4_K_M 和 Q5_K_MQ4 体积小、速度快代码生成质量在我的一批测试任务中依然稳定Q5 更接近未量化效果但内存占用多出 2G 左右。对于代码场景我建议至少 Q4_K_M 起不要为了省空间去用 Q2 之类的激进量化那种糊成一片的代码补全结果会让你怀疑人生。上下文长度方面Ollama 默认是 2048对 Claude Code 来说完全不够用。Agent 在多轮交互里动辄几万 token 的历史记录短窗口会导致早期对话被截断模型忘了你前面让它做什么。我在 Ollama 的启动参数里把num_ctx设置到 32768确保长任务不会断片。2.4 依赖清单需要提前装好的东西这里列出我在部署过程中实际依赖的组件按安装顺序给出Python 3.10 或更高版本用于部分辅助脚本Node.js 18因为 Claude Code 官方 CLI 是 npm 包Ollama去官网下载对应平台的安装包即可Claude Code通过npm install -g anthropic-ai/claude-code安装Claude Code Router 代码从 GitHub 拉到本地用 npm 安装依赖。注意Claude Code 安装后需要登录认证不登录的话无法进入核心功能。离线环境下可以先在有网的机器上完成认证也可以配置 Router 的密钥填充逻辑绕过。后面有专门说明。3. 实操过程与核心环节实现3.1 第一步在 Ollama 里拉取 GLM-4.5-Air 量化模型Ollama 安装完成后先确认服务正常运行ollama --version ollama serve后台确认无报错后拉取量化模型。不同量化等级的标签在 Ollama 库里有区分我拉的是 Q4_K_M 版本ollama pull glm4.5-air:q4_K_M这一步取决于网络情况可能需要一段时间。下载完可以用一段简单对话验证模型是否正常ollama run glm4.5-air:q4_K_M 写一个 Python 快速排序带注释看到正常输出后进入下一步。这个验证不要跳过很多后续问题都是因为模型文件损坏或下载不完整导致的。3.2 第二步配置 Ollama 支持长上下文Ollama 默认服务模式下上下文长度受限于模型参数通常只有 2048。为了让 Claude Code 能跑长会话我创建了一个 Modelfile自定义参数FROM glm4.5-air:q4_K_M PARAMETER num_ctx 32768然后在终端创建新模型ollama create glm4.5-air-ctx32 -f Modelfile创建完成后需要让服务加载这个新模型ollama run glm4.5-air-ctx32确认能正常对话后按CtrlD退出即可。这个新模型名在 Router 配置里会用到。实操心得很多人直接在启动命令里加参数但 Ollama 服务模式不会读命令行参数必须通过 Modelfile 创建自定义模型。这个我在第一次部署时踩坑了反复修改不生效最后才发现是配置方式错了。3.3 第三步部署 Claude Code RouterRouter 的本质是一个本地 HTTP 服务负责把 Claude Code 发出的 API 请求转发到指定后端。我用的实现方式是修改 Node.js 脚本核心思路如下首先克隆代码到工作目录安装依赖git clone https://github.com/your-router-repo/claude-code-router.git cd claude-code-router npm install在 Router 目录下创建配置文件config.json关键配置如下{ port: 3456, provider: ollama, ollama: { baseUrl: http://localhost:11434, model: glm4.5-air-ctx32, contextWindow: 32768, maxTokens: 4096 }, anthropic: { apiKey: your-anthropic-api-key, baseUrl: https://api.anthropic.com, model: claude-sonnet-4-5 }, rules: [ { match: code, provider: ollama }, { match: chat, provider: anthropic } ] }这个配置实现了我的核心需求默认所有请求走本地 Ollama 模型只有在特定场景比如用自然语言聊天、处理复杂推理时才切到 Anthropic 官方模型。Router 启动后监听127.0.0.1:3456。启动命令node index.js看到Router started on port 3456的日志就算成功。3.4 第四步编写协议转换适配层这个环节是整套链路的技术核心也是最容易出问题的地方。Claude Code 发出的请求是 Anthropic Message API 格式{ model: claude-sonnet-4-5, max_tokens: 4096, messages: [ { role: user, content: 你好 } ], system: ..., tools: [...] }而 Ollama 的 OpenAI 兼容接口要求的是{ model: glm4.5-air-ctx32, messages: [ { role: user, content: 你好 } ], max_tokens: 4096 }所以 Router 的核心逻辑是“翻译”把 Anthropic 格式的请求转换成 Ollama 能理解的格式再把 Ollama 的返回值包装成 Anthropic 格式返回给 Claude Code。我在实现时维护了一个转换函数function convertAnthropicToOllama(reqBody) { const messages reqBody.messages.map(msg { if (typeof msg.content string) { return { role: msg.role, content: msg.content }; } if (Array.isArray(msg.content)) { const blocks msg.content.filter(block block.type text); return { role: msg.role, content: blocks.map(b b.text).join(\n) }; } return { role: msg.role, content: String(msg.content) }; }); if (reqBody.system) { messages.unshift({ role: system, content: reqBody.system }); } return { model: config.ollama.model, messages: messages, max_tokens: reqBody.max_tokens || 4096, stream: true }; }这里有几个细节值得反复强调System 消息必须前置。Anthropic API 的system字段是单独配置不能放进messages数组。而 Ollama 需要把它作为第一条 system 消息才能正常处理Content 可能是数组。Claude Code 发出的消息里content不一定是纯字符串可能是多段 Block。必须遍历取 text 部分否则会丢内容Stream 必须开启。Claude Code 通过流式响应实现打字机效果同时保证长输出的实时性。如果你在 Router 里把stream设成falseClaude Code 会一直等待全部生成完毕体验极差而且可能导致前端超时。返回方向也要转换把 Ollama 的流式 chunk 包装成 Anthropic 格式function convertOllamaStreamChunkToAnthropic(chunk, model) { return { model: model, type: content_block_delta, delta: { type: text_delta, text: chunk.message?.content || } }; }3.5 第五步配置 Claude Code 环境变量Claude Code 默认连接官方 API必须通过环境变量把请求重定向到本地 Router。在 Cli 配置文件里设置export ANTHROPIC_BASE_URLhttp://localhost:3456 export ANTHROPIC_API_KEYlocal-router-placeholder export ANTHROPIC_MODELglm4.5-air-ctx32这里有个技巧ANTHROPIC_API_KEY不能留空但 Router 会忽略它的值因为我们已经在 Router 侧配置了真正的密钥填充逻辑。用local-router-placeholder这样的占位符就能满足 Claude Code 的校验。为了让配置持久化我把这三行加入 shell 配置文件echo export ANTHROPIC_BASE_URLhttp://localhost:3456 ~/.bashrc echo export ANTHROPIC_API_KEYlocal-router-placeholder ~/.bashrc echo export ANTHROPIC_MODELglm4.5-air-ctx32 ~/.bashrc source ~/.bashrc3.6 第六步启动并验证完整链路按顺序启动三个服务然后进入 Claude Code 验证终端一启动 Ollamaollama serve终端二启动 Routercd claude-code-router node index.js终端三启动 Claude Codeclaude进入交互界面后先做一个最简单的测试你是什么模型请用一句话回答。如果一切正常你会看到 GLM-4.5-Air 的回答出现在 Claude Code 的界面里。这个效果意味着整条链路已经打通。然后测试工具调用能力比如让它读取当前项目里的某个文件读取当前目录下的 README.md并总结内容如果它能正确读取并总结说明工具调用功能正常。这一步很关键因为 Claude Code 最核心的价值就是调用系统工具、读写文件、执行命令。4. 常见问题与排查技巧实录这一节是我整篇里最想写透的。部署过程中我至少踩了十几个坑有些花了一个多小时才排查出来。4.1 问题一Claude Code 报认证错误现象启动 Claude Code 后直接报Authentication failed根本没机会输入对话。原因Claude Code 不管你的ANTHROPIC_BASE_URL指向哪都会先做认证检查。它要求 API Key 格式正确。解决方法确保ANTHROPIC_API_KEY不是空字符串且ANTHROPIC_BASE_URL指向 Router 的地址。Router 接收到请求后不会真的拿这个 Key 去认证而是用配置文件里的密钥做填充。我踩的坑是一开始直接把ANTHROPIC_API_KEY留空结果 Claude Code 在启动时直接拒绝运行报错信息也查不到。用了local-router-placeholder之后一切正常。4.2 问题二响应速度极慢像死了一样现象Claude Code 发起请求后终端长时间没反应等几分钟才出现第一个 token。原因这种情况大概率是上下文溢出或者模型在等待生成却遇到了显存不足。我的第一反应是查 Ollama 日志发现out of memory字样。解决方法把模型上下文从 32768 降到 16384。GLM-4.5-Air 量化版在 8G 显存下跑 32768 上下文确实勉强降到 16384 后明显流畅。注意上下文长度不是越大越好。它直接影响显存占用和推理速度。如果你的机器只有 6G 显存建议直接 8192再配合 Router 里对max_tokens的限制。4.3 问题三代码修改不准频繁需要重试现象Claude Code 生成的代码逻辑不连贯经常会漏改一个文件或者改了 A 文件却忘了 B 文件。原因量化模型的能力上限限制了一部分 Agentic 能力同时上下文里的项目信息权重不够容易遗忘跨文件的上下文。解决方法在任务描述里明确列出需要修改的文件路径比如“只修改src/utils.ts和src/api.ts”不要一次下达超大范围的任务拆分成小步骤推进把项目的关键约定代码风格、目录结构写进项目根目录的CLAUDE.mdClaude Code 每次启动都会加载这个文件。4.4 问题四Router 日志显示 404现象Claude Code 发出请求后Router 收到但返回 404。原因Claude Code 实际调用的路径可能是/v1/messages而 Router 默认监听路径是/v1/chat/completions两者不匹配。解决方法在 Router 代码里增加一个路径映射把/v1/messages统一转发到后端接口。这个适配逻辑在协议转换层里做const transformedPath req.originalUrl.includes(/v1/messages) ? /v1/chat/completions : req.originalUrl;4.5 问题五中文输出乱码或半中半英现象模型输出的中文有时候出现乱码或者回答一半变成英文。原因量化模型对多语言的支持有一定概率波动特别是上下文很长后模型风格漂移。解决方法在系统提示词里显式强调“请始终使用中文回答保持一致性”。我在 Modelfile 的PARAMETER system里加了这句话效果立竿见影。4.6 问题六Claude Code 的 MCP 工具全部失效现象外接的 MCP 服务比如 GitHub MCP、文件系统 MCP在 Claude Code 里无法响应。原因MCP 工具本质上依赖模型对工具调用格式的精确理解量化模型在复杂的多工具调用场景下经常遗漏参数或输错类型。解决方法暂时禁用大部分 MCP 工具只保留文件系统 MCP。实测文件输入输出功能是对量化模型适配最好的其他高级 MCP 工具留给官方模型场景用。5. 对配置参数的深度解读与调优建议5.1 温度temperature怎么设置才合适Claude Code 默认的 temperature 在代码场景下偏“游离”量化模型的随机性比原版更高所以我在 Router 转发时会把 temperature 压到 0.2 左右。这个值适合代码生成和修改减少了模型“自由发挥”的概率。纯聊天场景可以适当提升到 0.6让回答更自然。5.2 max_tokens 设多少合适我建议 2048 到 4096 之间。太短的 512 不够 Claude Code 生成完整函数太长的 8192 会显著增加单次请求的等待时间因为量化模型的生成长度与耗时的关系接近线性。5.3 num_ctx 和 num_predict 的关系num_ctx是整个上下文窗口num_predict是每次生成的最大 token 数。我之前的错误是只改num_predict没改num_ctx导致模型在长对话后段彻底失忆。两者需要同时合理配置num_ctx16384、num_predict4096是目前测试下来最稳的组合。5.4 缓存cache开与不开Ollama 支持 prompt cache开启后能复用前缀编码结果大幅降低长对话的响应延迟。代价是显存占用增加。我开了缓存在长任务里第二次提问的响应速度提升了接近一倍。PARAMETER num_gpu 99 PARAMETER use_cache true5.5 模型服务的健康检查部署长期运行时建议用 cron 定期检查 Router 进程是否存活。我自己写了一个简单的 Shell 脚本每 10 分钟检查一次node index.js进程是否存在不存在就自动拉起。这个在高负载下特别有用因为 Router 偶尔会因为某个畸形请求崩溃。6. 实际使用效果与性能数据6.1 代码生成场景实测数据我在真实项目里跑了三天任务是修 bug、补注释、生成单测。抽样统计结果场景请求数量成功率平均响应时长生成单测4789%18.5s修复 bug3284%22.1s代码解释5696%9.4s跨文件重构1872%35.6s跨文件重构的成功率最低这符合预期——量化模型在最需要全局状态理解的任务上还是吃力。但如果你把任务拆小、分步处理成功率会明显提高。6.2 资源占用情况运行时资源如下资源占用显存约 6.1G内存约 9.8GCPU 占用约 15%磁盘空间模型文件 5.2G 日志空间这个资源占用说明即使是 8G 显存的机器也能比较从容地运行。6.3 与官方 API 的对比感受使用本地模型和官方 Claude 模型的差异是客观存在的。本地量化 GLM-4.5-Air 在复杂推理、长代码生成、跨文件理解上明显弱于官方模型但它的核心优势是零成本、隐私安全、无网络依赖。对我来说日常改代码、学习新项目、生成解释性文档这些任务用本地模型足够了真正需要顶配能力的时候再通过 Router 切到官方 API。这种混合路由策略是我最终觉得“一站式”方案最值钱的部分——本地优先云端兜底成本和质量都掌控在自己手里。最后分享一个个人经验。整套方案跑通之后我又花了半天时间把启动流程脚本化了用 systemd 管理 Ollama 和 Router 的常驻服务开机自启断电恢复不用手动干预。这看起来是个小事但实际用起来才知道多省心。建议你在部署完成后也抽时间做这一步把服务托管起来而不是依赖手工启动。Claude Code 这边把ANTHROPIC_BASE_URL和模型名写死在 shell 配置里以后每一次打开终端敲个claude就能直接进入工作状态本地大模型驱动的 AI 编程助手就像原生体验一样顺手。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑