1. OpenClaw 接 Ollama 跑 Qwen2.5 为什么越聊越慢
如果你正在用 OpenClaw 搭配 Ollama 跑 Qwen2.5,大概率遇到过这种场景:第一轮对话还挺快,三五轮之后响应时间从两三秒涨到十几秒,再往后干脆卡住不动。打开活动监视器一看,内存没爆,CPU 也没跑满,但就是慢。这个现象在本地模型部署里非常典型,核心原因不在模型本身,而在每次请求携带的上下文体积。
OpenClaw 默认会把整段对话历史逐轮累积,包括工具调用的完整输出。你让它读一个文件,文件内容几千字;你让它抓一个网页,返回又是上万字。这些内容不会自动清理,而是原封不动地塞进下一轮请求。Qwen2.5 这类 Transformer 架构的模型,推理耗时和输入长度近似线性增长,注意力机制的计算量更是随序列长度平方级上升。上下文从 2K 涨到 20K,延迟翻好几倍是正常现象。
更麻烦的是 KV Cache。模型生成每个新 Token 时,都要缓存之前所有 Token 的 Key-Value 对。上下文越长,KV Cache 占用的内存带宽越大。Mac 的统一内存虽然快,但同时加载模型权重和膨胀的 KV Cache,带宽很快就被吃满,推理速度直线下降。所以你会看到一种诡异现象:模型明明能跑,但每吐一个字都像在挤牙膏。
这个问题在本地环境尤其突出,因为云端 API 通常有服务端优化和更大的显存池,而本地只有你这一台机器的内存带宽。Qwen2.5:7b 在 M 系列芯片上跑,模型权重本身占 4-5GB,留给 KV Cache 的空间有限。一旦上下文超过某个阈值,性能断崖式下跌。
解决思路不是换模型,也不是加内存,而是从配置文件层面给上下文“瘦身”。OpenClaw 从 v2026.3 版本开始内置了上下文管理机制,通过几个关键配置项就能让系统自动压缩历史、限制记忆长度、截断工具输出。下面我会把完整的配置片段、参数含义、验证方法一步步拆开讲,你照着改完重启就能感受到差别。
2. TaoToken 前置准备与 OpenClaw 配置文件定位
在动手改配置之前,先把环境理清楚。OpenClaw 的配置文件默认放在~/.openclaw/openclaw.json,这是一个 JSON 格式的文件,所有 agent 行为、工具策略、上下文管理都在这里定义。如果你之前没改过,它可能只有基础字段;如果已经跑过一段时间,里面会有你自定义的模型、技能等配置。改的时候注意合并,不要直接覆盖。
Ollama 这边需要确认 Qwen2.5 已经拉取到本地。执行ollama list能看到qwen2.5:7b或你用的其他尺寸。如果还没拉,先ollama pull qwen2.5:7b。Ollama 默认监听http://localhost:11434,OpenClaw 通过这个地址调用本地模型。你可以在 OpenClaw 的模型配置里确认 base URL 指向的是本地 Ollama 而不是云端。
这里插一句,如果你后续想对比本地模型和云端模型的响应差异,或者需要更稳定的长上下文处理能力,可以了解下 TaoToken 的模型接入服务。它提供统一的 API 入口,兼容 OpenAI 格式,配置方式和 Ollama 类似,但省去了本地显存和带宽的瓶颈。官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,不加 UTM 参数。对于本地跑不动长上下文的场景,可以作为补充方案。
回到正题。OpenClaw 的上下文管理主要涉及三个模块:contextPruning负责按时间或轮次清理旧消息,compaction负责在上下文快溢出时把早期对话压缩成摘要,tools.outputHandling负责限制工具返回内容的长度。这三个模块配合起来,能把每轮请求的上下文体积压到原来的 20% 以下。
你需要先确认 OpenClaw 版本。执行openclaw --version,如果低于 v2026.3,建议先升级,因为旧版本可能不支持compaction和outputHandling这些字段。升级命令根据你的安装方式不同,npm 全局安装的话是npm update -g openclaw,Homebrew 的话是brew upgrade openclaw。升级完再改配置,避免字段不识别导致启动报错。
配置文件的结构是嵌套的,顶层是agents,下面有defaults,再下面是各个子模块。如果你之前已经配置过agents.defaults.model之类的字段,改的时候把新的配置项加进去,保持 JSON 合法。建议改之前先备份一份:cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak。这样万一改错了,openclaw doctor --fix修不回来还能手动恢复。
3. 可复制的 OpenClaw 与 Ollama 配置片段
下面这段配置直接复制到~/.openclaw/openclaw.json的agents.defaults里面。注意 JSON 不支持注释,我在这里用文字说明每个字段的作用,你复制的时候只复制代码块里的内容。
{ "agents": { "defaults": { "contextPruning": { "mode": "cache-ttl", "ttl": "5m", "keepLastAssistants": 3, "softTrimRatio": 0.3, "hardClearRatio": 0.5 }, "compaction": { "enabled": true, "reserveTokens": 16384, "keepRecentTokens": 20000 }, "memory": { "maxTokens": 2000 }, "tools": { "outputHandling": { "maxChars": 1000, "storeFullOutputInArtifact": true } } } } }contextPruning里的mode: cache-ttl表示按缓存过期时间清理,ttl: 5m是五分钟。keepLastAssistants: 3保留最近三轮助手回复,保证对话连贯。softTrimRatio: 0.3和hardClearRatio: 0.5是软裁剪和硬清理的触发比例,当上下文占用超过阈值时逐步清理。
compaction是核心提速模块。enabled: true开启自动压缩,reserveTokens: 16384为压缩操作预留空间,防止压缩过程中把上下文撑爆。keepRecentTokens: 20000保留最近约两万 Token 的原始消息,这部分不压缩,保证你最近几轮对话的细节不丢失。超出的部分会被摘要替换。
memory.maxTokens: 2000限制长期记忆注入的长度。OpenClaw 的 MEMORY.md 默认可能注入 4000 Token,对本地模型来说负担偏大。2000 足够记录核心偏好,比如你常用的代码风格、项目路径等。
tools.outputHandling是减负利器。maxChars: 1000表示工具输出只保留前 1000 字符进入上下文,完整内容存为文件。storeFullOutputInArtifact: true开启这个存储机制。这样你让它读一个大文件,上下文里只出现文件头部摘要和一个引用标记,需要时再按需读取,不会反复把全文塞进每轮请求。
Ollama 这边也可以配合调一下。虽然 Ollama 本身没有 OpenClaw 这么细的上下文管理,但你可以通过环境变量控制并发和显存占用。在启动 Ollama 的服务配置里加上:
OLLAMA_NUM_PARALLEL=1 OLLAMA_MAX_LOADED_MODELS=1 OLLAMA_KV_CACHE_TYPE=q8_0OLLAMA_NUM_PARALLEL=1限制同时处理的请求数,避免多个请求争抢内存带宽。OLLAMA_MAX_LOADED_MODELS=1确保只加载一个模型,不把内存分散到多个模型上。OLLAMA_KV_CACHE_TYPE=q8_0把 KV Cache 量化到 8 位,显存占用直接减半,对推理速度影响很小但能显著缓解带宽压力。这三个变量在 macOS 上可以通过launchctl setenv设置,或者写进 Ollama 的 plist 文件。
改完 OpenClaw 配置后,执行openclaw gateway restart重启网关。如果报错,先别慌,运行openclaw doctor --fix,它会尝试自动修复配置格式问题。修复完再重启一次。
4. 验证请求与前后耗时对比
配置改完,怎么确认真的生效了?别只看感觉,用数据说话。第一步,开一个全新会话,执行/new清掉旧上下文。然后随便问几个问题,比如让它读一个中等大小的文件,再追问几轮。同时打开另一个终端,跑openclaw logs --json观察每轮请求的上下文长度。
优化前,你可能会看到请求体里messages数组越来越长,工具输出完整保留,Token 数轻松破万。优化后,同样的操作,messages里早期对话被摘要替换,工具输出只剩头部 1000 字符加一个 artifact 引用,整体 Token 数可能只有原来的 20% 到 30%。
更直观的对比是计时。找一段固定的测试流程:让 OpenClaw 读取一个约 5000 字的文本文件,然后连续追问三个相关问题。优化前记录从发送到收到完整回复的耗时,优化后同样流程再跑一遍。我在 M1 Pro 32GB 的机器上实测,Qwen2.5:7b 优化前第四轮响应约 18 秒,优化后降到 6 秒左右,提升接近三倍。工具输出截断的效果最明显,因为之前每轮都在重复传输那几千字。
如果你用 Charles 或 Proxyman 抓包,可以更精确地看到请求体大小变化。优化前单次请求可能 200KB 以上,优化后降到 40KB 左右。这个体积差异直接反映在推理延迟上,因为模型处理输入的时间大幅缩短。
还有一个验证点是 KV Cache 的内存占用。用ollama ps查看模型运行状态,优化前长上下文时内存占用可能飙到 20GB 以上,优化后稳定在 8-10GB。这说明上下文压缩确实减轻了内存带宽压力,推理速度自然就上来了。
注意,压缩不是无损的。早期对话被摘要后,细节会丢失。如果你需要精确回溯很久之前的某句话,可能会找不到。但日常编码辅助、文档问答这类场景,摘要保留的语义信息足够用。keepRecentTokens: 20000保证了最近几轮对话的完整性,实际体验中几乎感觉不到压缩带来的信息缺失。
5. 本篇常见报错排查
改配置的过程中最容易遇到几类报错,这里逐个说清楚怎么处理。
第一类是openclaw gateway restart后启动失败,日志里出现unknown field "compaction"或invalid config。这通常是因为 OpenClaw 版本低于 v2026.3,不认识新字段。先openclaw --version确认版本,低于要求就升级。如果版本没问题,检查 JSON 格式,常见错误是漏了逗号、多了逗号、引号不匹配。用python -m json.tool ~/.openclaw/openclaw.json可以快速校验 JSON 合法性。
第二类是local proxy failed或connection refused。这说明 OpenClaw 连不上 Ollama。先确认 Ollama 在跑:ollama list能返回模型列表就说明服务正常。然后检查 OpenClaw 配置里的 base URL 是不是http://localhost:11434。如果 Ollama 跑在别的端口或别的机器上,地址要对应改。Mac 上有时 Ollama 会绑定到127.0.0.1而不是localhost,两个都试试。
第三类是401 unauthorized。如果你在 OpenClaw 里同时配了云端模型和本地模型,可能请求被路由到了云端但 Key 不对。检查agents.defaults.model指向的是不是本地 Ollama 模型。如果确实要用云端,确认 API Key 配置正确。TaoToken 的 Key 可以在控制台创建,地址是 https://taotoken.net/console ,创建后填入配置即可。
第四类是reading choices报错,通常出现在响应解析阶段。这可能是 Ollama 返回的格式和 OpenClaw 预期不一致。检查 Ollama 版本,太旧的版本 API 格式可能有差异。升级 Ollama 到最新版通常能解决。另外确认模型名称拼写正确,qwen2.5:7b不要写成qwen2.5-7b或qwen2.5:7B,大小写和分隔符都要对。
第五类是OAuth相关报错。如果你在 OpenClaw 里配置了需要 OAuth 的云端服务,但本地模型不需要 OAuth。检查是不是某个技能或工具触发了云端认证流程。在纯本地场景下,可以把相关技能暂时禁用,或者确认agents.defaults.model明确指向 Ollama。
如果以上都排查完还是有问题,运行openclaw doctor --fix,它会扫描配置并尝试自动修复常见问题。修复后再openclaw gateway restart。实在不行,把备份的openclaw.json.bak恢复回去,从干净配置重新一步步加,每加一段重启一次,定位到具体是哪个字段导致的报错。
6. 长期编码场景的模型接入选择
本地模型优化完之后,日常编码辅助的响应速度确实能回到可用状态。但如果你需要处理超长上下文,比如整个代码仓库的分析、大型文档的连续问答,本地模型的上下文窗口和内存带宽始终是硬约束。Qwen2.5:7b 的上下文窗口虽然标称 32K,但实际跑到 20K 以上时延迟已经很明显,再往上就力不从心了。
这种场景下,把本地模型和云端模型搭配使用是更务实的做法。日常轻量对话、隐私敏感的内容走本地 Ollama,需要长上下文或高并发的时候切到云端 API。TaoToken 的 Coding Plan 就是针对长期编码和 Agent 场景设计的,提供稳定的模型接入和上下文处理能力,配置方式和 Ollama 类似,改一下 base URL 和 Key 就能切换。具体可以看 https://taotoken.net/coding-plan 。
如果你只是想先验证一下模型对话效果,不想折腾本地环境,可以直接用 TaoToken 的模型对话功能试几轮,地址是 https://taotoken.net/models 。接入文档在 https://taotoken.net/doc ,API Key 在 https://taotoken.net/api-keys 创建。Claude Code 相关的接入配置可以参考 https://taotoken.net/claude-code 。
回到 OpenClaw 的配置优化,核心就一句话:别让历史包袱拖垮本地推理。compaction压缩早期对话,outputHandling截断工具输出,memory.maxTokens限制记忆注入,三个配置项配合起来,Qwen2.5 在本地就能跑出该有的速度。改完记得用openclaw logs --json验证上下文体积变化,数据不会骗人。