0. 先看结论

LLM 使用 Q/K/V,不是因为三个字母神秘,而是因为 attention 本质上在做一次“可微的内容检索”:

1
2
3
Query 负责提问
Key 负责匹配
Value 负责提供内容

放进 Transformer 里就是:

Q/K/V 把一件事拆成两步:

  1. 先决定看哪里:用 $QK^T$ 算当前位置和其他位置的匹配程度。
  2. 再决定拿什么:用匹配权重对 $V$ 做加权求和。

如果没有 Q/K/V 的分工,模型只能用同一套表示同时承担“匹配”和“传递信息”两个角色,表达能力会弱很多。

1
2
3
4
5
6
7
8
9
flowchart LR
A["当前 token"] --> B["Q 提问"]
C["上下文 token"] --> D["K 被匹配"]
C --> E["V 提供内容"]
B --> F["QK 算相关性"]
D --> F
F --> G["softmax 权重"]
G --> H["加权汇总 V"]
E --> H

1. Q/K/V 的一句话解释

符号 全称 做什么 类比
Q Query 当前 token 想找什么 搜索词
K Key 每个 token 用什么被匹配 索引
V Value 匹配后真正取走的信息 内容

例子:

1
小明把书放进书包,因为它太重了。

模型处理“它”时,需要判断“它”指什么。

候选位置 token K 提供的索引 V 提供的内容
1 小明 人名、主体 人物相关信息
2 物体、可重 书的语义信息
3 书包 容器、装东西 书包的语义信息
4 当前 query 当前要更新的位置

“它”的 Q 会更匹配“书”的 K,于是“书”的 V 被分到更高权重。


2. 从固定向量到 attention

早期 encoder-decoder 模型常把整句压成一个固定长度向量,再交给 decoder 生成输出。问题很直接:句子越长,信息越容易挤在一起。

Bahdanau attention 的关键改变是:decoder 每生成一步,都可以回头看 encoder 的不同位置。它不再依赖一个固定向量装下整句。

阶段 做法 局限
固定向量 encoder-decoder 整句压成一个向量 长句信息容易丢
Bahdanau attention decoder 动态看 source 位置 还依赖 RNN
Luong attention 系统比较 global/local attention attention 形式更清晰
Transformer 完全用 self-attention 建模序列 并行化好,成为 LLM 主线

这条历史线解释了 Q/K/V 的需求:模型需要一种机制,能在每一步动态决定“该看哪个位置”。


3. Q/K/V 的历史来源

Q/K/V 的表述在 Transformer 原论文中被清晰固定下来。论文写法是:attention 可以看成把一个 query 和一组 key-value pairs 映射成一个输出。

这个说法不是凭空来的,它和三类思想有关。

3.1 信息检索

在搜索系统里,你输入 query,系统拿它去匹配文档索引,然后返回文档内容。

搜索系统 Attention
搜索词 Query
文档索引 Key
文档内容 Value
检索相关性 attention score
返回结果 加权后的 value

Attention 把这个过程变成了可微分的神经网络操作。

3.2 记忆网络

Memory Networks 把模型看成能读写外部记忆的系统。记忆里可以有地址,也可以有内容。后来的 key-value memory 思想,把“用什么匹配”和“取什么内容”分开。

这和 Q/K/V 很接近:

1
2
3
query -> 找 memory slot
key -> memory slot 的地址或索引
value -> memory slot 的内容

3.3 神经机器翻译里的对齐

Bahdanau 和 Luong 的 attention 还没有今天这么明确的 Q/K/V 术语,但已经有了同样的结构:

早期 NMT attention Transformer Q/K/V
decoder 当前状态 Query
encoder hidden states Key/Value 的来源
alignment score Q 与 K 的匹配分数
context vector 加权后的 V

Transformer 把这套机制矩阵化、并行化,并让同一个序列内部也能互相注意。


4. 为什么不直接用一个向量

假设每个 token 只有一个向量 $x$,attention 直接用:

这样当然也能跑,但它把三件事绑死了:

  1. 用 $x$ 去匹配别人。
  2. 让别人用 $x$ 匹配自己。
  3. 被选中后,仍然把 $x$ 当内容传出去。

