DeepSeek KV Cache — 为什么缓存命中率能到 98%

MLA 压缩架构 · 磁盘持久缓存 · 自动前缀检测 · 命中 10 倍降价

01 核心问题:为什么 DeepSeek 的缓存跟别人不一样

别人(OpenAI / Anthropic)

KV Cache 存在 GPU 显存或 CPU 内存中。显存太贵,存不了多少。高并发一来,旧的立刻被挤出。5-10 分钟后缓存热数据就没了。Anthropic 还要你手动标记 cache_control,标记错了白花钱。

DeepSeek

KV Cache 可以存到磁盘上。怎么做到?先把 KV Cache 压缩 5-13 倍(MLA),压缩完只有原来的 1/10 不到,磁盘读写完全扛得住。不依赖显存,不会因为并发被挤出。缓存有效期从别人家的 5 分钟变成了几小时到几天

02 MLA(Multi-head Latent Attention)是怎么压缩的

标准 MHA(每个 Token 存 K/V 完整矩阵) K₀ K₁ K₂ K₃ ... K₁₂₇ V₀ V₁ V₂ V₃ ... V₁₂₇ 128 头 × 每头维度 × 序列长度 = 大量显存 只能存 GPU 显存 / CPU 内存 高并发 → 挤出 → 缓存失效 DeepSeek MLA(压缩成潜变量) c (压缩潜变量,~1/10 大小) 查询时:c → 还原 K/V → Attention 压缩比 5-13× 缩小到 1/10 → 磁盘可存储 持久化数小时到数天 不依赖显存 → 高并发不失效 Transformer 推理的 KV Cache 存储方式对比

MLA 的核心创新

标准多头注意力(MHA)每个 token 为每个注意力头存储完整的 Key 和 Value 向量。MLA 引入一个低维潜变量 c,将多个头的 K/V 信息压缩到这个潜变量中。查询时从 c 重建 K 和 V。压缩比由潜变量维度控制——DeepSeek V3 的潜变量维度约为原始 K/V 联合维度的 1/10 到 1/5。

关键工程含义:一个 100K token 会话的 KV Cache,标准 Transformer 可能占 40GB 显存——MLA 压缩后仅 4-8GB,可以直接写到 NVMe SSD 上。这是 DeepSeek 全球首家在 API 层面实现大规模磁盘缓存的技术基础。

03 三层自动缓存机制

① 请求级自动落盘

每次请求的用户输入结束位置模型输出结束位置各产生一个缓存前缀单元。不需要你手动标记 cache_control——全自动。

② 公共前缀自动检测

系统持续监测多次请求间的重复前缀。一旦检测到多个请求共享同一个前缀(比如同一个 system prompt),自动将该前缀落盘为独立缓存单元。

③ 长序列固定间隔截取

超长输入或输出(> 64K tokens)按固定 token 间隔截取缓存单元。确保长上下文请求也能部分命中缓存,而不是全扔。

④ LRU-K 淘汰策略

不是简单的最近最少用。采用 LRU-K(K=2),额外引入访问热度衰减因子 α=0.95。一个前缀被访问两次以上才进入「高频池」——单次访问的不会挤掉多次访问的。

04 缓存命中规则(什么情况会命中)

请求 A System Prompt Tool Defs User: A Output: A ↓ 落盘 ↓ 请求 B(新请求) ✅ 命中缓存 (System Prompt) ✅ 命中缓存 (Tool Defs) ❌ 未命中 (User: B 不同) Output: B (新生成) 命中长度占总输入 60% 几小时后 命中规则:前缀完全匹配才命中 System Prompt + Tool Defs 不改变 → 每次都命中 用户消息变了 → 只从变化点开始重新计算
一句话:保持最长稳定前缀不变(System Prompt + Tool Definitions + 固定指令),只把变化的部分(用户消息)放在最后。前面的所有固定 token 都会命中缓存,只需为最后的用户消息付费。

四个实践原则

原则怎么做反面例子
固定 System Prompt移出所有动态内容(时间戳、用户ID)"今天是 2026-06-13" 插在 System Prompt 开头 → 每一天前缀不同,永不命中
只追加,不修改新消息放在对话历史末尾在中间插入一条纠正 → 后面的所有内容缓存失效
工具定义稳定Tool JSON 定义 hardcode,不要每次动态生成用 LLM 动态写 tool schema → 每次不同
JSON 序列化确定json.dumps(data, sort_keys=True)Python dict 的 key 顺序随机 → 相同的语义,不同的字节 → 不命中

05 与其他厂商对比

DeepSeekOpenAIAnthropic
缓存位置磁盘(NVMe SSD)GPU 显存 / SSDGPU 显存
缓存有效期数小时 — 数天5-10 分钟5 分钟
是否自动全自动 ✅全自动 ✅需手动标记 ❌
命中价格折扣10 倍~2 倍~10 倍
缓存写入收费不收费 ✅不收费 ✅收费 ❌
压缩技术MLA(5-13×)Paged Attention专有实现

06 实战基准数据

极限命中率测试(知乎博主,2 万次请求)

模型缓存命中率备注
DeepSeek100%12 小时后仍 100%
MiniMax90%(低峰)高峰期降至 70%
Kimi中等
GLM(智谱)2min:80%→15min:0%缓存快速失效
OpenAI中等

不同场景命中率预期

场景预期命中率
Web 开发(高重复上下文)95%+
多轮对话(长 session)80-95%
固定仓库代码问答90%+
定时脚本(cron job)98%+
每次请求完全不同< 10%

极端案例:98.07% 命中率

一位开发者使用 Claude developer mode 对接 DeepSeek API 做 Web 开发。单日消耗约 8900 万 tokens,总费用仅 ¥4.39(约 $0.64)。缓存命中率 98.07%。如果换成无缓存的 API 调用,这笔账单会是 ¥40+。

07 对定时任务(Cron Job)的意义

为什么你的 cron 是 DeepSeek 缓存的完美场景

  • 同一个 SKILL.md 每次读取 — System Prompt 里的 skill 定义完全固定 → 永远命中
  • 同一个 CLAUDE.md 约束 — 项目规则不变 → 前缀缓存
  • 串行执行 — 11 个 cron 不是同时跑的,不存在并发挤出缓存
  • 固定间隔 — 每 24 小时一次,间隔远小于缓存有效期(数天)
  • 相似任务结构 — 编译、日报、蒸馏的 input 结构高度一致
估算:如果把你 11 个 cron 从 Claude API 切到 DeepSeek API,且 skill 定义不变:每天约 50 万 token 的 skill + system prompt 前缀 → 缓存命中约 80-95%。实际 API 成本可能降到现在的 1/5 到 1/10。唯一需要验证的是 Qwen3.7-Max/Plus 在编译质量上是否接近 Opus 4.6——这个需要 A/B 测试。
具体切换方案需单独评估——不同 skill 的质量要求不同,不是一刀切。