跳到主要内容

Transformer 与注意力机制

Transformer 是当前大语言模型的基础结构,核心是注意力机制:生成每个位置时,按相关程度从前面所有位置汇总信息。应用开发岗位考这部分,是为了让候选人能解释上下文长度为什么贵、KV Cache 为什么能加速、长对话为什么会“忘记”中间内容。本文讲到这一深度,不展开训练细节。

1. 面试核心​

先记住这几条,再读正文
  • 主流大模型是仅解码器(Decoder-only)结构:多层相同的块堆叠,每块包含带因果掩码的多头自注意力和前馈网络,配合残差连接和归一化。卡 · 整体结构
  • 自注意力把每个 Token 投影成 Query、Key、Value,用 Query 与所有 Key 的点积除以 √d 得到相关度,经 softmax 后对 Value 加权求和。多头注意力把这一过程拆成多个子空间并行计算,再拼接。卡 · 自注意力的计算
  • 注意力的计算量随序列长度平方增长,这是长上下文昂贵的根本原因;长序列中位于中间的信息更容易被忽略。卡 · 注意力的局限
  • KV Cache 保存已处理 Token 在每层的 Key 和 Value。解码时新 Token 只需计算自己的 Q、K、V,再与缓存做注意力,避免重复计算整个前缀;代价是显存随序列长度和并发数增长。卡 · KV Cache 与推理成本
  • 前缀缓存(Prompt Cache)把相同前缀的 KV Cache 跨请求复用,所以提示词要“稳定内容在前、变化内容在后”。

2. 整体结构​

原始 Transformer 由编码器和解码器组成,用于翻译:编码器双向读取源句,解码器逐词生成译文。之后分化出三类:

结构注意力方向代表擅长
仅编码器双向,每个位置能看到前后文BERT理解类任务,如分类、Embedding、重排序
编码器-解码器编码双向,解码单向并关注编码结果T5输入到输出的转换,如翻译、摘要
仅解码器单向,只能看到前面的位置GPT、Llama、Qwen 等生成;统一用“预测下一个 Token”完成各类任务

一个仅解码器模型的推理流程:

  1. Token ID 经过嵌入层变成向量,加入位置信息(目前多用 RoPE 旋转位置编码,把位置编码进 Q、K 的计算中)。
  2. 依次经过 N 个解码块。每块先做多头自注意力,再做前馈网络(逐位置的两层全连接,扩展维度后再压回)。每个子层外有残差连接,并在子层前做归一化(LayerNorm 或 RMSNorm)。
  3. 最后一层输出经过线性层映射到词表大小,softmax 得到下一个 Token 的概率。

因果掩码:训练时整句并行计算,用掩码屏蔽每个位置之后的内容,保证模型只依据前文预测;推理时自然只有前文。

3. 自注意力的计算​

对输入矩阵 X(n 个 Token,每个 d 维),用三个可学习矩阵投影:

Q = X·W_Q K = X·W_K V = X·W_V
Attention(Q, K, V) = softmax(Q·Kᵀ / √d_k + mask) · V
  • Q·Kᵀ:每个位置的 Query 与所有位置的 Key 做点积,得到 n×n 的相关度矩阵。
  • 除以 √d_k:维度越大点积方差越大,softmax 会趋于只选一个位置、梯度变小;缩放后分布更平稳。
  • softmax:每一行变成和为 1 的权重。
  • 乘 V:按权重汇总各位置的 Value,得到这个位置融合上下文后的表示。

直观理解:Query 是“我在找什么”,Key 是“我能提供什么”,Value 是“我实际提供的内容”。生成“它”这个词时,注意力会把较高权重放在前文中被指代的名词上。

多头注意力:把 d 维拆成 h 个头,每个头有独立的投影矩阵,在各自子空间中计算注意力,最后拼接再线性变换。不同的头可以关注不同关系,如语法依赖、指代、相邻位置。为了减小 KV Cache,很多模型让多个 Query 头共享一组 Key、Value 头(GQA、MQA)。

4. KV Cache 与推理成本​

解码第 t 步时,新 Token 需要与前面 t-1 个位置的 Key、Value 做注意力。如果每步都重新计算整个前缀的 K、V,总计算量随长度平方增长。KV Cache 把每层已经算过的 K、V 保存下来,新步骤只计算新 Token 的 Q、K、V 并追加进缓存。

阶段计算特点影响的指标
预填充一次并行处理全部输入,计算密集首 Token 延迟(TTFT)
解码每步一个 Token,需要读取全部 KV Cache,受显存带宽限制每 Token 延迟、吞吐

KV Cache 的大小约为 2 × 层数 × KV 头数 × 每头维度 × 序列长度 × 每个数值的字节数,并随并发请求数线性增长,常常是显存的主要占用。推理框架用分页管理(vLLM 的 PagedAttention)减少碎片、用 GQA 和量化减小体积,并把相同前缀的缓存在请求之间共享,即前缀缓存。

5. 注意力的局限​

  • 平方复杂度:注意力矩阵是 n×n,长上下文的计算和显存成本迅速上升。
  • 中间信息被忽略:实验表明,关键信息位于长输入的开头或结尾时效果最好,位于中间时明显下降(Lost in the Middle)。
  • 注意力被稀释:无关内容越多,相关内容分到的权重越少,模型越容易被干扰。
  • 没有跨请求的状态:模型只看到本次输入,多轮对话要靠程序重新发送历史或检索记忆。

