Claude Code 省 Token 指南
/cost、Prompt Cache、CLAUDE.md 与 settings.json
同样实现一个功能,有人 3k token 搞定,有人要烧掉 30k。差距通常不在模型,而在对话习惯、工具使用方式和项目基础设施。这篇文章把 Claude Code 里最容易被忽视的 Token 开销源拆开讲清楚,帮助你把账单压下来,同时让上下文更干净、产出更稳定。
// 为什么会差 10 倍
一、为什么同样干活,有人 3k Token,有人 30k Token?
Claude Code 的账单,表面上看是模型价格,实际上更像你的工程习惯镜子。你怎么提问、Claude 怎么读文件、项目里挂了多少扩展能力、会话是否拖得太长,都会直接体现在 /cost 里。
真正决定 Token 消耗的,通常不是你这一句 prompt,而是 system prompt、CLAUDE.md、MCP / Skills / Plugins、历史对话、工具输出和这一轮消息一起构成的完整 input 包。
所以这篇文章不是讲“如何省一句 prompt 的 token”,而是讲如何控制整个对话系统的总开销。
// Token 花在哪
二、先看懂:Claude Code 的 Token 花在了哪里
从计费角度看,Claude API 按 input 和 output 分开算账。Claude Code 里最容易膨胀的是 input,因为它会不断累积。
| 类别 | 包含什么 | 典型问题 |
|---|---|---|
| 系统侧 | System prompt、CLAUDE.md、MCP / Skills / Plugins 元数据 | 固定开销越来越大 |
| 历史侧 | 从 session 开始到现在的全部对话 | 越聊越贵 |
| 工具侧 | Read、Grep、Bash 等工具结果 | 最容易突然爆炸 |
| 当前侧 | 你这一轮的消息 | 通常最小,但最容易被误以为是全部 |
如果你问“为什么明明只发了一句话却这么贵”,答案通常就在工具侧和历史侧。
Prompt Cache 为什么这么重要
Claude Code 的前缀缓存命中后,system prompt 开始的一大段重复内容只需要付读取成本。简单说,如果你的前缀完全不变,这部分 input 的价格会明显下降。
| 命中条件 | 解释 |
|---|---|
| 前缀完全一致 | 任意一个字符变了,从变化点开始往后都可能 miss |
| 同一个模型 | 不同模型之间不共享 cache |
| TTL 内 | 默认是短时缓存,长时间中断后常会失效 |
💡 如果你频繁改 CLAUDE.md、频繁切模型、长时间离开再 resume,就很容易把原本能命中的缓存打碎。
先学会看 /cost
/cost
input # 全价 input
output # 全价 output
cache read # 命中缓存的 input,越高越好
cache write # 新写入缓存的 input,越低越好判断是否在省 Token,不要只看总价,要看 cache read 有没有稳定提高,以及 cache write 有没有被无意放大。
// 输入方式
三、你输入内容的方式,正在悄悄浪费 Token
1. 整段日志、整段 diff、整段输出直接贴
这是最常见也最贵的错误。几千行日志里,真正有价值的通常只有少数错误行和 stack trace,其余大部分是噪音。
# 不推荐:整段贴
adb logcat -d
# 更推荐:先过滤再给 Claude
grep -E "FATAL|Exception|^\s+at\s" crash.log
tail -100 build.log
git diff --stat同样的原则适用于服务端日志、测试输出、构建报错、整段 Git diff。先筛一遍,再交给 Claude。
2. 开放式提问,而不是精准提问
帮我了解一下这个项目 这种问法,几乎是在邀请 Claude 读更多无关文件。你如果已经知道想看哪个目录、哪个模块、哪个函数,就直接说。
# 更省 token
src/services/ 下有哪些文件?分别 export 什么?
# 更费 token
帮我了解一下这个项目的整体结构💡 你知道的信息越多,越应该前置给 Claude。这样工具调用次数会更少,Read 范围也更小。
3. 挤牙膏式多轮补需求
多轮对话不是多次独立请求。每一轮都会带着前面所有轮次的历史一起继续发,所以如果你一开始就知道需求,最好一次说清。
| 方式 | 问题 |
|---|---|
| 5 轮逐步加需求 | 每一轮都在重复支付前面所有历史 |
| 1 轮一次说清 | 目标明确,通常代码更干净,历史更短 |
4. 无意中清空缓存
最常见的两种情况是:长时间中断后 resume,以及频繁切模型。前者会让缓存 TTL 过期,后者会因为模型隔离导致首轮重写缓存。
# 长时间离开前,如果还要继续当前任务
/compact
# 完全换主题
/clear
# 不要一句话一切模型
/model sonnet
/model opus// Claude 的干活方式
四、Claude 的干活方式,也会隐性消耗 Token
1. 改一个点,却 Read 整个大文件
如果只是改一个 handler、一个按钮回调、一个小函数,优先让 Claude 用 Grep 定位,再局部读取上下文,而不是把 1000 行以上的大文件整页读进来。
# 推荐流程
Grep 关键字 -> 拿到行号 -> 只读上下几行 -> Edit
# 不推荐
先看看这个文件(然后 Read 1500 行)如果你在编辑器里能直接选中代码范围,效果通常更好,因为 Claude 不需要再为了定位而读整文件。
2. Plan mode 不是每次都该开
Plan mode 会先出方案再动手,这本身就要花一笔 token。对于小需求、已知范围、明确修改点,直接做通常更便宜。
| 场景 | 建议 |
|---|---|
| 目标明确、改动范围小 | 直接做 |
| 跨模块、方向不确定、方案可能跑偏 | 先 plan |
3. 脏活适合交给 Subagent
像“全项目扫某类 export”“统计废弃 API 调用点”这种任务,往往会读很多文件。如果放在主会话里做,这堆 Read 结果会污染后续所有轮次。
更好的方式是让 subagent 在独立上下文里完成扫描,主会话只接收最终总结。这样后续连续追问时,主上下文会干净得多。
4. /compact 和 /clear 都是工具,不是习惯
/compact 会读完整段历史,再写一份摘要替换原来的消息,这本身也要花钱。只有你 compact 后还会继续聊很多轮,这笔成本才容易摊平。
💡 继续当前任务但历史太大,用 /compact。彻底换主题,直接 /clear。
// 基础设施
五、你的基础设施,也在每一轮静默扣钱
1. 没屏蔽构建产物、依赖目录和 generated 文件
如果项目里有超大的自动生成文件、构建产物、依赖目录,一次随手的 Grep 或 Read 就可能把它们带进上下文。
项目根目录建议加一份 .claude/settings.json,限制明显不该读取的区域。
{
"permissions": {
"deny": [
"Read(**/node_modules/**)",
"Read(**/dist/**)",
"Read(**/build/**)",
"Read(**/.next/**)",
"Read(**/generated/**)",
"Read(**/*.generated.*)",
"Read(**/Pods/**)",
"Read(**/DerivedData/**)",
"Read(**/*.lock)",
"Read(**/*-lock.json)",
"Read(**/*.lock.yaml)"
]
}
}如果业务允许,配合 .gitignore 一起用效果更好。
2. MCP、Skills、Plugins 的“入场费”税
每个已启用的 MCP 工具、Skill 或插件,都会以元数据形式进入 system prompt。装得越多,每轮固定开销越大。
| 建议 | 做法 |
|---|---|
| 这周常用 | 保留在全局配置 |
| 只在某项目需要 | 只在项目级启用 |
| 半年没用过 | 直接删掉,需要时再装 |
不要把 Skill 和 MCP 当收藏夹。它们不是免费挂件,而是每轮对话都在付费的能力声明。
3. CLAUDE.md 写得太大、太动态
CLAUDE.md 是 prompt cache 的主战场,也是 system 侧最容易膨胀的部分。两个最常见错误:
| 错误 | 为什么贵 |
|---|---|
| 写成超长项目知识库 | 哪怕只说 hi,也要带着整份内容一起走 |
| 放时间戳、TODO、动态状态 | 每次变化都会击穿前缀缓存 |
# 推荐放进 CLAUDE.md
- 代码规范
- 目录约定
- 常用命令
- 禁用写法
# 不推荐放进 CLAUDE.md
- Last updated: 2026-03-22 12:30
- Current sprint: Sprint 40
- Active TODOs
- 历史决策长文档💡 CLAUDE.md 不是项目知识库,而是给 Claude 的开场白。只放“它不知道就会犯错”的规则。
// 实战清单
六、Claude Code 省 Token 的实战清单
| 动作 | 为什么有效 |
|---|---|
| 先学会 /cost | 你得先知道钱花在哪 |
| 过滤日志和长输出 | 减少工具侧爆炸 |
| 一次说清需求 | 减少历史侧重复支付 |
| 改一个点先 Grep 再局部 Read | 减少无关文件进入上下文 |
| 大任务才开 plan mode | 避免小任务预付过多 output |
| 脏活交给 subagent | 避免主会话臃肿 |
| 项目级 deny 规则屏蔽 generated/dist/node_modules | 减少误读大文件 |
| 定期清理不用的 MCP / Skills | 降低固定 system 开销 |
| 精简且稳定地维护 CLAUDE.md | 提高 Prompt Cache 命中率 |
当你把这些习惯建立起来,省下来的不只是 token,还有会话上下文的干净度和后续修改的稳定性。
// 总结
总结
Claude Code 省 Token 的核心,不是学一个神奇命令,而是控制四件事:
输入更干净
过滤日志、一次说清、少贴原始大段内容
读取更克制
Grep 定位、局部 Read、别轻易读整文件
上下文更轻
合理 compact、subagent 隔离、少带无关历史
基础设施更瘦
精简 CLAUDE.md、屏蔽 generated、少装闲置扩展
下次看到 /cost 里的数字,别只把它当账单。它本质上是在提醒你:哪些工程习惯,正在被你自己放大成本。