Q/K/V 的做法是:

同一个 token 可以在三个空间里扮演不同角色。

角色 如果共用 $x$ 使用 Q/K/V
主动查找 只能用原始表示查找 用 $W_Q$ 学“要找什么”
被别人匹配 只能用原始表示当索引 用 $W_K$ 学“如何被找”
输出内容 只能输出原始表示 用 $W_V$ 学“该传什么”

这就是 Q/K/V 的核心收益:匹配空间和内容空间可以分开学


5. 数学上 Q/K/V 做了什么

5.1 三个线性投影

设输入序列表示为:

其中 $L$ 是序列长度,$d_{\text{model}}$ 是模型维度。

Transformer 学三组参数:

得到:

这不是手写规则,而是训练出来的投影。

5.2 匹配分数

第 $i$ 个 token 看第 $j$ 个 token 的分数是:

其中:

符号 含义
$q_i$ 第 $i$ 个位置的 query
$k_j$ 第 $j$ 个位置的 key
$d_k$ query/key 维度
$\sqrt{d_k}$ 缩放因子,避免点积过大

所有位置一起算,就是:

5.3 权重和输出

对每一行做 softmax:

输出:

展开到单个位置:

这句话很重要:attention 输出不是“选一个 token”,而是按权重混合多个 value。


6. Q/K/V 蕴含的数学基础

6.1 内积相似度

Q 和 K 的点积衡量两个向量的匹配程度:

点积越大,softmax 后权重越高。

6.2 双线性打分

把 $q_i=x_iW_Q$、$k_j=x_jW_K$ 代入点积:

这说明 attention 分数不是简单比较两个原始 token 向量,而是在学习一个双线性匹配函数。

其中:

可以看成模型学到的“匹配度量”。不同 head 有不同的 $W_Q,W_K$,也就能学不同的关系。

6.3 概率归一化

softmax 把分数变成权重:

每一行权重加起来等于 1:

这让输出成为一组 value 的加权平均。

6.4 可微检索

普通检索通常是硬选择:

1
找到最匹配的一条,然后返回

Attention 是软选择:

1
所有位置都给一点权重,相关位置权重大

这让模型可以通过反向传播学习:

学什么 对应参数
当前该问什么 $W_Q$
每个 token 如何被匹配 $W_K$
被选中后传什么内容 $W_V$

7. 自注意力和交叉注意力里的 Q/K/V

7.1 Self-Attention

Self-attention 里,Q/K/V 都来自同一个序列:

这让一句话内部的 token 可以互相看。

位置 来源
Q 当前序列
K 当前序列
V 当前序列

LLM 的 decoder block 主要使用 causal self-attention,也就是只能看当前位置及之前的 token。

7.2 Cross-Attention

Encoder-decoder Transformer 里还有 cross-attention。

位置 来源
Q decoder 当前状态
K encoder 输出
V encoder 输出

这和早期机器翻译 attention 更接近:decoder 用 Q 去查 encoder 产生的 K/V。


8. Multi-Head 为什么要多套 Q/K/V

一个 head 只能学一种匹配方式。多个 head 可以并行学习不同关系。

head 可能关注的关系 例子
语法依赖 主谓、宾语、修饰关系
指代关系 “它”指向哪个名词
局部邻近 前一个 token、短语内部
长距离依赖 跨句引用、代码括号匹配
格式结构 Markdown 标题、列表、代码块

Multi-head attention 的公式:

每个 head 都有自己的 Q/K/V 投影。不同 head 学到的“检索方式”可以不同。

1
2
3
4
5
6
7
8
9
10
flowchart LR
A["输入 X"] --> B["Head 1 的 Q K V"]
A --> C["Head 2 的 Q K V"]
A --> D["Head n 的 Q K V"]
B --> E["不同关系 1"]
C --> F["不同关系 2"]
D --> G["不同关系 n"]
E --> H["拼接后输出"]
F --> H
G --> H

9. Q/K/V 和 KV Cache

LLM 推理时,历史 token 的 K 和 V 不会变。

生成第 $t$ 个 token 时:

张量 是否需要重新算 原因
当前 Q 需要 新 token 要发起查询
历史 K 不需要 历史 token 的索引不变
历史 V 不需要 历史 token 的内容不变
当前 K/V 需要 新 token 要加入缓存

