跳转至

大模型核心八股文 - 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是维度)

深入版

Text Only
详细步骤:
  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中多个卷积核捕捉不同特征

深入版

Text Only
实现:
  将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显存占用,加速推理,质量损失很小

深入版

Text Only
对比:
  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优化

深入版

Text Only
核心问题:
  标准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(旋转位置编码):通过旋转矩阵编码位置,支持长度外推

深入版

Text Only
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的注意力)

深入版

Text Only
无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

深入版

Text Only
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

深入版

Text Only
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

深入版

Text Only
动机: 预训练权重的变化量(Δ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:直接从偏好数据优化,不需要训练奖励模型,更简单稳定

深入版

Text Only
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用)

深入版

Text Only
假设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时使用

深入版

Text Only
场景: 想要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:保护"重要"通道(激活值大的通道),速度快

深入版

Text Only
后训练量化(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缓存)

深入版

Text Only
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),总参数量大但每次推理只用一小部分 - 相同推理成本下获得更大模型的效果

深入版

Text Only
架构:
  标准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协议

深入版

Text Only
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年后的新范式,涵盖范围更大

深入版

Text Only
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

深入版

Text Only
问题:
  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

深入版

Text Only
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月