如何节省OpenClaw 80%的Token消耗

6 阅读6分钟

最近正好因为业务在爆改OpenClaw,然后做自己业务的Claw,就给大家分享一下在OpenClaw处理上下文中,一些对于普通用户可以节省Token的Tips。

Skills

OpenClaw的Skills设计是这样的:

磁盘 SKILL.md 文件
    ↓ loadSkillEntries()           — 扫描磁盘
    ↓ filterSkillEntries()         — 按配置过滤
    ↓ applySkillsPromptLimits()    — 截断保护
    ↓ formatSkillsForPrompt()      — 只取名称+描述
    ↓
skillsSnapshot.prompt(纯文本,约几百字节)
    ↓
buildSkillsSection()               — 包裹使用规则
    ↓
system prompt 数组中展开

第一步

OpenClaw的第一步会取你所有 可用 的Skills的 namedescription放入上下文中。

好消息是:它只会取你前 N 个 skill,默认上限 150 个。

坏消息是:就算只取50个Skills的 namedescriptiom也是超高的上下文消耗。

紧接着取出来可用的之后,第二步还会用二分查找找到最大能装下的前缀,默认上限 30,000 字符。

这对于我们来说,其实就是两个点:

  1. 不要瞎下很多的Skills,特别是基本实现差不多的Skills,他们都是会装入上下文的,我们要谨慎安装,时常清理。
  2. 在编写Skills的时候,不要把 namedescription写特别长,这是必读的部分。

第二步

只有当模型判断真的需要某项技能时,才会自己调用 Read 工具拉取具体的 SKILL.md 回来。(一轮对话只会选中一个,不会选中多个,这是写在源码提示词的东西),然后去执行。

这里的点是在于:在我们编写Skills的时候,如果你有一份很详细的 JSON 数据样本,或者长达两三万行的排错日志。不要直接粘贴到 SKILL.md 中。因为读出来的东西,是会全量到上下文的下次思考和过程的。(这里其实还有个限制SKILL.MD不能超过256,000 bytes)

后面的步骤基本都跟节省消耗关系不大了。

Project Context

OpenClaw 启动或者是开启新 Session 时,会自动根据配置(比如 workspace 下的 AGENTS.mdSOUL.md 以及其他指定的上下文文件)提取上下文,并且将它们作为 Project Context 组装到 System Prompt 中。

这也是消耗 Token 最核心的地方,它的文件加载限制设计是这样的:

配置的 Project Context 文件列表
    ↓
buildBootstrapContextFiles()       — 开始分配字符额度 (Budget)
    ↓
    ├— 每个文件最高不超过 20,000 字符 (默认 bootstrapMaxChars)
    ├— 所有文件总计最高不超过 150,000 字符 (默认 bootstrapTotalMaxChars)
    ↓
拼接进 System Prompt 的 Project Context 块

第一步:单文件额度与“掐头留尾”保护机制

好消息是:就算你把单个指导文件(例如 AGENTS.md)写得太长,超过了单文件上限(默认是 20,000 字符),OpenClaw 也没有生硬地一刀切掉后半边,更不会因为读取超限而直接崩掉。它底层采用了一种掐头留尾砍中间的截断策略:

  • 保留文件开头的 70% (Head Ratio = 0.7)
  • 保留文件结尾的 20% (Tail Ratio = 0.2)
  • 将文件中间被砍掉的长段替换为一句 [...truncated, read {fileName} for full content...]

坏消息是:这种截断是完全无脑按物理字数切割的。如果你恰好把一段极长、极其详尽的排错代码或者业务逻辑写在了中间的截断区,大模型甚至连阅读这段逻辑的机会都没有,这部分内容就这么凭空消失了。

这对于我们来说,其实就是两个点:

  1. 不要把具体的代码实现细节、常年不看的压测历史日志塞进系统的 Bootstrap 配置文件中(如 AGENTS.md)。
  2. 头部最重要,尾部次重要。如果你非要塞一套几万字的标准作业手册(SOP),千万要记得把“核心定义和高压红线”写在前 70%,把“兜底总结和输出规范”写在最后 20% 里面。

第二步:全局预算耗尽保护

我们知道OpenClaw有这些默认文件,但是这只是OpenClaw给的小白用户一个比较好的默认起点配置而已,你完全可以写更多的File去引导大模型,加在Agent.md入口中,或者其他入口里。

文件来源谁写入真实内容作用
BOOTSTRAP.md模板复制用完删除onboarding 引导
IDENTITY.md模板复制AI 写入AI 身份
USER.md模板复制AI 写入用户信息
SOUL.md模板复制AI/用户修改人格
AGENTS.md模板复制用户/AI行为规范
HEARTBEAT.md模板复制用户/AI定期任务
TOOLS.md模板复制用户/AI工具说明
MEMORY.md不自动创建AI 创建长期记忆

上下文工程这种事情我觉得是基本功和需要靠大量尝试的,每个人都有自己的方法论和实践,比如我可能就拆得很细,拆了7、8个辅助文件,因为可以做文件索引去节省上下文。

比如某个辅助文件是专门控制子Agent行为和调用模型,某个辅助文件是控制人格修正什么的。包括现在很火的self-improve这类skills也是在下面加了很多Markdown,并不特别。

如果你的文件实在太多,即使每个都没超过两万字,但全部配置文件的总字数由于堆叠逼近了全局上限(默认 150,000 字符)时:每塞进去一个文件,系统剩余可分配的字符配额(remainingTotalChars)就会疯狂缩减。

当装到某一个文件时,系统发现可用余量少于 64 个字符(源码里写死的门槛 MIN_BOOTSTRAP_FILE_BUDGET_CHARS)时,OpenClaw 会觉得“只剩 64 个字符了,塞个文件名进来毫无意义”。于是,它会直接打断并彻底废弃加载后续队列里的所有上下文文件

这里的点是在于:优先级决定生死。在 OpenClaw 中,一定要优先把自己最核心的想法文件(比如赋能性格的 SOUL.md、或者系统核心 RULES.md)放在最前面。对于些庞杂的辅助设定文档,果断放在后头。这样哪怕触碰到了全局 15 万字的硬上限,也就是次要上下文读取失败。

结束

文章写长了没人看,所以多写几章。后面应该会写一些配置上如何节省Token,长记忆最佳的总结机制,长记忆Embed/Query的最佳实践、缓存机制等。

完整的实现,我目前自己测试过,每轮对话能节约30-60%的Token使用。而根据业务完全的魔改版能节约40-80%的Token使用。(我的计算基准是根据OpenClaw里有个Report的函数,并没有计算上游Cache等场景,可能不是特别准确)

所以可以想象的是调优是件很有必要的场景。

欢迎加入我们的OpenClaw调优社区,这里有很多的技术大牛,也有各种寻求帮助的用户。