分享如何节省 OpenClaw 80% 的 Token 消耗(总结)
原文:https://linux.do/t/topic/1804369
TL;DR(5-8 行)
- 这篇帖从源码流程出发,解释 OpenClaw 的两块主要 token 消耗来源:Skills 列表注入与Project Context(bootstrap 文件)注入,并给出“立竿见影”的节省建议。
- Skills 部分的关键点是:即使 OpenClaw 只把 skills 的 name+description 放进 prompt,也会在数量/长度上造成显著开销;因此要“少装、短写、避免重叠”。
- 只有当模型判断需要某个 skill 时才会读取完整
SKILL.md(并且一轮只会选一个),所以超长样本/日志/JSON 不要塞进SKILL.md,应该放到references/等按需文件里。 - Project Context 部分通过预算机制(单文件上限、全局上限、掐头留尾截断)保护 prompt,但也可能导致“关键内容被截断”或“后续文件直接不加载”。
- 因此要把最重要规则放在文件前 70% 与最后 20%,并把最核心文件放在配置列表前面,避免触发全局预算耗尽时丢失关键上下文。
- 作者最后强调:上下文工程要靠实践迭代;后续计划写更多关于配置、长记忆与缓存的省 token 策略。
核心要点(8-15 条)
- OpenClaw 在 session 启动时,会把“可用 skills 的 name+description”做成一个 skillsSnapshot,再包进 system prompt;默认最多取前 150 个 skill。
- 即便只塞 50 个 skill 的 name/description,也可能是“高上下文消耗”;此外还会做前缀截断以适配默认 30,000 字符上限。
- 运行中真正读取
SKILL.md是按需发生的:模型只在需要时调用 Read 拉取完整内容,且一轮对话只会选中一个 skill。 - 因此:不要把几万行日志/巨型 JSON 样本直接写进
SKILL.md;一旦读进来会全量进入后续上下文(并且SKILL.md还有 256,000 bytes 的硬上限)。 - Project Context 的注入有预算:单文件最多 20,000 字符(bootstrapMaxChars),所有文件总计最多 150,000 字符(bootstrapTotalMaxChars)。
- 单文件超限时不是“硬切尾部”,而是“掐头留尾砍中间”:保留头 70%、尾 20%,中间替换成 truncated 提示。
- 这种按字数切割很“无脑”,如果关键逻辑落在中间被砍区,模型就完全看不到。
- 当全局剩余预算小于 64 字符(MIN_BOOTSTRAP_FILE_BUDGET_CHARS)时,OpenClaw 会直接停止加载后续所有上下文文件。
- 结论:技能要精简 + 描述要短;上下文文件要分层、按优先级排序;重要约束要写在最容易被保留的位置(头/尾)。
结构化梳理(按原文逻辑)
1) Skills:为什么“装多了就贵”
- OpenClaw 会扫描磁盘上的 skills,过滤可用项,并把 name+description 格式化进 skillsSnapshot。
- 默认最多取前 150 个,并在 30,000 字符预算内做二分截断,保证能塞进 prompt。
2) Skills 的可操作建议
- 不要乱装大量、功能重叠的 skills(它们都会以 name/description 形式进上下文)。
- 写 skill 时不要把 name/description 写得很长(它们属于“必读、常驻 prompt”部分)。
SKILL.md只放“路由与流程”,大样本/大日志放到references/,让模型按需读取。
3) Project Context:真正的大头与两级预算
- 启动/新 session 时会把 AGENTS/SOUL/USER 等项目文件作为 Project Context 拼到 system prompt。
- 单文件与全局预算同时生效:单文件超限触发掐头留尾;全局预算耗尽会导致后续文件直接不加载。
4) Project Context 的可操作建议
- 重要红线/核心定义优先放在文件前 70% 与最后 20% 的“安全区”。
- 核心文件(如 SOUL.md、RULES.md)必须排在最前面;辅助文档放后面。
- 避免把很少用、但很长的代码/历史日志塞进 bootstrap 文件。
5) 结尾与后续方向
- 作者表示会继续写:配置层面的省 token、长记忆最佳实践、Embed/Query、缓存机制等。
关键细节 / 数据 / 例子
- skills:上限 150 个;skills prompt 截断上限 30,000 字符。
SKILL.md大小上限:256,000 bytes。- bootstrap:单文件 20,000 字符;总计 150,000 字符。
- 截断策略:Head 0.7 / Tail 0.2;中间替换为 truncated 提示。
- 全局预算门槛:剩余 < 64 字符 时停止加载后续文件。
原文摘录(3-8 条)
“不要瞎下很多的Skills……在编写Skills的时候,不要把 name 和 description 写特别长,这是必读的部分。”
“只有当模型判断真的需要某项技能时,才会自己调用 Read 工具拉取具体的 SKILL.md……一轮对话只会选中一个。”
“掐头留尾砍中间……保留文件开头的 70%,保留文件结尾的 20%。”
“当装到某一个文件时……可用余量少于 64 个字符……会直接打断并彻底废弃加载后续队列里的所有上下文文件。”
我的备注
- 这篇帖的价值在于把“省 token”落到了可执行的工程点位:常驻 prompt 的 name/description、按需加载的 references、以及 bootstrap 文件的预算与排序。
- 如果你在做自己的 Claw/Agent,建议把“高频规则写短、低频细节分文件并按需读”当作默认架构,而不是把所有东西堆进一个大文件。
行动项(如果适用)
- 清理 skills:删除功能重叠/低频的,控制数量与描述长度
- 重构技能内容:把大样本/日志移到
references/,主 SKILL.md 只保留路由与流程 - 审计 Project Context:把核心文件前置,关键约束写在文件头部/尾部安全区
- 定期检查启动时的 Project Context 总长度,避免逼近 150k 总预算导致后续文件不加载