标准回答
原理
LLM 推理分 prefill(并行处理输入、算出每个 token 的 KV)和 decode(逐 token 生成)两阶段。当多次请求共享同一段固定前缀时,这段前缀的 KV Cache 每次都要重新 prefill,纯属重复计算。Prompt Caching 把固定前缀的 KV 状态缓存下来,后续命中同一前缀的请求直接复用,只需对前缀之后的新内容做 prefill。
为什么能降本降延迟
跳过前缀 prefill 既减少了 GPU 计算量,又缩短了首 token 延迟(TTFT);计费上,缓存命中的输入 token 按显著更低的价格结算,长前缀重复调用的场景成本下降明显。
关键约束
缓存以前缀精确匹配为前提:前缀需逐 token 完全一致且位于开头。因此工程上应把稳定内容(system prompt、文档、few-shot)放前面、把易变的用户输入放末尾,命中率才高。这与 LLM 推理加速实战 中的 KV Cache 优化一脉相承。
常见误区
⚠️ 常见踩坑
Prompt Caching 缓存的是前缀的 KV 状态、加速的是 prefill,并不会缓存或复用最终生成结果(那是语义/响应缓存,另一回事);另外只要前缀有一个 token 不同或变动内容放在了前面,缓存就会失效。
追问
追问 1:Prompt Caching 和普通的 KV Cache 有什么区别?
单次请求内的 KV Cache 是在 decode 阶段复用已生成 token 的 KV,生命周期仅限本次生成。Prompt Caching 是跨请求复用:把固定前缀的 KV 持久化保存,让多次独立调用都能跳过该前缀的 prefill,属于服务层面的优化。
追问 2:为什么变化的内容要放在 prompt 末尾?
因为缓存按前缀精确匹配,且 Transformer 中靠后 token 的 KV 依赖前面所有 token。只要前面有一处不同,后续 KV 全部失效。把稳定内容前置、易变内容(用户问题)后置,才能让最长公共前缀命中缓存。
追问 3:缓存命中率低或缓存过期会带来什么问题?
命中率低时收益消失,还可能因维护缓存带来额外开销;缓存通常有 TTL,过期或被驱逐后需重新 prefill。设计时要让前缀足够稳定、复用频繁,并控制缓存数量与生命周期,避免显存被大量低复用前缀占满。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
🛠️ AI 工具
- vLLM
高吞吐 LLM 推理引擎,77,418+ stars。采用 PagedAttention 显存优化技术,吞吐量比 HuggingFace Transformers 高 24 倍,是生产环境部署大模型推理的首选方案,支持 OpenAI 兼容 API