你以为缓存的是“问答对”?不,缓存的是“序列前缀”。
你以为上一轮的答案会被缓存?不,每轮新增成本恰恰来自上一轮的答案和本轮的问题。

一、30秒速览:核心结论

问题 答案
KV缓存按什么匹配? 输入序列的前缀(token级别),不是按“问答对”
第N轮命中哪部分? 第N-1轮请求时的完整输入
第N轮新增哪部分? 第N-1轮的AI回答 + 第N轮的用户问题
上一轮的回答会被下一轮命中吗? 不会(作为前缀命中)
如何优化命中率? 不变前置,变化后置
成本能降多少? 多轮对话从O(n²)降到O(n),节省80%+

二、核心机制:序列前缀匹配

2.1 KV缓存是什么?

KV缓存是Transformer架构中多头自注意力机制的Key矩阵和Value矩阵的缓存。大模型生成回答时采用自回归方式(一个字一个字蹦),每生成一个新token都要“回顾”之前所有的token。KV缓存把已经算好的中间结果存下来,避免重复计算。

2.2 关键认知转变

错误认知 ❌ 正确认知 ✅
按“问答对”缓存 按“输入序列前缀”缓存
语义相似就能命中 必须前缀token完全一致才能命中
上一轮的答案会被缓存 上一轮的答案不会作为前缀命中

2.3 为什么是“前缀”而不是“问答对”?

模型看到的只是一个扁平的token序列,没有任何“问题”和“回答”的边界标记。它只认一件事:当前输入的开头部分,和之前哪个请求的开头一模一样


三、用表格看懂:每轮命中什么、新增什么

3.1 符号说明

符号 含义
Qn 第n轮的用户问题
An 第n轮的AI回答

3.2 完整命中规律表

当前轮次 输入序列组成 命中的缓存(=上一轮的输入) 未命中/新增部分
第1轮 Q1 无(首次请求) Q1
第2轮 Q1 + A1 + Q2 Q1(第1轮输入) A1 + Q2
第3轮 Q1 + A1 + Q2 + A2 + Q3 Q1 + A1 + Q2(第2轮输入) A2 + Q3
第4轮 Q1 + A1 + Q2 + A2 + Q3 + A3 + Q4 Q1 + A1 + Q2 + A2 + Q3(第3轮输入) A3 + Q4
第N轮 前N-1轮完整 + Qn 前N-2轮完整 + Q_{n-1}(第N-1轮输入) A_{n-1} + Qn

3.3 规律总结

命中的 = 第N-1轮请求时的输入(包含到第N-1轮的用户问题为止,不包含第N-1轮的AI回答)

未命中的 = 第N-1轮的AI回答 + 第N轮的用户问题

3.4 成本含义

对比维度 无缓存 有KV缓存
第2轮成本 全部重新算 只算A1+Q2
第10轮成本 全部历史(巨大) 只算A9+Q10(很小)
成本增长 O(n²) O(n)

核心洞察:每轮新增成本固定来自两部分——上一轮的AI回答 + 本轮的用户问题。更早的历史全部命中缓存,不需要重复计算。


四、常见坑点与误区

4.1 误区一:以为语义相似就能命中

错误做法 ❌ 为什么错
“用户问的问题意思差不多就行” 缓存要求token级完全一致,不是语义相似

4.2 误区二:在固定内容里混入动态数据

错误做法 ❌ 后果
f"当前时间:{datetime.now()}\n系统:你是一个助手" 每次请求时间不同,前缀变化,缓存全部失效

4.3 误区三:误以为上一轮的回答会被缓存

错误认知 ❌ 正确认知 ✅
“第2轮的回答A2会被第3轮复用” A2在第3轮输入中出现在中间位置,不是前缀,不会命中

4.4 坑点速查表

坑点 现象 解决方案
动态内容在前缀中 命中率骤降 将所有动态内容移至最后
多轮对话成本仍偏高 命中率只有40%左右 接受这是正常现象(每轮都要算上一轮的A)
不同用户不共享缓存 首用户成本高 预热策略:提前发请求建立缓存

五、工程优化:如何提高命中率

5.1 核心原则:不变前置,变化后置

原则 做法 效果
不变前置 把System Prompt、固定指令放在最前面 所有请求共享缓存
变化后置 把用户问题、时间戳放在最后面 不影响前缀缓存
避免动态混入 不要让时间戳出现在固定内容之前 否则缓存全部失效

5.2 代码对比

