很多人刚开始用 OpenClaw 的时候,都会遇到一个问题:Token 消耗得特别快。明明只是聊了几轮,账单就蹭蹭往上涨。
为什么会这样呢?
其实,要理解Token 消耗,我们可以用一个简单的公式来理解:
Token消耗 = (输入 + 输出) × 调用次数 × 模型价格
其中,这里的输入输出就是你的上下文,模型价格就是不同模型的计费标准,调用次数就是调用大模型的次数。
所以下面我们用这个公式来分析一下,OpenClaw 为什么会这么消耗 Token,以及我们如何解决这个问题。
输入:看不见的大头
很多人以为,Token 主要花在 AI 的回复上。但实际上,输入才是真正的大头。
OpenClaw 的设计哲学是无状态到有状态的转变,为了让 Agent 像人类一样记住一切,框架每次都会默认将完整对话历史发送出去。
也就是你每次和 OpenClaw 对话,它都会发送以下这些内容:
首先是 System Prompt(系统提示词 + 自定义),大约 3,000-10,000 tokens。然后是 Tool Schema(工具定义),约 8,000 tokens。
接着是 Workspace 文件,OpenClaw 会自动注入这些文件(如果存在的话):AGENTS.md、SOUL.md、TOOLS.md、IDENTITY.md、USER.md、HEARTBEAT.md,以及 MEMORY.md(可选)。如果启用了 Memory Search,还会检索相关的每日记忆文件(memory/YYYY-MM-DD.md)。
最后是历史对话,也就是之前的聊天记录。
加起来,一次请求的输入可能就有 2-3 万 tokens。如果你聊了 10 轮,那就是 20-30 万 tokens 的输入。
那怎么优化输入?
1. 精简 Workspace 文件(最简单有效)
OpenClaw 的 Workspace 文件每次对话都会注入,是隐形的 Token 大户。这些文件包括 MEMORY.md(长期精选的记忆)、memory/YYYY-MM-DD.md(每天自动生成的日志)、AGENTS.md(Agent 配置)、SOUL.md(性格文件)、TOOLS.md(工具配置)等。
很多人刚开始用的时候,这些文件都是默认配置,里面有大量用不到的功能说明。比如 AGENTS.md 里可能有群聊规则、TTS 配置、各种你根本不用的功能,这些都在白白消耗 tokens。
精简这些文件是性价比最高的优化。直接用提示词让 AI 帮你:
帮我精简 OpenClaw 的上下文文件以节约 token。
具体包括:
1) AGENTS.md 删掉不需要的部分(群聊规则、TTS、不用的功能),压缩到 800 tokens 以内
2) SOUL.md 精简为简洁要点,300-500 tokens
3) MEMORY.md 清理过期信息,控制在 2000 tokens 以内
4) 检查 workspaceFiles 配置,移除不必要的注入文件
5) 定期清理 memory/YYYY-MM-DD.md 中的过期日志
经验法则:每减少 1000 tokens 注入,按每天 100 次调用 Opus 算,月省约 $45。
2. 启用 Prompt Caching
Prompt Caching 可以缓存重复的输入内容,能节约 90% 的输入成本。
工作原理:
• 第一次请求:10,000 tokens 输入,正常计费
• 第二次请求:100 tokens 新内容 + 10,000 tokens 缓存
• 100 tokens 正常计费
• 10,000 tokens 按缓存读取计费(便宜 10 倍)
配置方法:
{
"models": {
"anthropic/claude-opus-4-6": {
"params": {
"cacheRetention": "long",
"maxTokens": 65536
}
}
}
}
3. 配置 Heartbeat 保持缓存温暖
Prompt Caching 的缓存时间是 1 小时。如果超过 1 小时没有对话,缓存就会过期,下次对话需要重新缓存(cache write 成本更高)。
Heartbeat 机制可以定期发送心跳,保持缓存不过期:
{
"heartbeat": {
"every": "55m",
"target": "last",
"model": "minimax/MiniMax-M2.5"
}
}
为什么是 55 分钟?因为缓存时间是 1 小时,55 分钟发一次心跳,可以保持缓存温暖。虽然 Heartbeat 会增加调用次数,但避免了重新缓存的成本,整体是划算的。
注意:Heartbeat 可以使用免费/轻量模型,成本更低。
4. 使用 Context Pruning 自动修剪
跟 OpenClaw 聊了一整天,到晚上的时候发现它开始变慢,或者突然说上下文太长了?这是因为历史消息一直在累积,从早上到晚上可能已经积累了几万 tokens 的对话历史。
Context Pruning 就是用来解决这个问题的。它会自动移除旧的对话内容,保持上下文在合理范围内。配合 Prompt Caching 使用效果更好:
{
"contextTokens": 200000,
"contextPruning": {
"mode": "cache-ttl",
"ttl": "55m"
}
}
这个配置的意思是:上下文窗口最大 200K tokens,保留 55 分钟内的对话(配合 Heartbeat 和 Prompt Caching 的 1 小时缓存)。超过 55 分钟的旧对话会被自动移除,但不影响缓存的使用。
5. 使用 Compaction 压缩历史
有时候你需要跟 OpenClaw 进行长时间的深度对话,比如一起完成一个复杂的项目,可能要聊几个小时甚至几天。这种情况下,即使有 Context Pruning,对话历史还是会越来越长,最终超出限制。
Compaction 可以把长对话压缩成摘要。它不是简单地删除旧对话,是让 AI 把重要信息提炼出来,保存到 Memory 文件中,然后再清理历史。这样既节约了 tokens,又不会丢失重要信息。
{
"compaction": {
"mode": "safeguard",
"reserveTokensFloor": 24000,
"memoryFlush": {
"enabled": true,
"softThresholdTokens": 6000,
"systemPrompt": "Session nearing compaction. Store durable memories now.",
"prompt": "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store."
}
}
}
memoryFlush 的作用是:在压缩前,自动提醒 AI 保存重要信息到 Memory 文件。这样你就不用担心压缩后丢失重要的讨论内容了。
你也可以在对话中手动触发压缩:
/compact
/compact Focus on decisions and open questions
6. 使用子 Agent 隔离上下文
当你需要让 OpenClaw 并发处理多个独立任务时,比如同时搜索 10 个文件、运行 5 个测试、检查 3 个 API,如果都在主 Agent 里串行执行,不仅慢,而且每个操作都会累积到主 Agent 的上下文中。
子 Agent(Sub-Agent)的核心优势是:每个子 Agent 有独立的上下文,不会继承主 Agent 的完整对话历史。这意味着你可以避免主模型的上下文长度爆炸,变相缩减主模型的上下文,而且子任务可以使用便宜的模型。
{
"subagents": {
"model": "minimax/MiniMax-M2.5",
"maxConcurrent": 12,
"archiveAfterMinutes": 60
}
}
使用场景:需要并发处理多个独立任务(如同时搜索多个文件)、需要并行执行的测试或检查、简单的信息收集任务。
子 Agent 的工作原理:每个子 Agent 在独立的 session 中运行,有自己的 token 使用统计,不会继承主 Agent 的对话历史,完成后将结果返回给主 Agent。
这样,主任务用高性能模型保证质量,子任务用免费模型节省成本,同时避免上下文爆炸。
7. 启用 Memory Search 精准检索
OpenClaw 用久了,MEMORY.md 和每天的 memory/YYYY-MM-DD.md 文件会越来越大。传统方式是每次对话都读取整个文件,但你想想,一个几千行的 MEMORY.md,可能有 5000-10000 tokens,但 AI 真正需要的可能只是其中几段相关的内容。
Memory Search 可以根据当前对话内容,只检索相关的 Memory 片段(约 400 tokens 的块),而不是读取整个文件。就像你在图书馆找书,不需要把整个书架的书都搬出来,只需要找到相关的那几本。
{
"memorySearch": {
"provider": "local",
"cache": {
"enabled": true,
"maxEntries": 50000
}
}
}
Memory Search 的工作原理:将 MEMORY.md 和 memory/**/*.md 分成约 400 tokens 的块(有 80 token 重叠),根据当前对话进行语义检索,只返回相关片段(约 700 字符),而不是整个文件,大幅节约输入 tokens。
Provider 选择:local(本地嵌入,零成本,适合记忆文件不多的情况)、openai(使用 OpenAI 嵌入模型,质量更高)、voyage(使用 Voyage AI,每账号 2 亿 token 免费)、qmd(使用 qmd 作为 backend,见下文)。
8. 使用 qmd 进一步减少上下文(进阶)
如果你有大量文档需要检索,或者想要更强大的语义搜索能力,可以使用 qmd 作为 memory backend。
qmd 的核心价值:精准检索,只返回相关段落,而不是读取整个文件。
传统方式:
• Agent 查资料时默认"读全文"
• 一个 500 行文件 3000-5000 tokens
• 但 Agent 只需要其中 10 行
• 90% 的 input token 被浪费了
qmd 方式:
• 建立全文 + 向量索引
• Agent 精准定位段落
• 只读取需要的 10-30 行
• 节约 90% tokens
安装和配置:
# 安装 qmd
npm install -g https://github.com/tobi/qmd
# 为工作目录建立索引
cd ~/.openclaw/workspace
qmd collection add . --name main-workspace --mask "**/*.md"
# 生成向量嵌入
qmd embed
配置 OpenClaw 使用 qmd 作为 memory backend:
{
"memory": {
"backend": "qmd",
"citations": "auto",
"qmd": {
"includeDefaultMemory": true,
"update": {
"interval": "5m",
"debounceMs": 15000
},
"limits": {
"maxResults": 8,
"timeoutMs": 5000
},
"paths": [
{
"name": "main-workspace",
"path": "/home/user/.openclaw/workspace",
"pattern": "**/*.md"
},
{
"name": "obsidian-kb",
"path": "/path/to/knowledge-base",
"pattern": "**/*.md"
}
]
}
}
}
qmd 的优势:
• 完全本地运行,零 API 成本
• 93% 准确率(hybrid search:向量 + 全文)
• 自动索引 MEMORY.md 和 memory/**/*.md(includeDefaultMemory: true)
• 可以添加额外的知识库路径(如 Obsidian)
• 自动更新索引(每 5 分钟)
与 Memory Search 的区别:
• Memory Search 是功能(使用不同的 provider:local/openai/voyage)
• qmd 可以作为 Memory Search 的 backend
• qmd 的能力更强:可以索引额外的路径,不仅仅是 MEMORY.md
实测效果:每次查资料从 15000 tokens 降到 1500 tokens,减少 90%。
调用优化:减少不必要的调用
每次对话都是一次 API 调用。虽然我们无法完全避免调用,但可以通过优化来减少不必要的调用。
怎么减少调用?
1. 优化 Cron 任务
Cron 任务每次触发都是一次完整的对话调用,会重新注入全部上下文。一个每 15 分钟跑的 cron,一天 96 次,Opus 下一天可能花费 $10-20。
使用提示词优化:
帮我优化 OpenClaw 的 cron 任务以节约 token。
请:
1) 列出所有 cron 任务及其频率和模型
2) 把所有非创作类任务降级为 Sonnet 或免费模型
3) 合并同时间段的任务(比如多个检查合为一个)
4) 降低不必要的高频率(系统检查从 10 分钟改为 30 分钟)
5) 配置 delivery 为按需通知,正常时不发消息
核心原则:不是越频繁越好,大多数"实时"需求是假需求。合并 5 个独立检查为 1 次调用,可以省下 75% 上下文注入成本。
2. 优化 Heartbeat 频率
Heartbeat 虽然能保持缓存温暖,但它本身也是一次 API 调用。如果你设置得太频繁,比如每 10 分钟一次,一天就是 144 次调用。即使用免费模型,也会产生不必要的开销。
可以通过以下方式优化:设置工作时间间隔为 45-60 分钟;深夜 23:00-08:00 设为静默期(反正你也在睡觉);精简 HEARTBEAT.md 到最少行数;把分散的检查任务合并到 heartbeat 批量执行。
{
"heartbeat": {
"every": "55m",
"target": "last",
"model": "minimax/MiniMax-M2.5",
"quiet": {
"start": "23:00",
"end": "08:00"
}
}
}
模型选择:平衡性能和成本
不同模型的价格差距太大,特别是Claude模型,价格较高,所以尽可能的不要一直主模型设置为Claude Opus
策略1:日常 Sonnet,关键 Opus(手动切换)
Sonnet 定价约 Opus 的 1/5,但是80% 日常任务完全够用。所以可以保持这样的配置,然后再需要的时候进行切换。
如何切换模型:
在对话中使用 /model 命令:
/model sonnet # 切换到 Sonnet
/model opus # 切换到 Opus
/model haiku # 切换到 Haiku
/model gemini # 切换到 Gemini
你也可以配置模型别名:
{
"agents": {
"defaults": {
"models": {
"anthropic/claude-opus-4-6": {
"alias": "opus"
},
"anthropic/claude-sonnet-4-5": {
"alias": "sonnet"
}
}
}
}
}
然后根据不同场景进行切换: Opus 场景:长文写作、复杂代码、多步推理、创意任务 Sonnet 场景:日常闲聊、简单问答、cron 检查、heartbeat、文件操作、翻译
策略2:基于频道/分组的差异化配置
在 Discord 或 Telegram 等平台上,可以针对不同的频道或分组设置不同的模型:
代码频道:
• 使用高性能模型(Claude Opus 4.6、GPT-5.3)
• 适合复杂的代码任务
日常聊天频道:
• 使用便宜模型(MiniMax、Gemini Flash)
• 适合简单问答和闲聊
创作频道:
• 使用 Claude Opus
• 适合长文写作和创意任务
通过这种方式,我们可以更有效地控制成本。
免费模型和订阅计划
如果你想进一步降低成本,可以考虑:
1. MiniMax M2.5、智谱 GLM Coding Plan:针对开发者的订阅计划,性价比很高,不用担心用量问题
智谱链接:https://www.bigmodel.cn/glm-coding?ic=AD6AIXFQOH
2. 各平台的免费、低价模型:在一些小型任务上使用免费低价的模型,同样能完成任务,价格可以更低,不过一定要注意稳定性。
实战:一套完整的优化配置
基于上面的分析,这里是一套完整的优化配置。
配置文件(~/.openclaw/openclaw.json):
{
"agents": {
"defaults": {
"model": {
"primary": "anthropic/claude-sonnet-4-5",
"fallbacks": [
"minimax/MiniMax-M2.5",
"google/gemini-2.0-flash-exp"
]
},
"models": {
"anthropic/claude-opus-4-6": {
"alias": "opus",
"params": {
"maxTokens": 65536,
"cacheRetention": "long"
}
},
"anthropic/claude-sonnet-4-5-20250929": {
"alias": "sonnet",
"params": {
"maxTokens": 16384,
"cacheRetention": "long"
}
},
"anthropic/claude-haiku-4-5-20251001": {
"alias": "haiku",
"params": {
"maxTokens": 16384,
"cacheRetention": "long"
}
}
},
"contextTokens": 200000,
"contextPruning": {
"mode": "cache-ttl",
"ttl": "55m"
},
"compaction": {
"mode": "safeguard",
"reserveTokensFloor": 24000,
"memoryFlush": {
"enabled": true,
"softThresholdTokens": 6000,
"systemPrompt": "Session nearing compaction. Store durable memories now.",
"prompt": "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store."
}
},
"heartbeat": {
"every": "55m",
"target": "last",
"model": "minimax/MiniMax-M2.5"
},
"maxConcurrent": 6,
"subagents": {
"model": "minimax/MiniMax-M2.5",
"maxConcurrent": 12,
"archiveAfterMinutes": 60
},
"memorySearch": {
"provider": "local",
"cache": {
"enabled": true,
"maxEntries": 50000
}
}
}
},
"memory": {
"backend": "qmd",
"citations": "auto",
"qmd": {
"includeDefaultMemory": true,
"update": {
"interval": "5m",
"debounceMs": 15000
},
"limits": {
"maxResults": 8,
"timeoutMs": 5000
},
"paths": [
{
"name": "main-workspace",
"path": "/home/user/.openclaw/workspace",
"pattern": "**/*.md"
},
{
"name": "obsidian-kb",
"path": "/path/to/knowledge-base",
"pattern": "**/*.md"
}
]
}
}
}
这套配置的核心思路:
1. 日常任务用 Sonnet(性价比高),用 /model opus 手动切换到 Opus
2. 启用 Prompt Caching(节约 90% 输入成本)
3. 配置 Context Pruning 自动修剪上下文
4. 配置 Heartbeat 保持缓存温暖
5. 启用 Compaction 和 memoryFlush,避免信息丢失
6. 启用 Memory Search 精准检索
7. 配置 qmd 语义搜索(可选)
8. 子 Agent 使用免费模型,独立上下文避免爆炸
9. 精简 AGENTS.md、SOUL.md、MEMORY.md 文件
总结
总结
回到最开始的公式:Token消耗 = (输入 + 输出) × 调用次数 × 模型价格
根据这个公式,我们的优化策略是:
• 输入优化:精简 Memory 文件、启用 Prompt Caching、使用子 Agent 隔离上下文、qmd 语义搜索
• 调用优化:优化 Cron 和 Heartbeat 频率
• 模型选择:日常用 Sonnet,复杂任务用 /model opus 切换
最重要的是精简 Memory 文件 + Prompt Caching,这两项就能节约 60-80% 的输入成本。根据使用场景,整体成本可降低 50-90%。