所以推理会缓存历史 K/V:

1
2
3
4
5
第 t 步:
计算当前 token 的 Q/K/V
用当前 Q 匹配历史 K
用权重汇总历史 V
把当前 K/V 追加到 KV cache

这也解释了为什么后来的注意力优化经常盯着 K/V:长上下文推理时,KV cache 会占大量显存。


10. 为什么当前探索多围绕 K/V

下面这些方向按截至 2026-06 的公开论文梳理。它们并不是都已经成为主流标准,但能看出研究重点:尽量保留 Q/K/V 的内容检索能力,同时降低长上下文的计算和缓存成本。

标准 multi-head attention 中,每个 head 都有自己的 K/V。推理时要为每一层、每个 head、每个历史 token 存 K/V。

KV cache 大小近似正比于:

1
层数 * 序列长度 * KV head 数 * head 维度 * 2

这里的 2 分别是 K 和 V。

当上下文从 4K 变成 128K,KV cache 会线性增长。于是新的注意力架构大多在问:

1
2
3
4
能不能少存一点 K/V?
能不能少读一点 K/V?
能不能只看一部分 K/V?
能不能把 K/V 压缩成更小的状态?

11. 当前探索一:MQA

Multi-Query Attention(MQA)保留多个 Q head,但所有 head 共享一组 K/V。

结构 Q heads KV heads 结果
MHA 多个 多个 质量强,KV cache 大
MQA 多个 1 组 KV cache 小,推理快

直观理解:

1
2
多个 query 视角还在
但大家共用同一套 key/value 记忆

MQA 的目标是降低推理时读取 K/V 的内存带宽。Shazeer 2019 的论文标题“One Write-Head is All You Need”说的就是这个方向。

代价是表达能力可能下降,因为所有 query heads 共用同一个 K/V 空间。


12. 当前探索二:GQA

Grouped-Query Attention(GQA)介于 MHA 和 MQA 之间。

它把 query heads 分组,每组共享一组 K/V。

结构 KV 共享方式 取舍
MHA 每个 head 独立 K/V 表达能力强,缓存大
MQA 所有 head 共享一组 K/V 缓存小,可能降质
GQA 一组 query heads 共享一组 K/V 折中

GQA 论文还提出把已有 MHA checkpoint 转成 GQA/MQA,并用少量继续训练适配。论文报告中,GQA 可以接近 MHA 的质量,同时接近 MQA 的速度。


13. 当前探索三:MLA

Multi-head Latent Attention(MLA)是 DeepSeek-V2 提出的注意力结构。它的目标仍然是减少 KV cache,但思路不只是“少几个 KV head”,而是把 K/V 压到一个更小的 latent 表示里。

简化理解:

1
2
标准 MHA:缓存每层每个 token 的完整 K/V
MLA:缓存压缩后的 latent,再生成需要的 K/V 信息
方法 怎么省 KV cache
MQA 所有 heads 共享 K/V
GQA 分组共享 K/V
MLA 存更小的 latent 表示

MLA 的意义在于:它把“Q/K/V 是否必须完整显式存储”这个问题推进了一步。现代长上下文模型越来越重视这类结构。


14. 当前探索四:稀疏注意力

标准 attention 每个位置看所有位置,复杂度是 $O(L^2)$。

稀疏注意力改成只看一部分位置:

策略 看哪些 token
local window 附近窗口
global tokens 少数全局位置
block sparse 按块选择
dynamic sparse 根据内容动态选择

Native Sparse Attention(NSA)代表了一个新方向:稀疏模式不仅要数学上省,还要和硬件计算方式对齐,并且最好能端到端训练。

在 Q/K/V 视角下,稀疏注意力不是取消 Q/K/V,而是减少每个 Q 需要匹配的 K/V 数量。


15. 当前探索五:线性注意力和替代架构

线性注意力试图把:

改写成能按序列长度线性计算的形式。常见思路是用核函数或递推状态,把历史 K/V 压缩到一个状态里。

粗略写法:

这仍然保留了 Q/K/V 的影子:

