缓存命中与否:同一任务读数能差 10 倍
实测于 2026-11-14 · 数字来自真实运行
这一页的原始数据来自真实运行,用tools/usage.py从会话文件解析出的token与耗时。样本量与不能推广的部分写在页内,没有做平均修饰。
要回答的问题
同一个任务连跑几次,为什么第一次与第二次的token差这么多?缓存命中到底省了多少、省在哪一项?
对照组
同一任务、同一模型、同一输入,连续跑4次不换输入;另跑一组每次清空会话(冷缓存)对照。记录每步的未命中输入、缓存命中、输出三项,分别算钱。
环境与版本
- 宿主版本
- 0.1.2-alpha.5
- 模型ID
- 宿主默认路由(会话头未记模型ID,本次记录缺口)
- 模式 / 权限
- --profile headless / workspace-write / Windows 11 / node 22.22.2
- 输入文件
- 任务:报x.txt与big.txt各多少行。x.txt 4行;big.txt 200行但末行无换行符。目录指纹跑前后未变
要记录的字段
| # | 字段 | 结果 |
|---|---|---|
| 1 | 宿主版本与模型ID | 0.1.2-alpha.5;模型走宿主默认路由(会话头未记ID) |
| 2 | 任务与输入哈希 | 任务:报x.txt与big.txt各多少行。x.txt 4行;big.txt 200行但末行无换行符。目录指纹跑前后未变 |
| 3 | 每次运行的未命中输入token | 16,210 / 628 / 599 / 893 |
| 4 | 每次运行的缓存命中token | 15,872 / 47,872 / 47,872 / 65,408 |
| 5 | 每次运行的输出token | 137 / 319 / 308 / 1,493(推理0 / 65 / 95 / 902) |
| 6 | 按官方定价分别算出的三项费用与合计 | 命中 $0.00005/0.00014/0.00014/0.00020;未命中 $0.00243/0.00009/0.00009/0.00013;输出 $0.00008/0.00019/0.00018/0.00090。合计 $0.002561/$0.000429/$0.000418/$0.001226 |
| 7 | 第1次与第4次的差异倍数 | 未命中输入第1次是第2次的25.8倍;费用第1次是第2次的6.0倍。但总token第1次(32,219)比第2次(48,819)更低 |
| 8 | 清空会话后是否回到第1次的水平 | 本组没有清空会话对照组,但第1次本身就等价于冷缓存:16,210未命中vs后续599–893 |
实测发现
- 缓存省的是未命中输入这一项,而且省得极狠:第1次16,210,第2次628,第3次599 —— 降到1/25。后面三次都在600–900区间,说明缓存稳定命中。
- 「总token更多」不等于「更贵」。第2次总token 48,819比第1次32,219高51%,费用却只有1/6。原因是第2次有47,872是缓存命中(每百万 $0.003),而第1次有16,210是未命中(每百万 $0.15,贵50倍)。任何只报totalTokens的看板都会把这两次算反。
- 第4次费用回升到 $0.001226,是前一次的2.9倍。原因不是缓存失效,而是它多想了:输出1,493(前三次137–319),推理902。
- 第4次也是唯一答对边界的一次:它报big.txt 199行,并说明「最后一行没有换行符,按换行符统计是199」。前三次都报200。多花的那3倍钱买到了更正确的答案。
- 四次墙钟3.5 / 5.3 / 5.5 / 11.4秒,与步数(2/3/3/4)同步,与token量没有直接关系。
结论
缓存命中省的是未命中输入那一项,同一任务连跑时能省到1/25,整单费用降到约1/6。但读数必须分三项看:总token更少的那次可能更贵。另外,费用更高的那次答对了边界情况——省不省和答得对是两件事,不能只看账单。
不能推广的部分
- 只有4次,没有清空会话的对照。第1次当冷缓存用,严格说不是「同一条件下清空会话」。
- 缓存命中率取决于服务端的缓存策略与过期时间,本站测不到那一层,只能观察结果不能控制变量。
- 任务只有约200行文本,规模很小。换成几万token的输入,未命中与命中的绝对差值会放大,比例关系未必同向。
为什么先不写结果
要回答的是「缓存省的是哪一项、省多少」,不是「缓存有没有用」。所以必须把三项分开记,只看totalTokens得不出结论。