ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenClaw 100% Context 问题找到了:从 compaction 到 skillsSnapshot 的排查路径

OpenClaw 100% Context 问题找到了:从 compaction 到 skillsSnapshot 的排查路径 1. OpenClaw 上下文 100% 到底卡在哪OpenClaw 是一个把大模型接进本地工作流的开源 Agent 框架它能读文件、跑命令、调技能适合想让 AI 真正动手干活的人。但很多人第一次跑起来就撞墙对话没几轮Context 直接飙到 100%模型开始报超限或者干脆失忆。我实测下来问题基本不在模型本身而是启动阶段就把上下文吃掉了大半。具体表现是这样的你刚发第一句话还没聊几句界面上的 token 占用条就红了。翻会话记录会发现单次启动请求就吃掉了两万多 tokens。模型 context window 假设是 98k光启动就占了五分之一剩下给对话的空间被压缩得可怜。这时候 compaction 又没触发历史越堆越多最后必然爆掉。这篇就围绕三个热词拆compaction压缩策略、tokenstoken 消耗来源、skillsSnapshot技能快照加载。我会给出可复制的 config.toml 骨架再带你做验证动作确认修复到底有没有生效。适合已经在用 OpenClaw、被 Context 超限卡住的人跟做。先说结论Context 100% 通常是「启动加载太重」加「压缩配置太保守」两个原因叠加。前者让起点就高后者让增长不受控。分开治问题就清楚了。2. 定位 Context 膨胀的三个来源2.1 skillsSnapshot 把 24 个技能全塞进来skillsSnapshot 是 OpenClaw 启动时对已注册技能做的一次快照加载。默认行为是把每个技能的完整描述、参数说明、示例全部读进上下文。如果你装了 24 个技能每个技能描述几百 tokens加起来就是几千 tokens 的固定开销。问题在于大部分技能在当前对话里根本用不到。你只是想让它改个文件结果它把数据库技能、爬虫技能、图像处理技能的说明全背了一遍。这些内容占着 context window却不产生任何价值。排查方法看启动日志里 skillsSnapshot 那一段的 token 计数。如果超过 3000基本可以确认是技能加载过重。2.2 Project Context 无差别加载所有文件Project Context 负责把项目里的 prompt 文件读进上下文常见的有 AGENTS.md、SOUL.md、USER.md、MEMORY.md。默认配置是全量加载也就是这些文件有多长就塞多长。MEMORY.md 尤其危险它是长期记忆文件用久了会越写越长。有人把它当日记写几个月后单这一个文件就上万 tokens。每次启动都全量读context 起点自然高。排查方法单独统计每个文件的 token 数。SOUL.md 和 USER.md 通常几百 tokens 合理MEMORY.md 如果超过 2000 就要考虑精简或按需加载。2.3 compaction 从未触发compaction 是 OpenClaw 的历史压缩机制。当对话变长时它应该自动把旧对话压缩成摘要释放 context 空间。但如果配置太保守它可能一直不触发。判断依据是 compactionCount 这个指标。如果它一直是 0说明从启动到现在一次压缩都没发生过。历史消息原封不动堆着context 只增不减爆掉只是时间问题。这三个来源里skillsSnapshot 和 Project Context 决定起点高度compaction 决定增长速度。要彻底解决两边都得动。3. TaoToken 前置把模型接入配好在调 OpenClaw 的 context 配置之前得先确保模型接入是通的。我用的是 TaoToken 做模型接入层它提供统一的 API 入口OpenClaw 通过它调用模型省去自己维护多个 provider 的麻烦。接入需要的东西很简单一个 API Key一个 base URL。API 地址是 https://taotoken.net/api注意这个不带任何查询参数。Key 在控制台生成路径是 console 里的 api-keys 页面。拿到 Key 之后在 OpenClaw 的模型配置里填两样base_url 指向 https://taotoken.net/apiapi_key 填你生成的那串。模型名按你实际要用的填比如 claude 系列或者 gpt 系列具体支持列表在接入文档里能查到。这一步的意义在于后面调 context 配置时你需要一个稳定的模型端点来验证修复效果。如果模型接入本身不稳你分不清是 context 问题还是网络问题。所以先把这层打通再动 compaction 和 skillsSnapshot。如果你还没生成 Key去 console 的 api-keys 页面建一个权限给到对话和补全就够了。生成后先别急着填进 OpenClaw用下面的命令单独测一下通不通。4. 可复制的 config.toml 骨架4.1 精简 skillsSnapshot 与 Project Context先处理启动加载。核心思路是技能按需加载文件只读必要的。[skills] # 关闭全量快照改为按需加载 snapshot_mode lazy # 只预加载高频技能其余用到再读 preload [file_edit, shell_exec, web_search] # 单个技能描述截断长度防止超长技能撑爆 max_description_tokens 200 [project_context] # 只加载核心身份文件 include [SOUL.md, USER.md] # MEMORY.md 改为按需检索不默认全量读 memory_mode retrieval memory_max_tokens 1500snapshot_mode 设成 lazy 之后skillsSnapshot 不再一次性读所有技能只有真正调用某个技能时才加载它的描述。preload 列表里放你每天都用的几个保证响应速度。max_description_tokens 是保险丝防止某个技能描述写得过长。Project Context 这边include 只留 SOUL.md 和 USER.md这两个是身份和偏好必须常驻。MEMORY.md 改成 retrieval 模式需要时再检索相关片段而不是全量塞入。memory_max_tokens 限制单次检索返回的上限。4.2 调整 compaction 配置再处理历史压缩。默认配置太保守改成更积极的策略。[compaction] mode default reserve_tokens 15000 keep_recent_tokens 8000 max_history_share 0.6 recent_turns_preserve 5 memory_flush true逐项说明。mode 从 safeguard 改成 defaultsafeguard 是保守模式几乎不压缩default 才会主动触发。reserve_tokens 留 15000 给模型回复避免压缩太狠导致没空间生成。keep_recent_tokens 保留最近 8000 tokens 的完整对话保证近期上下文不丢细节。max_history_share 设 0.6意思是历史最多占 context window 的 60%超过就压缩。recent_turns_preserve 保留最近 5 轮对话不动只压更早的。memory_flush 开启后压缩前会先把重要信息写进记忆防止压缩丢关键内容。参数对照表配置项之前现在作用modesafeguarddefault更积极的压缩策略reserve_tokens无15000保留 15k 给回复keep_recent_tokens无8000最近 8k 完整保留max_history_share无0.6历史最多占 60%recent_turns_preserve无5保留最近 5 轮memory_flush无true压缩前写内存把这两段合并进你的 config.toml注意 TOML 的表名不要重复。如果你的配置文件里已经有 [skills] 或 [compaction] 段把对应字段合并进去别直接覆盖整个文件。5. 验证请求与成功结果5.1 用一条命令确认模型接入配置改完先别急着开对话单独测模型端点。用 curl 发一个最小请求curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-3-5-sonnet, messages: [{role: user, content: ping}], max_tokens: 10 }返回里能看到 choices 数组和 usage 字段说明接入正常。usage 里的 prompt_tokens 应该很小因为这条请求没带任何 context。如果这里就报 401 或 404先解决 Key 和模型名的问题别往下走。5.2 启动 OpenClaw 看 token 起点重启 OpenClaw观察启动日志里的 token 统计。修复前 skillsSnapshot 加 Project Context 大概两万多 tokens修复后应该降到几千。重点看两个数skillsSnapshot 的 token 计数以及 Project Context 的 token 计数。前者应该从几千降到几百后者从一万多降到一两千。如果没降检查 snapshot_mode 是不是真的生效了有时候配置没被读到是因为表名写错。5.3 连续对话触发 compaction接下来做压力测试。连续发 10 到 15 轮对话每轮内容长一点观察 compactionCount 的变化。修复前它一直是 0修复后应该在历史占比超过 60% 时开始增长。同时看 context 占用条它会在压缩后回落而不是一路涨到 100%。如果 compactionCount 涨了但 context 没回落检查 max_history_share 是不是设得太高。成功的结果是对话变长时自动压缩历史context 占用稳定在 60% 到 80% 之间波动不再触顶。模型回复质量不受影响因为最近 5 轮完整保留更早的以摘要形式存在。6. 本篇常见错排查6.1 compactionCount 还是 0最常见的原因是 mode 没改。safeguard 模式下压缩几乎不触发必须改成 default。另一个可能是 max_history_share 设得太高比如 0.9那要等历史占到 90% 才压实际上很难触发。改成 0.6 试试。还有一种情况是对话轮数不够。compaction 通常在历史超过阈值后才启动你只聊了两三轮它没机会触发。多聊几轮再看。6.2 skillsSnapshot 没降下来检查 snapshot_mode 的拼写和位置。它必须在 [skills] 表下面写成 snapshot_mode lazy。如果写成 snapshotMode 或者放在别的表里不会生效。另外确认 preload 列表里的技能名和实际注册名一致。名字写错的话预加载失败可能回退到全量加载。看启动日志有没有技能加载报错。6.3 MEMORY.md 检索不到内容memory_mode 改成 retrieval 后记忆不再全量注入而是按当前对话检索相关片段。如果检索不到可能是 memory_max_tokens 设得太小或者记忆文件本身没有结构化。建议把 MEMORY.md 按条目组织每条一个独立段落方便检索命中。如果还是不行临时把 memory_mode 改回 full 确认文件本身没问题再切回 retrieval 调参数。6.4 改了配置但没生效OpenClaw 有些配置需要重启才读。改完 config.toml 后完全退出再启动别只刷新界面。另外确认你改的是实际加载的那个配置文件有些项目有多个 config 文件优先级不同。如果重启后还没变在启动日志里搜配置项名字看它读到的值是多少。日志会打印实际生效的配置对照你写的值就能发现哪里没对上。7. 把接入和排障串起来Context 100% 这个问题拆开看就是启动加载和压缩策略两件事。skillsSnapshot 和 Project Context 决定起点compaction 决定增长。两边都调好context 就能稳定住。模型接入这层用 TaoToken 统一管base URL 是 https://taotoken.net/apiKey 在 console 的 api-keys 页面生成。接入文档里有完整的模型列表和参数说明配 OpenClaw 时对着填就行。如果你还在选模型或者想先试试对话效果模型对话页面可以直接体验不用先配本地环境。长期跑编码和 Agent 任务的话Coding Plan 更适合额度和并发都按持续使用设计不用每次担心 token 不够。排障过程中如果遇到接入报错先回 API Keys 页面确认 Key 状态再对照接入文档检查 base URL 和模型名。最后留个实用习惯每次改完 config.toml先跑一遍第 5 节的验证命令确认模型通、token 起点低、compaction 能触发。三步都过再开始正式对话。这样出问题时你能快速定位是哪一层的事不用从头猜。
返回列表