从 2023 年到 2026 年,我前后经手过几十场大模型相关岗位的技术面试,也陪不少候选人做过复盘。一个特别明显的趋势是:早期面试官喜欢问“Transformer 的 self-attention 复杂度是多少”“反向传播怎么做”这种基础题,可现在只要涉及模型架构,开口就是 GPT、LLaMA、DeepSeek、Qwen 放在一起对比,而且层层追问非常深。这篇“主流大模型架构全景”,专门拆解这四大家族在架构上的相同与不同,从注意力机制、位置编码、归一化策略,一路聊到 MoE 和 KV Cache。不管你是正在准备面试,还是想真正理解当前大模型背后的设计思路,这篇都可以给你一张足够清晰的地图。
1. 大模型架构演进的底层逻辑:为什么主流军都收敛到 Decoder-only
1.1 重新认识 Transformer 的三个流派
在聊具体模型之前,得先把 Transformer 的“家族谱”说清楚。2017 年那篇划时代的 Transformer 论文里,作者给了一套完整的 Encoder-Decoder 框架:Encoder 负责把输入序列编码成语义空间,Decoder 负责根据编码结果逐步生成输出。后来的发展把这套框架拆成了三个流派。
Encoder-only 的典型代表是早期被疯狂用于文本分类、实体抽取的 BERT。它的特点是双向注意力,每个 token 都能“看到”上下文的所有 token。因为这种双向特性,它特别适合做理解型任务,但做生成就比较别扭。Encoder-Decoder 则比如 T5、BART 这类,保留了完整的编码和解码过程,在翻译、摘要这类“序列到序列”任务上有天然优势,代价是结构更重,训练和推理的复杂度都更高。Decoder-only 就是现在所有主流大模型采用的方案,只保留了解码器部分,用单向的因果注意力,每个 token 只能“看到”它之前的 token。
这里有个容易混淆的点:Decoder-only 不是说不能做理解任务。恰恰相反,今天几乎所有对话、问答、代码生成甚至“推理”任务,都是用 Decoder-only 模型完成的。区别在于,它把所有任务都统一成了“续写”的形式——给它一段 prompt,它负责把后面的内容续写出来。这种“一切皆生成”的哲学,是 GPT 系列最初验证出来的,之后被 LLaMA、DeepSeek、Qwen 们一路沿用。
1.2 为什么四大家族全都选择 Decoder-only
面试官特别爱问的一个问题是:“为什么现在的大模型几乎都选 Decoder-only?”这个问题比表面看起来更深。我总结下来,至少有四层原因。
第一,训练目标的对齐。大模型预训练的核心目标是“下一个 token 预测”,这是一个完美的自监督任务。Decoder-only 的因果注意力结构,天然就是为这个目标设计的。而 Encoder-Decoder 里的双向 Encoder 部分在做“下一个 token 预测”时反而用不上,属于额外的结构开销。
第二,训练效率。Decoder-only 的结构更简单,没有 Encoder 那一大坨,同样的算力可以堆更多的层数和参数量。在 Scaling Law 主导的时代,训练效率直接决定了模型上限。实验也反复证明,当把数据规模和算力等条件拉齐时,Decoder-only 的效果往往不输甚至超过同规模的 Encoder-Decoder 模型。
第三,推理效率。生成任务是一个自回归过程,每次只能吐一个 token。Encoder-Decoder 在生成时仍然需要依赖 Encoder 处理整个输入,解码器每一步都要跟整个 Encoder 输出做注意力交互,这会带来额外的计算和存储开销。Decoder-only 把输入和输出都放在同一个模型里处理,每一步只需要维护一份 KV Cache,工程上简单很多。
第四,涌现能力与统一范式。随着模型规模变大,Decoder-only 这种“从左到右生成”的范式展现出更强的 in-context learning 和指令跟随能力。你可以把它理解成:既然所有任务都能被改写成“上文到下文”的映射,那干脆只学这一种映射方式,学得足够深、足够大,其他能力自然涌现出来。这个知识点是架构对比题的“地基”,后面所有对比都会反复回到它。
2. 注意力机制 PK:从多头注意力到分组查询,再到潜在注意力
2.1 标准自注意力是怎么回事
讲各家改动之前,先把标准自注意力(MHA,Multi-Head Attention)的细节摆出来。Transformer 的注意力操作可以理解成“让序列里的每个 token 去搜一遍所有 token,把相关信息加权汇总”。具体计算时,每个 token 会生成三个向量:Query 表示“我想找什么”,Key 表示“我提供了什么”,Value 表示“我携带的实际内容”。注意力权重就是 Query 和 Key 做点积,再做 softmax 归一化,然后用这个权重去加权求和对应的 Value。
多头(Multi-Head)的意思是:不只是一套 Q/K/V,而是很多套,每套关注不同的子空间。你可以类比成多个“检索器”并行工作,有的负责语法关系,有的负责语义关联,最后把各头的结果拼起来再过一层线性变换。
MHA 的复杂度是 O(n²·d),n 是序列长度,d 是隐藏维度。在 2k、4k 这种训练长度下还能勉强接受,可一旦把上下文拉到 32k、128k 甚至更长,推理时的显存和算力会迅速撑爆。那问题就来了:怎么在尽量少损失模型能力的前提下,省掉注意力里那些不必要的开销?
2.2 LLaMA 的 GQA:KV Cache 的第一次“瘦身”
注意力开销的大头,除了计算 O(n²) 的矩阵乘法,还有一个非常隐蔽的内存杀手——KV Cache。推理时模型是一个 token 一个 token 地往后生成,每生成一个新 token,都要重新去“关注”前面所有 token。如果每一层、每个头都重新算一遍所有历史 token 的 K 和 V,那纯属浪费。所以工程上会把每步生成的 K 和 V 缓存下来,下次直接用。这就是 KV Cache。
问题是,如果用的是 MHA,那缓存里存的 K/V 数量等于“层数 × 头数 × 序列长度 × 维度”,非常庞大。比如一个 70B 参数的模型,到了 2k 长度时 KV Cache 可能占用十几 GB 显存,比模型权重本身还夸张。
LLaMA 系列给出的第一个答案是 GQA(Grouped Query Attention,分组查询注意力)。思路很朴素:既然多个“查询头”关注的语义空间可能高度重合,那就不给每个查询头配独立的 K 和 V。比如 32 个查询头,组织成 8 组,每组共享一套 K 和 V。这样 KV Cache 直接缩到原来的 8/32,也就是四分之一,代价只是少数任务上有一丁点精度损失。实操结果证明,这个损失小到几乎可以忽略。LLaMA-2 的 70B、LLaMA-3 的 8B 都用了 GQA,这也是现在开源社区跑模型时最常用的配置。
2.3 DeepSeek 的 MLA:把压缩做到极致
如果说 GQA 是“分组共享”,那 DeepSeek 的 MLA(Multi-head Latent Attention,多头潜在注意力)就是更进一步——直接把 KV 压缩到一个低维潜在空间。
MLA 的做法是:不直接缓存完整的 K 和 V,而是先把 Key 和 Value 投影到一个很小的低维向量(也就是“潜在”表示),再把这个低维向量缓存下来。等到真正要计算注意力的时候,再用一个上投影矩阵把它还原成完整的多头 K 和 V。这有点像视频压缩:高清视频直接存储太大,那就先压成一个关键帧加运动矢量,播放时再解码回高清画面。
这么做的收益非常直接:KV Cache 可以再缩小 90% 以上。DeepSeek-V2 时代公开的数据显示,MLA 让推理所需的 KV Cache 相比传统 MHA 减少了一个量级。这个优势在最吃显存的超长上下文场景里,几乎是决定性的。也正因如此,DeepSeek 系列可以在不太夸张的 GPU 集群上支撑比同代模型更长的上下文和更大的并发。
面试里聊到 MLA,你最好能主动解释一句:MLA 不是简单地减少头数,而是把“投影到低维空间再恢复”这个思路用在了 KV 上,它的底层逻辑和 LoRA 这种低秩分解思想是相通的。能把这些概念串起来,面试官会觉得你是真的理解了,而不是背的。
2.4 注意力机制对比速查表
| 维度 | 标准 MHA | GQA(LLaMA 系) | MLA(DeepSeek 系) |
|---|---|---|---|
| 每个查询头是否独享 KV | 是 | 分组建 KV | KV 被低秩压缩 |
| KV Cache 开销 | 最高 | 降为 1/8~1/16 | 降到 1/10 量级 |
| 实现复杂度 | 低 | 低-中 | 中-高 |
| 主要收益 | 无额外设计 | 减少显存占用 | 极致的显存节省 |
| 主要用途 | 早期模型 | 中大规模开源模型 | 超长上下文、高并发推理 |
补充一个细节:Qwen 系列在 Qwen2 之后的版本也大量使用 GQA,并且在针对长文本场景时做了专门的 attention 实现优化。也就是说,2026 年你去看主流开源模型,几乎不会再看到纯 MHA 的设计了,这是架构收敛的一个明显信号。
3. 位置编码:从绝对到旋转,再到超长上下文插值
3.1 为什么 Transformer 需要位置编码
RNN 处理序列是“一个接一个”地走,天然带顺序信息。Transformer 是并行计算的,对模型来说,输入序列就是“一袋子 token”,如果不加位置信息,“我爱你”和“你爱我”在模型眼里没区别。所以必须把位置信息编码进去。
最早用的绝对位置编码是给每个位置加上一套固定的正弦余弦向量。这种方式简单,但有两个问题:一是没学过足够长的位置时,遇到更长的序列就懵了;二是它把位置信息当“加法噪音”混进 embedding 里,效果很粗糙。后来出现了相对位置编码,让模型关注“两个 token 之间的距离”而不是各自的绝对坐标。但最主流的还是 2021 年提出、2022 年后被所有大模型广泛采用的 RoPE(Rotary Position Embedding,旋转位置编码)。这个方案目前统治了整个开源社区,强如 GPT 系列、LLaMA、DeepSeek、Qwen,无一例外。
3.2 RoPE 到底做了什么,凭什么成为主流
RoPE 的核心操作可以这样理解:它把每个 token 的向量分成若干“二维旋转组”,然后根据 token 的位置把每个组做一次旋转。位置越靠后,旋转角度越大。这样 Query 和 Key 在做点积时,就会自动带上“它们之间的距离信息”。
好处有三个。第一,对相对位置敏感,连续且平滑,模型能感知到“tokenA 在 tokenB 后面 3 个位置”这类信息。第二,天然支持外推,理论上只要定义了旋转角度,位置得多远都能算,不像绝对位置编码那样有个硬上限。第三,没有额外参数,RoPE 不改模型结构,只是在每个 token 输入前“转一下”,实现上很轻量。
但 RoPE 也有一个实际痛点:虽然能“外推”,但直接外推到训练长度之外,效果往往会崩。原因是旋转角的频率是按训练长度设计的,位置一远,模型就“转”得过头了。
3.3 超长上下文的插值技巧:base 值、动态 NTK 与 YaRN
为了解决“训练 4k 长度,怎么推理 128k”这个问题,业界卷出了好几套方案。
位置插值(Position Interpolation)说白了就是把“新位置”按比例“压缩”到模型熟悉的 0~4k 范围内。比如原始位置 10000,按 128k/4k=32 倍缩放后变成约 312。这招简单粗暴,但会损失高频细节。NTK-aware 插值则借用神经正切核的思路,不去均匀压缩所有频率,而是只调整 RoPE 的 base 值(比如从 10000 调到 500000),频带被重新分配,长距离性能比均匀插值更好,这也是很多模型直接调整 base 值的原因。动态 NTK 则是推理时按实际序列长度实时调整 base 值,而不是训练时定死。YaRN 结合了 NTK 和部分插值,还针对注意力 softmax 的温度做了修正,是目前很多长上下文模型使用的方案。
Qwen 系列是这块的优等生。Qwen2.5 用了大量技巧扩展上下文,同时对高频信息做了专门的增强,避免长序列下出现性能衰减。有兴趣的同学可以直接去开源仓库看它对 RoPE 的改写,代码写得非常清楚,比背论文高效得多。
面试官如果问“你们模型是怎么从 4k 扩展到 128k 的”,标准回答路径就是:训练时加大长文本数据比例 + 调整 RoPE 的 base + 用动态 NTK 或 YaRN 做推理阶段插值,并且要说明每一步的取舍。
4. 架构里的“隐形肌肉”:归一化、前馈网络与 MoE
4.1 从 LayerNorm 到 RMSNorm:砍掉均值后的稳定革命
归一化(Normalization)是为了解决深层模型训练不稳定的问题。每一层输出的分布如果不控制,深层的梯度和激活值很容易漂移甚至爆炸,就像叠积木时底下的木头一直在抖动。
经典的 LayerNorm 会对每个 token 的所有特征做减均值、除标准差的标准化。它有效,但计算时要维护均值和方差两套统计量,比较啰嗦。后来的研究发现在注意力机制里均值信息其实常常是“冗余”的,于是 RMSNorm 只对残差作根均方归一化,不减去均值。它减少了计算量,同时被证明在深层网络中效果不输 LayerNorm。LLaMA 系列从第一代就全面采用 RMSNorm,DeepSeek、Qwen 也都沿用了这个设计。现在你去看任何一份大模型源码,几乎都能看到 RMSNorm 的实现,它已经是事实标准。
还有一个小考点是 Pre-Norm vs Post-Norm。原始 Transformer 用的是 Post-Norm——先走子层,再归一化。后来大家发现 Pre-Norm(先归一化,再走子层)训练更稳定,可以不用那么小心地调学习率,所以几乎所有新模型都切到了 Pre-Norm。但 Pre-Norm 有个不太体面的副作用:模型越堆越深时,最深层的表征可能会退化。DeepSeek 在做 DeepSeek-V2 时用了类似“DeepNorm 变体”的层间缩放策略,来缓解深层模型训练不稳定的问题,这块属于进阶考点,能答上会很加分。
4.2 前馈网络(FFN)的演变:从 ReLU 到 SwiGLU 的“配方升级”
Transformer 的每一层里,差不多三分之二的计算量都花在一个两层的全连接网络(FFN)上。它做的事情是“先把 token 投影到 4 倍宽的空间,让信息充分融合,再投影回原维度”。FFN 中间的激活函数,直接影响信息流动的质量。
早期的 ReLU 简单但粗糙:负半轴直接“一刀切”置零,模型需要靠足够多的神经元来弥补这个信息损失。后来 GELU 用平滑曲线替代硬切,信息保留更好,很多 BERT 系模型都用它。真正让各家大模型集体“换配方”的是 SwiGLU。
SwiGLU 是门控线性单元(GLU)和 Swish 激活的组合,核心思想是用另一个层生成的“门控向量”去控制主路径的信息流。举个例子,把 FFN 想象成一条水管,SwiGLU 给水管加了一个阀门,阀门开多大由模型自己学。这种“门控”设计带来的直接效果是,同样的宽度下,模型表达能力更强,或者反过来说,想要达到同等效果,用 SwiGLU 可以省参数。LLaMA、Qwen、DeepSeek 全系列几乎都在 FFN 里使用了 SwiGLU 或它的变体。面试问到这里,通常还会再追问一句“你知道为什么门控能提升效果吗”,答案是它能对信息做乘法式的调制,而不是只做加法式的变换,表达能力更强,底层还能和 LSTM 的门控思想扯上关系。
4.3 MoE:把“一个巨无霸”拆成“一群专家”
如果说上面那些改动都是微调,MoE(Mixture of Experts,混合专家)就是一次彻头彻尾的结构革命。
标准 FFN 是“一个模型处理所有输入”,MoE 则是“一个路由网络决定这次输入交给哪些专家处理”。整个 MoE 层里有几十甚至上百个“专家子网络”,但每次推理只激活其中少数几个。好比一个超大型医院,不安排所有医生同时接诊,而是由分诊台根据病情只安排对应的两三个专科医生来处理。这样模型的总参数量可以做到 600B、1T,但每次推理实际计算量只相当于 20B、30B 的模型。
DeepSeek 是 MoE 路线上最激进也最高调的玩家。DeepSeek-V2/V3 的 MoE 设计里有两个杀手锏。一个是细粒度专家分割,把传统一个“大专家”拆成多个“小专家”,让路由可以选择更多样的组合,专家共用的平衡性更好。另一个是共享专家,保留少量专家对每个输入都生效,负责处理所有任务共性的部分,避免其他专家被高频调用导致“贫富差距”过大。
Qwen 也出了自己的 MoE 版本,但相比 DeepSeek 的“极致参数密度”,Qwen 的 MoE 更强调通用性和稳定性。面试里聊 MoE 的标准组合拳是:先说什么是 Router、怎么算 Top-k 专家选择,再说训练时如何解决“专家冻结”和负载不均衡,最后补充 MoE 在推理时如何通过 expert parallelism 做分布式。把这套串起来,基本就能覆盖 90% 的追问。
4.4 归一化、FFN、MoE 的关键差异汇总
| 组件 | GPT 系列 | LLaMA 系列 | DeepSeek 系列 | Qwen 系列 |
|---|---|---|---|---|
| 归一化 | Pre-Norm(细节未完全公开) | Pre-Norm + RMSNorm | Pre-Norm + RMSNorm + 变体 | Pre-Norm + RMSNorm |
| FFN 激活 | 各代实现有差异,未完全公开 | SwiGLU | SwiGLU | SwiGLU |
| 是否 MoE | 未官方确认 | 少量版本 | DeepSeekMoE(细粒度+共享) | 部分版本 |
| 门控/压缩设计 | 传统 | GQA | MLA + MoE | GQA + 长文本优化 |
需要说明一点:GPT 系列因为闭源,架构细节大多靠公开论文和社区逆向分析,上面表格里标“未完全公开”的部分,恰恰是面试中很常见的一个考察点——面试官会想你愿不愿意诚实地说“这部分我不确定”,而不是编一个答案出来。这种严谨态度,本身就是一种技术素质。
5. 面试实战:架构对比高频题与答题框架
5.1 高频问题拆解与参考回答
面试中关于架构对比的高频问题,我整理了四道代表题,每个都给一条可复用的回答思路。
第一题:“GPT 为什么选择 Decoder-only,而不是 BERT 或 T5 的结构?”参考思路:生成任务统一为自回归建模,Decoder-only 的因果注意力与“下一个 token 预测”目标天然匹配,结构更简洁,训练和推理时都不需要额外的 Encoder,在同等算力下规模上限更高,实验也证明大规模下 Decoder-only 的 loss 和下游效果不比 Encoder-Decoder 差。尤其别漏掉“推理时不需要维护 Encoder 输出”这个工程收益。
第二题:“LLaMA 相比早期 GPT 做了哪些架构上的改动?”参考思路:从四个维度切入——归一化用了 RMSNorm;FFN 激活换成了 SwiGLU;注意力用 GQA(至少在中大模型上);位置编码用 RoPE。然后补一句:这些改动没有一个是“重新发明轮子”,而是把已经被论文验证过的组件系统性地组合起来,再配合更高质量的数据和更合理的训练策略。这就是 LLaMA 开源后快速追平 GPT 的核心逻辑。
第三题:“DeepSeek 的 MLA 有什么优势,为什么能省这么多显存?”参考思路:先解释 KV Cache 是推理内存大头,然后说 MLA 把 Key/Value 先映射到低维潜在空间缓存,计算时再恢复成多头 KV,因此 KV Cache 和激活内存都大幅下降,同时推理吞吐变高。最后主动提一句“MLA 和 LoRA 都用了低秩思想”,把知识串起来会有意外加分。
第四题:“Qwen 和 LLaMA 在架构上最大的差异是什么?”参考思路:基础组件高度相似,都是 RMSNorm、RoPE、GQA、SwiGLU,真正的差异在训练数据和工程策略——Qwen 在超长文本、多语言、特殊 token 上下得功夫更重,Qwen 的词汇表经过了特别设计,对中英文混合场景做了优化,词汇量也处于较高水平;扩展上下文时用了更多针对性的 RoPE 变体。面试里不要只停留在“组件差异”,要说“同样的组件,不同团队如何用数据和方法论拉开差距”。
5.2 我私藏的答题框架与避坑清单
准备这类面试题,我最推荐一个“三层回答法”。
先讲结论:直接说出“XX 模型在注意力上用了 GQA/MLA”这种一句话结论。再讲原理:解释这种设计为什么能带来收益,尽量带上 KV Cache、显存、训练稳定性这些工程指标。最后讲选型:站在项目场景角度说“如果是我设计,在什么情况下我会选它,什么情况下不选”。面试官很吃这套,因为它说明你不是背概念,而是有架构决策能力。
避坑清单我也列一下,这些都是我在真实面试现场见过别人踩的坑。
不要为了体现知识面而硬扯不相关的名词。比如把“MLA”说成“MQA 的升级版”就不够严谨,MLA 的压缩机制和 MQA 的分组共享根本不是一回事。不要张口就来具体参数。真的记不清 LLaMA-3 的中间层大小或 DeepSeek-V3 到底多少个专家,就老实说“这是一个细节,我不太确定,但它的设计意图是……”,诚实比准确更能赢得好感。不要忽略“闭源模型”这个前提。讲 GPT 架构时,要始终强调“基于公开论文和社区分析,可能存在不准确”,这种严谨本身就是专业度。
5.3 从“背答案”到“能推演”:我的日常训练方法
最后分享一个我自己验证有效的方法:不要把四大家族当四个孤立的模型去背,而是把它们当成“不同团队在同一个 Transformer 基座上做的不同工程选择”。
我每次研究一个新模型,会固定走四步:看架构图、读源码关键实现、跑一个小规模的消融实验对比组件差异、最后试着用一段 50 行以内的伪代码把核心模块的流程写出来。只要你能亲手写出“RoPE 的旋转角怎么算”“GQA 的 index 怎么映射”“MLA 的低维投影在 cache 里到底存了哪几个向量”,你对这些架构的理解就不是死记硬背,而是真的可以随时推演。面试时会明显感觉到,那种“自己理解过的细节”和“背诵过的结论”在表达上的差别非常之大。
我现在拿到一个新模型,还是会习惯性地把它的 attention 实现和另外几个主流模型放在一起读,边读边画各自的 KV Cache 结构图。一旦你亲自动手走一遍数据流动,很多面试问题的答案都会自己浮出来。这也是我认为准备架构类面试最高效的路径,没有之一。