Claude Code通用

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 累积曲线——你会很快学会哪些工具调用值,哪些是浪费。

相关阅读

相关阅读

Tool Use 的 Token 开销有多大?以 Claude Code 为例