乐于分享
好东西不私藏

OpenClaw·上下文减肥指南|把隐形开销砍掉一半

OpenClaw·上下文减肥指南|把隐形开销砍掉一半

小龙虾🦞OpenClaw 个人实践 · B-04

成本控制 · 上下文管理 · 多智能体优化

OpenClaw 上下文减肥指南把隐形开销砍掉一半

数据截至 2026 年 3 月 · 不换模型 · 不降质量 · 只砍不该花的钱

     很多人用 OpenClaw 越来越觉得费钱,第一反应是换便宜模型。   

     这个方向不是错的,但只解决了一半问题——甚至不到一半。   

     真正最烧钱的地方,不是你选了什么模型,而是你每次开口之前,OpenClaw 在你不知道的情况下,已经先塞给模型一大包东西。   

OpenClaw 官方 GitHub 上有一条 Issue,标题直白:

"Workspace file injection wastes 93.5% of token budget"

     不是夸张。每条消息发出去,模型先吃进去的不是你说的话,而是你那些积累起来的配置文件、规则文档、历史对话……你真正说的那句话,排在最后。   

     这篇把这个问题讲清楚,然后给出真实可操作的解法——基于 OpenClaw 自带功能和社区验证方案,不涉及复杂开发。   


一、你以为在付什么钱,实际在付什么钱

     先说清楚一个普遍的误解。   

     大多数人以为 token 费用 = 你说的话 + AI 的回复。   

     实际上,一次简单的"今天有什么待办",模型真正处理的 token 分布是这样的:   

消耗来源
大约 tokens
你控制了吗
OpenClaw 系统提示词(硬编码)
3,000~5,000
❌ 无法修改
配置文件注入(SOUL/AGENTS等)
3,000~14,000
⚠️ 可大幅优化
历史对话记录
随会话增长
⚠️ 可大幅优化
你说的这句话
约 20
——
AI 的回复
200~800
——

     标红的两行是关键。你没说任何话,它就已经在烧钱了。   

     这是因为 OpenClaw 的设计逻辑是:每次对话开始,把所有配置文件全部注入——SOUL.md、AGENTS.md、USER.md、TOOLS.md、MEMORY.md、HEARTBEAT.md,全部,每次。   

     再加上累积的历史对话,一个运行了一段时间的系统,每次轻描淡写地说一句话,背后已经是一次 1 万到 5 万 token 的请求。   

换算成钱有多贵

用 Claude Sonnet 4.6(输入 ¥22/百万 tokens)举例:

• 配置文件 10,000 tokens × 100 次/天 = 100 万 tokens = ¥22/天 = ¥660/月,什么都没干

• 每减少 1,000 tokens 的配置文件体积,按 100 次/天计算,每月节省约 ¥66


二、第一步:给配置文件减肥

     配置文件是每次请求都要加载的固定成本,这里省一点,每次都省。   

先摸清楚现状

     在 OpenClaw 对话框里输入:   

/context list

     它会列出当前每个文件占用了多少字符,哪些被截断了。这是优化前的基准数据,先看清楚钱花在哪,再动手。   

每个文件该有多长

各配置文件的合理目标体积(字符数)

文件
职责(只放这些)
建议上限
SOUL.md
只写让它"不一样"的性格规则,默认行为不要重复写
< 800 字
AGENTS.md
规则边界、安全限制,精简到清单格式
< 600 字
USER.md
你的背景、偏好、时区,不放业务文档
< 500 字
HEARTBEAT.md
只写例行检查清单,不放背景知识
< 400 字
MEMORY.md
索引指针 + 核心事实,长内容放 memory/ 子目录
< 2000 字

最常见的"肥胖"来源

一、模型本来就会的事,你又说了一遍

     "保持有帮助、准确、高效"、"尊重用户"、"回答时条理清晰"——这些是模型默认行为,写进 SOUL.md 是纯浪费。只写"与众不同"的那些。   

