缓存输入 Token 是什么?为什么它能让账单降 90%
cached_input_tokens 是 input_tokens 的十分之一价格——这意味着 90% 的成本节省。但它怎么命中、什么时候失效、为什么 Claude Code 缓存命中率高达 91%?这篇讲清原理。
打开任何一家大模型 API 的定价页,你会看到三种 input 价格:
- 普通 input:基准价
- 5 分钟内缓存的 input:基准价的 10%
- 1 小时长缓存的 input:基准价的 25%
最低和最高差 10 倍。能让缓存命中的开发者,账单天然便宜一个数量级。这篇讲清缓存怎么工作、Claude Code 为什么默认命中率高达 91%、你怎么把自己的命中率推到 90%+。
缓存的物理基础
LLM 推理分两个阶段:prefill(预填充)和 decode(解码)。
prefill 阶段把输入的所有 Token 一次性算出 KV cache(每层每个 token 的 key 和 value)——这个过程吃 GPU 计算单元。decode 阶段每生成一个新 Token 都要读所有前面的 KV cache 算 attention。
Prompt Cache 做的事:把 prefill 出来的 KV cache 暂存几分钟,下次相同前缀直接复用。
下次请求如果前缀相同,模型连 prefill 都不用做了——KV cache 直接从内存读出来,从中间开始算。这能省 90% 的 input 计算量,所以单价也降 90%。
缓存命中的两个条件
不是想命中就命中。两个硬条件:
条件 1:完全前缀相同
模型缓存是「前缀缓存」(prefix cache)——从开头到某个点必须 byte-for-byte 一致。中间改一个字符,从那个字符开始往后的缓存全部失效。
这就是为什么很多人开了 cache 但命中率低——他们 prompt 模板里有动态字段(时间戳、UUID、当前选择文件名),导致每次"前缀"实际上不一样。
条件 2:在 TTL 内复用
默认 5 分钟。Anthropic 提供了"1 小时 cache"的扩展,价格是 25%(不是 10%),但常用的还是 5 分钟。
5 分钟之内重复使用 → 10% 价格。超时 → 全价重新建。
这两条对你的实际意义
意义 1:稳定的内容靠前,多变的靠后。
把 prompt 想象成一段长文本——如果你想让缓存命中尽可能多,就要把不变的部分(系统提示、项目背景、风格约定)放在最前,把变化的(用户当前问题、临时上下文)放在最后。
Claude Code 默认就是这样设计的:CLAUDE.md / AGENTS.md → 工具说明 → 当前会话历史 → 你刚发的消息。前 80% 内容跨调用基本不变,所以缓存能命中前 80%。
意义 2:长时间挂着比频繁开关省钱。
你想做一个事,30 分钟内多次和 Claude Code 交互——一直在 5 分钟 TTL 内,每次新消息都享受缓存命中。
如果你写两条退出,2 小时后再开——缓存早过期,下次第一条消息要全价支付完整 prefill。每次 session 重启的"缓存重建税"大约 5-15K Token。
真实数据:各工具的缓存命中率
我看 Vibe Usage 上 6 个主流工具的近 30 天缓存命中率:
| 工具 | 缓存命中率 |
|---|---|
| Codex CLI | 92% |
| Claude Code | 91% |
| OpenCode | 67% |
| Gemini CLI | 59% |
| openclaw | 53% |
| hermes | 51% |
Codex 和 Claude Code 都是 90%+,因为这两家工具都默认开了 prompt cache 且 prompt 结构稳定。
OpenCode 和其他工具的命中率不到 70%,原因主要是:
- OpenCode 默认不开 cache(取决于 provider)
- 不同 provider 的 cache 实现不一样
- prompt 模板里掺入了动态内容
如果你用 OpenCode 之类的工具,光这一项就能节省 30-50% 月支出——只要把 cache 开起来。
你的命中率怎么查
最直接的方式:打开 Vibe Usage 看自己每个工具的缓存命中率——它会按工具、按模型分别显示 cached_input_tokens / (input_tokens + cached_input_tokens) 的比例。
我看自己的数据时发现:
- Claude Code 命中率 88%——还可以推到 95%
- OpenCode 命中率 47%——巨大的优化空间
- 一个我以为很省的项目,缓存命中率只有 30%——原因是我那份 CLAUDE.md 经常改
发现问题之后我做了三件事:
- 把 OpenCode 的 cache: true 显式打开
- 把那份 CLAUDE.md 的稳定内容和易变内容分开成两份文件
- 长会话不再频繁切话题——保持单一主题让缓存活着
三件事做完后,月账单从 130 美元降到 90 美元。
一个反直觉的事
把 prompt 写得更短不一定省钱——
如果你的 prompt 短但每次都不一样(比如每次手敲),缓存命中率为 0,全价支付。
如果你的 prompt 长但 95% 内容跨调用稳定(比如长 CLAUDE.md),缓存命中率 90%+,每次实际只付 10%。
长但稳定 比 短但多变 更省钱。这是设计 prompt 的关键洞察。
一个具体省钱建议
如果你只能做一件事——把你 CLAUDE.md / AGENTS.md / 项目级 prompt 模板里的所有动态字段移除,或者移到末尾。光这一件事就能让你缓存命中率涨 20-40%,账单立刻减半。
然后用 Vibe Usage 验证一下——优化前后看一周对比,你会有非常清晰的数据反馈。