Skip to content
🔗 分享本题
查看我的学习进度 →

Prompt Caching 动漫知识图:多个请求在字节级前缀一致时跨请求复用前缀 Prefill 的 KV 结果,稳定静态内容应放前、动态字段放后,并区分解码 KV Cache 和语义缓存

🧠 图解记忆:缓存命中靠前缀完全一致,收益要看命中率与账单;点击图片可查看原图。

Prompt Caching = API 层复用相同"前缀"的 KV Cache,跳过重复的 Prefill 计算。

原理(一句话)

同一个前缀(System Prompt + 固定文档)第一次计算后,K/V 缓存保留一段时间;后续请求只要前缀逐字节相同,直接复用缓存,只计算新增部分。

请求1: [System Prompt] [文档A] [问题1]  → 全量计算, 写入缓存
请求2: [System Prompt] [文档A] [问题2]  → 前缀命中缓存, 只算[问题2] ✅
请求3: [System Prompt] [文档B] [问题3]  → 前缀变了, 缓存失效, 全量重算 ❌

与 KV Cache 的区别(高频追问)

维度KV CachePrompt Caching
范围单次请求内跨请求共享
解决自回归重复计算(O(n²)→O(n))重复前缀的 Prefill 浪费
收益加速生成降本 + 降首 token 延迟(TTFT)

收益与成本

  • 缓存计价、最小前缀长度、保留时间和命中规则因供应商与模型而异,不能把某一家某一档折扣当成通用结论
  • 实际收益取决于可缓存前缀占比、命中率、缓存写入成本、请求分布和 TTFT 变化,应从账单 usage 字段与线上指标核算
  • 配合"语义缓存"(相同问题直接返回历史答案,完全不调 API)可再省一层

最佳实践(面试必答)

  1. 静态内容在前,动态内容在后[System Prompt] → [检索文档] → [对话历史] → [当前问题](缓存键是精确字节序列,一个字符变了就全失效)
  2. System Prompt 里别注入易变内容:时间戳、用户名、请求 ID 会让每次请求缓存全废
  3. 显式标记缓存点:Anthropic 用 cache_control: {"type": "ephemeral"};OpenAI 自动前缀缓存;DeepSeek 上下文硬盘缓存自动生效
  4. RAG 场景把固定文档块放 System 位置,多轮追问不重算

(引擎层实现:vLLM APCache / SGLang RadixAttention → 见 08-推理优化、19-推理框架)

面试话术:

"Prompt Caching 复用重复前缀的计算。工程上要把稳定内容放前、动态字段放后,并通过缓存命中 token、TTFT 和实际账单验证收益;折扣比例和命中条件是供应商配置,不应背成固定数字。"