在 AI 大模型的服务链路里,提示缓存是省算力的关键设计,而缓存失效常常发生在你没留意的一瞬间:同一段系统提示词,昨天还能命中,今天却整体重算。把失效的来路弄清楚,是每个调用方的基本功。
可以把提示缓存想成食堂的备菜:师傅把常点的菜提前切配好,客人一点就直接下锅。它失效也好理解——菜谱改了、备菜间满了、放太久撤下了,任何一样都会让准备工作作废。这个类比有个失效之处:菜坏掉是渐进的,缓存的作废却是一瞬间的,前缀对不上就整体重来。带走一个判断:失效不是「坏了」,而是「对不上了」。
缓存为什么会失效:三个触发点
第一个触发点是前缀变化。缓存按前缀匹配工作,从第一个字开始逐段对齐,只要系统提示词、工具定义或资料内容有一个字不同,差异处之后的所有缓存段都派不上用场。把经常变动的信息放在提示词末尾,是保住缓存的基本功。
第二个触发点是过期淘汰。服务端缓存空间有限,长时间没被命中的条目会被逐步请出去腾位置。第三个触发点是节点迁移,请求被调度到另一台机器上,而那台机器没有这份前缀的副本,调度与边界的细节可以看多租户的隔离是怎么做的?互不干扰。各家的保留时长策略不同,DeepSeek 和 Kimi 的开放文档都对此有单独说明,具体以官方为准。
| 触发点 | 怎么发生 | 应对 |
|---|---|---|
| 前缀变化 | 提示词、工具定义或资料有一个字不同 | 把易变内容放到提示词末尾 |
| 过期淘汰 | 长时间没被命中,条目被请出去 | 留意服务的保留时长 |
| 节点迁移 | 请求被调度到没有副本的机器 | 换机器后重新计算 |
从写入到作废:一条缓存的生命周期
一条缓存的旅程分四步:请求进来,服务先把前缀切分成段并算好指纹;接着查缓存表,命中就复用计算结果,未命中就正常计算再写回;之后带着相同前缀的请求到来,就能直接吃到现成结果;最后当前缀变化、条目过期或节点下线时,缓存被宣布作废。每一步进来什么、发生什么、出去什么都有明确边界,顺着这条线排查,方向不会错。
怎么判断缓存有没有命中
多数服务会在返回的用量明细里,把读取缓存的 token 和新计算的 token 分开列出。连续几次请求都显示前者占大头,说明前缀复用得好;反过来数字一直居高不下,多半是前缀在悄悄变化。豆包和通义千问的开放平台同样提供这类明细,字段叫法不同,思路一致。命中与否也直接影响首字延迟,两种服务策略的取向见保首字还是保整段?两种服务策略。长文本在进入缓存前的切分方式也会影响命中,可参考长文本的预处理发生在哪一步?切块与标注。
让缓存活得更久的三个习惯
一是把动态内容后置,让前缀保持逐字稳定;二是让重试和批量任务复用同一份提示词骨架,只在尾部替换变量;三是留意服务的缓存有效期,把密集调用安排在窗口内。流式返回场景下缓存同样在后台工作,想看输出这一侧的机制,可以读流式输出的顺序是怎么保证的?分片组装。
缓存健康速查:
- 前缀里是否有逐字稳定、不随请求变化的部分
- 返回明细里缓存命中的 token 占比是否可观
- 距离上次命中是否已超出服务的保留窗口
三条都过关,缓存才真的在替你省算力。
缓存失效快问快答三则
- 改一个字也会失效吗?:会。前缀匹配从首字对齐,差异之后的部分全部作废,改动越靠前代价越大。
- 失效了会报错吗?:不会。它只影响速度和消耗,服务会重新计算,回答照常给出。
- 能主动清掉自己的缓存吗?:多数开放平台提供删除接口,不管它的话等条目自然过期也可以。
看懂失效的来路比记住任何参数都管用,下次发现响应变慢,先回头检查前缀是不是变了。


