第4篇:越聊越便宜?Prompt Cache原理

2 阅读4分钟

直觉上,对话越长越贵。但实际上,为什么同一个对话到后期,每轮的费用反而大幅下降呢?背后的机制叫 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 用英文写且保持精简。  内容稳定 + 体积小 = 命中率高且省。


本人公众号「向好慢慢行」,欢迎大家关注。