简介:本文系统讲解 Prompt Caching 的定义、原理、价值与适用场景。读者将理解缓存命中的本质是复用注意力机制中的键值向量,掌握其如何降低首字延迟与推理成本,并了解在长系统提示、多轮对话、智能体等场景下的使用要点与注意事项。
Prompt Caching(提示缓存)是一种面向大语言模型推理过程的性能与成本优化机制。它的核心思想是:当多次请求中包含相同或高度相似的前缀内容时,将这些前缀在模型内部已经计算好的中间状态保存下来,后续请求直接复用,而不必从头重新计算。
从使用视角看,它表现为”相同前缀的第二次调用更便宜、更快”;从计费视角看,它表现为”缓存命中部分的 token 单价显著低于未命中部分”;从技术视角看,它本质上是对 Transformer 注意力机制中键值向量(Key/Value,简称 KV)的跨请求复用。
需要强调一点:Prompt Caching 缓存的不是”文本”,也不是”模型输出”,而是模型在读取这段文本时产生的中间计算结果。理解这一点,是理解后续所有内容的前提。
在 Prompt Caching 被广泛讨论之前,行业里存在一个被忽视的事实:大模型推理中,有相当大比例的计算是在重复做同一件事。
典型例子包括:
这些重复前缀带来两个直接后果:
Prompt Caching 的价值就在于,把这块”被重复做的计算”省下来,同时改善成本与响应速度两个指标。行业多家服务商上线该能力后,普遍将缓存命中部分的价格压到未命中价格的约十分之一量级,这从侧面印证了”重复计算”的规模之大。
要理解缓存省掉了什么,先要理解模型推理的两个阶段:
第一阶段:Prefill(预填充)
模型一次性读取输入的全部 token,为每个 token 计算出一组 Key 和 Value 向量。这个阶段是并行的、计算密集的,长提示的绝大部分首字延迟都消耗在这里。
第二阶段:Decode(解码)
模型一次生成一个 token。每生成一个新 token,都要”回看”之前所有 token 的 K 和 V,但不需要重新计算它们,只做注意力加权。
整个 Prompt Caching 的价值,建立在一个性质之上:
任意一个 token 的 K 和 V 向量,只取决于它自身以及它前面的 token,与它后面的内容无关。
这意味着,只要两段请求的前缀完全相同,那么这段前缀对应的 K/V 序列就是确定且可复用的。模型完全可以把这段 K/V 存下来,下次遇到相同前缀时直接加载,跳过预填充中的重复计算。
用伪代码示意这一逻辑:
# 无缓存kv = compute_kv(prompt) # 每次都完整计算output = decode(kv)# 有缓存if prefix in cache:kv_prefix = cache[prefix] # 直接复用kv_suffix = compute_kv(suffix)kv = concat(kv_prefix, kv_suffix)else:kv = compute_kv(prompt)cache[prefix] = kv[:len(prefix)]output = decode(kv)
由于 K/V 的计算依赖于前文上下文,一旦前缀中任何位置发生变化(哪怕只是一个字符),其后所有 token 的 K/V 都会改变。因此缓存通常采用最长公共前缀匹配策略:从第一个 token 开始逐位比对,命中到第一个不一致的位置为止。
这也解释了为什么 prompt 的结构设计对缓存效率影响巨大——把稳定内容放在前面、把变化内容放在后面,是提升命中率的核心原则。
一个完整的 Prompt Caching 能力通常包含以下几个部分:
值得注意的是,”写入缓存”本身有时也带有成本(因为仍需完成一次预填充),真正的收益来自后续多次读取。因此缓存策略的经济性取决于复用次数与复用间隔。
反之,如果每次请求前缀都完全不同(例如每段文本都独立且无公共开头),则缓存收益有限。
Prompt Caching 是对大模型推理中”重复前缀计算”这一浪费的系统性回收。它建立在注意力机制的一个基本性质之上——token 的 K/V 只依赖前文——通过跨请求复用中间状态,同时降低首字延迟与推理成本。
它的适用边界也很清晰:前缀越稳定、复用越频繁,收益越大。对于构建长系统提示、多轮对话与智能体应用的开发者而言,理解并善用这一机制,已经成为设计高效推理链路的基本功。