01
一句话:缓存的不是答案,是已经算过的前缀状态
把已经算过的前缀注意力状态留下;命中就按折扣价读,分叉之后重新算。
CACHE ≠ RESPONSE
CACHE = REUSABLE PREFIX STATE
同一个输入仍会重新生成输出;temperature 等参数仍可能让答案不同。
“LLM 缓存”至少指四件不同的事。先把它们拆开,后面的价格、TTL、命中率才不会串台。
先纠正一个常见说法“前缀差一个字节就整段作废”说得太狠了。准确说法是:从第一个分叉点往后不能复用;分叉前若存在可用缓存断点或缓存前缀单元,仍可能命中更短前缀。厂商会向后寻找最长可用匹配,但规则各不相同。
✦ 本章通关条件
✓
能说清 KV Cache、Prefix Cache 与 Semantic Cache 为什么不是一回事
02
里面发生了什么:每个词都做成 K/V 卡片,前缀第二次直接复用
别被 K/V 吓到。模型读句子,就像店员在仓库取货:每个词都先被做成两张小卡片,后面要用时才有现成的可拿。先把这三张卡认熟:
Q查询卡“我现在想找什么”。每读到一个新词,模型就拿着它当问题,去前面挨个问。
K门牌卡“这个词是什么来头”。每个词都贴一张门牌,用来被别人的查询卡比对。
V储物柜“这个词真正装着什么”。门牌对上了,才打开柜子把内容取出来用。
一句话版本:注意力 = 拿新词的 Q,去比前面每个词的 K,比得越像,取的 V 越多。K/V 不是缓存的“答案”,而是模型回头翻材料用的中间账本。
第 1 幕 · 第一次请求
点击“下一步”开始
- 第一次:完整前缀进模型,逐词做成 K/V 卡(最费算力的一段);合格前缀被存进缓存货架。
- 下一次:前缀一字不差,卡片直接货架取,只给新尾部现场做卡,再照常生成新答案。
- 账单不等于显存:推理引擎内部那张 K/V 表是单次请求的加速;API usage 里的 cached tokens 才是跨请求的货架复用。
为什么输出不缓存?货架只存“读完这段前缀后的模型状态”。模型还是要对新问题做注意力、逐 token 采样生成答案——输入可以复用,输出不承诺相同。
03
动手:看前缀从左向右咬合,在哪里断
点击四种变体。蓝色是复用的缓存前缀,橙色是正常变化的动态尾部,红色是本来想复用、却因更早变化而重新计算的部分。
PREFIX MATCHER · 模拟已存在“稳定区末尾”断点
真正比较的是厂商渲染后的完整上下文,不只是你肉眼看到的字符串。模型、工具 schema、结构化输出、reasoning/thinking 配置都可能改变前缀。稳定骨架通常是:
append-only-prompt.txt · 通用结构[tools / 工具定义] # 最稳,固定内容与顺序
[system / developer] # 稳定指令
[参考文档 / few-shot] # 按版本稳定
[对话历史] # 只追加,不回头改
──────── CACHE BREAKPOINT ────────
[动态 RAG / 时间 / 用户问题] # 每次变,放最后
04
一次请求:从序列化到最长命中,再写入新状态
点“推进”走完整条流水线。注意:共同前缀存在,不代表它已经被写成可读取的缓存项。
DeepSeek 的缓存前缀单元,是一个重要例外
DeepSeek 默认自动构建磁盘缓存,但新版规则不是“发现任意公共前缀,当次马上命中”。每个可命中的前缀必须先成为完整的缓存前缀单元:
- 请求会在用户输入末尾和模型输出末尾持久化前缀单元;长内容还会按固定 token 间隔切单元。
- 若第一次是 A+B,第二次是 A+C,第二次不能命中 A+B;系统会发现公共 A 并将 A 持久化,第三次 A+D 才可能命中 A。
- 缓存构建需要数秒,且是 best-effort;并发冷启动不能假定 100% 命中。
05
三家对照:别把模型代际与平台规则揉成一张假表
以下规则来自 2026-08-27 官方文档。价格和模型会变,生产环境应把 usage 与实际价目表作为最终事实。
OpenAI
- CONTROL
- 支持模型默认启用;GPT-5.6+ 有 implicit / explicit-only,最多 4 次写入、读取看最近 50 个断点。
- MINIMUM
- GPT-5.6+:1,024 可见 token;更早模型通常 2,048。
- PRICE
- GPT-5.6+ 写 1.25×、读 0.1×;更早模型不另收写费,读价看模型。
- LIFETIME
- GPT-5.6+ 默认且仅支持最低 30m;更早模型有 in-memory 或支持时 24h。
- USAGE
cached_tokens、GPT-5.6+ 的 cache_write_tokens
Anthropic
- CONTROL
- 顶层 automatic caching,或 content block 显式
cache_control;最多 4 个断点,回看 20 blocks。 - MINIMUM
- 按模型 512 / 1,024 / 2,048 / 4,096,不再适合概括成“多数 1,024”。
- PRICE
- 5m 写 1.25×;1h 写 2×;读 0.1×。
- LIFETIME
- 默认 5m,可选 1h;写或读会刷新,计时从请求开始。
- USAGE
cache_creation_input_tokens + cache_read_input_tokens
DeepSeek
- CONTROL
- 磁盘 Context Cache 默认开启,无需改代码;完整匹配已经持久化的缓存前缀单元。
- MINIMUM
- 官方当前 Context Caching 指南未承诺统一最低命中长度;旧公告曾称 64 token 存储单元,不应当作新版 SLA。
- PRICE
- V4 当前峰值缓存命中相对 miss 约 1/31.4;离峰同倍率,具体价格随模型变化。
- LIFETIME
- 未使用后通常数小时至数天自动清除,无可配置 TTL 承诺。
- USAGE
prompt_cache_hit_tokens + prompt_cache_miss_tokens
| 问题 | OpenAI | Anthropic | DeepSeek |
|---|
| 缓存原文答案? | 都不是。复用输入前缀状态,输出重新生成。 |
| 能否手动清空? | 否 | 否 | 文档未提供 |
| 命中保证? | 受路由与容量影响 | 并发首写完成前不可读 | 明确 best-effort |
| 变化最敏感处 | 完整 rendered context | tools → system → messages | 已持久化前缀单元的完整匹配 |
⚠ 规则变化比你想得快Anthropic 当前文档已支持顶层 automatic caching,最低长度也按新模型细分;OpenAI GPT-5.6+ 又增加显式断点和写入计费。不要把 2024 年博客里的数字长期硬编码进监控系统。
06
成本实验室:写一次,读几次,什么时候开始省
拖动参数观察输入成本。图中用“标准输入 token 等价成本”比较,避免把不同模型的美元单价混在一起;输出 token 与动态尾部不受缓存折扣。
怎么算?
无缓存 = N ×(稳定前缀 + 动态尾部)。有缓存 = 首次写入前缀 + 每次动态尾部 + 后续命中的前缀读价 + 后续未命中的前缀标准价。OpenAI / Anthropic 分别使用写 1.25×、读 0.1×;DeepSeek 当前 V4 峰值 hit/miss 比约 0.0318,自动写入没有单列写费。模拟忽略输出、路由失败和 TTL 过期。
07
缓存杀手挑战:8 个改动,哪些会砸掉命中
假设改动发生在缓存断点之前,并且没有更早的独立断点可退。先判断,再看真实失效边界。
CACHE KILLER REVIEW0 / 8 已判断
生产口诀,不是玄学
- 稳定的放前,变化的放后:时间、用户 ID、request ID、动态 RAG 结果留在断点后。
- 工具定义冻结:固定名称、schema、描述与顺序;OpenAI 可用 allowed tools,而不是每轮删工具。
- 历史只追加:不要重排、重写旧消息;compaction 会改变前缀,需接受压缩后的第一次命中下降。
- 先测 usage:看 token 级命中率,不要用“请求命中过几次”掩盖只命中很短前缀。
- 先预热再并发:Anthropic 要等首个响应开始后缓存才可用;DeepSeek 构建也需要数秒。
Agent 场景的肥肉tools + system/developer + 长文档 + append-only history 才值得缓存。用户的当前问题天然会变,把它留在最后,不要让它挡在稳定前缀前面。
08
终极测验:你真的会设计可命中的 Prompt 了吗?
5 题验收。答对 4 题以上,才算能去看生产账单。
FINAL EXAM · PREFIX CACHING0 / 5
官方来源