缓存经济账:一份 KV,两端省钱
讲次页把提示词缓存压成一张价目表和一句「前缀要稳定」,本篇把它拆回完整链条:prefill 一次算出的 KV,在服务器端省下重复计算与显存,在 API 端折成按读价计费的折扣。一份 KV,两端省钱。看懂两端怎么定价、缓存怎么失效、命中率怎么度量,Agent 的省钱设计就从背价目表变成可度量的工程。
GLM-5.2 的输入价有两个:常规 0.26。差价全看能不能命中。
便宜的源头是 KV cache:预填充(prefill)阶段一次算出的注意力底稿。本篇从它的来历讲起,一路走到两端的定价与失效。
KV 从哪来:两阶段推理与前缀复用
先看推理服务栈(L3 p.37-44)。Request 进入 Scheduler 排队,先过预填充:整段 prompt 一次算完,计算密集,首 token 延迟(TTFT, Time To First Token)随长度上涨。
再进解码(Decode):逐 token 生成,内存带宽密集,节奏用每 token 输出时间(TPOT, Time Per Output Token)度量。
衔接两阶段的持久状态就是 KV cache:每个请求一份,让解码不必重算历史。这份注意力底稿只算一次。
Agent 循环把这份底稿的价值成倍放大。工具结果不断回流,与上一轮完全相同的前缀每轮都在变长。
MLSys 2024 的 Prompt Cache 论文刻画的就是这个场景。实证结论:重算的计算量增长快于加载已缓存 attention 状态的成本,交叉点在哪取决于硬件。前缀够长时,存下来就赢了重算。
2026 年的「Can I Buy Your KV Cache?」再进一步:一次 prefill 的产物还能跨读者摊销。同一份长文档的 KV 可以服务许多读者,物理成本与 API 定价是两个量。
落到请求组织上,就是前缀要稳定的结构化版本,出自 L3 p.44:
API 端:一张价目表,两种缓存哲学
各家价目表出自 L3 p.40,单位 $/1M token,三列依次为缓存读、常规输入、输出:
| 模型 | 缓存读 | 常规输入 | 输出 |
|---|---|---|---|
| DeepSeek V4 Flash | 0.007-0.014 | 0.22-0.44 | 0.66-1.32 |
| GLM-5.2 | 0.26 | 1.40 | 4.40 |
| Kimi K3 | 0.30 | 3.00 | 15.00 |
| GPT-5.6 Luna | 0.02 | 0.20 | 1.20 |
| Claude Opus 5 | 0.50 | 5.00 | 25.00 |
价目截至 2026-09 讲课当周,厂商调价频繁,以官方定价页为准。
缓存读普遍只有常规输入的 1/5 到 1/30,输出价则高一个量级。省输入只是小头;真正贵的重算一旦全价重来,账单立刻回到原价。
代入一个示意演算:10 轮会话,稳定前缀 10k token,按 GLM-5.2 价目。写入按两家通行的 1.25x 溢价计。
| 方案 | 第 1 轮(前缀 10k) | 第 2-10 轮(各 10k) | 前缀部分合计 |
|---|---|---|---|
| 无缓存 | $0.0140 | 9 × 0.1260 | $0.1400 |
| 命中 | 写入 $0.0175 | 9 × 0.0234 | $0.0409 |
只算前缀就省约七成。会话越长、可复用前缀越长,差距越大。
Manus 的生产经验是缓存与非缓存相差 10 倍成本,并把 KV-cache 命中率称为生产 Agent 最重要的单一指标。交互版演算可以直接上手:
怎么把命中拿到手,两家 API 是两种哲学:
断点(breakpoint)由你在请求里显式标记,每请求最多 4 个;TTL 分 5 分钟(写 1.25x)与 1 小时(写 2x)两档,命中读 0.1x(部分新模型低至 0.025-0.05x);最低缓存量按 512-4096 分档;TTL 内每次命中即刷新。
无需标记,前缀匹配自动命中;写 1.25x、读 0.1x;最低 1024 token;默认 30 分钟;缓存的是 KV 张量而非文本。
显式断点要你自己决定什么值得缓存,换来精确控制与更细的 TTL 选项;自动缓存零心智负担,但你只能靠调整自己的前缀去迎合它。
工具端:让缓存一夜清零的日常操作
Claude Code 文档列了一份失效清单:换模型、改推理 effort、增删 MCP 工具、compact。任何一件都会让前缀变化,全段重算。
原因在请求的分层结构:系统提示 → 项目上下文 → 对话。任何一层的字节变化,都会让它之后所有层的 KV 作废。
健康度不用猜,账单字段直接给出:cache_read 与 cache_creation 的比值就是缓存健康度。
最微妙的是 compact:压缩本身会毁缓存,但可以让变化只发生在末尾。Claude Code 在 claude.dev 博客里给出的做法是缓存安全的 fork:复用父对话完全相同的前缀,仅在末尾追加压缩指令:
由此得到三条设计纪律,出自 L3 p.44:
- 稳定层在前。指令、工具、示例这些稳定前缀放在前面,变化状态追加在后面。
- 别扰动前缀。别在前缀埋时间戳,别随手重排 schema;一个字节的扰动就是一次全段重算。
- 持续度量。盯住三件事:cached tokens、TTFT、缓存驱逐。
服务器端:分页与共享树,谁在保管你的 KV
你的 KV 住在服务端显存里。vLLM 的 PagedAttention 发表在 SOSP 2023,解决的就是保管问题:KV 显存随请求动态变化,按最大长度预留式的浪费严重。
解法是借鉴操作系统分页:把 KV 切成块按需分配,近乎零浪费,吞吐提升 2-4x。
SGLang 的 RadixAttention 把复用往前推了一步:所有请求的前缀组织成一棵共享基数树,用 match /split/evict 管理复用。
调度器还做缓存感知路由,示意性地打分:score = 可复用前缀 − 队列惩罚。谁的请求能蹭到已缓存的共享前缀,就先服务谁。
你在 API 端看到的命中与驱逐,物理上就是这棵树上的 match 与 evict。
不自建部署,这套机制也值得懂。它解释了读价折扣的物理来源:省下的是真实的 prefill 计算。
也解释了为什么 TTL 到期、别人家的请求挤占显存时,你会莫名全价重算。缓存是被驱逐的,不是失效的。
与本讲的连接
讲次页经济账一节的三个结论,本篇都给出了机制解释:
- 前缀要稳定:稳定分层的前缀让命中最大化。
- 压缩会毁缓存:缓存安全的 compaction 把毁掉的代价压到末尾一段。
- 长上下文不豁免管理:吞吐与驱逐的存在说明窗口再大也只是把问题推后。
- 连着 2b:技能的渐进式披露是缓存友好的设计,目录常驻稳定层,按需的正文留给变化层。
本节论文与规范
本节资料
Claude Code 如何吃满提示缓存:请求按「系统提示→项目上下文→对话历史」分层组织,让稳定前缀全部落在缓存里;换模型、改 reasoning effort、增删 MCP 工具、compact 都会使缓存失效重算。健康度看 cache_read 与 cache_creation 的 token 比值。把上一份定价文档落到真实 agent 的用法里。
Anthropic 工程师复盘 compaction 的缓存安全实现:压缩天然破坏 prompt cache,他们的做法是尽量复用父对话前缀、只在末尾追加压缩指令,并给约 20k token 的摘要预留 buffer,让压缩后仍能命中缓存;再把缓存命中率当 uptime 级别的监控指标。压缩与缓存必须一起设计,这是最好的工程案例。
- Manus 上下文工程复盘(中文) 博客入门
Manus 团队的中文复盘,最出圈的判断是「KV-cache 命中率是生产 Agent 最重要的单一指标」——命中与否可差 10 倍成本。具体做法:保持前缀稳定、只追加不重写;工具定义只在头部出现一次(遮蔽而非移除);把文件系统当上下文用;todo.md 之类的软状态放到上下文末端。字字来自踩坑。
Anthropic 提示缓存的机制与定价:写入 5 分钟档 1.25 倍、1 小时档 2 倍,命中读取 0.1 倍(部分新模型低至 0.025-0.05 倍);缓存按 512-4096 token 分档起步;一条请求最多 4 个断点;TTL 内每次命中都会刷新。显式断点设计让「什么值得缓存」成为开发者的显式决策,而不是平台的黑盒。
OpenAI 的对照设计:缓存全自动,前缀达到最低 1024 token 即生效,GPT-5.6 及以后写入 1.25 倍、命中读取 0.1 倍,默认保留约 30 分钟;底层缓存的是注意力 KV 张量而非文本本身。省心但不可控,与 Anthropic 的显式断点哲学互为镜像,对照着读最有味道。
服务端视角的 KV cache 经济账:注意力 KV 缓存占显存可达 30% 以上,连续存储下的内部外部碎片造成大量浪费;PagedAttention 借操作系统分页思想把 KV 切成块按需映射,浪费接近零,吞吐提升 2-4 倍。与 API 侧提示缓存合起来看,构成「同一份 KV、两端省钱」的完整图景。
AI 生成 · 仅供参考,与课程方无关。选中正文里的任何一段也能直接问我(解释一下 / 举个例子)。
本详解以 CMU 11-768 AI Agents (Fall 2026) 课程大纲为参考框架独立撰写,AI 辅助起草、人工抽审。 涉及的官方课件、论文与课程材料版权归原所有方,讲义为站内镜像、其余外链原文出处; 观点与文字(除标注引用外)为作者原创。