Tool Use 的 Token 开销有多大?以 Claude Code 为例
你以为 Token 都花在跟模型对话上?真实数据:Claude Code 一场会话里 70% 的 input Token 是工具调用的输入输出。这篇拆解 tool use 是怎么吃 Token 的。
打开任意一个 Claude Code session 的本地日志,你会看到一个让人吃惊的事实:你的对话只占 input Token 的 5-10%。剩下 90%+ 都是 tool use 的开销。
这篇用真实数据拆解 tool use 在 Token 上的代价。
一次 Claude Code 调用包含什么
我打开自己的 ~/.claude/projects/<project>/<session-id>.jsonl,挑一条 message 拆解 input:
| 部分 | Token 数 | 占比 |
|---|---|---|
| 系统提示(Anthropic 内置 + 工具说明) | 8,200 | 7% |
| CLAUDE.md / AGENTS.md | 3,400 | 3% |
| 历史对话(你和模型的纯文本来回) | 12,500 | 11% |
| 历史工具调用(read_file 的入参) | 4,800 | 4% |
| 历史工具调用结果(read_file 读出的内容) | 78,400 | 69% |
| 当前你发的消息 | 250 | 0.2% |
| 当前可用工具列表 | 5,500 | 5% |
| 总 input | 113,050 | 100% |
最大头是"工具调用结果"——历史 read_file 读出的文件内容。
为什么 tool use 这么贵
Claude Code 的工作流是:你说一个任务 → 模型决定先读几个文件 → 模型读完判断 → 写代码 / 跑命令 / 改文件。
每次 read_file 都把文件内容塞进上下文,永久保留在该 session 的历史里。下次模型决策时,这些"读过的文件"全部还在 input 里被重发。
10 个文件、每个 1000 行 → 加 10 万 Token 进上下文。这些 Token 之后每条消息都要重发一次。
举例对比:
纯 chat 模式(不调用工具):你问"什么是 React",模型输出 500 字。Input 5K(系统提示 + 你的问题),output 1.5K。
Tool use 模式(Claude Code 默认):你问"看下 App.jsx 然后说说哪里能改"。模型先 read_file 读 App.jsx(200 行),然后输出建议。Input 飙升到 12K(多了 7K 文件内容)+ 输出 1K。
每次 tool call 都是 input 永久增长。
真实数据:哪些 tool 最烧
我看 Vibe Usage 上 Claude Code 用户的 session 数据,按消息类型拆分(基于 162306 条 30 天内的真实 session):
| 工具调用类型 | 平均贡献的 Token |
|---|---|
| read_file(一般) | 5,000 - 30,000 |
| read_file(大文件) | 50,000 - 200,000 |
| list_directory | 1,000 - 8,000 |
| glob | 200 - 5,000 |
| grep | 200 - 3,000 |
| bash run | 500 - 50,000(取决于命令输出) |
| edit_file | 1,000 - 5,000(diff 形式) |
| write_file | 同 edit |
意外发现:bash run 的方差最大。如果你跑 npm test 输出几千行 log,那条工具调用的 Token 数比读一个大文件还高。
怎么降低 tool use 开销
1. 让模型只读它真正需要的文件
最常见的浪费:让 Agent 自己 grep 找相关文件,结果它读了 30 个,实际只用上 3 个。
动作:自己定位 5-10 个真正相关的文件,明确 @ 给 Agent。
2. 不要让模型读大日志
bash run npm test 输出 3000 行 log → 5 万 Token 进上下文 → 后续每条消息都贵。
动作:让 Agent 只看 log 末尾 100 行(npm test 2>&1 | tail -100),或者你自己 grep 出关键错误信息再贴。
3. 长 session 主动 compact
/compact 会把工具调用的历史结果总结掉,只保留结论。压缩之后下条消息的 input 直接砍半。
我自己的规则:单 session 累计 50 万 Token 以上就 compact。
4. 限制 Agent 探索深度
prompt 里写「只看 src/auth/ 目录下文件,不要 grep 其他地方」。明确边界让 Agent 不去无谓搜索。
数据驱动判断
你不知道自己的工具调用消耗多少?打开 Vibe Usage——它能展示 session 里 input Token 的累计趋势,你能看到哪个 message 突然增加了几万 Token,多半就是某次 tool call 拉了大文件。
我装 Vibe Usage 看自己 session 趋势之后,做了几件事:
- 把单 session 平均工具调用次数从 80 次降到 30 次
- 主动 compact 频率从"每天一次"提到"每 1 小时一次"
- 大文件改成"先 grep 再读相关 chunk",避免完整 read_file
整体 session 平均 Token 数砍半,账单跟着降。
一个反共识的结论
很多人想省 Token 第一反应是"少用工具"。我的建议反过来——多用工具,但每次工具调用都精准。
只读 1 个相关文件 200 行(200 token) vs 读 5 个不太相关的文件平均 1000 行(5000 token)——前者总 Token 少 25 倍,但你能解决的问题更多。
工具不是问题,滥用工具才是问题。
用 Vibe Usage 跟踪自己 session 的 Token 累积曲线——你会很快学会哪些工具调用值,哪些是浪费。