对话里每次新提问,为什么还能命中缓存?
一个常见困惑:"每次问的都是新问题,怎么可能还命中缓存?" 答案藏在一个容易忽略的细节里——新问题不在开头,而在结尾。 本页讲清「前缀缓存」在连续对话里是如何每次都命中大段的。
01核心:新问题在结尾,不在开头
提交一个问题时,发给模型的不只是这个问题本身,而是整段对话历史: 系统提示 + 之前所有来回 + 你刚发的新问题。新问题只是被追加在最末尾。
而"能命中缓存的前缀",是从开头一直算到上一次请求的结尾。因为每次都只是往后追加, 前面那一大段历史在上一次请求时就已经算过并缓存了——于是这次一开头就能命中。
02逐条追加示意
绿色 = 本次命中(复用上次已算的),红色 = 本次新算(未命中):
第1问
系统提示问题1
第2问
系统提示问题1回答1问题2
第3问
系统提示问题1回答1问题2回答2问题3
每次只有末尾新增的那一截是"新的",其余整段历史全部命中缓存。
03命中 / 未命中分布
假设每次的历史有 8 万 token、新问题只有 2000 token:
| 部分 | 规模 | 单价 | 占本轮成本 |
|---|---|---|---|
| 命中(历史前缀) | 80,000 token | 超便宜(≈1/30) | 绝大部分 |
| 未命中(新问题) | 2,000 token | 全价 | 很小 |
也就是说:对话越长,命中比例越高,新增成本越小——这正是长对话省钱的根源。
04打个比方
不是每次重新做一整桌菜,而是同一锅汤不断往里加料。锅底和老汤都还在, 你只是往里面加了新的几片菜——加进去那几片要煮(未命中),整锅老汤直接复用(命中)。 下次再加料时,连上次加的那几片也变成老汤的一部分了。
05推论
ℹ️ 这解释了之前的三点
- dsh / agent 的长对话为什么省钱——连续前缀命中率天生很高。
- 切换模型会断缓存——换了缓存域,前缀全部重算,命中失效。
- 提示词开头别放会变的内容——一旦前缀改变,后面整段缓存作废。
⚠️ 何时命中不了
如果每次都开一个全新的、没有共同前缀的会话,那就几乎命中不了;
或者开头插入了会变化的信息,也会让前缀失效。对话式 agent 的优势就在于天然连续。