7 月 12 日晚上刷到一篇爆文:Claude Code 在读你的 prompt 之前,先发了 33k token,OpenCode 只发 7k。我不服,写脚本数了自己的账:621 个会话、15,308 轮请求,中位数一轮实际读取 42,882 token,一个月累计约 13 亿,比爆文还狠。
这篇实测战报把这笔 token 账单摊开:模型读的到底是什么、哪两个省钱的理解是错的、怎么当天给 Claude Code 瘦身。数据全部来自我本机的会话记录,脚本是我自己写的,欢迎拿着你的导出结果来对账。
收据先摆出来:621 个会话、15,308 轮请求怎么统计的
先说方法,你可以照着复现。Claude Code 会把每个会话存成本地的 jsonl 文件,里面每一轮 assistant 消息都带一个 usage 字段,记录这轮模型的输入构成:普通输入、缓存读(cache read)、缓存写(cache creation)。脚本干的事很简单:遍历最近一个月的会话文件,把每轮的三项加起来,得到”这一轮模型实际读了多少 token”,核心逻辑不到一百行。之所以信 usage 字段而不是界面上的显示,因为前者是 API 返回的原始凭证,你被扣的钱就是按它算的。第一遍跑出来我以为是脚本多算了,翻文档核对了半天口径才认。
6 月底建站之后我越用越狠,暑假这两周基本全天挂着干活:改站、写脚本、预习课设。攒下来的盘子是 621 个会话、15,308 轮请求,平均一个会话 25 轮左右。
| 统计项 | 单轮实际读取的 token |
|---|---|
| 中位数 | 42,882 |
| 均值 | 84,822 |
| P75 | 99,306 |
| P90 | 228,969 |
| 最大值 | 405,990 |
均值是中位数的两倍,说明分布严重右偏:大多数轮次停在几万的量级,一小撮长会话的尾部轮次把均值硬生生拽了上去。这撮尾部轮次后面还要重点说,它们是误区的重灾区。
中位数一轮 42,882 token,你那句话只占 450
先看整体分布。

直方图是双峰的。左边的主峰在 3 万到 4 万之间,是短会话的日常轮次;10 万以上还拱起一个明显的山包,全是长会话的尾部轮次。P90 到了 22.9 万,最大的一轮 405,990 token,接近中位数的 10 倍,放进 200K 的上下文窗口(context window),等于一口气塞满两个窗口。两个山包对应两种工作状态:左边是问答和小修小补,右边是放手让 Agent 自己干半小时的大活。山包每高一分,都是在为全部历史多买一次单。
再看中位数那一轮的构成,这张图更刺痛。