角色 线性注意力里的对应
Q 查询当前状态
K 决定如何写入状态
V 写入状态的内容

Mamba 这类 SSM 则走得更远:它不再使用标准 Q/K/V attention,而是用选择性状态空间模型处理序列。它说明当前研究并不是只在改 Q/K/V,也在探索 attention 之外的序列建模方式。

Kimi Linear 等较新的线性/混合注意力模型,则尝试在效率和检索能力之间重新折中。它们不是简单否定 Q/K/V,而是在问:哪些层、哪些场景还需要完整 attention,哪些地方可以用更便宜的结构替代。

2026 年的 Dynamic Linear Attention(DLA)继续沿着“压缩历史记忆”这个方向走。它关注的问题是:固定分块或固定合并策略会把重要 token 过早压进粗粒度状态里。DLA 尝试根据信息变化动态决定什么时候开新状态、什么时候合并旧状态。

方向 处理历史信息的方式
标准 attention 保留所有历史 K/V
稀疏 attention 只看一部分历史 K/V
线性 attention 把历史压进递推状态
多状态线性 attention 用多个状态保存不同粒度历史
DLA 根据信息变化动态合并状态

16. 当前探索六:Q/K/V 是否有冗余

近年的一些工作开始直接问:Q/K/V 三套投影是否都必要?

有研究讨论在一定假设下,Query、Key、Value 的某些投影可能存在冗余,可以被 identity 或更少的参数替代。这个方向还不是主流大模型的标准做法,但问题很有价值:

1
Q/K/V 是最方便的分解方式,还是存在更省参数的等价分解?

这类研究提醒我们:Q/K/V 是目前非常成功的工程和数学结构,但不是不可挑战的公理。


17. Q/K/V 的优势和代价

维度 优势 代价
表达能力 匹配和内容分开学 参数更多
并行性 $QK^T$ 很适合矩阵乘法 序列长时 $L^2$ 成本高
可训练性 soft attention 可微 softmax 可能饱和
长上下文 能做内容检索 KV cache 占显存
多头机制 多种关系并行建模 K/V 存储和带宽压力大

Q/K/V 的成功不是因为它完美,而是因为它在表达能力、可训练性和硬件效率之间做了很好的平衡。


18. 常见误解

误解 更准确的说法
Q/K/V 是人工写好的语义规则 它们是训练出来的线性投影
Q 就是问题,K 就是关键词,V 就是答案 这是类比,真实模型里它们是向量空间
self-attention 里 Q/K/V 完全一样 来源相同,投影矩阵不同
attention 只是找最相关 token 它是对多个 value 做加权混合
多头只是重复计算 不同 head 可以学习不同匹配关系
KV cache 是模型参数 KV cache 是推理时产生的中间状态
MQA/GQA/MLA 取消了 Q/K/V 它们主要是在压缩或共享 K/V
线性注意力完全不需要 Q/K/V 思想 许多线性注意力仍保留 query/key/value 的角色分工

19. 和前两篇文档的关系

文档 重点
softmax历史由来与LLM应用深度调研.md 分数如何变成概率/权重
Scaled Dot-Product Attention详解.md 为什么用 $QK^T/\sqrt{d_k}$
本文 为什么要把表示拆成 Q/K/V

三篇合起来可以按这条线读:

1
Q/K/V 分工 -> QK 点积打分 -> scale 稳定分数 -> softmax 变权重 -> 加权汇总 V

20. 小结

LLM 使用 Q/K/V,是因为序列建模需要一种可训练的内容检索机制。

Q/K/V 把 attention 拆成三个角色:

1
2
3
Q:当前位置要找什么
K:上下文位置如何被匹配
V:匹配后传递什么内容

数学上,它对应三组可学习线性投影、一个双线性匹配函数、一个 softmax 归一化,以及对 value 的加权求和。

工程上,它带来了强表达能力,也带来了 KV cache、长上下文和内存带宽问题。当前很多新结构,包括 MQA、GQA、MLA、稀疏注意力和线性注意力,都在围绕这个问题做取舍:保留 Q/K/V 的检索能力,同时降低 K/V 存储和读取成本。


21. 参考资料

历史和基础

Q/K/V 和推理优化

替代注意力和最新探索