背景与目标
LLM 缓存机制 技术研究
LLM 缓存 Token 机制研究背景、核心问题定义及研究目标
问题背景
在使用 DeepSeek、Kimi、Qwen、GLM 等大语言模型 API 时,用户经常注意到一个”缓存 token”的特性。这个特性声称可以显著降低 API 调用成本(最高可达 90%)并减少响应延迟(最高可达 85%)。然而,关于这个特性的本质存在诸多疑问:
- 技术归属问题:缓存 token 是模型本身的能力,还是模型供应商在工程层面的实现?
- 实现机制问题:既然是自然语言交流,如何实现对非确定性内容的缓存?传统的缓存机制依赖于确定性的 key,但自然语言输入本质上是变化的。
- 优化策略问题:在日常使用中,如何避免缓存失效?为什么系统提示词中加入时间戳就容易导致缓存失效?
核心问题定义
问题一:缓存 Token 的本质归属
缓存 token 机制涉及两个层面的技术栈:
模型层能力:
- Transformer 架构中的 KV Cache(Key-Value Cache)是模型推理的固有机制
- 在自回归生成过程中,模型需要为每个 token 计算 Key 和 Value 向量
- 这些计算结果可以被复用以避免重复计算
供应商工程层:
- 跨请求级别的缓存(Cross-request Caching)
- 分布式存储系统(如 Kimi 的 Mooncake)
- 磁盘级缓存(如 DeepSeek 的 Context Caching on Disk)
- 前缀匹配算法和路由策略
问题二:自然语言输入的缓存实现
传统缓存依赖于确定性 key,但 LLM 缓存采用不同的策略:
前缀匹配(Prefix Matching):
- 不是对整个输入进行哈希,而是对输入的前缀部分进行匹配
- 要求前缀 token 完全一致才能命中缓存
- 这是最严格的匹配方式,但也最可靠
语义缓存(Semantic Caching)(部分供应商支持):
- 使用嵌入向量(Embedding)计算语义相似度
- 允许一定程度的语义变化但仍命中缓存
- 实现更复杂,准确率相对较低
问题三:缓存失效的常见原因
根据研究,以下情况容易导致缓存失效:
- 动态内容前置:将时间戳、UUID、随机数等动态内容放在提示词前面
- 前缀不匹配:即使是微小的变化(如多了一个空格)也会导致整个前缀失效
- 缓存过期:不同供应商的缓存 TTL(生存时间)不同(5分钟到24小时不等)
- 请求频率过低:某些供应商需要最低请求频率(如每分钟15次)才能触发缓存路由
研究目标
本次研究旨在:
- 揭示技术本质:明确区分模型级 KV Cache 与供应商级 Prompt Caching 的差异
- 解析实现机制:深入理解前缀匹配、KV Cache 存储、分布式缓存架构等技术细节
- 提供优化指南:给出避免缓存失效的最佳实践和代码示例
- 对比供应商差异:分析 DeepSeek、Kimi、Qwen、GLM 等主流供应商的缓存实现差异
研究范围
包含内容:
- Transformer 架构中的 KV Cache 机制
- 各主流供应商的 Prompt Caching 实现
- 前缀匹配算法的具体工作原理
- 缓存优化策略和最佳实践
- 成本与性能影响分析
不包含内容:
- 响应级缓存(Response Caching)
- 模型微调(Fine-tuning)
- 语义缓存的完整实现细节(作为补充概念提及)
预期产出
- 技术原理的深度解析文档
- 各供应商实现对比分析
- 可复用的代码示例和配置指南
- 风险与注意事项清单
参考资料
- DeepSeek Context Caching Guide - DeepSeek 上下文缓存实现详解
- Prompt caching | OpenAI API - OpenAI 官方 Prompt Caching 文档
- Context Caching | DeepSeek API Docs - DeepSeek API 缓存技术文档
- Understanding Prompt Caching in Large Language Model APIs - LLM Prompt Caching 技术原理
- Mooncake: A KVCache-centric Disaggregated Architecture for LLM Serving - Kimi 的 Mooncake 架构论文