那根橙色长条几乎占满全程:缓存命中的前缀 40,576 token,包含系统提示、工具定义和此前全部对话;右端小到几乎看不见的灰点,是本轮真正的新输入,450 token。450 大概就是两三句话,就是你那句”帮我看看这个报错”。你以为你只发了一句话,模型实际读了 4 万字的东西来接待你这句话。
这里必须交代一个口径问题,不然懂统计的读者要挑刺。图 1 的 42,882 是分布的中位数:把 15,308 轮各自的总数排序,取最中间那一个。图 2 合计约 4.1 万,是把每一项(前缀、新写缓存、新输入)分别取中位数再相加。**两种算法口径不同,4.3 万和 4.1 万都对,但不能混成同一个数用。**另外中位数一轮的新写缓存恰好是 0,跟缓存的增量更新机制有关,这里不展开猜。
误区一:消息发得短,花费就该小
常见理解:我就发一句”改个 bug”,几十个 token,能花多少钱。省钱方式就是把问题打短点,长话短说。
为何错:对普通聊天机器人这么说大体成立,对 Coding Agent 完全不成立。模型侧不记事,API 每一轮调用都要把系统提示、工具定义、全部对话历史重新发一遍,这是这类模型推理的基本工作方式。你的 450 token 只是搭在 4 万 token 的车上。**花费的开关不在”你这句多长”,在”这轮之前累积了多少”。**同一个问题,会话第 1 轮问和拖到几十轮之后再问,读的量能差好几倍,极端情况差出一个数量级,我的 P90 就是证据。
正确理解:把估成本的单位从”我发了多少”换成”模型背了多重”。中位数那一轮里你的新输入只占 1%,前缀的体重才是账单主体。爆文比的不是谁的消息长,而是谁开门就发 33k,因为底座是常量,你的消息是零头。拿中位数那一轮的构成算,把你的消息删短一半,账单几乎不动;把前缀砍掉一万,每一轮立刻省两成多。
我 6 月写 Agent 记忆架构全景 时提过一层:Agent 的”记忆”本质上是每轮重新注入的上下文。当时在讲架构,现在从账单角度看,那句话还有个更土的翻译:你养的每一份记忆,都是每轮重付的邮费。
误区二:命中缓存等于白嫖
常见理解:Anthropic 有提示词缓存(prompt caching),我的命中率 91.27%,九成的 token 打一折,那不约等于免费?随便聊。
为何错:缓存改的是单价,不是”每轮重读全部历史”这个逻辑,至少有三笔账它不管。
第一笔,写比读贵。Anthropic 2024 年起公开的定价结构是:缓存读 = 基础输入价 ×0.1,缓存写 = ×1.25。每一轮新增的内容都要先按 1.25 倍写进缓存,之后才能享受一折。你省下的钱里,有一部分是先多付 25% 换来的。
第二笔,前缀一变,缓存全废。缓存按前缀匹配,从第一个字节开始对齐。中途改了 CLAUDE.md、换了个模型、工具列表变了,甚至 Agent 自动压缩了历史,前面一变,后面的缓存全部作废重写。91.27% 的命中率听着高,反过来算就是还有近 9% 的 token 走全价甚至 1.25 倍价。
第三笔,尾巴越背越重。每轮模型的输出会成为下一轮历史的一部分,前缀像滚雪球,每轮都要整个重读一遍。图 1 右边那个山包就是这么滚出来的:
P90 那种 22.9 万 token 的轮次,就算全打一折,折算成全价也还有 2.3 万,单这一轮就抵得上我短会话里五轮的开销。
也别矫枉过正,缓存的价值是真的。13 亿 token 全按原价读是天文数字;91% 打一折之后,等效全价约 2.3 亿到 2.6 亿(取决于缓存写占多少),省了大约八成。缓存是把账单砍到两折多的折扣券,不是免单。
正确理解:省钱的正确姿势是把基数做小,而不是盯着折扣率。基数小,一折才真的便宜;基数大了,一折也是巨款。编码任务每轮都在改文件,前缀天然会变,缓存命中本来就有上限,别为了”保缓存”牺牲干活。
给 Claude Code 瘦身:今天就能做的四件事
账单结构清楚了,减肥就好办:前缀是主要矛盾,所有动作都围绕”别让前缀长胖”。四件事按性价比排序。
**1. 把 CLAUDE.md 写短。**它是常驻前缀,每一轮、每个会话都要被读一遍,塞 3000 字进去等于给每轮账单加一笔固定税。只留反复需要的事实:构建命令、风格硬规矩、目录约定。我 6 月写过 CLAUDE.md 使用指南,写完指南自己也没忍住往里堆东西,这个月删掉三分之二,只留十几行。权限相关的规矩值得留一条,我在这个坑里栽过,过程写在 一次 rm -rf 桌面的安全事故复盘 里。
**2. 单任务单会话,做完就 /clear。**长会话是 P90 轮次的直接来源,20 万 token 以上的尾部轮次全是拖着不结的会话贡献的。A 任务做完,/clear 再开 B,别让 A 的尸体挂在 B 的前缀上。平均一个会话 25 轮,我的体感是超过百轮的会话,基本都在为历史付冤枉钱。清空对回答质量也有好处:历史里堆满上个任务的报错和死胡同,模型的注意力会被这些碎片分掉。
**3. 少装用不上的 MCP 工具。**MCP(Model Context Protocol)工具的定义和系统提示一样进常驻前缀。挂十个 MCP 服务器、上百个工具,等于每轮开工前先读一篇长文再干活。爆文测出的 33k 底座里,工具定义就是大头之一。只留当前项目真用得上的,其余从配置里摘掉。
**4. 长任务拆子代理(subagent)。**让主会话保持苗条,翻代码、跑批量修改这类脏活派给子代理,只把结论带回来。雪球让它在子代理那边滚,主会话的前缀不膨胀。
| 动作 | 瘦的是哪部分 | 什么时候别用 |
|---|---|---|
| 写短 CLAUDE.md | 常驻前缀 | 项目必需的事实别删过头 |
| 单任务单会话 + /clear | 历史雪球 | 下个任务要接着用上下文时 |
| 少装 MCP 工具 | 工具定义 | 工具每个都高频在用 |
| 长任务拆子代理 | 主会话前缀 | 子代理来回搬运比共享上下文更费 |
也说句公道话:上下文本身是资产。大范围重构、跨文件推理,硬拆会丢线索,来回补上下文的成本可能比重读还高。这份清单是默认值,不是铁律,权重大的任务该胖就让它胖。
三个口径局限:一台机器、一个字段、一种定价
这份数据能说明结构,当不成普遍规律,三个局限必须交代清楚。
局限一,只测了我一台机器。我的用法是建站、写博客、写脚本,我的 CLAUDE.md、我装的 MCP、我的会话习惯,全都和别人不同。你的数字大概率不是 42,882,但结构应该差不多:前缀占绝对大头,你的输入是零头。而且我这个月正值高强度期,分布天然偏向长会话,拿它去推轻量周末用户的账单,只会高估。
局限二,usage 字段的口径。我统计的是 API 返回的 usage 字段,即”模型这一轮读了多少 token”,不等于”你被扣了多少钱”,中间隔着缓存折扣和计费档次。爆文的 33k 和我的 42,882 也未必是同一种数法,跨文章比较先对口径。
局限三,缓存定价随厂商不同。0.1 倍读、1.25 倍写是 Anthropic 的结构,GPT-5.6(07-09 发布)和 Grok 4.5(07-08 发布)各有各的缓存计价方案。拿 Claude Code 的账单去推别的 Agent 的成本,会推错。
下一个实验:用同一套脚本把 OpenCode 也测一遍
爆文说 OpenCode 开门只发 7k,约是 Claude Code 的五分之一。这个差距我准备亲手验一遍:把 OpenCode 装上,干同一批活,跑同一个解析脚本,对比两边的常驻前缀体重和缓存行为,再拆到系统提示、工具定义、历史三层看差异。数据齐了写暑期第三篇。
如果你今天只想做一个动作:打开你的 CLAUDE.md,删掉一半。这一下的收益是每轮、每个会话、每天都生效的。
一句话结论(2026-07-14):解析本机 Claude Code 的 621 个会话、15,308 轮请求,中位数一轮实际读取 42,882 token(P90 228,969,一个月累计约 13 亿),整体缓存命中率 91.27%,你发的那句话中位数只有 450 token;账单大头是常驻前缀,瘦身的本质是给前缀减肥。
参考链接
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