这些局限直接决定了 Agent 的上下文策略:只放必要信息、把关键约束放在开头或末尾、长历史做压缩、过程材料放到外部存储按需取回,见上下文管理和上下文压缩。

6 · 面试题卡片​

6.1 介绍一下 Transformer 的核心结构与推理流程,Encoder 和 Decoder 有什么区别?​

出现公司:字节跳动、蚂蚁、顺丰、Accenture

考察重点

  • 解码块的组成:注意力、前馈网络、残差与归一化、位置编码。
  • 三类结构的注意力方向和适用任务;为什么生成模型多用仅解码器结构。

相关内容:整体结构、一次生成的过程。

参考回答

原始 Transformer 包含编码器和解码器:编码器用双向自注意力理解输入,解码器用带掩码的自注意力逐个生成输出,并通过交叉注意力读取编码结果。现在的大语言模型多数是仅解码器结构:Token 经过嵌入并加入位置信息(常用 RoPE),再经过多层相同的块,每块是“归一化、多头自注意力、残差”加“归一化、前馈网络、残差”,最后映射到词表得到下一个 Token 的概率。

推理时先对整段输入做一次并行的预填充,再逐 Token 解码,每步用 KV Cache 复用前文结果。仅编码器(如 BERT)能看到前后文,适合分类、Embedding 和重排序;仅解码器只看前文,用“预测下一个 Token”统一各种生成任务,扩展规模和训练都更简单,所以成为生成模型的主流。

6.2 自注意力怎样计算?Q、K、V 分别是什么,为什么要除以 √d?多头注意力有什么作用?​

出现公司:阿里云、阿里淘天、蚂蚁、腾讯

考察重点

  • 公式中每一步的含义和矩阵形状。
  • 缩放的原因;多头的作用;因果掩码。

相关内容:自注意力的计算。

参考回答

输入 X 分别乘三个可学习矩阵得到 Q、K、V。Q·Kᵀ 得到 n×n 的相关度矩阵,除以 √d_k 后加因果掩码,再按行 softmax 得到权重,最后乘 V,得到每个位置按相关度汇总全序列信息的结果。本质是一种按内容寻址的加权平均:Query 表示当前位置在找什么,Key 用于匹配,Value 是被汇总的内容。

除以 √d_k 是因为维度大时点积的方差随维度增长,softmax 会变得极端,几乎只选一个位置,梯度很小,缩放后训练更稳定。多头注意力把维度拆成多个头,各自用独立投影计算注意力再拼接,让模型在不同子空间里同时关注不同关系。手写实现时注意矩阵形状 (batch, heads, n, d_head)、掩码用负无穷填充未来位置。

6.3 KV Cache 是什么?为什么能加速推理?前缀缓存与它是什么关系?​

出现公司:字节跳动、阿里巴巴、凌脉

考察重点

  • 解码时哪些计算被缓存,省下了什么。
  • KV Cache 的显存代价;前缀缓存跨请求复用的条件。

相关内容:KV Cache 与推理成本、组装顺序与前缀缓存。

参考回答

解码是逐 Token 进行的,每生成一个新 Token,都要让它与前面所有 Token 的 Key、Value 做注意力。前面 Token 的 K、V 不会变化,如果每步重新计算,就是大量重复工作。KV Cache 把每层已算好的 K、V 存起来,新步骤只计算新 Token 的 Q、K、V,追加进缓存后做注意力,每步的计算量从处理整个前缀降到处理一个 Token。

代价是显存:缓存大小与层数、KV 头数、每头维度、序列长度和并发数成正比,长上下文、高并发时常常是瓶颈,推理框架用分页管理、GQA 和量化来缓解。前缀缓存把这一思路扩展到请求之间:两个请求的开头完全相同时,直接复用这段前缀的 KV Cache,跳过预填充,降低首 Token 延迟和输入费用。命中要求前缀逐字一致,所以系统提示和工具定义放在前面且保持稳定,时间戳、本轮输入等变化内容放在后面。

6.4 在 Agent 多轮对话任务中,注意力机制有哪些局限?工程上怎样应对?​

出现公司:阿里淘天、字节跳动

考察重点

  • 平方复杂度、中间信息丢失、注意力稀释和无状态四个局限。
  • 从局限推出上下文选择、压缩和外部记忆等做法。

相关内容:注意力的局限、上下文压缩。

参考回答

第一是成本:注意力矩阵随长度平方增长,多轮对话每轮都带着越来越长的历史,延迟和费用持续上升。第二是位置:关键信息在长输入中间时更容易被忽略,早期用户提出的约束到后面可能不再被遵守。第三是稀释:工具结果、日志等无关内容越多,相关信息得到的权重越少,模型更容易被干扰或跑题。第四是无状态:模型只看到本次输入,超出窗口的内容等于不存在。

工程上对应的做法:每轮只放完成当前步骤所需的信息;用户目标和硬性约束放在系统提示或单独的状态区,并在压缩时保留;旧历史压缩成结构化摘要,大段工具输出只保留结论和引用;跨会话信息放入外部记忆按需检索;子任务交给独立上下文的子 Agent 处理后只返回结果。

7. 参考资料​