直觉上,对话越长越贵。但实际上,为什么同一个对话到后期,每轮的费用反而大幅下降呢?背后的机制叫 Prompt Cache。
Prompt Cache 缓存的是什么
缓存的是 KV 矩阵——token 的注意力运算结果。模型处理上下文时,每个 token 都要参与注意力计算,结果以 KV 矩阵的形式存在内存里。
正常情况下这个矩阵用完即丢。Prompt Cache 把它持久化保存下来,下次发同样的前缀时直接复用,跳过重新计算。效果等价,成本大幅降低。
缓存的本质:前缀匹配
每次请求的内容顺序固定:
system prompt → 历史对话 → 当前新消息
└───────────────────────┘ └──────────┘
上一轮已发过,内容不变 本轮新增
→ 全部命中缓存 → 按全价计
历史对话也命中缓存,不只是 system prompt。 对话越长,每轮命中的缓存越多,省得越多。只有当前这条新消息按全价计。
缓存命中的条件
- 内容完全一致:任何一个字节变化都会使该位置之后的缓存全部失效
- 顺序一致:内容顺序必须和上次完全相同
- 最小长度:前缀至少约 1024 tokens 才会被缓存
- 5 分钟内复用:缓存最短存活 5 分钟,每次命中后重新计时;长时间未用才会失效,失效后重新写入
缓存如何计费
计费分三档:
| 状态 | 倍率 |
|---|---|
| 首次写入缓存 | 全价 × 1.25(贵 25%) |
| 普通输入(未命中缓存) | 全价 × 1 |
| 缓存命中 | 全价 × 0.1(省 90%) |
写入为什么比普通输入贵? 普通输入计算完 KV 矩阵就丢弃,写入缓存时还要把 KV 矩阵持久化到存储里,额外的 0.25x 是这部分开销。适用于所有第一次被缓存的内容,不只是 system prompt。
每轮的实际费用拆解如下:
第 1 轮:system prompt(1.25x 写入缓存)+ 第1条消息(1x)
第 2 轮:system prompt(0.1x)+ 第1轮历史(1.25x 写入缓存)+ 第2条消息(1x)
第 3 轮:system prompt + 第1轮历史(0.1x)+ 第2轮历史(1.25x 写入缓存)+ 第3条消息(1x)
第 N 轮:前 N-2 轮历史全部(0.1x)+ 第N-1轮历史(1.25x 写入缓存)+ 第N条消息(1x)
每轮只有上一轮新增的历史是 1.25x,再往前的历史全部是 0.1x。随着对话变长,0.1x 的部分越来越大,整体越来越划算。
举个具体的数: 对话进行到第 8 轮,system prompt ≈ 8000 tokens、读了 3 个文件 ≈ 6000 tokens、历史积累 ≈ 20000 tokens,共约 34000 tokens 命中缓存,当前新消息约 500 tokens 按全价计。
其中约 3000 tokens 是上一轮历史(1.25x),其余 31000 tokens 是更早的历史(0.1x)
本轮输入成本 = 31000 × 0.1 + 3000 × 1.25 + 500 × 1 = 7250(等效 token 数)
不使用缓存 = 34500 × 1.0 = 34500
实际费用约为不使用缓存时的 21%,节省约 79%。
(绝对金额因模型不同而异,以 Anthropic 官网当前单价为准。)
哪些内容缓存价值最高
| 内容 | 缓存价值 |
|---|---|
| System prompt | 最高,每轮都一样,从第 2 轮起全命中 |
| CLAUDE.md | 高,基本不变,频繁命中 |
| 历史对话 | 高,上一轮已发过,自动命中 |
| 读入的长文件 | 高,一次读入后反复引用 |
| Skill 文件 | 中,触发后进入对话历史,内容稳定则后续命中 |
| 当前新消息 | 无,每次不同,永远不会命中 |
怎么最大化利用缓存
Claude Code 自动缓存,不需要配置。你能做的是不打破它:
1. 保持 CLAUDE.md 内容稳定。 内容变了,该位置之后的缓存立刻全部失效。频繁调整 CLAUDE.md 等于每轮都在多花钱。
2. 同一任务在同一对话里做完。 /clear 清空历史后,所有缓存归零,下一轮全部全价。
3. 需要反复参考的长文件,在对话开始时一次性读入。
先帮我读 src/order/OrderService.java,
接下来我们会一直修改它
后续每轮命中缓存,只收 1/10 费用(如果每次用到时才读,缓存永远不会命中)。
4. Skill 用英文写且保持精简。 内容稳定 + 体积小 = 命中率高且省。
本人公众号「向好慢慢行」,欢迎大家关注。