小龙虾🦞OpenClaw 个人实践 · B-04
成本控制 · 上下文管理 · 多智能体优化
OpenClaw 上下文减肥指南把隐形开销砍掉一半
数据截至 2026 年 3 月 · 不换模型 · 不降质量 · 只砍不该花的钱
很多人用 OpenClaw 越来越觉得费钱,第一反应是换便宜模型。
这个方向不是错的,但只解决了一半问题——甚至不到一半。
真正最烧钱的地方,不是你选了什么模型,而是你每次开口之前,OpenClaw 在你不知道的情况下,已经先塞给模型一大包东西。
OpenClaw 官方 GitHub 上有一条 Issue,标题直白:
"Workspace file injection wastes 93.5% of token budget"
不是夸张。每条消息发出去,模型先吃进去的不是你说的话,而是你那些积累起来的配置文件、规则文档、历史对话……你真正说的那句话,排在最后。
这篇把这个问题讲清楚,然后给出真实可操作的解法——基于 OpenClaw 自带功能和社区验证方案,不涉及复杂开发。
一、你以为在付什么钱,实际在付什么钱
先说清楚一个普遍的误解。
大多数人以为 token 费用 = 你说的话 + AI 的回复。
实际上,一次简单的"今天有什么待办",模型真正处理的 token 分布是这样的:
标红的两行是关键。你没说任何话,它就已经在烧钱了。
这是因为 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 是纯浪费。只写"与众不同"的那些。
二、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 次的普通用户为例估算:
这是在不换主力模型、不降低 Agent 能力的前提下,只优化上下文管理能省下的钱。多 Agent 系统规模越大,效果越明显。
系统的成本不只是你选了什么模型。
更多是你有没有意识到:每次开口之前,它已经先读了多少东西。
配置文件是固定成本,历史是流动成本。两个都管好,才算真的省钱。
今天可以做的几件事
1. 发一条 /context list,看看现在每个配置文件占多少 token
2. 找出最大的那个文件,把模型本来就会的废话删掉
3. 给当前最长的会话发一条 /compact
4. Heartbeat 的模型改成 DeepSeek 或 GLM Flash
5. 把 MEMORY.md 里的详细内容挪到 memory/ 子文件,只保留索引
💬 你的 /context list 里最大的文件是哪个?评论区说说,看看大家哪里胖得最离谱。
夜猫子弦月 | 白天写代码,晚上写文章,偶尔弹古琴MeowClaw Lab 出品
夜雨聆风