返回博客

省 token 省过头,一次重试就全赔回去了

作者 约 5 分钟读完

省 token 省到任务失败、重跑一遍,前面省的全赔进去。拆解 Claude Code 一个任务的四个成本变量:回合数、缓存、输出与思考、模型;讲清 effort 怎么调、何时降级或升到 Fable 5.1、别打断缓存、/compact 何时回本,以及用 /usage 量出你自己的数。


省 token 省过头,一次重试就全赔回去了

每一种省 token 的方式,都可能让你完不成任务。而一次重试的花费,比这些省下来的都多。

你要的是把功能做完。省 token 省到任务失败、重跑一遍,前面省的那点全赔进去,还要倒贴。

钱花在哪、哪些设置真正影响账单、怎么量出你自己的数。


先记住 Opus 5.5 的价格

每百万 token:

项目Opus 5Opus 5.5降幅
输入$5$4-20%
输出$25$20-20%
缓存读取$0.50$0.20-60%

注意最后一行,缓存读取从输入价的 1/10 降到了 1/20。

再记一个比例:一个输出 token 的价格,是一次缓存读取的 100 倍。


一个任务的钱从哪来

Claude Code 里的一个任务就是一个循环:模型读对话 → 调工具 → 读结果 → 再来一轮,直到干完。每一轮都要把到目前为止的整段对话重发一遍。

能影响成本的有四个变量。

回合数

官方举了个例子。一个任务,上下文从 20K 涨到 120K,跑了 40 轮,平均每轮发 70K,总共 2.8M 输入 token。对话本身从没超过 120K,但你付的是 2.8M。

  • 40 轮完成:输入成本约 $1.62
  • 25 轮完成:输入成本约 $1.02

同一个任务,少 15 轮,省 37%。

想少跑几轮,最有效的是给模型一个检查自己的办法:一个能跑的测试、一次构建、一个调接口的脚本。它能自己验证,就能早点发现错,不用等写完了你看、你说不对、它再改。

缓存

还是那 2.8M 输入:

  • 没缓存:$11.20
  • 90% 命中:$1.62
  • 96% 命中:$0.99

差了十倍,没有别的设置能影响这么大。怎么别把它打断,后面单独讲。

输出,包括你看不见的思考

一个典型任务 60K 输出 token,花 $1.20,相当于从缓存里读 6M token。

thinking 按输出计费。Claude Code 只给你看摘要,但它想的每个字你都付钱,所以 effort 对账单影响才这么大。

模型

决定每个 token 的单价。这个好理解,下面讲怎么选。


换模型之前,先调 effort

上一篇我写过"简单活别用 Opus,切 Sonnet、Haiku",但其实有更细致的做法。

先看 effort。Opus 5.5 有四档:low、medium、high、xhigh,外加单次会话用的 max。

/effort medium      # 设置档位
/effort status      # 查看当前档位

官方的用法:

  • medium:范围明确的日常活,从这里起步
  • high:medium 卡住了再升
  • low:机械活,比如重命名、在多个文件里套一个已知模式

high 值不值,可以算一笔账。假设 high 在一个任务里多想了 20K token,按输出价是 $0.40。而一个 10 轮的重试循环,100K 缓存上下文,总共 10K 输出,成本也差不多是 $0.40。

也就是说,high 只要帮你省掉一次重试就回本了。medium 本来就能一次搞定的活,开 high 就是白花钱。

什么时候该升档?看"只修了一层"

官方举的例子很典型:API handler 里一个字段改名了。

medium 下,模型改了 handler,handler 的测试也过了,但客户端还在发旧字段。你要它做的它确实做了,只是没读得够远,没找到第二个调用方。

high 下,它会在动手前多花几轮读调用点,一次把两层都改了。

但官方紧接着补了一句:升档之前,先看看它有没有办法检查自己。如果有一个会经过客户端的测试,旧字段在写入那一轮就会让测试挂掉,medium 也能发现。一次测试只花一轮和它的输出,更高的 effort 却是每一轮都在加思考。

所以顺序是:

加一个检查手段 → 升 effort → 换更大的模型

降级只用来"查",别用来"写"

