我测量了Claude Code的token实际花在了哪里:96.8%用于重读历史记录,我的输入只占0.01%
Claude Code 会将每次会话的日志写入 ~/.claude/projects/,每行都是 JSON 格式,message.usage 里记录了 API 实际返回的 Token 数。我汇总了 32 次会话的数据。这些都是实测值,不是估算。
96.8% 的 Token 都在重读对话历史。
| 类型 | Token 数 | 占比 |
|---|---|---|
重读历史(cache_read) |
13.709 亿 | 96.8% |
| 缓存写入 | 3770 万 | 2.7% |
| 模型输出 | 670 万 | 0.5% |
| 我的输入 | 20 万 | 0.01% |
| 总计 | 14.155 亿 | 100% |
我自己打字只占 0.01%。也就是说,缩短提示词只能优化账单的一万分之一。
根本原因:模型每轮对话都会把整段历史重新读一遍。 一旦某个大段返回结果进入上下文,后续每次对话你都得为它付费。假设你丢进一个 1 万字符的返回结果,然后又聊了 20 轮,那你就为这 1 万字符支付了 20 万字符的读取开销。
88.8% 的历史 Token 来自工具返回值
不是你的提示词,也不是模型生成的文字,而是工具的返回结果。问题不在于调用频率,而在于每次返回的内容有多大。
| 工具 | 占比 | 调用次数 | 每次平均字符数 |
|---|---|---|---|
| 抓取整个网页(浏览器) | 63.3% | 417 | 33,645 |
| 读取整个文件 | 13.0% | 258 | 11,132 |
| 截图 | 4.0% | 3 | 296,827 |
| Bash 命令 | 3.7% | 967 | 839 |
| 仅用 JS 提取所需值 | 0.4% | 164 | 504 |
注意最后两行:967 次 Bash 调用的总开销还不到 3 次截图。一张截图 ≈ 354 次 Bash 调用。同样是在浏览器任务里,抓取整页平均花费 33,645 字符,而只提取你需要的几个值只需 504 字符——相差 67 倍。
真正能降低 Token 消耗的三件事
-
不要直接读取整个文件。 每次读文件平均 11,132 字符。先用
grep定位行号,再只读那一段。只有当第一次需要了解文件结构时,才完整读一次。 -
不要习惯性地截图。 每张截图 296,827 字符。如果状态能以文本形式读取,就用文本方式读。
-
不要抓取整个网页。 只提取你需要的几个值。33,645 → 504。
反过来:别省着用 Shell 命令。 967 次调用才占了 3.7%。
注意事项
- 这次的样本偏重于网页研究类任务,所以浏览器调用排名第一。如果你主要写代码,文件读取会居首。建议去测你自己的日志。
cache_read的计费单价低于新输入的 Token,所以 Token 占比 ≠ 费用占比。- 周使用量限制是否按这个比例消耗?尚未验证,官方未公开计算公式。