🧠 图解记忆:缓存命中靠前缀完全一致,收益要看命中率与账单;点击图片可查看原图。
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 Cache | Prompt Caching |
|---|---|---|
| 范围 | 单次请求内 | 跨请求共享 |
| 解决 | 自回归重复计算(O(n²)→O(n)) | 重复前缀的 Prefill 浪费 |
| 收益 | 加速生成 | 降本 + 降首 token 延迟(TTFT) |
收益与成本
- 缓存计价、最小前缀长度、保留时间和命中规则因供应商与模型而异,不能把某一家某一档折扣当成通用结论
- 实际收益取决于可缓存前缀占比、命中率、缓存写入成本、请求分布和 TTFT 变化,应从账单 usage 字段与线上指标核算
- 配合"语义缓存"(相同问题直接返回历史答案,完全不调 API)可再省一层
最佳实践(面试必答)
- 静态内容在前,动态内容在后:
[System Prompt] → [检索文档] → [对话历史] → [当前问题](缓存键是精确字节序列,一个字符变了就全失效) - System Prompt 里别注入易变内容:时间戳、用户名、请求 ID 会让每次请求缓存全废
- 显式标记缓存点:Anthropic 用
cache_control: {"type": "ephemeral"};OpenAI 自动前缀缓存;DeepSeek 上下文硬盘缓存自动生效 - RAG 场景把固定文档块放 System 位置,多轮追问不重算
(引擎层实现:vLLM APCache / SGLang RadixAttention → 见 08-推理优化、19-推理框架)
面试话术:
"Prompt Caching 复用重复前缀的计算。工程上要把稳定内容放前、动态字段放后,并通过缓存命中 token、TTFT 和实际账单验证收益;折扣比例和命中条件是供应商配置,不应背成固定数字。"
