分享如何节省 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 总预算导致后续文件不加载