Claude Code 用久了,常见两种情况:API 账单比预想的高,或者订阅额度没到下午就见底。一个常被忽略的原因是:每问一句,Claude Code 都会把整段对话重新发一遍。
这篇按官方文档整理省 token 的做法:哪些命令该用、什么时候用,CLAUDE.md 怎么写才不白占上下文,以及哪些操作会让缓存失效。命令和配置项都对照了 Claude Code 官方文档(2026 年 10 月版本),版本差异以官方文档为准。
一、先弄明白 token 花在哪
Claude Code 每发一条消息就是一次新的 API 请求。模型本身不记事,所以每次请求都要带上完整上下文:
| 层 | 内容 | 什么时候变 |
|---|---|---|
| 系统提示词 | 内置指令、工具定义 | 加载的工具定义发生变化时 |
| 项目上下文 | CLAUDE.md、自动记忆、无作用域的 rules | 会话开始,或 /clear、/compact 之后 |
| 对话 | 你的消息、Claude 的回复、工具结果 | 每一轮 |
所以会话越长,每一轮的成本越高。哪怕你只问一句"这个变量叫什么",背后也是把一整天的对话又发了一遍。
缓存能抵掉一部分成本,也就是 prompt caching (提示词缓存):API 按请求开头(前缀)去匹配最近处理过的内容,没变的部分按缓存价格计费,比正常输入便宜得多。Claude Code 默认会自动开启缓存,你要做的是别去破坏它,下文第五节专门讲这个。
二、先看清用量:/usage 和 /context
先看清用量再动手,常用的是这两个命令:
text
/usage # 本次会话的 token 和估算费用,/cost 是它的别名
/context # 用彩色格子显示当前上下文被什么占着,并给出优化建议
/usage 的 Session 区块大概长这样(官方文档示例):
text
Total cost: $0.55
Usage by model:
claude-sonnet-4-6: 1.2k input, 5.3k output, 940.0k cache read, 50.0k cache write ($0.55)
看 cache read 和 cache write 的比例:读远多于写,说明缓存在起作用;如果每一轮写入都很高,说明前缀一直在变。新版本(v2.1.251 起)还会多一行 Prompt cache (main),直接显示命中率和缓存还热不热。
几点说明:
- 金额是按官方定价在本地估算的,实际账单看 Claude Console 的 Usage 页面。
- Pro / Max 订阅用户看的是额度条,Session 里的金额和计费无关。订阅用户的
/usage还会列出 skill、子 Agent、MCP 服务器各占多少用量。 /context适合排查"刚开会话就占了一大块"的问题,比如 CLAUDE.md 太长、MCP 工具太多。
官方还给过一个参考数据:在企业部署中,平均每位开发者每个活跃日约 13 美元,90% 的用户每天低于 30 美元(官方称)。自己的账单远高于这个数,就值得排查一下。
三、三个最省 token 的命令:/clear、/compact、/rewind
| 命令 | 做了什么 | 适合什么时候 | 成本 |
|---|---|---|---|
/clear |
清空上下文,开新对话 | 换到不相关的任务 | 基本为零 |
/compact [说明] |
把历史总结成摘要,继续同一个对话 | 同一任务做到一半,上下文太长 | 要发一次总结请求 |
/rewind |
回退到之前某一轮(可连带代码) | 走错了方向,想整段丢掉 | 回到已缓存的前缀,很便宜 |
/clear:换任务就清
最简单的一个习惯:做完一件事、开始不相关的下一件之前,先 /clear。 旧上下文留着没用,后面每一条消息都得为它付费。
怕之后找不到,可以先命名再清:
text
/rename 修复登录接口
/clear
要回来时用 /resume 打开会话列表。/clear 也可以直接带名字:/clear 修复登录接口。
/compact:带上说明再压缩
/compact 会把对话总结成摘要。可以告诉它保留什么:
text
/compact 重点保留 API 用法和代码改动,测试过程可以略过
也可以写进项目根目录的 CLAUDE.md,让每次压缩(包括自动压缩)都按这个来:
markdown
# Compact instructions
When you are using compact, please focus on test output and code changes
几个容易误会的地方:
- 压缩本身不是免费的。 它要读一遍整个对话来生成摘要。缓存还热时,这次请求大部分走缓存,比较便宜;隔了很久再压缩,缓存已经过期,就得按全价重新处理整段历史。
- 在任务间隙手动压缩,比等自动压缩更好。 官方的建议是自己挑压缩的时机,不要等它在任务进行到一半时自动触发。
- 压缩后会保留的东西:项目根目录的 CLAUDE.md 和自动记忆会从磁盘重新加载,最近修改过的最多 5 个文件会被重新读入,已调用的 skill 也会重新注入(每个最多 5000 token)。
自动压缩的阈值可以用 /autocompact 调,范围是 100K 到 1M token:
text
/autocompact 200k # 上下文到 200K 就压缩
/autocompact auto # 恢复为模型默认值
如果你用的网关不接受超过 200K 的请求,官方建议设置环境变量 CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000。
/rewind:走错路就回退,别硬压
Claude 往错误方向跑了十几轮,与其 /compact 把错路也总结进去,不如直接回退。按两下 Esc 或者输入 /rewind,选一个之前的节点,对话和代码都能一起恢复。
官方文档专门提到:回退后剩下的历史和当时建缓存的内容一样,下一次请求能直接命中旧缓存,压缩则要重新建一份。所以回退往往比压缩便宜。
/btw:问个题外话,不进历史
临时想问"这个函数在哪个文件",可以用 /btw 提一个旁支问题,它不会加进当前对话。主对话就不会被零碎问题撑大。
四、让启动时的上下文变小
每次会话一开始就加载的东西,会在每一轮重复计费,这部分最值得精简。
CLAUDE.md 控制在 200 行以内
官方建议每个 CLAUDE.md 不超过 200 行。太长不光占上下文,Claude 遵守规则的效果也会变差。
两个常见误区:
- 用
@path拆文件不能省 token。 被导入的文件也是启动时一起加载,只是看起来整齐了。 - 只在部分场景用到的规则不要放进 CLAUDE.md。 比如 PR 审查流程、数据库迁移步骤,平时写前端时它们也一直占着位置。
更好的做法是放进带 paths 的规则文件,或者做成 skill。
按路径加载的规则 :放在 .claude/rules/ 下,只有 Claude 读写匹配的文件时才加载:
markdown
---
paths:
- "src/api/**/*.ts"
---
# API Development Rules
- All API endpoints must include input validation
- Use the standard error response format
Skill:只在被调用时才加载正文。适合流程性的说明,比如"怎么发版""怎么写迁移脚本"。还可以写一个介绍项目结构的 skill,让 Claude 不用每次都翻好几个文件才弄明白目录是怎么分的。
注意一点:带 paths 的规则在压缩后不会自动保留,要等再次碰到匹配文件时才重新加载。某条规则必须一直生效的话,就去掉 paths 或放回根目录的 CLAUDE.md。
少开用不上的 MCP 服务器
现在 MCP 工具定义默认是延迟加载的:启动时只放工具名,用到某个工具时才加载完整定义,比以前省很多。但依然有两条建议:
- 能用命令行工具就用命令行。
gh、aws、gcloud这类 CLI 不需要在上下文里登记工具列表,比对应的 MCP 服务器更省。 - 用
/mcp关掉暂时用不上的服务器。
大段输出交给 hook 或子 Agent
跑测试、看日志这类操作,输出动不动就几千行,全塞进主对话很浪费。两个办法:
- Hook 预处理 :用 PreToolUse hook 改写命令,比如测试只输出失败的部分。官方文档给的示例是在
settings.json里给Bash挂一个脚本,遇到npm test、pytest、go test时在命令后面接上grep只保留FAIL/ERROR附近的行。 - 交给子 Agent :让子 Agent 去跑测试、查文档,详细输出留在子 Agent 自己的上下文里,主对话只收到一段总结。子 Agent 也要花 token,简单任务可以在子 Agent 配置里写
model: haiku。
五、别让缓存白白失效
这部分成本不太显眼。缓存按前缀精确匹配,前面任何一处变了,后面全部重算。官方文档列出的会让缓存失效的操作有这些:
| 操作 | 影响 | 建议 |
|---|---|---|
中途用 /model 切模型 |
每个模型有独立缓存,下一轮整段重算 | 开会话时就定好模型 |
| 中途改 effort | 多数模型整段重算;Opus 5.5、Sonnet 5.5、Haiku 5.5、Fable 5.1 走 API Key 或订阅时不受影响 | 同上 |
| 打开 fast mode | 第一次开启时整段重算,按 fast mode 价格计 | 要用就在会话开头开 |
| 连接或移除 MCP 服务器 | 工具延迟加载时一般不受影响;工具预先加载时会失效 | 别在任务中途折腾 MCP |
/compact |
对话层重建 | 放在任务间隙 |
| 截图太多 | 超出限制后会删掉最早的一批图片,从那里开始重算 | 截图按需发 |
| 升级 Claude Code | 新版本的第一次会话从头建缓存 | 无需处理 |
还要注意 opusplan:它在计划模式用 Opus、执行时用 Sonnet,每切换一次计划模式都等于换模型,会重新建缓存。
另外,会话中途改 CLAUDE.md 不会让缓存失效,但也不会立即生效 ,要等下一次 /clear、/compact 或重启。改完觉得"没反应",多半是这个原因。
缓存多久过期
| 计费方式 | 主对话默认 TTL |
|---|---|
| Claude 订阅(在套餐额度内) | 1 小时 |
| 使用超额额度、API Key、云服务商 | 5 分钟 |
用 API Key 的话,离开 5 分钟以上再回来,第一轮就要整段重算。如果你经常中途离开,可以在 settings.json 里改成 1 小时(需要 v2.1.242 及以上):
json
{
"promptCacheTtl": "1h"
}
也可以用环境变量 CLAUDE_CODE_PROMPT_CACHE_TTL=1h。代价是 1 小时缓存的写入单价更高,如果你一直连续工作、很少空闲超过 5 分钟,改了反而更贵。
用第三方地址(自定义 ANTHROPIC_BASE_URL)的读者要多留意:缓存能不能生效取决于网关会不会原样转发 cache_control 标记。如果网关把它去掉了,每一轮都会按全价计整段历史。拿 /usage 看一下 cache read 是不是一直为 0,就能判断。
六、模型和思考预算
- 日常编码用 Sonnet,复杂设计再用 Opus。 官方的说法是 Sonnet 能处理大多数编码任务,价格也更低。用
/model切换,或者在settings.json里写"model": "sonnet"作为默认。 - 简单任务调低 effort。 思考 token 按输出 token 计费。用
/effort low或/effort medium调低;Opus 5.5、Sonnet 5.5、Haiku 5.5 默认就是medium。 - 固定思考预算的旧模型 可以用环境变量
MAX_THINKING_TOKENS=8000限制上限;自适应推理的模型会忽略这个值,要用 effort 控制。
七、写提示词的习惯
下面几条不需要任何配置:
- 说具体。 "改进一下这个项目"会让 Claude 大范围扫描文件;"给 auth.ts 里的 login 函数加输入校验"只需要读一两个文件。
- 复杂任务先进计划模式。 按
Shift+Tab切到计划模式,先看方案再动手,避免做到一半推倒重来。 - 发现跑偏立刻按
Esc。 越早打断,浪费越少。 - 给出验证标准。 附上测试用例或期望输出,Claude 能自己检查,省掉你来回提修改意见的几轮。
常见问题速查
| 现象 | 可能的原因 | 处理 |
|---|---|---|
| 一句简单问题也很贵 | 会话太长,整段历史都在计费 | 换任务前 /clear |
| 离开一会儿回来第一轮特别慢 | 缓存过期,整段重算 | API Key 用户考虑 promptCacheTtl: "1h" |
| 切模型后突然变慢 | 新模型没有缓存 | 会话开头就定好模型 |
| 改了 CLAUDE.md 没效果 | 中途修改要等 /clear、/compact 或重启 |
改完 /clear |
/context 显示启动就占很多 |
CLAUDE.md 太长或 MCP 太多 | 拆到 rules / skill,关掉不用的 MCP |
cache read 一直是 0 |
网关没有转发缓存标记 | 换支持缓存的服务商,或联系服务商 |
| 订阅额度消耗快 | 子 Agent、定时任务、长上下文 | 看 /usage 的用量分布 |
简单说:换任务就 /clear,走错路用 /rewind,任务间隙才 /compact,会话中途别乱切模型。 这四条做到了,常见的浪费基本能避开。
参考资料
- Claude Code 文档 · Manage costs effectively:code.claude.com/docs/en/cos...
- Claude Code 文档 · How Claude Code uses prompt caching:code.claude.com/docs/en/pro...
- Claude Code 文档 · Explore the context window:code.claude.com/docs/en/con...
- Claude Code 文档 · How Claude remembers your project:code.claude.com/docs/en/mem...
- Claude Code 文档 · Model configuration:code.claude.com/docs/en/mod...
- Claude Code 文档 · Commands:code.claude.com/docs/en/com...