# ❌ 错误:动态内容在前缀中
prompt = f"时间:{datetime.now()}\n系统:你是一个助手\n用户:{query}"

# ✅ 正确:动态内容后置
prompt = f"系统:你是一个助手\n用户:{query}\n时间:{datetime.now()}"

5.3 多用户共享缓存策略

对于10万用户的系统,所有用户的System Prompt相同:

用户1请求: System(3000) + Query1 → 缓存System
用户2请求: System(3000) + Query2 → System命中缓存 ✅
...
用户N请求: System(3000) + QueryN → System全部命中 ✅

六、验证方法:如何知道缓存命中了?

6.1 查看API返回的usage字段

{
  "usage": {
    "prompt_tokens": 1500,
    "prompt_cache_hit_tokens": 1200,
    "prompt_cache_miss_tokens": 300,
    "completion_tokens": 200
  }
}
字段 含义 计费
prompt_cache_hit_tokens 命中缓存的token数 原价10%-20%
prompt_cache_miss_tokens 未命中的token数 原价

6.2 命中率诊断表

观察现象 可能原因 解决方案
命中率突然从90%降到10% 动态内容混入前缀 检查是否有时间戳等动态内容
首轮命中率低 正常(无历史缓存) 关注第2轮及之后
命中率一直<10% 输入结构问题 重新设计prompt模板

七、LangGraph的thread_id与KV缓存的关系

机制 所属层次 作用 是否手动配置
thread_id + MemorySaver 应用层 保存对话历史,让Agent记住用户说了什么 需要
KV缓存 模型层 避免重复计算相同前缀的KV矩阵 API自动处理

两者配合

  • thread_id让Agent能把完整历史传给模型(业务正确性)

  • KV缓存让传完整历史这件事不贵(经济可行性)


八、重点面试题(附答案解析)

面试题一:基础概念

题目:API返回中有prompt_cache_hit_tokensprompt_cache_miss_tokens,请解释含义和缓存命中的前提条件。

参考答案

prompt_cache_hit_tokens表示命中缓存的token数(按原价10%-20%计费),prompt_cache_miss_tokens表示未命中的token数(按原价计费)。

缓存命中的核心前提是前缀完全匹配——两次请求的输入token序列开头必须一模一样。不是语义相似,而是字符级、token级完全相同。


面试题二:场景分析

题目:多轮对话第5轮,输入包含System Prompt(3000) + 4轮历史(2000) + 新问题(100)。命中多少token?

参考答案

设第4轮输入 = System(3000) + 前3轮历史(1500) + Q4(50) = 4550 token。

第5轮命中的是第4轮的完整输入,即4550 token

未命中的是:A4(第4轮AI回答,约200 token)+ Q5(本轮新问题,100 token)= 300 token。

命中率 = 4550 / (4550+300) ≈ 93.8%。

注意:这个例子假设有会话缓存。无会话缓存时,命中率约为40%,因为历史中的AI回答需要重新算。


面试题三:系统设计(进阶)

题目:10万用户的医疗咨询系统,System Prompt固定4000 token,每位用户对话10轮。如何最大化缓存命中率?预热策略怎么做?

参考答案

优化方案

  1. 将4000 token System Prompt放在输入序列最前面

  2. 所有用户的请求以此相同前缀开头

  3. 第1个用户请求后,System Prompt被缓存

  4. 后续9.9999万用户的System Prompt全部命中缓存

预热策略

  • 在低峰期(如凌晨),用空查询或测试查询请求一次API

  • 目的:让System Prompt的KV缓存提前建立

  • 效果:高峰期首位真实用户的成本从4000 token降到0

成本对比

场景 无预热 有预热
第1位用户 支付4000 token 0 token(命中预热缓存)
第2-10万用户 0 token(命中第1位用户的缓存) 0 token
首用户成本节省 - 4000 token

九、一句话总结

KV缓存不关心“问题”还是“回答”,只关心“前缀”是否一致。每轮新增成本 = 上一轮的AI回答 + 本轮的用户问题。


十、速记卡片(面试前复习)

要记住 一句话
命中规则 前缀完全匹配
第N轮命中 前N-2轮问答 + 第N-1轮的问题
第N轮新增 第N-1轮的回答 + 第N轮的问题
优化原则 不变前置,变化后置
验证方法 prompt_cache_hit_tokens
最大坑点 动态内容混入前缀

本文内容基于与ChatGPT的深度对话整理,涵盖了KV缓存的核心机制、常见误区、工程优化和面试题。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