Tokenomics: the 62.5-minute rule for Claude's cache¶
Ch01.385 Tokenomics: the 62.5-minute rule for Claude's cache¶
📊 Level ⭐⭐ | 9.3KB |
entities/tokenomics-the-625-minute-rule-for-claudes-cache.md
核心结论¶
62.5 分钟是 Claude 提示缓存策略的决策临界点:
- 如果预计在 62.5 分钟内再次需要该缓存 → 选择刷新(refresh),持续以读代写保持缓存活性
- 如果预计超过 62.5 分钟才需要 → 放任缓存过期,下次重新写入更划算
- 该临界值不随模型型号变化(Opus/Sonnet/Haiku 均相同)
- 该临界值不随前缀 token 规模变化(5K 或 500K 均相同) --- See also Claude Code Architecture
深度分析¶
1. 定价结构的数学本质¶
Claude 的提示缓存定价遵循一套固定的倍率体系,而非绝对价格: | 操作 | 倍率(相对 base input) | |---|---| | 5 分钟缓存写入 | 1.25x | | 1 小时缓存写入 | 2.00x | | 缓存读取 / 刷新 | 0.10x | 这三个倍率是所有模型共享的——差异仅在于 base input 的绝对价格。这意味着临界时间 62.5 分钟的推导是模型无关的:
refresh_cost(T) = W + R × floor(T / 5)
rewrite_cost(T) = 2W
W = N × base × 1.25
R = N × base × 0.10
W/R = (N × base × 1.25) / (N × base × 0.10) = 12.5
T_break_even = 5 × (W/R) = 5 × 12.5 = 62.5 分钟
2. 缓存刷新的经济学含义¶
"缓存刷新"(cache read)本质上是一个最小区块请求:发送一个足够小的请求来读取已缓存的前缀,同时将 TTL 重置为 5 分钟。 关键机制:
- 缓存命中 = 刷新:每次读取已缓存的前缀时,API 自动将 TTL 重置回 5 分钟
- 刷新成本仅为写入成本的 8%(0.10/1.25 = 8%)
- 但必须每 5 分钟执行一次才能维持缓存活性 这形成了一个非对称的博弈:写入成本高但一次性,刷新成本低但高频。在 62.5 分钟内,刷新累计成本低于一次重写;超过 62.5 分钟,刷新累计成本超过一次重写。
3. 美元金额的规模敏感性¶
虽然决策时间点不变,但绝对美元金额随模型和前缀规模剧烈变化: 以 Opus 4.7 + 100K token 前缀为例: | 策略 | T = 30 min | T = 60 min | T = 90 min | |---|---|---|---| | 持续刷新 | $0.925 | $1.225 | $1.525 | | 过期重写 | $1.250 | $1.250 | $1.250 | | 节省 | $0.325 | $0.025 | -$0.275(亏损) | 注意 60 分钟处刷新仅节省 $0.025——这意味着在临界点附近,策略选择的实际收益微乎其微,但在 30 分钟处可节省 26%,在 90 分钟处刷新反而开始净亏损。
4. Compaction(压缩)的成本收益分析¶
上下文压缩(如 /compact 命令)是另一个被频繁使用的优化手段,但它的成本结构鲜为人知:
compaction_cost = read_old(N × R) + generate_summary(S × 5B) + write_new(S × W)
per_turn_saving = (N - S) × R
break_even_turns = (N + 62.5 × S) / (N - S)
= (1 + 62.5 × r) / (1 - r), 其中 r = S/N
5. 三大缓存地雷(Footguns)¶
地雷 1:Opus 4.7 的新 Tokenizer¶
Opus 4.7 使用了新的 tokenizer,相同文本可能产生多达 35% 更多的 token。 这意味着:
- 从 Opus 4.6 迁移到 4.7 时,历史缓存的 token 计数可能严重失准
- 100K token 的前缀在 4.7 上可能变成 135K token
- 必须在迁移前用 token counting endpoint 重新测量
地雷 2:最小缓存门槛¶
| 模型 | 最小缓存 token 数 |
|---|---|
| Opus 4.5/4.6/4.7 | 4,096 |
| Sonnet 4.6 | 1,024 |
低于门槛时 API 不会报错,只是静默不缓存——唯一的信号是 usage block 中 cache_creation_input_tokens 和 cache_read_input_tokens 均保持为 0。 |
地雷 3:20 Block 回溯窗口¶
缓存的回溯扫描以 block 为单位,每次请求最多向后查看 20 个 content block。超过 20 个 block 后,旧的缓存条目就会落在搜索窗口之外。 这解释了为什么某些"应该命中"的缓存实际上未命中——需要在更早的位置显式插入 cache breakpoint。¶
实践启示¶
1. 实现缓存计时器¶
对于需要周期性调用 Claude 的 agent 任务,在发送请求前检查距上次缓存写入的时间:
if elapsed_minutes < 62.5:
send_refresh_request() # 读取缓存,TTL 重置为 5 分钟
else:
send_new_write_request() # 放弃旧缓存,重新写入
2. 根据前缀规模选择策略¶
| 前缀规模 | 建议策略 |
|---|---|
| < 4,096 tokens | 不使用缓存(低于门槛,静默失效) |
| 4K–50K | 62.5 分钟内刷新;注意 Sonnet 比 Opus 便宜得多 |
| 50K–200K | 这是缓存价值最高区间,每次刷新节省显著 |
| > 200K | 优先考虑 compaction,而非持续刷新 |
3. Compaction 的触发条件¶
仅当预计后续轮次明确超过盈亏平衡点时,才应执行 compaction:
- 交互式单轮问答:永远不要 compaction(预期轮次 = 1,远低于任何盈亏平衡)
- 长时间 agent 会话(Code/Agent 模式):至少需要 8–17 轮后续交互,压缩比 10:1–5:1 才合算
- 压缩时保留关键上下文(错误信息、分支名、失败假设),只压缩重复性高的中间过程
4. Opus 4.7 迁移检查清单¶
从旧模型迁移到 Opus 4.7 时: 1. 用 Anthropic token counting API 重新测量所有缓存前缀的 token 数 2. 按 1.35x 系数估算新 tokenizer 下的上限 3. 重新计算 refresh/rewrite 成本——前缀变大后,刷新策略在更短时间内就变得不划算 4. 更新缓存监控告警阈值
5. 监控与仪表化¶
文章特别强调需要自建监控来验证缓存实际生效:
# 检查缓存是否真正创建/命中
assert usage.cache_creation_input_tokens > 0 or usage.cache_read_input_tokens > 0, "Cache not active!"
- 每次请求的
cache_creation_input_tokens/cache_read_input_tokens - 距上次 cache write 的已耗时间
- 选择的策略(refresh vs rewrite)及依据
6. 交互式 vs 非交互式场景的区别¶
文章最后指出一个容易被忽略的假设:62.5 分钟规则假设你真的会再次发起请求。
- 如果 30% 的会话是单次问答后即终止,应该完全不写入缓存(省去首次写入成本)
- 交互式编程 agent(Claude Code、OpenCode 等)通常在多次往返的会话中,缓存策略价值最大
- 非交互式批量处理场景:评估单次调用 vs 缓存写入的边际成本