DSH 学习资料站 · 前缀缓存

对话里每次新提问,为什么还能命中缓存?

一个常见困惑:"每次问的都是新问题,怎么可能还命中缓存?" 答案藏在一个容易忽略的细节里——新问题不在开头,而在结尾。 本页讲清「前缀缓存」在连续对话里是如何每次都命中大段的。

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 的优势就在于天然连续