降级到 Sonnet 或 Haiku,用于查询,不要用来写代码。

  • 适合小模型:搜索、总结的子 agent,读日志、读测试输出,"这个函数在哪定义的"
  • 跨多个文件的机械编辑:留在 Opus 5.5,把 effort 调到 low

编辑应该留在写其余代码的那个模型上。小模型要是误读了搜索结果,主模型就会去找错的文件,绕的这段路还是主模型付钱。所以小模型只干错了容易发现的活:找文件、跑测试、读日志。

把子 agent 设成小模型,两种方式:

# 在子 agent 定义里单独指定
model: haiku
# 或者一次性设置所有子 agent
export CLAUDE_CODE_SUBAGENT_MODEL=sonnet

子 agent 定义里写了模型的,会覆盖环境变量。什么都没写的,默认跑在你的主模型上,价格也跟着主模型走——这一点很多人没注意。

什么时候升到 Fable 5.1

Fable 5.1 每百万输入 $10、输出 $50,是 Opus 5.5 的两倍半。但它的缓存读取只要 $0.25,只比 Opus 5.5 贵 25%。所以长时间、缓存密集的运行里两者差价最小,大量输出的任务里差价最大。

官方给的规则很好记:Opus 5.5 在 high 下两次撞到同一个问题,就切 Fable 5.1,解决完切回来。别等到第三次失败。

适合 Fable 的场景:长时间无人值守的运行、代码库里没有现成模式可抄的问题、要协调多个子 agent 的大改动。

切的时候注意两点:

  • 在自然断点切。新模型从空缓存开始,第一轮要为整段对话付写入价。先 /compact,或者写个简短计划开新会话。
  • /model 会把你的选择存成新会话的默认值,难的部分做完记得切回来。

别亲手打断你的缓存

缓存存的是前缀,只能复用"从头开始和上一次请求一致"的那部分。改动了早期内容,后面就全部失效。

以下操作会触发缓存重写:

  • 暂停超过缓存有效期
  • 改 effort 或 thinking 设置
  • 连接或断开 MCP server
  • 切换模型
  • 对话被压缩

第二条单独说一下:改 effort 会清掉缓存。所以 effort 也要在断点改,别一个问题问到一半来回拨。

5 分钟还是 1 小时

缓存有效期取决于你怎么付费:

  • Claude 订阅:1 小时
  • API key 或云厂商:默认 5 分钟
  • 订阅在用额度积分时:也降到 5 分钟

120K 上下文在 Opus 5.5 上,一次缓存读取约 $0.02,一次 5 分钟缓存写入约 $0.60,一次写入顶 25 次读取。用 API key 的时候,你起身倒杯水、六分钟后回来,下一轮就从 $0.02 变成 $0.60。

会话开始时把模型、effort、MCP 都设好,干活期间别动。


/compact 什么时候回本

在 150K 上下文时压缩一次,大约花 $0.25(读一遍、写几千 token 摘要、在短上下文上重建缓存),之后每轮省约 $0.025 的读取。大约 10 轮回本,所以快干完了就别压了,压了反而亏。

摘要还会丢细节。调试到一半压缩,可能正好丢掉唯一关键的那行日志。压的时候告诉它留什么:

/compact keep the failing test names and the schema change

/clear 是免费的,转去做不相关的事就用它。


计量你自己的数

官方全文最后一条要点是加了粗的:在每个模型上跑一个真实任务,对比 /usage。你自己的数字才值得信。

任务结束时跑:

/usage

/usage 输出示例

看三个比例:

  1. 缓存占比。长会话应该很高。如果低,查查有没有长时间停顿、中途改了 effort 或模型、中途接了 MCP。
  2. 输出和输入的比值。小改动却有一大堆输出,通常是 effort 开太高了,或者模型在反复重试。
  3. 总输入和对话大小的比值。总输入是对话大小的很多倍,说明跑了太多轮,值得翻回去看看在哪兜圈子。

参考线:官方给的企业平均值是每个开发者每个活跃日约 $13,90% 的人不超过 $30。哪个会话明显高出你平时的水平,就翻出来看看是哪一步多花了。