Prompt Cache 里存的 value 到底是什么

Transformer 推理:Prefill 与 Decode,前后相连的两个阶段
Autoregressive · 自回归 · 每生成一个字,都接回输入再生成下一个
Prefill 预填充
整段跑一次前向
Decode 解码
一次写一个字
Transformer
Transformer
Transformer
Transformer
喜欢
Rap
还有
篮球
music
你发来的提示词
模型逐字生成的回答
生成下一个token时,前面的词并非同等重要 —— Attention 注意力机制算出此刻谁最相关
举个例子:模型正在预测「?」位置的下一个token —— 看注意力回头落在哪些词上
喜欢
Rap
还有
篮球
计算过程:每个词投影成 Q、K、V,代入 Attention 公式
每个 token
Query
查询 · 我想找什么
Key
标签 · 我能提供什么
Value
内容 · 我携带的信息
\[\text{softmax}\!\left(\frac{\textcolor{#a78bfa}{Q}\textcolor{#38bdf8}{K^{\top}}}{\sqrt{d_k}}\right)\textcolor{#ff8a3d}{V}\]
假设提示词有 n 个 token、每个 token 向量 d 维 —— Q、K、V 各是一个 n×d 矩阵
Prefill:整段提示词进行全量计算 —— Q 满 n 行、Kᵀ 满 n 列、V 满 n 行
\[\text{Attention}(\textcolor{#a78bfa}{Q},\textcolor{#38bdf8}{K},\textcolor{#ff8a3d}{V})=\text{softmax}\!\left(\frac{\textcolor{#a78bfa}{Q}\textcolor{#38bdf8}{K^{\top}}}{\sqrt{d_k}}\right)\textcolor{#ff8a3d}{V}\]
Q
n × d
×
K
d × n
=
softmax(QK/√d)
n × n
×
V
n × d
=
Output
n × d
n 越大,中间那张 n×n 权重表涨得越猛 —— Prefill 计算量主要烧在这一步,吃的是 GPU 算力
Decode:每生成一个新字 —— Q 只 1 行、Kᵀ 末列加 1、V 末行加 1
Q
1 × d
×
K
d × (n+1)
=
softmax(QK/√d)
1 × (n+1)
×
V
(n+1) × d
=
Output
1 × d
每生成一个字,K、V 各多存一份这个新字的向量;前面那些已经算过的,每一步都要被重新用一遍 —— 这就是 KV Cache 要解的问题。
加入 KV Cache 后:Prefill 一次性写入,Decode 边读边追加
Prefill 阶段
prompt
×
wQ
wK
wV
=
=
=
\(\text{softmax}\!\left(\frac{\textcolor{#a78bfa}{Q}\textcolor{#38bdf8}{K^{\top}}}{\sqrt{d_k}}\right)\textcolor{#ff8a3d}{V}\)
→ output
KV Cache
cached K (Kᵀ)
cached V
loop
Decode 阶段
new
×
wQ
wK
wV
=
=
=
q
k_new
v_new
\(\text{softmax}\!\left(\frac{\textcolor{#a78bfa}{q}\textcolor{#38bdf8}{K^{\top}}}{\sqrt{d_k}}\right)\textcolor{#ff8a3d}{V}\)
→ output
KV Cache 到底存了什么
Q
只在生成它的那一刻用一次
K
V
之后每生成一个新字都要翻出来再用
把这批不变的 K 和 V 存下来,就是 KV Cache
单步复杂度 O(N2) O(N) 每步快 N 倍
N = 当前上下文长度(提示词 + 已生成)
prompt cache:前缀和上次一样,直接搬出存好的 K/V
两次请求共享前缀;第二次请求跳过这段 Prefill 计算
请求 1 · 冷启动 · Prefill 全量计算所有 token 的 K/V
偶像 练习生 蔡徐坤cache_control 一段 rap
写入 KV Cache
KV Cache · 按前缀哈希存储
缓存命中查找的就是这一份(5 个前缀 token 的 K / V 张量)
cached K (Kᵀ)
d × 5
cached V
5 × d
请求 2 · 前缀命中 · 直接搬出 K/V
搬出缓存 · 跳过 Prefill
偶像 练习生 蔡徐坤cache_control 一场 篮球
命中缓存 直接给你一个答案。省掉的是 Prefill 那段 attention 计算,模型该生成还得生成 —— 这就是命中的 token 便宜得多的原因。
KV Cache vs Prompt Cache · 核心对比
关键维度
KV Cache · 键值缓存
Prompt Cache · 提示词缓存
本质定义
存储当前对话中已生成 tokenKV 矩阵的显存技术
存储多轮对话间完全相同 / 高频复用的前置文本(如 system prompt) 的 KV 缓存技术
核心目的
消除 Decode 阶段的重复投影计算
消除 Prefill 阶段静态长文本的重复大表计算
复杂度优化
Decode 单步复杂度从 O(N2) 降到 O(N) · 平方级 → 线性级
命中部分 Prefill 计算量从 O(N2) 抹平到 O(1) · 直接跳过
生命周期
动态局部变量: 单次对话内实时追加 (Append), 对话结束即销毁
静态半持久变量: 跨请求 / 多用户长期锁在显存, 命中即复用, 按 LRU 策略过期
一句话: KV Cache 省的是同一次对话内 decode 的重复算; Prompt Cache 省的是跨请求 prefill 的重复算