二、AGENTS.md 变成了规则大杂烩

     规则文件越加越厚,从最初的十条变成了四十条,性格说明、工具说明、备忘录全塞进去了。AGENTS.md 只应该放行为规则,其他的拆到对应的文件里。   

三、MEMORY.md 当成日记本在用

     每天的事情全写进 MEMORY.md,结果这个文件每个月都在膨胀,而它是每次请求都加载的。正确做法:MEMORY.md 只放持久的、跨场景的核心事实(姓名、时区、项目背景),时间相关的内容放 memory/日期.md,用 memory_search 按需读取。   

# 设置配置文件注入的硬性上限(openclaw.json)

       {         "agents": {           "defaults": {"bootstrapMaxChars": 5000,// 单文件上限(默认 20000)"bootstrapTotalMaxChars": 30000// 所有文件总上限(默认 150000)           }         }       }     

     默认的 150,000 字符上限相当于约 5 万 tokens,每次请求都要付这笔钱。设成 30,000 字符,按配置文件精简后的实际体积,可以把这部分开销砍掉 60-80%。   


三、第二步:控制历史对话的体积

     历史对话是另一块隐形开销。每多一轮对话,下一次请求就要多带这些历史。会话跑得越久,每次请求越贵。   

方法一:/compact——压缩而非丢弃

     在对话框里输入 /compact,OpenClaw 会把旧的对话记录压缩成一段摘要,保留核心逻辑,丢掉冗余细节。   

     可以加指引,让压缩更精准:   

       /compact Focus on 保留决策结论和待办事项,删除调试过程和重复内容     

     建议:每 10-15 轮对话主动跑一次 /compact,不要等系统自动触发(自动触发往往已经很贵了)。   

方法二:不同任务开新会话

     这是最简单也最有效的方法,很多人就是不舍得用。   

     逻辑上不相关的任务,放进同一个长会话,只会让双方都越来越混乱。"写一封邮件"和"分析上周的销售数据"放在同一个会话里,历史上下文对两件事都是干扰,不是帮助。   

       /new   # 开启新会话,清空历史,保留所有配置文件

方法三:配置历史消息上限

     在 openclaw.json 里设置会话历史的硬性上限:   

       {         "sessions": {"maxHistoryMessages": 50,// 最多保留 50 条消息"maxHistoryTokens": 12000,// token 数超过就压缩           "autoCompaction": true,           "compactionStrategy": "summary",           "compaction": {             "summaryMaxTokens": 1000, // 摘要不超过 1000 tokens             "preserveLastN": 20 // 最近 20 条原文保留           }         }       }     

     超过 maxHistoryTokens 的部分会被自动压缩成摘要,而不是直接丢掉,效果比截断好。


四、第三步:多智能体系统的专项优化

     单 Agent 的问题是"自己把自己养胖了",多 Agent 系统还有额外的问题:每只虾各自都在加载完整的配置包,每只都在带着大量历史跑。   

子 Agent 用精简模式启动

     OpenClaw 支持三种系统提示词模式:   

full(默认):注入所有配置文件 + 完整工具列表 + 记忆系统 → 适合主 Agent,功能全

minimal:去掉技能列表、记忆召回、消息格式等模块 → 适合子 Agent,只保留完成任务必须的内容

none:跳过整个系统提示词构建 → 适合只需要执行单一功能的工具型 Agent

     每个子 Agent 的 SOUL.md 应该只写它这个角色的职责,不需要加载主 Agent 的整套规则。在 openclaw.json 里为子 Agent 单独配置:   

       {         "agents": {           "list": [             { "id": "main" }, // 主 Agent 用 full 模式             {               "id": "researcher",               "workspace": ".agents/researcher","systemPromptMode": "minimal"// 子 Agent 精简模式             },             {               "id": "editor",               "workspace": ".agents/editor","systemPromptMode": "minimal"             }           ]         }       }     

Cron 任务用隔离会话

     定时任务(每天发日报、每周汇总)不需要带着主会话的全部历史去跑。加上 --session isolated,每次定时任务都在干净的上下文里启动:   

       openclaw cron add \         --name "每日日报" \         --cron "30 7 * * 1-5" \--session isolated \# 独立会话,不带主会话历史         --message "搜集今日信息,发飞书日报。" \         --announce     

     隔离会话只加载配置文件,不加载你昨天的对话历史。日报任务本身不需要知道你昨天和主 Agent 聊了什么。   

Heartbeat 用便宜模型 + 限制频率

     Heartbeat 每 30 分钟跑一次,绝大部分时候什么都没发生,回复 HEARTBEAT_OK 就结束了。但它每次都要加载完整上下文。   

两个优化点:

① 用便宜模型跑 Heartbeat:在配置里单独给 Heartbeat 指定 DeepSeek 或 GLM Flash,不需要用主模型

② HEARTBEAT.md 只保留必要检查项:不把背景知识放进去,只放清单,控制在 400 字以内


五、进阶:用 memory_search 替代"把所有信息塞进 MEMORY.md"

     很多人以为 MEMORY.md 写得越详细,Agent 越聪明。实际相反——这个文件越大,每次请求就越贵,而大量内容其实当次任务根本用不到。   

     更好的架构:   

MEMORY.md — 只放索引和核心事实

       ## 核心背景       姓名:XX,时区:Asia/Shanghai       主要项目:[项目名] → 详情见 memory/project-xxx.md       关键客户:[客户名] → 详情见 memory/client-xxx.md       ## 行为偏好       - 回复简洁,不超过 3 句话       - 数字用中文单位     

↑ 这个文件始终加载,保持精简。详细内容用指针指向子文件。

memory/ 子目录 — 按需调用

把详细的项目背景、客户信息、历史决策放在 memory/ 子目录里:

       memory/       ├── project-abc.md       ├── client-xyz.md       ├── 2026-03.md (3 月日志)       └── decisions.md     

这些文件不自动加载,Agent 通过 memory_search 按需读取,返回相关片段而不是整个文件。

     这个架构下,MEMORY.md 控制在 2000 字以内,详细知识放在子文件里。处理日常任务时只加载核心摘要,遇到需要深入知识的场景再用 memory_search 精准召回——既省钱,又不损失任何知识。   


六、做完这些,能省多少

     以一个使用 Claude Sonnet 4.6、每天主动对话 50 次 + Heartbeat 48 次的普通用户为例估算:   

优化项
优化前
优化后
月节省
配置文件体积(每次注入)
约 12,000 token
约 3,000 token
约 ¥140
历史对话控制(/compact)
无上限累积
上限 12,000 token
约 ¥80
Heartbeat 换便宜模型
Sonnet(¥22/M)
DeepSeek(¥2/M)
约 ¥30
合计节省
——
——
约 ¥250/月

     这是在不换主力模型、不降低 Agent 能力的前提下,只优化上下文管理能省下的钱。多 Agent 系统规模越大,效果越明显。   


系统的成本不只是你选了什么模型。

更多是你有没有意识到:每次开口之前,它已经先读了多少东西。

配置文件是固定成本,历史是流动成本。两个都管好,才算真的省钱。

今天可以做的几件事

1. 发一条 /context list,看看现在每个配置文件占多少 token

2. 找出最大的那个文件,把模型本来就会的废话删掉

3. 给当前最长的会话发一条 /compact

4. Heartbeat 的模型改成 DeepSeek 或 GLM Flash

5. 把 MEMORY.md 里的详细内容挪到 memory/ 子文件,只保留索引


     💬 你的 /context list 里最大的文件是哪个?评论区说说,看看大家哪里胖得最离谱。   


     夜猫子弦月 | 白天写代码,晚上写文章,偶尔弹古琴MeowClaw Lab 出品