大模型核心八股文 - 2028面试必备¶
重要性:2028年AI岗位面试中,大模型八股文已替代传统CS八股成为主力考察内容 覆盖范围:Transformer核心、注意力机制、训练技术、推理优化、RAG、Agent、对齐 使用方法:每个问题包含"简答版"(30秒回答)和"深入版"(2-3分钟展开)
Part A:Transformer与注意力机制(15题)¶
Q1: Self-Attention的计算过程是什么?时间复杂度和空间复杂度?¶
简答版: - Q、K、V由输入通过三个线性变换得到 - Attention(Q,K,V) = softmax(QK^T / sqrt(d_k)) V - 时间复杂度 O(n^2 d),空间复杂度 O(n^2)(n是序列长度,d是维度)
深入版:
详细步骤:
1. 输入X ∈ R^{n×d} 通过三个权重矩阵:
Q = XW_Q, K = XW_K, V = XW_V (W ∈ R^{d×d_k})
2. 注意力分数: S = QK^T / sqrt(d_k) → S ∈ R^{n×n}
3. 归一化: A = softmax(S) (按行softmax)
4. 加权求和: Output = AV → R^{n×d_v}
为什么除以sqrt(d_k)?
- Q和K的点积期望值随维度增大而增大: E[q·k] = d_k × E[q_i × k_i]
- 点积过大 → softmax梯度趋近0(梯度消失)
- 除以sqrt(d_k)使方差归一化为1
瓶颈: n^2的注意力矩阵
序列8K: 8192^2 × 2B(FP16) = 128MB → 可接受
序列128K: 131072^2 × 2B = 32GB → 一块GPU的显存全占满!
→ 这就是FlashAttention等优化的动机
Q2: Multi-Head Attention相比Single-Head有什么优势?¶
简答版: - 多头允许模型在不同的子空间学习不同类型的注意力模式 - 相当于CNN中多个卷积核捕捉不同特征
深入版:
实现:
将d维空间切分为h个子空间(head_dim = d/h)
每个头独立计算Attention,最后concat + 线性投影
MultiHead(Q,K,V) = Concat(head_1, ..., head_h) × W_O
head_i = Attention(QW_Q^i, KW_K^i, VW_V^i)
计算量: 与单头几乎相同(参数量完全相同)
单头: d × d × 3 (QKV) + d × d (输出) = 4d^2
多头: d/h × d × 3 × h + d × d = 4d^2 ← 完全一样!
优势:
不同头可以学到: 语法关系、语义关系、位置关系、指代关系等
实际可视化发现: 有些头关注局部, 有些关注全局, 有些关注特定语法结构
Q3: GQA(Grouped Query Attention)是什么?为什么现在主流模型都在用?¶
简答版: - GQA是MHA和MQA的折中,多个Query头共享一组KV头 - 减少KV Cache显存占用,加速推理,质量损失很小
深入版:
对比:
MHA (Multi-Head Attention): Q=32头, K=32头, V=32头
KV Cache大小: 2 × 32 × seq_len × head_dim × precision
MQA (Multi-Query Attention): Q=32头, K=1头, V=1头
KV Cache减少32倍! 但质量有损
GQA (Grouped Query Attention): Q=32头, K=8头, V=8头
KV Cache减少4倍, 质量接近MHA
使用情况:
Llama-2-70B: GQA (8 KV头 for 64 Q头)
Qwen-2: GQA
Mistral-7B: GQA
→ 2024年后几乎所有主流LLM都采用GQA
Q4: FlashAttention的核心思想是什么?¶
简答版: - 利用GPU内存层次(SRAM vs HBM),通过分块(tiling)计算避免存储完整的n×n注意力矩阵 - 不改变数学结果,纯粹的IO优化
深入版:
核心问题:
标准Attention: 需要将n×n的注意力矩阵写入HBM再读回来
GPU HBM带宽: ~2TB/s (A100)
GPU SRAM带宽: ~19TB/s → 10倍差距!
FlashAttention做法:
将Q、K、V分成小块(tile),每块能放入SRAM
在SRAM中计算完整个tile的softmax贡献
使用"在线softmax"技巧: 不需要看到所有K就能正确计算softmax
- 关键: 维护running max和running sum
- 每处理一个K块,更新max和sum,调整之前的结果
效果:
- 显存: O(n^2) → O(n)(不存储n×n矩阵)
- 速度: 2-4x加速(减少HBM读写次数)
- 长序列: 使128K+的上下文窗口变得可行
FlashAttention-2改进:
- 更好的并行化(沿序列维度并行)
- 减少非矩阵乘法操作(充分利用Tensor Core)
- 比FlashAttention-1再快2x
Q5: 位置编码有哪些方案?RoPE为什么成为主流?¶
简答版: - 绝对位置编码(原始Transformer):可学习的位置向量 - 相对位置编码(T5/ALiBi):编码token间的相对距离 - RoPE(旋转位置编码):通过旋转矩阵编码位置,支持长度外推
深入版:
RoPE核心思想:
对Q和K的每对连续维度(q_{2i}, q_{2i+1})应用旋转变换:
[q'_{2i} ] [cos(mθ_i) -sin(mθ_i)] [q_{2i} ]
[q'_{2i+1}] = [sin(mθ_i) cos(mθ_i)] [q_{2i+1}]
m是位置索引, θ_i = 10000^{-2i/d}
RoPE的关键性质:
q_m · k_n 仅依赖于(m-n), 而非m和n的绝对值
→ 天然具有相对位置编码特性
→ 注意力分数只取决于两个token的相对距离
为什么成为主流:
1. 相对位置 → 更好的泛化
2. 无需额外参数
3. 可通过调整θ基数实现长度外推:
原始base=10000 → 调大base=500000(NTK-aware) → 支持更长上下文
4. 几乎所有主流LLM使用: Llama/Qwen/Mistral/DeepSeek
Q6: KV Cache是什么?为什么是推理的核心优化?¶
简答版: - LLM自回归生成时,之前token的K和V不变,缓存起来避免重复计算 - 将推理从O(n^2)降到O(n)(每步只计算新token的Q与所有K的注意力)
深入版:
无KV Cache:
生成第N个token时,需要重新计算前N-1个token的K、V
总计算量: 1 + 2 + 3 + ... + N = O(N^2)
有KV Cache:
首次(Prefill): 计算所有prompt token的K、V,存入缓存
后续(Decode): 每步只计算新token的Q, 用缓存的K、V计算注意力
总计算量: N + N + N + ... = O(N) per token
显存占用:
KV Cache = 2(K和V) × layers × kv_heads × head_dim × seq_len × batch × precision
Llama-3-70B (80层, 8 KV头, 128维, FP16):
每个token的KV: 2 × 80 × 8 × 128 × 2B = 327KB
4096 tokens: 327K × 4096 = 1.3GB
batch=50: 1.3GB × 50 = 65GB ← 接近一张A100的显存!
→ KV Cache的显存管理是LLM推理的核心工程挑战
→ PagedAttention/GQA/KV量化都是为了解决这个问题
Q7: Prefill和Decode阶段有什么区别?¶
简答版: - Prefill:处理全部输入token,计算密集(compute-bound),可充分利用GPU并行 - Decode:逐token生成,访存密集(memory-bound),每步只生成一个token
深入版:
Prefill阶段:
输入: 完整的prompt (如1000 tokens)
计算: 所有token并行计算QKV和注意力 → 填充KV Cache
特点: 计算密集, GPU利用率高(矩阵乘法大)
延迟: TTFT(Time To First Token) = Prefill时间
Decode阶段:
输入: 上一步生成的1个token
计算: 1个Q与所有K做注意力 → 生成1个token
特点: 访存密集(读KV Cache大, 计算小)
延迟: 每token约20-50ms(7B) ~ 100-200ms(70B)
优化方向不同:
Prefill: Tensor并行、矩阵分块 → 充分利用算力
Decode: KV Cache优化、投机解码、批处理 → 提高吞吐量
分离部署(Disaggregated Serving, 前沿趋势):
Prefill集群(高算力GPU) + Decode集群(高显存/带宽GPU)
→ 各自优化,资源利用率最大化
Q8: Layer Normalization的位置有什么讲究?Pre-Norm vs Post-Norm?¶
简答版: - Post-Norm(原始Transformer):LayerNorm在残差连接之后 - Pre-Norm(GPT/LLama等):LayerNorm在子层之前 - Pre-Norm训练更稳定,几乎所有现代LLM都用Pre-Norm
深入版:
Post-Norm: output = LayerNorm(x + SubLayer(x))
- 原始Transformer使用
- 需要warmup,学习率敏感
- 最终效果可能稍好(充分训练后)
Pre-Norm: output = x + SubLayer(LayerNorm(x))
- 梯度直接通过残差路径传递(不经过LayerNorm)
- 训练更稳定,不需要warmup
- 几乎所有现代LLM使用(GPT/Llama/Qwen/Mistral)
RMSNorm(更进一步):
RMSNorm(x) = x / sqrt(mean(x^2) + ε) × γ
- 去掉了均值中心化,只做缩放
- 计算量减少,速度更快
- Llama系列/Qwen/Mistral/DeepSeek均使用RMSNorm
Part B:训练技术(10题)¶
Q9: LoRA的原理是什么?为什么能大幅减少微调参数?¶
简答版: - 冻结预训练权重W,用两个低秩矩阵A和B近似增量:W' = W + BA - A ∈ R^{d×r}, B ∈ R^{r×d}(r << d),参数量从d^2降到2dr
深入版:
动机: 预训练权重的变化量(ΔW)通常是低秩的
- 实验发现: 微调前后权重差ΔW的有效秩远小于维度d
- 假设: ΔW ≈ BA, 其中B ∈ R^{d×r}, A ∈ R^{r×d}
实现:
原始: h = Wx
LoRA: h = Wx + (α/r) × BAx (α是缩放因子)
训练时: W冻结, 只训练A和B
推理时: W' = W + (α/r)BA → 合并后无额外延迟!
参数量对比(Llama-7B, d=4096):
全参数: 4096 × 4096 = 16.7M (每个线性层)
LoRA r=16: 4096 × 16 + 16 × 4096 = 131K → 减少128倍!
全模型: 7B → LoRA约10-50M可训练参数
QLoRA:
在LoRA基础上:
1. 基础模型4-bit量化(NF4数据类型)
2. 双重量化(quantize the quantization constants)
3. Paged Optimizers(优化器状态offload到CPU)
→ 70B模型在单张A100上微调!
Q10: RLHF的流程是什么?DPO相比RLHF有什么优势?¶
简答版: - RLHF:训练奖励模型 → 用PPO优化策略模型 - DPO:直接从偏好数据优化,不需要训练奖励模型,更简单稳定
深入版:
RLHF三阶段:
Stage 1: SFT(监督微调) → 用高质量数据微调基座模型
Stage 2: 训练Reward Model
- 数据: 同一Query下,人工标注哪个回答更好(喜好对)
- 模型: 输入(Query, Answer) → 输出标量reward分数
Stage 3: PPO强化学习
- 策略模型生成回答 → RM打分 → PPO更新策略
- 同时用KL散度约束,防止偏离SFT模型太远
DPO(Direct Preference Optimization):
核心洞察: 可以将RM+PPO的目标函数改写为直接对策略的优化
Loss = -log σ(β × (log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x)))
y_w: 偏好数据中human preferred的回答
y_l: 偏好数据中rejected的回答
π_ref: 参考模型(SFT后的模型)
DPO优势:
- 不需要训练独立的Reward Model(省一个模型)
- 不需要PPO采样循环(训练更稳定)
- 显存需求更低(不需同时加载4个模型)
- 超参更少,更容易调
- 现在大多数团队优先选择DPO或其变体(SimPO/ORPO/KTO)
Q11: 分布式训练中的AllReduce、AllGather、ReduceScatter分别是什么?¶
简答版: - AllReduce:所有节点归约后人手一份完整结果(梯度同步用) - AllGather:收集所有节点数据,人手一份完整数据 - ReduceScatter:归约后每人只拿一片(ZeRO用)
深入版:
假设4个GPU, 每个有数据 [a_i]:
AllReduce (所有人归约,所有人拿完整结果):
GPU0: [a0] ──┐ ┌→ [a0+a1+a2+a3]
GPU1: [a1] ──┤ AllReduce(sum) ├→ [a0+a1+a2+a3]
GPU2: [a2] ──┤ ├→ [a0+a1+a2+a3]
GPU3: [a3] ──┘ └→ [a0+a1+a2+a3]
用途: 数据并行的梯度同步
AllGather (收集所有人的数据):
GPU0: [a0] ──┐ ┌→ [a0, a1, a2, a3]
GPU1: [a1] ──┤ AllGather ├→ [a0, a1, a2, a3]
GPU2: [a2] ──┤ ├→ [a0, a1, a2, a3]
GPU3: [a3] ──┘ └→ [a0, a1, a2, a3]
用途: ZeRO-3前向时收集参数
ReduceScatter (归约后分片):
GPU0: [a0,b0,c0,d0] ──┐ ┌→ [Σa] (只拿第1片)
GPU1: [a1,b1,c1,d1] ──┤ ReduceScatter ├→ [Σb] (只拿第2片)
GPU2: [a2,b2,c2,d2] ──┤ ├→ [Σc] (只拿第3片)
GPU3: [a3,b3,c3,d3] ──┘ └→ [Σd] (只拿第4片)
用途: ZeRO梯度分片
关系: AllReduce = ReduceScatter + AllGather
Q12: 梯度累积(Gradient Accumulation)是什么?什么时候用?¶
简答版: - 多个mini-batch的梯度累加后再更新参数,等效于更大的batch size - 显存不够但需要大batch时使用
深入版:
场景: 想要batch_size=256, 但GPU只能放batch_size=8
做法:
for i in range(32): # accumulation_steps = 256/8 = 32
loss = model(batch_i) / 32 # 缩放loss
loss.backward() # 梯度累积到.grad
optimizer.step() # 用累积的梯度更新
optimizer.zero_grad()
注意事项:
- Loss除以accumulation_steps(平均梯度)
- 与DDP结合: 只在最后一步做AllReduce(节省通信)
- BatchNorm需要特殊处理(统计量不准确) → LLM用LayerNorm无此问题
- 学习率调度: 以"有效batch"计算warmup步数
Part C:推理优化(8题)¶
Q13: 模型量化的常见方法?GPTQ和AWQ的区别?¶
简答版: - 量化:将FP16/FP32权重压缩为INT8/INT4,减少显存和加速推理 - GPTQ:基于Hessian估计的逐层量化,精度高 - AWQ:保护"重要"通道(激活值大的通道),速度快
深入版:
后训练量化(PTQ) vs 量化感知训练(QAT):
PTQ: 模型训练好后直接量化, 无需重训, 方便
QAT: 训练过程中考虑量化误差, 精度更好, 成本高
GPTQ(GPT Quantization):
- 基于OBQ(Optimal Brain Quantizer)思想
- 逐层量化: 用一小批校准数据估计Hessian矩阵
- 量化一个权重后, 调整同层其他权重补偿误差
- 3-4bit精度与FP16几乎无损
- 速度: 量化过程较慢(需校准数据), 推理快
AWQ(Activation-aware Weight Quantization):
- 核心观察: 只有约1%的"显著"权重通道对精度影响大
- 通过观察激活值, 找到重要通道, 给予更高精度
- 对重要通道的权重做per-channel scaling后再量化
- 速度: 量化过程更快, 推理效率高
- 比GPTQ更适合大规模部署
选择:
精度优先 → GPTQ (比如用于生成高质量文本)
速度/易用优先 → AWQ (比如用于高吞吐在线服务)
极致压缩 → GGUF/GGML (llama.cpp生态, CPU推理)
Q14: vLLM的核心优化有哪些?¶
简答版: - PagedAttention(显存分页管理) - Continuous Batching(动态批处理) - Prefix Caching(系统Prompt缓存)
深入版:
vLLM关键优化:
1. PagedAttention:
KV Cache按Block分配(不预分配连续内存)
→ 显存利用率30% → 90%
→ 并发数提升2-4倍
2. Continuous Batching:
短请求完成后空位立即被新请求填入
→ 相比Static Batching, 吞吐提升2-3倍
3. Prefix Caching:
多个请求共享相同前缀(System Prompt)的KV Cache
→ 长System Prompt场景下减少50%+ Prefill时间
4. Tensor Parallelism:
模型切分到多张GPU, 支持大模型推理
单机8卡推理70B模型
5. Speculative Decoding(投机解码):
小模型草拟 + 大模型验证
→ 2-3x加速
6. Chunked Prefill:
长Prompt分块Prefill, 中间插入Decode步骤
→ 避免长Prompt阻塞其他请求
使用:
pip install vllm
vllm serve meta-llama/Llama-3-8B --dtype auto --max-model-len 8192
Q15: 什么是Mixture of Experts (MoE)?为什么DeepSeek-V3用它?¶
简答版: - MoE用门控网络选择性激活部分专家(FFN),总参数量大但每次推理只用一小部分 - 相同推理成本下获得更大模型的效果
深入版:
架构:
标准Transformer FFN: 所有token经过同一个FFN(全部参数激活)
MoE Transformer: FFN替换为N个Expert + Gate
Gate(x) → 选择Top-K个Expert → 加权求和Expert输出
例: DeepSeek-V3: 256个Expert, 每次选8个
总参数: 671B → 激活参数: ~37B
优势:
- 推理时只激活部分参数 → 推理成本接近37B模型
- 但模型容量等效671B → 效果接近超大密集模型
- 训练效率也更高(MoE可以更好地利用数据并行)
挑战:
- 负载均衡: 某些Expert被选中太多, 其他空闲
→ 辅助Loss鼓励均匀分配
- 通信开销: Expert分布在不同GPU, token需跨卡路由
→ 专家并行(EP)策略
- 显存: 总参数大(所有Expert都需加载)
→ 集群部署必须, 不适合端侧
Part D:RAG与Agent(7题)¶
Q16: RAG系统中,向量检索和BM25各自的优缺点?¶
简答版: - 向量检索:擅长语义匹配,不依赖关键词一致 - BM25:擅长精确关键词匹配,对专有名词/编号效果好 - 混合检索是标配
深入版:参见 AI系统设计面试/02-RAG系统设计深入 第2.2节
Q17: Agent中的ReAct、Function Calling、Tool Use有什么区别?¶
简答版: - ReAct:Thought-Action-Observation循环,基于Prompt工程的Agent范式 - Function Calling:模型原生支持结构化调用(OpenAI格式),由模型决定何时/如何调用 - Tool Use:更广义的概念,包含Function Calling和MCP协议
深入版:
ReAct (Prompt方式):
优点: 通用, 任何LLM都能用, 推理过程透明(有Thought)
缺点: 依赖Prompt格式, 解析不稳定, 容易格式错误
Function Calling (模型原生):
优点: 模型经过对齐训练, 输出结构化JSON, 可靠
缺点: 不是所有模型支持, 不同模型格式不同
MCP (Model Context Protocol):
优点: 标准化协议, 工具生态互通, 一次接入到处可用
缺点: 协议开销, 需要MCP Server
实践选择:
- 原型阶段: ReAct(快速验证)
- 生产阶段: Function Calling(可靠) + MCP(生态)
- 复杂系统: 多Agent框架(LangGraph/AutoGen)
Q18: 什么是上下文工程(Context Engineering)?与Prompt Engineering有什么区别?¶
简答版: - Prompt Engineering:关注单条指令的措辞和格式 - Context Engineering:关注整个上下文窗口的信息组织——什么信息送入、什么顺序、什么时候动态更新 - Context Engineering是2026年后的新范式,涵盖范围更大
深入版:
Prompt Engineering(2023-2025重点):
- 编写更好的指令(few-shot, CoT, 角色设定)
- 关注"怎么说"
Context Engineering(2025-2028重点):
- 管理整个上下文窗口的信息流
- 关注"该让模型看到什么"
核心技能:
1. 信息选择: 从海量信息中筛选最相关的放入上下文
2. 信息排序: 利用LLM对位置的敏感性(重要信息放开头/结尾)
3. Token预算管理: 上下文窗口有限, 如何分配给指令/检索结果/对话历史
4. 动态上下文: 根据对话进展动态更新上下文(加入新检索/工具结果)
5. 跨轮上下文: 长对话中如何压缩/摘要历史保留关键信息
面试考法:
"你的Agent系统上下文窗口8K, 单次要放系统Prompt(2K)+检索结果(3K)+对话历史(2K)+用户输入(1K), 但检索结果经常超出3K该怎么办?"
回答要点: 检索结果压缩/摘要, 对话历史滑动窗口+关键信息提取, Token预算动态分配
Part E:模型架构与前沿(5题)¶
Q19: MoE模型推理时的通信瓶颈在哪?怎么优化?¶
简答版: - 每个token需要被路由到不同GPU上的Expert,产生All-to-All通信 - 优化:专家并行+负载均衡+冗余Expert
深入版:
问题:
256个Expert分布在64张GPU上(每卡4个Expert)
每个token路由到8个Expert → 高概率需要跨卡通信
All-to-All通信: 每张卡把token发给需要的目标卡, 并接收其他卡的token
通信量 ∝ batch_size × hidden_dim × 跨卡Expert占比
优化:
1. 细粒度Expert并行: Expert分布考虑负载均衡
2. DeepSeek-MoE: 部分shared Expert保证基础能力, 减少路由通信
3. Expert冗余: 热门Expert在多卡上复制
4. 混合并行: TP(机内) + EP(跨机)
Q20: Transformer以外还有什么架构?Mamba/State Space Model是什么?¶
简答版: - Mamba/SSM:基于状态空间模型,线性复杂度O(n)替代Attention的O(n^2) - 对长序列高效,但在需要全局注意力的任务上效果不如Transformer
深入版:
SSM核心:
将序列建模为连续状态空间方程的离散化:
h_t = Ah_{t-1} + Bx_t (状态更新)
y_t = Ch_t (输出)
关键: A、B可以卷积化 → O(n log n)训练
Mamba改进:
让B、C、Δ依赖于输入(input-dependent) → 选择性SSM
→ 能根据内容选择性地记忆或忘记信息
Transformer vs Mamba:
Transformer: 训练O(n^2), 推理O(n)per step(有KV Cache)
Mamba: 训练O(n), 推理O(1)per step(固定状态)
Mamba推理时不需要KV Cache! → 显存固定, 超长序列更友好
现状(2026):
Mamba-2/Jamba等混合架构: Transformer层 + Mamba层交替
纯Mamba在需要精确回溯(如复制任务)上仍弱于Transformer
趋势: 混合架构可能成为下一代主流
篇幅所限,以上收录20道核心题。完整版另见各专题教程的面试章节。
最后更新:2026年2月