LLM 基础与推理面试
LLM 基础与推理面试
基础理论
【困难】Transformer 架构的核心组件有哪些?Self-Attention 的计算过程是怎样的?⭐⭐⭐⭐
🎯 目标等级:L3 | ⏱ 建议用时:15 min | 🏷 标签:LLM / Transformer
💎 关键结论
"Transformer 由 Multi-Head Self-Attention + FFN + LayerNorm + Positional Encoding 构成;Self-Attention 本质是 softmax(QKᵀ/√d)V 的加权聚合。"
⚡ 记忆卡片
- 口诀:QKV 算注意力,多头拼接再投影,残差归一化,前馈加位置
- 关键词:Scaled Dot-Product Attention、Multi-Head、Positional Encoding、FFN、LayerNorm
- 链路:Input Embedding → +Positional Encoding → [Multi-Head Attention → Add&Norm → FFN → Add&Norm]×N → Output
📖 核心知识
核心组件一览
| 组件 | 作用 | 关键细节 |
|---|---|---|
| Input Embedding | 将 token 映射为 d_model 维向量 | 词表大小 × 隐藏维度 |
| Positional Encoding | 注入位置信息 | 正弦/余弦函数或可学习位置编码 |
| Multi-Head Self-Attention | 捕获 token 间的依赖关系 | h 个头并行计算注意力 |
| Feed-Forward Network (FFN) | 非线性变换 | 两层全连接 + ReLU/GELU |
| Add & Norm | 残差连接 + 层归一化 | 稳定训练、加速收敛 |
Self-Attention 计算过程
- 线性投影:输入 X 分别乘以 W_Q、W_K、W_V 得到 Q、K、V
- 注意力分数:Score = QKᵀ / √d_k(缩放防止梯度消失)
- 归一化:Attention = softmax(Score) × V
- 多头拼接:将 h 个头的输出拼接后乘以 W_O
公式:
Attention(Q, K, V) = softmax(QKᵀ / √d_k) V
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) W_O- 缩放因子 √d_k:防止点积值过大导致 softmax 进入梯度极小区域
- 时间复杂度:O(n² · d),其中 n 为序列长度,d 为隐藏维度
- 空间复杂度:O(n²),需存储 n×n 的注意力矩阵
🔬 扩展知识
扩展知识
【L3】位置编码的演进
- Sinusoidal PE(原始 Transformer):固定编码,泛化性好但无法学习
- 可学习 PE(GPT):训练中学习位置向量,受限于最大序列长度
- RoPE(旋转位置编码)(LLaMA、Qwen):将位置信息编码为旋转矩阵,支持长度外推
- ALiBi:用线性偏置替代位置编码,无需额外参数
【L3】注意力变体
- Sparse Attention:降低 O(n²) 复杂度,如 Longformer 的滑动窗口 + 全局注意力
- FlashAttention:IO 感知算法,避免在 SRAM 中物化完整注意力矩阵
【L4】为什么除以 √d_k 而不是其他值?
- 假设 Q 和 K 的元素独立标准正态分布,点积 QKᵀ 的方差为 d_k
- 除以 √d_k 使方差归一为 1,softmax 输入分布稳定
- 实验证明不缩放时,d_k 较大时 softmax 输出接近 one-hot,梯度消失
⚠️ 常见误区
常见误区
- 误区 1:认为 Attention 只关注相邻 token → 实际上 Self-Attention 可以捕获任意距离的依赖
- 误区 2:认为位置编码不重要 → 没有位置编码,Transformer 退化为 Bag-of-Words
- 误区 3:认为多头注意力增加了计算量 → 多头只是将 d_model 拆分为 h 份,总计算量与单头相当
🔀 发散问题
Q1:Transformer 为什么要用 LayerNorm 而不是 BatchNorm?
A1:LayerNorm 对单个样本的所有特征做归一化,不依赖 batch 维度,适合变长序列和小 batch 场景;BatchNorm 在 NLP 中 batch 内序列长度不一,统计量不稳定。
Q2:为什么 FFN 的中间维度是 4 × d_model?
A2:经验值。FFN 承担"知识存储"角色,更大的维度提供足够的表达能力;4 倍是原始论文的实验最优选择,后续模型沿用。
Q3:Self-Attention 的 O(n²) 复杂度有哪些优化方向?
A3:线性注意力(如 Performer)、稀疏注意力(如 Longformer)、FlashAttention(IO 优化而非算法复杂度优化)、Ring Attention(分布式长序列)。
【中等】Transformer 中 Multi-Head Attention 的作用是什么?为什么需要多个头?⭐⭐⭐⭐
🎯 目标等级:L2-L3 | ⏱ 建议用时:10 min | 🏷 标签:LLM / Attention
💎 关键结论
"Multi-Head Attention 将注意力拆分为多个子空间并行计算,使模型能同时关注不同语义维度的信息(如语法关系、语义相似性、位置模式等)。"
⚡ 记忆卡片
- 口诀:多头分空间,各学各模式,拼接再投影,表达更丰富
- 关键词:Representation Subspace、Concat、Linear Projection、Attention Pattern Diversity
- 链路:X → [Q₁K₁V₁, ..., QₕKₕVₕ] → Concat → W_O → Output
📖 核心知识
为什么单头不够?
- 单头注意力只能在一个表示子空间中学习一种注意力模式
- 语言具有多层次结构:词法、句法、语义、指代关系等
- 单头难以同时捕获这些不同维度的信息
多头机制的工作方式
| 步骤 | 操作 | 维度变化 |
|---|---|---|
| 1. 线性投影 | 每个头 i 有独立的 W_Qⁱ, W_Kⁱ, W_Vⁱ | d_model → d_k = d_model/h |
| 2. 并行注意力 | 每个头独立计算 Attention(Qⁱ, Kⁱ, Vⁱ) | seq_len × d_k |
| 3. 拼接 | Concat(head₁, ..., headₕ) | seq_len × d_model |
| 4. 线性投影 | 乘以 W_O | seq_len × d_model |
不同头学到的模式(可解释性研究)
- 某些头关注句法关系(主谓、动宾)
- 某些头关注指代消解(代词 → 先行词)
- 某些头关注局部位置(相邻 token)
- 某些头关注语义相似性
计算量分析
- 总计算量 ≈ 单头全维度注意力(因为 d_k = d_model / h)
- 多头的价值在于表达能力,而非增加计算量
🔬 扩展知识
扩展知识
【L3】GQA(Grouped-Query Attention)
- MQA:所有头共享一组 K、V,每个头有独立的 Q → 减少 KV Cache
- GQA:将头分为 g 组,每组共享 K、V → 性能与 MQA 和 MHA 之间的折中
- LLaMA 2 (70B)、Qwen 2 等采用 GQA
【L3】注意力头的冗余性
- 研究表明部分头的贡献较低,移除后影响有限
- "Head Pruning" 可作为模型压缩手段
- 不同层、不同头的功能分工随训练逐步涌现
⚠️ 常见误区
常见误区
- 误区 1:认为多头增加了总计算量 → 实际上 d_k = d_model/h,总计算量与单头全维度相当
- 误区 2:认为每个头必须学到不同的模式 → 训练中部分头可能学到冗余模式
- 误区 3:认为头数越多越好 → 头数过多导致每个头的维度太小,表达能力反而下降
🔀 发散问题
Q1:如何确定最优的头数?
A1:通常 d_model / d_k = h,d_k 一般取 64 或 128。经验法则:头数应能整除 d_model,且 d_k 不宜过小(≥32)。
Q2:MQA 和 GQA 的区别是什么?
A2:MQA 所有头共享一组 KV,GQA 分组共享。GQA 在推理效率(KV Cache 减小)和模型质量之间取得更好的平衡。
【中等】主流的大语言模型有哪些?GPT、LLaMA、Claude、Qwen 等有什么区别?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:LLM / 模型对比
💎 关键结论
"主流 LLM 在架构(Decoder-only / MoE)、训练数据、上下文长度、开源策略上各有侧重;选型需综合考虑性能、成本、部署约束和合规要求。"
⚡ 记忆卡片
- 口诀:GPT 闭源强,LLaMA 开源王,Claude 长文本,Qwen 中文强
- 关键词:Decoder-only、MoE、Context Window、Open-source、License
- 链路:Pre-training → SFT → RLHF/DPO → 部署
📖 核心知识
主流模型对比
| 模型 | 厂商 | 架构 | 开源 | 上下文 | 特点 |
|---|---|---|---|---|---|
| GPT-4o | OpenAI | Decoder-only(推测 MoE) | 否 | 128K | 多模态、综合能力强 |
| LLaMA 3 | Meta | Decoder-only | 是(Llama License) | 128K | 开源标杆、社区活跃 |
| Claude 3.5 | Anthropic | Decoder-only | 否 | 200K | 长文本、代码、安全性 |
| Qwen 2.5 | 阿里 | Decoder-only | 是(Apache 2.0) | 128K | 中文能力突出、工具调用 |
| DeepSeek-V3 | DeepSeek | MoE | 是(MIT) | 128K | MoE 架构、性价比高 |
| Mistral | Mistral AI | Decoder-only | 是 | 128K | 欧洲开源、效率优先 |
架构差异
- Dense(稠密)模型:每个 token 经过所有参数(GPT、LLaMA、Claude)
- MoE(混合专家)模型:每个 token 只激活部分专家(DeepSeek-V3、Mixtral),推理效率高但显存需求不减
开源 vs 闭源
| 维度 | 开源模型 | 闭源模型 |
|---|---|---|
| 可定制性 | 高(可微调、蒸馏) | 低(仅 API 调用) |
| 数据隐私 | 本地部署可控 | 依赖厂商合规 |
| 性能天花板 | 略低于顶尖闭源 | 通常最强 |
| 成本 | GPU 硬件成本 | API 按量付费 |
| 延迟 | 可控 | 受网络影响 |
🔬 扩展知识
扩展知识
【L3】Scaling Laws 与模型选型
- Chinchilla Scaling Law:最优训练 token 数 ≈ 20 × 参数量
- 模型越大不一定越好,需匹配训练数据量
- 小模型 + 多轮优化 vs 大模型 zero-shot 的权衡
【L3】MoE 架构详解
- 每个 token 由 Router 选择 Top-K 个 Expert 处理
- 总参数量大但激活参数量小 → 推理 FLOPs 低
- 挑战:Expert 负载均衡、显存占用(所有 Expert 需加载)
⚠️ 常见误区
常见误区
- 误区 1:参数量越大模型越好 → 训练数据量和质量同样关键(Chinchilla 定律)
- 误区 2:开源模型可以随意商用 → 需关注 License(如 LLaMA 的商用限制、CC-BY-NC-SA 等)
- 误区 3:MoE 模型推理更省显存 → MoE 减少的是计算量,显存仍需加载全部参数
🔀 发散问题
Q1:如何选择使用开源模型还是闭源 API?
A1:看数据隐私要求、定制需求(微调)、延迟要求、成本预算。数据敏感 + 需微调 → 开源;快速验证 + 无定制 → 闭源 API。
Q2:MoE 模型的负载均衡问题如何解决?
A2:通过辅助损失函数(Auxiliary Loss)惩罚不均衡的 Expert 分配,确保所有 Expert 被均匀使用。
【简单】什么是 Tokenizer?BPE、WordPiece、SentencePiece 有什么区别?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:8 min | 🏷 标签:LLM / Tokenizer
💎 关键结论
"Tokenizer 将文本切分为模型可处理的最小单元(token);BPE/WordPiece/SentencePiece 都是子词(Subword)分词算法,在词表大小与 OOV 问题之间取得平衡。"
⚡ 记忆卡片
- 口诀:BPE 合并高频对,WordPiece 最大似然,SentencePiece 语言无关
- 关键词:Subword Tokenization、Merge Rules、Vocabulary Size、OOV
- 链路:原始文本 → Tokenizer 切分 → Token ID 序列 → 模型输入
📖 核心知识
为什么需要子词分词?
- 词级:词表过大、无法处理未登录词(OOV)
- 字符级:序列过长、语义信息稀疏
- 子词级:平衡词表大小与语义表达,高频词完整保留,低频词拆分为子词
三种算法对比
| 维度 | BPE | WordPiece | SentencePiece |
|---|---|---|---|
| 核心思想 | 合并最高频相邻 token 对 | 合并使语言模型似然最大的 token 对 | 基于 BPE/Unigram,直接在 UTF-8 字节上操作 |
| 训练目标 | 频率统计 | 最大化训练数据似然 | 无语言依赖 |
| 输入单位 | 预分词(空格分割) | 预分词 | 原始文本(含空格) |
| 典型使用 | GPT 系列 | BERT | LLaMA、Qwen、T5 |
| 特殊处理 | 使用 Ġ 标记词边界 | 使用 ## 前缀标记非词首子词 | 用 ▁ 替代空格 |
词表大小的权衡
- 词表太小 → 序列变长、推理变慢、语义信息分散
- 词表太大 → Embedding 层参数增多、罕见 token 训练不充分
- 主流 LLM 词表:32K ~ 152K(Qwen 2.5 约 152K)
🔬 扩展知识
扩展知识
【L3】Token Merge 字节回退(Byte Fallback)
- 当子词仍无法覆盖时,回退到 UTF-8 字节级别
- 保证任何输入都能被 tokenize,彻底消除 OOV
- LLaMA、Qwen 等现代模型均采用此策略
【L3】Tokenizer 对多语言的影响
- 英文为主的 Tokenizer 对中文效率低(一个汉字可能拆为多个 token)
- Qwen 等中文优化模型扩大了中文高频词的覆盖
⚠️ 常见误区
常见误区
- 误区 1:Token 就是单词 → Token 可以是子词、字符甚至字节
- 误区 2:不同模型的 Tokenizer 相同 → 不同模型的词表和切分规则完全不同,token 数不可跨模型比较
- 误区 3:词表越大越好 → 需平衡 Embedding 成本与序列长度
🔀 发散问题
Q1:为什么不同模型的"token 数"不能直接比较?
A1:不同 Tokenizer 的词表和切分规则不同,同一段文本在不同 Tokenizer 下的 token 数可能差异 30% 以上。
Q2:Tokenizer 会影响模型性能吗?
A2:会。Tokenizer 的压缩率(字符数/token 数)直接影响模型的有效上下文长度和推理效率。
【中等】LLM 的预训练过程是怎样的?预训练数据如何准备?⭐⭐⭐⭐
🎯 目标等级:L3 | ⏱ 建议用时:12 min | 🏷 标签:LLM / 预训练
💎 关键结论
"预训练通过 Next Token Prediction(自回归语言建模)在海量文本上学习语言知识;数据质量、多样性和规模是决定模型能力的三大支柱。"
⚡ 记忆卡片
- 口诀:爬数据、去重复、清洗过滤、Next Token 预测到底
- 关键词:Next-Token Prediction、Data Pipeline、Scaling Laws、Data Parallelism、Model Parallelism
- 链路:数据采集 → 去重 → 清洗 → 质量过滤 → 混合配比 → 分布式训练
📖 核心知识
预训练目标
目标函数:L = -Σ log P(x_t | x_1, ..., x_{t-1})
即:最大化给定前文预测下一个 token 的概率数据准备流程
| 阶段 | 操作 | 说明 |
|---|---|---|
| 数据采集 | 爬取网页、书籍、代码、论文等 | Common Crawl、GitHub、arXiv 等 |
| 去重 | MinHash / Exact Dedup | 去除重复文档和跨源重复 |
| 清洗 | 去除 HTML 标签、乱码、广告 | 规则 + 分类器 |
| 质量过滤 | 训练质量分类器打分 | 基于 Wikipedia 等高质量语料训练 |
| 隐私过滤 | PII 检测与脱敏 | 去除手机号、身份证号等 |
| 数据配比 | 混合不同领域数据 | 代码、数学、通用文本按比例混合 |
训练基础设施
- 数据并行(Data Parallelism):每张 GPU 处理不同数据,梯度同步(AllReduce)
- 模型并行(Model Parallelism):
- Tensor Parallelism:单层内部矩阵运算拆分到多 GPU
- Pipeline Parallelism:不同层分配到不同 GPU
- ZeRO 优化:分片存储 Optimizer States、Gradients、Parameters
- 典型框架:Megatron-LM、DeepSpeed、FSDP
Scaling Laws
- 模型性能(Loss)与参数量 N、数据量 D、计算量 C 呈幂律关系
- L ∝ N^(-α) · D^(-β),α ≈ 0.076,β ≈ 0.095
- Chinchilla 最优:固定计算预算时,模型大小和数据量应同步扩展
🔬 扩展知识
扩展知识
【L3】数据配比的实践经验
- 代码数据比例提高 → 编程和推理能力提升
- 数学数据(如 GSM8K 解析)→ 数学推理提升
- 高质量数据(书籍、论文)→ 长文本理解和知识广度
- 重复数据(Epoch > 1)→ 可能导致过拟合和多样性下降
【L4】训练中的工程挑战
- 梯度裁剪(Gradient Clipping)防止梯度爆炸
- 学习率 Warmup + Cosine Decay
- 训练中断恢复(Checkpoint + 数据位点记录)
- Loss Spike 处理:跳过异常 batch 或回滚 checkpoint
⚠️ 常见误区
常见误区
- 误区 1:预训练只关心数据量 → 数据质量和多样性同样重要,1T 低质数据不如 100B 高质量数据
- 误区 2:模型越大效果一定越好 → 需匹配训练数据量(Chinchilla 定律)
- 误区 3:预训练一次就够了 → 持续预训练(Continual Pre-training)是补充知识的重要手段
🔀 发散问题
Q1:预训练数据中为什么要混入代码数据?
A1:代码数据具有高度结构化、逻辑性强的特点,能提升模型的推理能力和格式化输出能力。
Q2:什么是数据污染(Data Contamination)?
A2:评测数据泄漏到训练集中,导致评测分数虚高。常用检测方法:n-gram 重叠、隐私成员推断。
【困难】什么是 LLM 的对齐(Alignment)?SFT、RLHF、DPO 各自解决什么问题?⭐⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:15 min | 🏷 标签:LLM / 对齐
💎 关键结论
"对齐是让 LLM 从'能说话'变为'说好话'的过程:SFT 教会格式和指令遵循,RLHF/DPO 教会偏好判断和价值观对齐,形成 Pre-train → SFT → RLHF 的标准流水线。"
⚡ 记忆卡片
- 口诀:预训练学知识,SFT 学格式,RLHF 学偏好,DPO 省模型
- 关键词:Alignment、SFT、Reward Model、PPO、DPO、Preference Learning
- 链路:Pre-trained LM → SFT → Reward Model Training → PPO Optimization → Aligned LM
📊 量化参考
- SFT 数据量:高质量指令数据 10k~100k 条即可显著提升指令遵循能力,数据质量 > 数量
- RLHF/PPO 训练:Reward Model 训练需 100k
1M 偏好对,PPO 训练成本约为 SFT 的 23 倍 - DPO 简化:跳过 Reward Model,训练成本降低 50%+,效果与 RLHF 接近(InstructGPT 对比实验)
- 对齐评估:HHH(Helpful, Honest, Harmless)维度,GPT-4 在安全性评测中拒绝率 > 95%
- 训练资源:7B 模型 SFT 约需 8×A100 训练 1
3 天,RLHF 额外需 25 天
📖 核心知识
对齐的三层目标
| 层次 | 目标 | 示例 |
|---|---|---|
| 指令遵循(Helpful) | 按用户指令完成任务 | 回答准确、格式正确 |
| 真实可靠(Honest) | 不编造、不确定时说明 | 减少幻觉、表达不确定性 |
| 安全无害(Harmless) | 拒绝有害请求 | 不生成暴力、歧视内容 |
标准对齐流水线
Stage 1: Pre-training → 学习语言知识(next token prediction)
Stage 2: SFT → 在指令-回复对上微调,学会遵循指令
Stage 3: RLHF → 训练 Reward Model,用 PPO 优化策略各阶段详解
| 阶段 | 数据 | 方法 | 解决的问题 |
|---|---|---|---|
| SFT | 人工标注的 (指令, 理想回复) 对 | 监督学习,标准交叉熵 | 格式、指令遵循、对话能力 |
| Reward Model | 人工标注的 (prompt, 回复A, 回复B) 偏好对 | Bradley-Terry 模型 | 量化"好回复"的程度 |
| PPO (RLHF) | RM 打分 + 策略模型生成 | 强化学习,最大化奖励同时约束 KL 散度 | 对齐人类偏好 |
DPO 的简化
- 跳过 Reward Model 训练,直接在偏好对上优化策略
- 将 RLHF 的奖励函数隐式地用策略的 log-probability 比表示
- 损失函数:L_DPO = -log σ(β · (log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x)))
🔬 扩展知识
扩展知识
【L3】PPO 的训练挑战
- 需要同时维护 4 个模型:策略模型、参考模型、Reward Model、Value Model
- 超参数敏感(KL 系数、clip range、learning rate)
- 训练不稳定:reward hacking(模型找到 RM 漏洞而非真正提升)
【L3】RLHF vs DPO 的权衡
| 维度 | RLHF | DPO |
|---|---|---|
| 复杂度 | 高(4 个模型 + RL) | 低(2 个模型 + 分类损失) |
| 稳定性 | 较难训练 | 更稳定 |
| 灵活性 | 可在线探索 | 仅利用离线数据 |
| 效果 | 上限更高 | 接近或略低于 RLHF |
【L4】对齐税(Alignment Tax)
- 对齐后模型在某些任务(如数学、编码)上的能力可能下降
- 原因:偏好数据分布与预训练数据分布不一致
- 缓解方法:混合预训练数据、持续预训练、提高 SFT 数据质量
🏭 实战场景:从零对齐一个开源模型
实战场景:从零对齐一个开源模型
场景:基于 LLaMA 3 构建垂直领域助手
- SFT 阶段:收集 10K 条领域指令数据,使用 LoRA 微调
- 偏好数据:领域专家对模型输出进行排序,构建 5K 偏好对
- DPO 训练:使用 TRL 库进行 DPO 训练,β=0.1
- 评估:领域任务准确率 + 安全性评测 + 人工评估
⚠️ 常见误区
常见误区
- 误区 1:SFT 就够了,不需要 RLHF → SFT 只学格式,无法学到"哪个回复更好"的偏好判断
- 误区 2:DPO 完全替代了 RLHF → DPO 更简单但灵活性低,在线 RLHF 仍有不可替代的场景
- 误区 3:对齐是一次性的 → 对齐需要持续迭代,新场景需要新的偏好数据
🔀 发散问题
Q1:什么是 Reward Hacking?如何检测?
A1:模型找到 Reward Model 的漏洞获得高分但实际输出质量下降。检测方法:监控 reward 与人工评估的相关性,定期用新偏好数据重新校准 RM。
Q2:Constitutional AI(CAI)是什么?
A2:Anthropic 提出的方法,用 AI 反馈替代大量人工反馈。模型先自我批评、再自我修正,减少对人工标注的依赖。
Q3:对齐后的模型还能通过继续预训练恢复能力吗?
A3:可以,但可能部分丢失对齐效果。最佳实践是在对齐后使用 LoRA 等参数高效方法进行能力增强。
微调(Fine-tuning)
【中等】什么是大模型微调(Fine-tuning)?全量微调和参数高效微调(PEFT)有什么区别?⭐⭐⭐⭐
🎯 目标等级:L2-L3 | ⏱ 建议用时:10 min | 🏷 标签:LLM / 微调
💎 关键结论
"全量微调更新所有参数,效果上限高但成本巨大;PEFT(如 LoRA)冻结主干、只训练少量附加参数,成本低且效果接近全量微调。"
⚡ 记忆卡片
- 口诀:全量效果好但贵,PEFT 省钱又高效,LoRA 低秩加适配器,选哪个看数据和钱
- 关键词:Full Fine-tuning、PEFT、LoRA、Adapter、Frozen Backbone
- 链路:Pre-trained Model → [Full FT: 全部更新 | PEFT: 冻结主干 + 训练附加参数] → Task Model
📖 核心知识
全量微调 vs PEFT 对比
| 维度 | 全量微调 | PEFT(参数高效微调) |
|---|---|---|
| 更新参数 | 全部(数十亿~数千亿) | 少量(< 1%~5%) |
| 显存需求 | 极高(7B 模型需 ~60GB) | 低(7B 模型 ~16GB) |
| 训练速度 | 慢 | 快 |
| 效果上限 | 最高 | 接近全量微调 |
| 灾难性遗忘风险 | 较高 | 较低(主干保留) |
| 适用场景 | 大规模数据、领域适配 | 数据有限、资源受限 |
主流 PEFT 方法
| 方法 | 原理 | 额外参数 |
|---|---|---|
| LoRA | 低秩矩阵 W = W₀ + BA | ~0.1%-1% |
| Adapter | 在 Transformer 层间插入小型 MLP | ~1%-5% |
| Prefix Tuning | 在每层 attention 前添加可学习前缀 | ~0.1% |
| Prompt Tuning | 在输入层添加可学习 soft prompt | < 0.01% |
何时选择哪种?
- 数据量 > 100K + 充足 GPU → 全量微调
- 数据量 < 50K + 有限 GPU → LoRA / QLoRA
- 需要多个任务快速切换 → LoRA(只切换小权重文件)
- 极致资源受限 → Prompt Tuning / Prefix Tuning
🔬 扩展知识
扩展知识
【L3】LoRA 的合并优势
- 训练完成后,LoRA 权重可以合并回原始模型(W = W₀ + BA)
- 推理时无额外延迟,与原始模型速度一致
- 不同任务的 LoRA 权重可以热切换
【L3】DoRA(Weight-Decomposed Low-Rank Adaptation)
- 将权重分解为幅度(magnitude)和方向(direction)
- 仅对方向部分做 LoRA 微调,幅度单独学习
- 比 LoRA 更接近全量微调效果
⚠️ 常见误区
常见误区
- 误区 1:PEFT 效果远不如全量微调 → 大量实验表明 LoRA 在多数任务上接近全量微调
- 误区 2:PEFT 参数越少越好 → 参数太少可能欠拟合,需根据任务复杂度调整 rank
- 误区 3:微调不需要高质量数据 → 数据质量对微调效果的影响远大于预训练阶段
🔀 发散问题
Q1:微调后的模型能否用于多个任务?
A1:全量微调通常导致任务间干扰;LoRA 可以为每个任务训练独立的低秩权重,推理时按需加载。
Q2:微调数据量一般多少合适?
A2:高质量数据 1K-10K 条即可显著提升特定任务表现;超过 50K 条后边际收益递减。
【困难】LoRA 的原理是什么?它如何实现参数高效微调?⭐⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:12 min | 🏷 标签:LLM / LoRA
💎 关键结论
"LoRA 假设微调时权重变化矩阵 ΔW 是低秩的,用两个小矩阵 BA 的乘积近似 ΔW(r << d),从而将可训练参数量降低数个数量级。"
⚡ 记忆卡片
- 口诀:权重冻结加低秩,B 乘 A 来近似差,推理合并无延迟,参数省到百分一
- 关键词:Low-Rank Decomposition、ΔW = BA、Rank r、Merge、Frozen Weights
- 链路:W₀ (frozen) + B·A (trainable) → Forward: h = (W₀ + BA)x → Merge: W = W₀ + BA
📊 量化参考
- 参数效率:r=8 时,可训练参数仅为全量微调的 0.1%~1%(d=4096 时,全量 1600 万 vs LoRA 约 6.5 万/rank)
- 显存节省:7B 模型全量微调需 ~56GB 显存(FP32 梯度+优化器状态),LoRA r=8 仅需 ~12GB
- 训练速度:LoRA 训练速度与全量微调相当(前向传播仍需计算完整 W₀x),但反向传播仅计算 BA 梯度
- 典型配置:r=8
64,alpha=16128(alpha/r 比值通常为 2),target_modules 选 q_proj/v_proj 效果最佳 - 质量对比:r=8 在多数任务上接近全量微调(差距 < 1%),r=64 在复杂推理任务上优势明显
📖 核心知识
核心公式
原始权重:W₀ ∈ R^{d×d}(冻结)
低秩分解:ΔW ≈ BA,其中 B ∈ R^{d×r},A ∈ R^{r×d},r << d
前向传播:h = W₀x + BAx = (W₀ + BA)x
推理合并:W_merged = W₀ + BA(无额外推理开销)参数量对比(以 d=4096, r=8 为例)
| 方法 | 可训练参数 | 比例 |
|---|---|---|
| 全量微调 | 4096 × 4096 = 16.7M | 100% |
| LoRA (r=8) | 4096×8 + 8×4096 = 65K | 0.39% |
关键超参数
| 参数 | 说明 | 经验值 |
|---|---|---|
| r(秩) | 低秩矩阵的维度 | 8、16、64(任务越复杂 r 越大) |
| α(缩放因子) | 控制 LoRA 权重的影响力度 | 通常设为 2r 或 r |
| target modules | 应用 LoRA 的层 | Q、K、V、O 投影 + FFN 层 |
| dropout | LoRA 层的 dropout | 0.05 ~ 0.1 |
应用层的选择
- 最小集:Q、V 投影矩阵(原始 LoRA 论文)
- 推荐集:Q、K、V、O 四个投影矩阵
- 全集:所有线性层(包括 FFN)→ 效果最好,参数略多
🔬 扩展知识
扩展知识
【L3】为什么 ΔW 是低秩的?
- 预训练模型已经学到了良好的表示空间
- 任务适配只需要在预训练基础上做"小幅度调整"
- 这些调整的本质维度(intrinsic dimension)远小于参数空间维度
- 实验验证:即使 r 很小(如 4-8),LoRA 也能达到接近全量微调的效果
【L3】LoRA 的变体
- QLoRA:基础模型 4-bit 量化 + LoRA 适配器
- DoRA:分解幅度和方向,分别优化
- LoRA+:对 A 和 B 使用不同学习率,B 的学习率更大
- rsLoRA:缩放因子改为 α/√r 而非 α/r,提升大 r 时的稳定性
【L4】LoRA 与全量微调的理论联系
- LoRA 可以看作对权重更新空间施加了低秩约束
- 当 r = d 时退化为全量微调
- 最优 r 取决于任务复杂度和预训练模型的表达能力
🏭 实战场景:LoRA 微调参数调优
实战场景:LoRA 微调参数调优
场景:用 LoRA 微调 7B 模型做代码生成
- 初始实验:r=8, α=16, target=q_proj+v_proj → 效果一般
- 提升 rank:r=64, α=128 → 效果显著提升
- 扩大 target:target=q,k,v,o,gate,up,down → 进一步提升
- 最终配置:r=64, α=128, dropout=0.05, 全部线性层 → 接近全量微调效果
- 显存:单卡 24GB(RTX 4090)即可训练
⚠️ 常见误区
常见误区
- 误区 1:r 越大一定越好 → r 过大可能过拟合,需根据数据量调整
- 误区 2:LoRA 只能应用于 attention 层 → 可以应用于任何线性层,FFN 层同样有效
- 误区 3:LoRA 推理会变慢 → 合并后与原始模型推理速度完全一致
- 误区 4:α 和 r 必须相等 → α 是独立超参数,通常设为 2r
🔀 发散问题
Q1:LoRA 的 rank r 如何选择?
A1:简单任务(格式调整)r=4-8;中等任务(风格迁移)r=16-32;复杂任务(领域知识注入)r=64-128。
Q2:多个 LoRA 适配器能否叠加使用?
A2:理论上可以,但效果不可预测。实践中推荐为每个任务单独训练 LoRA,推理时按需加载。
【简单】什么是 QLoRA?它和 LoRA 有什么区别?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:8 min | 🏷 标签:LLM / QLoRA
💎 关键结论
"QLoRA = 4-bit 量化的基础模型 + LoRA 适配器,通过 NF4 量化、双重量化和分页优化器,使消费级 GPU(如 RTX 4090)也能微调 65B 级别的模型。"
⚡ 记忆卡片
- 口诀:基础量化四个 bit,LoRA 适配器高精度,双重量化省显存,分页优化不溢出
- 关键词:4-bit NF4 Quantization、Double Quantization、Paged Optimizer、BF16 Compute
- 链路:4-bit Quantized Base Model (frozen) + BF16 LoRA Adapters (trainable) → Training
📖 核心知识
QLoRA 的三大创新
| 技术 | 原理 | 效果 |
|---|---|---|
| NF4 量化 | 使用正态分布分位数量化权重 | 比均匀量化更优的信息保留 |
| 双重量化 | 对量化常数再次量化 | 每参数额外节省 ~0.37 bit |
| 分页优化器 | 利用 NVIDIA 统一内存处理显存峰值 | 避免 OOM 崩溃 |
LoRA vs QLoRA 对比
| 维度 | LoRA | QLoRA |
|---|---|---|
| 基础模型精度 | FP16/BF16 | NF4(4-bit) |
| 适配器精度 | FP16/BF16 | BF16 |
| 7B 模型显存 | ~16GB | ~6GB |
| 65B 模型显存 | ~130GB | ~48GB |
| 训练速度 | 快 | 慢 ~20-30%(量化/反量化开销) |
| 效果 | 接近全量微调 | 接近 LoRA(略有损失) |
显存节省原理
- FP16:每参数 2 字节 → 7B 模型 = 14GB
- NF4:每参数 0.5 字节 → 7B 模型 = 3.5GB
- 加上 LoRA 适配器和优化器状态,总显存 ~6GB
🔬 扩展知识
扩展知识
【L3】NF4 量化的原理
- 假设预训练权重服从正态分布 N(0, σ)
- 将 [-1, 1] 区间按正态分布的分位数划分为 16 个桶(4-bit = 16 个值)
- 每个桶的中心值作为量化码本
- 比均匀 INT4 量化更适合正态分布的权重
【L3】何时用 QLoRA vs LoRA?
- 显存充足(A100/H100)→ 用 LoRA,速度更快
- 显存受限(消费级 GPU)→ 用 QLoRA,可行性优先
- 追求极致效果 → LoRA;追求性价比 → QLoRA
⚠️ 常见误区
常见误区
- 误区 1:QLoRA 效果远不如 LoRA → 实验表明差距很小(<1%),多数场景可忽略
- 误区 2:QLoRA 推理也慢 → 推理时可将模型反量化回高精度,或使用量化推理框架
- 误区 3:量化后模型能力大幅下降 → 基础模型被冻结,量化只影响精度,LoRA 适配器提供任务适配能力
🔀 发散问题
Q1:QLoRA 微调后推理需要保持 4-bit 吗?
A1:不需要。可以将 LoRA 权重合并后反量化回 BF16 进行推理,也可以保持量化推理(如 GGUF 格式)。
Q2:QLoRA 能用于全量微调吗?
A2:不能。QLoRA 的核心是冻结量化基础模型 + 训练 LoRA 适配器,全量微调需要更新所有参数。
【中等】微调数据集如何准备?数据质量对微调效果有什么影响?⭐⭐⭐⭐
🎯 目标等级:L2-L3 | ⏱ 建议用时:10 min | 🏷 标签:LLM / 数据工程
💎 关键结论
"微调数据的质量比数量更重要:1K 条高质量数据的效果可能超过 100K 条噪声数据;标准格式为 instruction/input/output,需经过清洗、去重、多样性保证。"
⚡ 记忆卡片
- 口诀:数据质量定上限,格式统一三字段,去重清洗保多样,少而精胜过多而杂
- 关键词:Instruction-Input-Output、Data Quality、Dedup、Diversity、Data Flywheel
- 链路:数据收集 → 格式标准化 → 清洗过滤 → 去重 → 质量评估 → 多样性采样 → 训练
📖 核心知识
标准数据格式
{
"instruction": "将以下文本翻译为英文",
"input": "今天天气真好",
"output": "The weather is really nice today"
}数据质量的关键维度
| 维度 | 说明 | 影响 |
|---|---|---|
| 正确性 | 输出内容准确无误 | 错误数据直接毒化模型 |
| 一致性 | 同类任务格式统一 | 不一致导致模型困惑 |
| 多样性 | 覆盖任务的各个方面 | 单一数据导致过拟合 |
| 难度分布 | 简单到复杂合理分布 | 全简单→能力不足,全难→学不到基础 |
数据质量 vs 数量
| 数据量 | 效果趋势 | 适用场景 |
|---|---|---|
| 100-1K(高质量) | 显著提升特定能力 | 快速验证、风格调整 |
| 1K-10K | 稳定的任务适配 | 多数垂直领域 |
| 10K-100K | 边际收益递减 | 复杂领域知识注入 |
| > 100K | 接近饱和 | 大规模知识更新 |
数据飞轮(Data Flywheel)
线上服务 → 收集用户反馈 → 标注高质量数据 → 微调模型 → 部署上线 → 继续收集🔬 扩展知识
扩展知识
【L3】数据清洗实践
- 去除过短/过长的样本
- 去除包含敏感信息(PII)的样本
- 使用模型打分过滤低质量样本(如用 GPT-4 评分)
- 去除高度相似的重复样本(MinHash / Embedding 相似度)
【L3】Self-Instruct 与数据增强
- 用 LLM 自动生成指令-回复对
- 人工审核 + 过滤 → 半自动化数据生产
- Alpaca(52K 条)、Evol-Instruct(WizardLM)等方法
⚠️ 常见误区
常见误区
- 误区 1:数据越多越好 → 超过一定量后边际收益递减,低质数据反而有害
- 误区 2:用 GPT-4 生成的数据直接用于微调 → 需人工审核,模型生成数据可能有系统性偏差
- 误区 3:所有任务用同一种数据格式 → 不同任务可能需要不同的 prompt 模板和格式
🔀 发散问题
Q1:微调数据需要多少条?
A1:取决于任务复杂度。简单格式调整 100-500 条;中等任务 1K-10K 条;复杂领域知识 10K-50K 条。
Q2:如何评估微调数据的质量?
A2:人工抽检 + 自动化指标(格式合规率、长度分布、重复率)+ 小规模实验验证效果。
【困难】什么是灾难性遗忘(Catastrophic Forgetting)?微调中如何避免?⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:12 min | 🏷 标签:LLM / 微调
💎 关键结论
"灾难性遗忘指模型在微调学习新任务时,丢失了预训练阶段获得的通用能力;通过混合通用数据、LoRA 参数高效微调、渐进式解冻等策略可有效缓解。"
⚡ 记忆卡片
- 口诀:新学忘旧是灾难,混合数据做回放,低秩微调保主干,渐进解冻缓遗忘
- 关键词:Catastrophic Forgetting、Replay Buffer、EWC、LoRA、Gradual Unfreezing
- 链路:Fine-tune on task-specific data → 通用能力下降 → 混合 replay + 参数高效微调 → 缓解遗忘
📖 核心知识
什么是灾难性遗忘?
- 模型在任务 A 上训练后,在任务 B 上微调,导致任务 A 的性能大幅下降
- LLM 场景:微调后丧失通用对话能力、推理能力下降、知识遗忘
- 根本原因:梯度更新覆盖了预训练学到的通用表示
缓解策略
| 策略 | 原理 | 效果 |
|---|---|---|
| 数据回放(Replay) | 混合 10-30% 的通用数据 | 最直接有效 |
| LoRA / PEFT | 冻结主干,只更新少量参数 | 天然减少遗忘 |
| 渐进式解冻 | 从顶层开始逐层解冻 | 保护底层通用表示 |
| EWC | 对重要参数施加约束 | 理论优雅但计算开销大 |
| 低学习率 | 减小参数更新幅度 | 简单但有效 |
数据回放实践
训练数据 = 90% 任务数据 + 10% 通用数据(如 ShareGPT、OpenAssistant)
通用数据来源:
- 通用对话数据
- 推理数据(GSM8K 解析等)
- 指令遵循数据🔬 扩展知识
扩展知识
【L3】EWC(Elastic Weight Consolidation)
- 计算每个参数对原任务的重要度(Fisher 信息矩阵对角线)
- 在损失函数中添加正则项:重要参数的更新被惩罚
- L_total = L_new + (λ/2) · Σ Fᵢ · (θᵢ - θᵢ_original)²
- 缺点:需计算 Fisher 信息,大模型开销大
【L3】渐进式解冻(Gradual Unfreezing)
- 初始只解冻最顶层(LM Head + 最后几层 Transformer)
- 每隔 N 步解冻更多层
- 保护底层通用特征不被破坏
【L4】遗忘的检测方法
- 在通用 benchmark(MMLU、HellaSwag)上监控性能变化
- 在预训练数据上计算 perplexity 变化
- 对比微调前后在通用对话数据上的表现
- 定期做"能力回归测试"
🏭 实战场景:微调后模型变"笨"了
实战场景:微调后模型变"笨"了
问题:微调客服问答后,模型丧失了推理和代码能力
排查步骤:
- 检查训练数据:全部是客服 QA 对,无通用数据
- 检查学习率:过大(5e-4),导致参数偏移严重
- 检查训练轮数:5 epoch,过度拟合
解决方案:
- 混合 20% 通用推理数据
- 降低学习率到 1e-5
- 减少到 2 epoch
- 改用 LoRA(r=16)替代全量微调
⚠️ 常见误区
常见误区
- 误区 1:LoRA 完全不会遗忘 → LoRA 大幅减少但无法完全消除遗忘,仍需混合通用数据
- 误区 2:学习率不影响遗忘 → 学习率越大遗忘越严重,微调学习率应比预训练低 1-2 个数量级
- 误区 3:只训练 1 epoch 就不会遗忘 → 即使 1 epoch,如果数据分布差异大,仍会遗忘
🔀 发散问题
Q1:如何判断微调后是否发生了灾难性遗忘?
A1:在通用 benchmark(MMLU、HellaSwag、ARC)和通用对话数据上评测,与微调前对比。
Q2:持续微调多个任务时如何避免遗忘累积?
A2:每个阶段都混合通用数据;使用 LoRA 的增量叠加;定期用全量数据做回归训练。
【困难】什么是 Direct Preference Optimization(DPO)?它相比 RLHF 有什么优势和局限?⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:12 min | 🏷 标签:LLM / DPO
💎 关键结论
"DPO 跳过 Reward Model 训练,直接用偏好数据对优化策略模型;本质是将 RLHF 的奖励函数用策略的 log-probability 比隐式表示,训练更稳定但灵活性较低。"
⚡ 记忆卡片
- 口诀:DPO 省掉奖励模型,偏好对直接优化策略,训练稳定又简单,但少在线探索灵活性
- 关键词:Direct Preference Optimization、No Reward Model、Log-probability Ratio、Bradley-Terry、Offline
- 链路:SFT Model + Preference Pairs (y_w, y_l) → DPO Loss → Optimized Policy
📖 核心知识
DPO 核心公式
L_DPO = -E[log σ(β · (log π_θ(y_w|x)/π_ref(y_w|x) - log π_θ(y_l|x)/π_ref(y_l|x)))]
其中:
- y_w: 偏好回复(chosen)
- y_l: 非偏好回复(rejected)
- π_θ: 当前策略模型
- π_ref: 参考模型(通常是 SFT 模型)
- β: 温度参数,控制偏离参考模型的程度RLHF vs DPO 流程对比
| 步骤 | RLHF | DPO |
|---|---|---|
| 1 | 收集偏好数据 | 收集偏好数据 |
| 2 | 训练 Reward Model | 直接优化策略 |
| 3 | PPO 训练(4 个模型) | 标准分类损失(2 个模型) |
| 4 | 调 RL 超参数 | 调 β 和学习率 |
DPO 的优势
- 训练简单:标准交叉熵变体,无需 RL 框架
- 稳定性好:无 RL 训练的震荡和 reward hacking
- 资源需求低:只需维护策略模型和参考模型(2 个 vs 4 个)
- 超参数少:主要调 β 和学习率
DPO 的局限
- 离线方法:只能利用已有偏好数据,无法在线探索
- 分布外泛化弱:对训练中未见过的 prompt 类型效果有限
- 数据质量敏感:偏好标注的噪声直接影响效果
- 上限受限:缺少 RL 的探索能力,上限可能低于精心调优的 RLHF
🔬 扩展知识
扩展知识
【L3】DPO 的变体
- IPO(Identity Preference Optimization):解决 DPO 在确定性偏好下的过拟合
- KTO(Kahneman-Tversky Optimization):不需要成对偏好,只需"好/坏"标签
- ORPO(Odds Ratio Preference Optimization):结合 SFT 和偏好优化为一个阶段
- SimPO:移除参考模型,用序列平均 log-probability 替代
【L4】DPO 的理论基础
- 基于 Bradley-Terry 偏好模型
- 通过变量替换,将奖励函数表示为策略的函数:r(x,y) = β log(π(y|x)/π_ref(y|x)) + C
- 代入 RL 目标函数后得到闭式解,无需显式训练 RM
⚠️ 常见误区
常见误区
- 误区 1:DPO 完全替代了 RLHF → DPO 更简单但灵活性低,在线场景仍需 RLHF
- 误区 2:DPO 不需要参考模型 → DPO 需要 π_ref 来计算 KL 约束
- 误区 3:DPO 数据越多一定越好 → 数据质量比数量重要,噪声偏好对可能严重损害效果
🔀 发散问题
Q1:DPO 的 β 参数如何选择?
A1:β 控制策略偏离参考模型的程度。β 大 → 保守(接近 SFT);β 小 → 激进(可能不稳定)。经验值 0.01-0.5。
Q2:偏好数据中 chosen 和 rejected 的质量差距多大合适?
A2:差距太小(难以区分)→ 模型学不到有意义的偏好;差距太大(明显好坏)→ 容易过拟合。建议中等差距,包含细微的质量差异。
推理优化
【困难】什么是 KV Cache?它在 LLM 推理中起什么作用?⭐⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:12 min | 🏷 标签:LLM / 推理优化
💎 关键结论
"KV Cache 缓存自回归解码中已计算过的 Key/Value 张量,避免重复计算历史 token 的注意力,将推理复杂度从 O(n²) 降至 O(n);但显存随序列长度线性增长,是长文本推理的核心瓶颈。"
⚡ 记忆卡片
- 口诀:解码每步算历史,KV 缓存免重算,显存随长度线性涨,GQA 分组来帮忙
- 关键词:Autoregressive Decoding、KV Cache、Memory Growth、Eviction、GQA/MQA
- 链路:Token 生成 → 计算 Q、K、V → K/V 存入 Cache → 下一步用 Cache 中的 K/V → 避免重复计算
📊 量化参考
- 显存占用:LLaMA-2-7B 单请求 2048 tokens 的 KV Cache 约 1.07GB(32 层 × 2(K+V) × 32 头 × 128 维度 × 2048 × 2 bytes)
- 线性增长:KV Cache 随序列长度线性增长,128k 上下文时单请求 KV Cache 可达 30~40GB
- GQA 优化:Group Query Attention(如 LLaMA-2-70B 用 8 组)可将 KV Cache 缩小 8 倍,质量损失极小
- 推理吞吐:无 KV Cache 时 7B 模型 batch=1 约 20 tokens/s,有 KV Cache 可达 50~100 tokens/s
- PagedAttention:vLLM 通过分页管理 KV Cache,显存利用率提升 2
4 倍,吞吐提升 23 倍
📖 核心知识
为什么需要 KV Cache?
自回归解码中,每生成一个 token 需要对所有历史 token 计算注意力:
- 无缓存:第 t 步需重新计算前 t-1 个 token 的 K、V → 总计算量 O(n²)
- 有缓存:只计算第 t 个 token 的 K、V,历史 K、V 从缓存读取 → 每步 O(n),总计 O(n²) 但避免重复计算
KV Cache 显存占用
KV Cache 大小 = 2 × batch_size × num_layers × seq_len × d_model × dtype_bytes
示例(7B 模型,batch=1,seq=2048,FP16):
= 2 × 1 × 32 × 2048 × 4096 × 2 bytes
= ~1 GB| 模型规模 | seq_len=512 | seq_len=2048 | seq_len=8192 |
|---|---|---|---|
| 7B | 256 MB | 1 GB | 4 GB |
| 13B | 512 MB | 2 GB | 8 GB |
| 70B | 2.5 GB | 10 GB | 40 GB |
KV Cache 优化策略
| 策略 | 原理 | 效果 |
|---|---|---|
| MQA | 所有头共享一组 KV | 显存减少 h 倍 |
| GQA | 每组头共享一组 KV | 显存减少 h/g 倍 |
| KV Cache 量化 | FP16 → INT8/INT4 缓存 | 显存减少 2-4 倍 |
| PagedAttention | 虚拟内存分页管理 | 减少碎片,提高批处理效率 |
| 滑动窗口注意力 | 只缓存最近 W 个 token | 显存固定为 O(W) |
🔬 扩展知识
扩展知识
【L3】PagedAttention(vLLM 核心)
- 借鉴操作系统虚拟内存分页思想
- KV Cache 不需要连续内存,按块(block)分配
- 解决内存碎片和预分配浪费问题
- 支持 copy-on-write 实现 beam search 的 KV 共享
【L3】Cache 驱逐策略
- H2O(Heavy-Hitter Oracle):保留注意力权重最大的 token 的 KV
- StreamingLLM:保留初始 token(Attention Sink)+ 最近 token
- SnapKV:基于注意力分数选择重要 token 保留
【L4】KV Cache 与 Speculative Decoding 的交互
- 推测性解码中,draft model 和 target model 都需要 KV Cache
- 验证阶段需对齐两者的 KV Cache
- 被拒绝的 token 对应的 KV Cache 需要回滚
⚠️ 常见误区
常见误区
- 误区 1:KV Cache 是缓存输出 → KV Cache 缓存的是中间计算的 Key 和 Value 张量,不是输出 token
- 误区 2:KV Cache 不影响推理速度 → 虽然减少计算,但大量 KV Cache 读取带来 IO 开销,长序列时成为瓶颈
- 误区 3:GQA 会降低模型质量 → GQA 在合理配置下质量损失很小(如 LLaMA 2 70B 使用 GQA)
🔀 发散问题
Q1:KV Cache 的显存和计算哪个是推理瓶颈?
A1:短序列时计算密集(compute-bound);长序列时 KV Cache 读取成为瓶颈(memory-bound),即 IO 密集型。
Q2:如何估算推理时需要的总显存?
A2:总显存 = 模型参数 + KV Cache + 激活值 + 框架开销。7B FP16 模型参数 ~14GB,加上 KV Cache 和开销,推理 2K 上下文约需 16-18GB。
【中等】LLM 量化(Quantization)是什么?INT8、INT4 量化对效果有什么影响?⭐⭐⭐⭐
🎯 目标等级:L2-L3 | ⏱ 建议用时:10 min | 🏷 标签:LLM / 量化
💎 关键结论
"量化将模型权重从高精度(FP16/BF16)转换为低精度(INT8/INT4),减少显存占用和加速推理;INT8 几乎无损,INT4 有轻微质量下降但可接受。"
⚡ 记忆卡片
- 口诀:量化压精度,显存省倍数,INT8 几乎无损,INT4 略降但够用
- 关键词:Weight Quantization、Activation Quantization、GPTQ、AWQ、GGUF、Calibration
- 链路:FP16 模型 → 校准数据 → 量化(GPTQ/AWQ/GGUF)→ 低精度模型 → 推理加速
📖 核心知识
量化的基本原理
FP16 → INT8:每个参数从 2 字节 → 1 字节(2x 压缩)
FP16 → INT4:每个参数从 2 字节 → 0.5 字节(4x 压缩)
量化公式:q = round(x / scale + zero_point)
反量化:x ≈ (q - zero_point) × scale主流量化方法对比
| 方法 | 类型 | 精度 | 特点 |
|---|---|---|---|
| GPTQ | Post-training | INT4/INT8 | 基于二阶信息(Hessian),需校准数据 |
| AWQ | Post-training | INT4 | 保护显著权重(Activation-aware),更快 |
| GGUF (llama.cpp) | Post-training | 混合(Q4_K_M 等) | CPU 推理友好,多种量化格式 |
| QAT | 训练时 | INT8/INT4 | 训练中模拟量化,效果最好但成本高 |
量化对效果的影响
| 量化精度 | 显存节省 | 质量影响 | 适用场景 |
|---|---|---|---|
| FP16(基线) | 1x | 无 | 精度敏感场景 |
| INT8 | 2x | 几乎无损(<0.1%) | 通用部署 |
| INT4 (GPTQ/AWQ) | 4x | 轻微下降(1-3%) | 消费级 GPU 部署 |
| INT3/INT2 | 6-8x | 明显下降(5-15%) | 实验性/极端资源受限 |
量化格式选择(GGUF 为例)
| 格式 | 大小 | 质量 | 推荐度 |
|---|---|---|---|
| Q4_K_M | 4.5 bpw | 好 | 性价比最高 |
| Q5_K_M | 5.5 bpw | 很好 | 显存允许时首选 |
| Q6_K | 6.5 bpw | 极好 | 接近 FP16 |
| Q2_K | 2.5 bpw | 较差 | 仅实验用 |
🔬 扩展知识
扩展知识
【L3】AWQ 的核心思想
- 观察到 1% 的"显著权重"对模型质量影响巨大
- 这些显著权重对应于激活值较大的通道
- AWQ 保护这些通道使用更高精度,其余通道激进量化
- 效果优于 GPTQ 且速度更快(无需 Hessian 计算)
【L3】量化推理的性能
- INT4 量化减少显存带宽需求 → 长序列推理更快(memory-bound 场景)
- 但需要反量化计算 → 短序列时可能反而更慢
- 硬件支持:NVIDIA Ampere+ 支持 INT4 Tensor Core 加速
⚠️ 常见误区
常见误区
- 误区 1:量化后模型一定变差很多 → INT8 几乎无损,INT4 在多数任务上可接受
- 误区 2:量化只影响权重 → 激活量化同样重要且更具挑战(激活值分布更不均匀)
- 误区 3:量化后推理一定更快 → 在 compute-bound 场景可能更快,在 memory-bound 场景收益更大
🔀 发散问题
Q1:量化后的模型还能微调吗?
A1:QLoRA 就是在量化模型上做 LoRA 微调。但全量微调量化模型需要先反量化。
Q2:如何选择量化精度?
A2:根据显存预算:显存充足用 INT8;消费级 GPU 用 INT4 (Q4_K_M);极端受限用 INT3 但需验证效果。
【困难】什么是推测性解码(Speculative Decoding)?它如何加速推理?⭐⭐⭐⭐
🎯 目标等级:L3 | ⏱ 建议用时:12 min | 🏷 标签:LLM / 推理优化
💎 关键结论
"推测性解码用小模型(draft model)快速生成 K 个候选 token,再用大模型(target model)并行验证,接受正确部分、拒绝错误部分;利用大模型的并行验证能力将自回归解码的串行瓶颈转化为并行,实现无损加速。"
⚡ 记忆卡片
- 口诀:小模型快猜,大模型验证,接受对的拒绝错的,加速无损并行算
- 关键词:Draft Model、Target Model、Verification、Acceptance Rate、Speculative Decoding
- 链路:Draft Model 生成 K tokens → Target Model 并行验证 → Accept/Reject → 输出
📖 核心知识
自回归解码的瓶颈
- 标准解码:每步生成 1 个 token,需完整前向传播
- 大模型单次前向传播慢(数十亿参数)
- GPU 计算能力未充分利用(memory-bound)
推测性解码流程
1. Draft Model(小模型)自回归生成 K 个候选 token: y₁, y₂, ..., y_K
2. Target Model(大模型)一次前向传播,并行计算所有位置的分布
3. 从左到右验证:
- 对每个位置 i,比较 draft 和 target 的概率分布
- 以 min(1, p_target(y_i)/p_draft(y_i)) 的概率接受
- 第一个被拒绝的位置之后全部丢弃
4. 从拒绝位置重新采样一个 token,继续下一轮关键特性
| 特性 | 说明 |
|---|---|
| 无损性 | 数学保证输出分布与直接用 target model 采样完全一致 |
| 加速比 | 取决于 draft model 的准确率,通常 2-3x |
| 计算节省 | K 个 token 只需 1 次 target model 前向传播 |
| 适用场景 | 长文本生成、batch 推理 |
Draft Model 的选择
- 与 target model 同系列的小模型(如 LLaMA 7B → LLaMA 68M)
- 共享 tokenizer
- Draft 准确率越高,加速比越大
🔬 扩展知识
扩展知识
【L3】Self-Speculative Decoding
- 不需要单独的 draft model
- 利用 target model 的早期退出(early exit)层作为 draft
- 或使用 target model 的量化版本作为 draft
- 避免维护两个模型的额外开销
【L3】推测性解码的局限性
- Draft 准确率低时(<50%),加速效果有限甚至减速
- 需要额外加载 draft model 的显存
- 实现复杂度高于标准解码
- 对短文本生成收益不大
【L4】接受率的理论分析
- 期望接受长度 = Σᵢ Πⱼ₌₁ⁱ min(1, p_target(yⱼ)/p_draft(yⱼ))
- 当 draft 和 target 分布完全一致时,接受率 = 100%,加速比 = K
- 分布差异越大,接受率越低
⚠️ 常见误区
常见误区
- 误区 1:推测性解码会改变输出质量 → 数学保证输出分布完全一致,是无损加速
- 误区 2:Draft model 越大越好 → Draft model 太大会抵消加速效果,需平衡速度和准确率
- 误区 3:推测性解码适用于所有场景 → 对 compute-bound 场景效果有限,主要加速 memory-bound 场景
🔀 发散问题
Q1:推测性解码和 KV Cache 的关系是什么?
A1:两者互补。KV Cache 避免重复计算历史 token;推测性解码利用并行验证减少前向传播次数。
Q2:如何选择 K 值(推测步数)?
A2:K 太小加速有限;K 太大浪费计算(被拒绝的 token 多)。经验值 K=4-8,取决于 draft 准确率。
【中等】Continuous Batching 和 Static Batching 有什么区别?为什么 Continuous Batching 更优?⭐⭐⭐⭐
🎯 目标等级:L3 | ⏱ 建议用时:10 min | 🏷 标签:LLM / 推理优化
💎 关键结论
"Static Batching 等待 batch 中最慢的请求完成才处理下一批;Continuous Batching 允许请求在每次迭代时动态加入/离开,显著提高 GPU 利用率和吞吐量。"
⚡ 记忆卡片
- 口诀:静态等最慢,动态随时换,迭代级调度,吞吐量翻倍
- 关键词:Static Batching、Continuous/Dynamic Batching、Iteration-level Scheduling、Throughput
- 链路:请求到达 → 调度器分配 → 迭代级执行 → 完成即释放 → 新请求即时插入
📖 核心知识
Static Batching 的问题
Request A: ████████████████████████ (长文本)
Request B: ████████ (短文本)
Request C: ██████████████ (中文本)
时间线: |---A---B---C---|---A---C---|---A---|
↑ B 完成后 GPU 空闲等待 ↑ 整体延迟 = max(A,B,C)- 短请求完成后 GPU 资源浪费
- 新请求必须等待当前 batch 全部完成
- 吞吐量受限于最慢的请求
Continuous Batching 的优势
Request A: ████████████████████████
Request B: ████████ → 完成后立即插入 Request D
Request C: ██████████████ → 完成后立即插入 Request E
时间线: |A|B|C| → |A|D|C| → |A|D|E| → |A|E|
↑ 无空闲,GPU 持续满载对比总结
| 维度 | Static Batching | Continuous Batching |
|---|---|---|
| 调度粒度 | 请求级(batch 完成才换) | 迭代级(每步可调度) |
| GPU 利用率 | 低(等待最慢请求) | 高(即时填充) |
| 吞吐量 | 低 | 高(2-4x 提升) |
| 延迟 | 高(排队等待) | 低(即时处理) |
| 实现复杂度 | 简单 | 复杂(需管理动态 batch) |
| 代表框架 | 早期实现 | vLLM、TensorRT-LLM、TGI |
🔬 扩展知识
扩展知识
【L3】Continuous Batching 的实现挑战
- 需要动态管理 KV Cache(新请求分配、完成请求释放)
- PagedAttention 解决了 KV Cache 的碎片化问题
- 调度器需要维护每个请求的状态(prefill / decode / finished)
- 需处理 prefill 和 decode 阶段的混合调度
【L3】Chunked Prefill
- 长文本 prefill 会阻塞 decode 阶段
- 将 prefill 分块(chunk),与 decode 交替执行
- 降低 TTFT(Time To First Token)的波动
⚠️ 常见误区
常见误区
- 误区 1:增大 batch size 就能提高吞吐 → Static batching 中 batch size 受限于最长请求的显存,过大会浪费
- 误区 2:Continuous Batching 降低了单个请求的速度 → 单个请求速度基本不变,但整体吞吐量和延迟大幅改善
- 误区 3:Continuous Batching 只适用于在线服务 → 离线批处理同样受益
🔀 发散问题
Q1:Continuous Batching 对 TTFT 有什么影响?
A1:新请求到达后可以立即开始 prefill(如果有显存空间),无需等待当前 batch 完成,TTFT 显著降低。
Q2:vLLM 是如何实现 Continuous Batching 的?
A2:vLLM 使用 PagedAttention 管理 KV Cache(分页存储),配合迭代级调度器,在每步执行后动态添加/移除请求。
【简单】什么是模型蒸馏(Knowledge Distillation)?它在 LLM 场景下如何应用?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:8 min | 🏷 标签:LLM / 蒸馏
💎 关键结论
"模型蒸馏将大模型(Teacher)的知识迁移到小模型(Student),使小模型在保持较快速度的同时接近大模型的效果;LLM 场景下主要通过数据蒸馏(用大模型生成训练数据)实现。"
⚡ 记忆卡片
- 口诀:大模型教小模型,软标签传知识,数据蒸馏最实用,小模型快又准
- 关键词:Teacher-Student、Soft Labels、Data Distillation、Logit Distillation
- 链路:Teacher Model → 生成数据/软标签 → Student Model 学习 → 小而强的模型
📖 核心知识
蒸馏的基本框架
| 组件 | 说明 |
|---|---|
| Teacher Model | 大模型,能力强,推理慢 |
| Student Model | 小模型,速度快,需学习 |
| 知识传递 | 软标签(概率分布)或中间表示 |
| 损失函数 | KL 散度(软标签)+ 交叉熵(硬标签) |
LLM 蒸馏的两种模式
| 模式 | 方法 | 代表工作 |
|---|---|---|
| Logit 蒸馏 | Student 学习 Teacher 的输出概率分布 | DistilBERT |
| 数据蒸馏 | 用 Teacher 生成训练数据,Student 用标准 SFT 学习 | Alpaca、Orca、Phi |
数据蒸馏的优势(LLM 场景)
- 不需要同时加载 Teacher 和 Student
- Student 训练使用标准 SFT 流程,无需修改
- Teacher 可以是 API(如 GPT-4),无需开源
- 数据可复用、可过滤、可增强
经典案例
| 模型 | Teacher | Student | 方法 |
|---|---|---|---|
| Alpaca | GPT-3.5 | LLaMA 7B | 数据蒸馏(52K 指令) |
| Orca | GPT-4 | LLaMA 13B | 数据蒸馏 + 推理过程 |
| Phi-2 | 合成数据 | 2.7B | 教科书级数据蒸馏 |
| DeepSeek-R1-Distill | DeepSeek-R1 | Qwen/LLaMA 系列 | 推理链蒸馏 |
🔬 扩展知识
扩展知识
【L3】蒸馏的温度参数
- 温度 T > 1 使 softmax 输出更"软",暴露更多类间关系
- T = 1:标准 softmax(硬标签)
- T = 3-5:常用范围,平衡信息量和噪声
- T 过大:引入过多噪声;T 过小:退化为硬标签
【L3】蒸馏的局限
- 小模型容量有限,无法完全吸收大模型知识
- Teacher 的系统性偏差会传递给 Student
- 数据蒸馏受限于 Teacher 的输出质量
⚠️ 常见误区
常见误区
- 误区 1:蒸馏后小模型能达到大模型水平 → 小模型有容量上限,通常接近但无法超越 Teacher
- 误区 2:蒸馏只适用于分类任务 → LLM 场景下数据蒸馏已证明非常有效
- 误区 3:蒸馏需要 Teacher 和 Student 架构相同 → 数据蒸馏不要求架构一致
🔀 发散问题
Q1:数据蒸馏和直接用人工标注数据有什么区别?
A1:数据蒸馏成本低、速度快、可大规模生产;但可能继承 Teacher 的偏差和错误模式。人工标注质量更高但成本大。
Q2:蒸馏和微调的关系是什么?
A2:数据蒸馏本质上是一种特殊的微调——训练数据来自 Teacher 模型而非人工标注。微调框架(SFT + LoRA)相同。
【困难】FlashAttention 的核心思想是什么?它如何解决 Attention 的内存瓶颈?⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:12 min | 🏷 标签:LLM / 推理优化
💎 关键结论
"FlashAttention 通过分块计算(Tiling)避免在 SRAM 中物化完整的 N×N 注意力矩阵,利用 Online Softmax 技巧实现精确(非近似)的 IO 感知注意力计算,将内存复杂度从 O(N²) 降至 O(N),同时加速 2-4 倍。"
⚡ 记忆卡片
- 口诀:分块计算不存矩阵,在线 softmax 流式算,IO 感知精确解,内存加速双丰收
- 关键词:IO-Awareness、Tiling、Online Softmax、SRAM vs HBM、Exact Attention
- 链路:Q/K/V → 分块加载到 SRAM → 分块计算 Attention → Online Softmax 累积 → 写回 HBM
📖 核心知识
GPU 内存层次
| 内存 | 容量 | 带宽 | 速度 |
|---|---|---|---|
| SRAM(片上) | ~20 MB | ~19 TB/s | 极快 |
| HBM(显存) | ~40 GB | ~1.5 TB/s | 较慢 |
标准 Attention 的 IO 瓶颈
- 需计算并存储 N×N 的注意力矩阵 → O(N²) 内存
- N=4096 时,注意力矩阵 = 4096² × 4 bytes = 64 MB(超出 SRAM)
- 频繁的 SRAM ↔ HBM 读写成为瓶颈(memory-bound)
FlashAttention 的核心技术
Tiling(分块计算)
- 将 Q、K、V 分成大小为 B 的块
- 每次只加载一个块到 SRAM 计算
- 不物化完整 N×N 矩阵
Online Softmax
- 传统 softmax 需要先计算全局最大值(两遍扫描)
- Online Softmax:流式更新最大值和归一化因子
- 每处理一个块就更新结果,最终得到精确的 softmax 输出
重计算(Recomputation)
- 反向传播时不存储注意力矩阵
- 而是重新计算需要的块
- 用计算换内存
效果
| 维度 | 标准 Attention | FlashAttention |
|---|---|---|
| 内存复杂度 | O(N²) | O(N) |
| 速度 | 基线 | 2-4x 加速 |
| 精确性 | 精确 | 精确(非近似) |
| 支持序列长度 | 受限 | 支持极长序列(128K+) |
🔬 扩展知识
扩展知识
【L3】FlashAttention-2 的改进
- 优化 warp 级并行,减少非矩阵乘法运算
- 改进前向和反向的并行策略
- 在 A100 上达到 50-73% 的理论 FLOPs 利用率
- 支持 head dimension 的灵活配置
【L3】FlashAttention-3(Hopper 架构)
- 利用 H100 的异步执行特性(Tensor Memory Accelerator)
- 进一步重叠计算和内存访问
- 支持 FP8 注意力计算
【L4】Online Softmax 的数学推导
- 维护运行最大值 mⱼ 和归一化因子 lⱼ
- 每处理一个块 j:
- mⱼ = max(mⱼ₋₁, max(QKⱼᵀ))
- 更新指数和:lⱼ = e^{mⱼ₋₁ - mⱼ} · lⱼ₋₁ + Σe^
- 更新输出:Oⱼ = (lⱼ₋₁ · e^{mⱼ₋₁ - mⱼ} · Oⱼ₋₁ + e^{QKⱼᵀ - mⱼ} · Vⱼ) / lⱼ
- 最终 O = O_final,精确等价于标准 softmax attention
⚠️ 常见误区
常见误区
- 误区 1:FlashAttention 是近似算法 → 数学上精确等价于标准 Attention,只是计算顺序不同
- 误区 2:FlashAttention 减少了 FLOPs → FLOPs 相同,减少的是 HBM 读写次数(IO 优化)
- 误区 3:FlashAttention 只在推理时有用 → 训练时收益更大(节省 O(N²) 内存使长序列训练成为可能)
🔀 发散问题
Q1:FlashAttention 和 Sparse Attention 的区别是什么?
A1:FlashAttention 计算完整注意力(精确),只是优化了 IO;Sparse Attention 只计算部分注意力(近似),降低了算法复杂度。
Q2:FlashAttention 对所有模型都有效吗?
A2:对标准 Multi-Head Attention 最有效。GQA/MQA 同样支持。对于已经使用稀疏注意力的模型,FlashAttention 的额外收益较小。
评估
【中等】如何评估一个大语言模型(LLM)的效果?有哪些评估方法和维度?⭐⭐⭐⭐⭐
🎯 目标等级:L2-L3 | ⏱ 建议用时:12 min | 🏷 标签:LLM / 评估
💎 关键结论
"LLM 评估需多维度、多方法结合:自动指标(BLEU/ROUGE/Perplexity)提供快速筛选,Benchmark 套件(MMLU/HumanEval)提供标准化对比,LLM-as-Judge 提供灵活评估,人工评估是最终金标准。"
⚡ 记忆卡片
- 口诀:自动指标快筛选,基准测试做对比,LLM 评审灵活用,人工评估定乾坤
- 关键词:Automatic Metrics、Benchmark、LLM-as-Judge、Human Evaluation、Task-specific
- 链路:自动指标初筛 → Benchmark 标准化对比 → LLM-as-Judge 灵活评估 → 人工评估最终验证
📖 核心知识
评估方法分类
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 自动指标 | 快速、可复现、低成本 | 与人类判断相关性有限 | 翻译、摘要等结构化任务 |
| Benchmark 套件 | 标准化、可对比 | 数据污染风险、饱和问题 | 模型能力全景对比 |
| LLM-as-Judge | 灵活、低成本、可扩展 | 偏差问题、校准需求 | 开放域生成评估 |
| 人工评估 | 金标准 | 昂贵、慢、主观性 | 最终验证、关键决策 |
评估维度
| 维度 | 说明 | 评估方法 |
|---|---|---|
| 语言能力 | 语法、流畅度、连贯性 | Perplexity、人工评分 |
| 知识广度 | 事实准确性、覆盖面 | MMLU、TriviaQA |
| 推理能力 | 逻辑、数学、因果推理 | GSM8K、MATH、ARC |
| 代码能力 | 编程正确性、效率 | HumanEval、MBPP |
| 指令遵循 | 按指令完成任务 | IFEval、MT-Bench |
| 安全性 | 拒绝有害请求 | TruthfulQA、Red-teaming |
| 多语言 | 跨语言能力 | 多语言 benchmark |
常用自动指标
| 指标 | 适用任务 | 计算方式 |
|---|---|---|
| BLEU | 翻译 | n-gram 精确率 |
| ROUGE | 摘要 | n-gram 召回率 |
| Perplexity | 语言建模 | 预测不确定度 |
| Pass@K | 代码生成 | K 次采样中至少一次通过 |
| Exact Match | QA | 精确匹配率 |
🔬 扩展知识
扩展知识
【L3】评估的挑战
- 数据污染:测试数据泄漏到训练集 → 检测方法:n-gram 重叠、canary 注入
- Benchmark 饱和:模型在基准上接近满分,区分度下降 → 需要更难的新基准
- Goodhart 定律:当指标成为目标,它就不再是好指标 → 避免过度优化单一指标
【L3】评估最佳实践
- 多维度评估,不依赖单一指标
- 结合自动评估和人工评估
- 关注业务场景的特定评估
- 定期更新评估集,防止污染
⚠️ 常见误区
常见误区
- 误区 1:Benchmark 分数高 = 实际效果好 → Benchmark 可能不反映真实业务场景
- 误区 2:BLEU/ROUGE 分数高 = 生成质量好 → 这些指标只衡量表面重叠,不衡量语义质量
- 误区 3:一次评估就够了 → 模型更新后需重新评估,评估集需定期更新
🔀 发散问题
Q1:如何检测 Benchmark 数据污染?
A1:使用 n-gram 重叠检测训练数据与测试数据的重复;在训练数据中注入 canary 标记检测是否被学习。
Q2:业务场景下的评估和 Benchmark 评估有什么区别?
A2:Benchmark 评估通用能力,业务评估关注特定任务的表现。业务评估需构建领域 Golden Dataset,关注业务指标(如转化率、用户满意度)。
【中等】Embedding 模型的效果如何评估?有哪些核心指标?⭐⭐⭐⭐
🎯 目标等级:L2-L3 | ⏱ 建议用时:10 min | 🏷 标签:LLM / Embedding
💎 关键结论
"Embedding 模型评估核心在于检索质量和语义表达能力:检索用 Recall@K、MRR、NDCG 衡量排序能力;语义质量用相似度任务和相关性评测衡量;MTEB 提供标准化多维度评测。"
⚡ 记忆卡片
- 口诀:检索看排序,语义看相似,MTEB 全维度,任务定制更精准
- 关键词:Recall@K、MRR、NDCG、Semantic Similarity、MTEB
- 链路:Query → Embedding → 向量检索 → 排序 → 评估指标
📖 核心知识
检索质量指标
| 指标 | 含义 | 计算方式 |
|---|---|---|
| Recall@K | 前 K 个结果中包含正确答案的比例 | 命中数 / 总正确答案数 |
| MRR | 第一个正确结果的排名倒数的均值 | mean(1/rank_i) |
| NDCG@K | 考虑位置加权的排序质量 | DCG / IDCG |
| Hit Rate@K | 前 K 个结果中是否包含正确答案 | 二值指标 |
语义质量评估
| 任务 | 指标 | 说明 |
|---|---|---|
| 语义文本相似度(STS) | Spearman 相关系数 | 预测相似度 vs 人工标注 |
| 分类任务 | 准确率 | Embedding + 简单分类器 |
| 聚类任务 | ARI / NMI | Embedding 聚类 vs 真实标签 |
| 重排序 | NDCG | 两两比较的排序质量 |
MTEB(Massive Text Embedding Benchmark)
| 任务类型 | 数据集数 | 评估能力 |
|---|---|---|
| 分类 | 12 | 文本分类 |
| 聚类 | 11 | 无监督分组 |
| 配对分类 | 13 | 句子对判断 |
| 重排序 | 12 | 相关排序 |
| 检索 | 15 | 信息检索 |
| STS | 18 | 语义相似度 |
| 摘要 | 1 | 摘要质量 |
🔬 扩展知识
扩展知识
【L3】Embedding 模型的选型考量
- 维度:768(BERT)→ 1024(BGE)→ 1536(OpenAI)→ 3072(text-embedding-3-large)
- 维度越高表达能力越强,但存储和计算成本越高
- 需根据实际场景平衡精度和效率
- Matryoshka Representation Learning 支持灵活维度截断
【L3】领域适配评估
- 通用 benchmark 不能完全反映领域表现
- 需构建领域评测集:领域术语、特定查询模式
- A/B 测试:新旧 Embedding 模型在下游任务(如 RAG)上的对比
⚠️ 常见误区
常见误区
- 误区 1:余弦相似度高 = Embedding 好 → 需结合下游任务评估,高相似度可能只是表面特征
- 误区 2:维度越大一定越好 → 高维度增加存储和计算成本,需根据任务选择
- 误区 3:MTEB 排名高 = 所有任务都好 → MTEB 以英文为主,中文等其他语言需单独评估
🔀 发散问题
Q1:如何评估 Embedding 模型在 RAG 场景中的效果?
A1:构建领域 QA 评测集,用 Recall@K 衡量检索质量,用端到端的回答质量(faithfulness、relevance)衡量最终效果。
Q2:Embedding 模型和 Cross-Encoder 的区别是什么?
A2:Embedding(Bi-Encoder)分别编码 query 和 document,适合大规模检索;Cross-Encoder 联合编码 query-document 对,精度更高但无法用于大规模检索,常用于重排序。
【困难】RAG 系统的端到端评估如何设计?有哪些关键指标?⭐⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:15 min | 🏷 标签:LLM / RAG / 评估
📌 交叉引用:见 Agent 面试文档「RAG 系统如何评估?有哪些核心指标?」了解基础评估方法,本题聚焦端到端流水线评估设计。
💎 关键结论
"RAG 端到端评估需覆盖检索质量(Precision/Recall@K)、生成质量(Faithfulness/Relevance)和端到端效果(最终回答准确率)三个层面;RAGAS 框架提供了标准化的自动化评估方案。"
⚡ 记忆卡片
- 口诀:检索看召回,生成看忠实,端到端看准确率,RAGAS 框架全搞定
- 关键词:Retrieval Quality、Faithfulness、Answer Relevance、RAGAS、End-to-End Pipeline
- 链路:Query → Retrieval → Generation → Evaluation(检索评估 + 生成评估 + 端到端评估)
📊 量化参考
- 检索质量:Precision@5 > 0.7 为合格,Recall@10 > 0.8 为优秀;向量检索(BGE/E5)在 MTEB 榜单得分 60~70+
- 生成质量:Faithfulness(忠实度)> 0.8 表示幻觉率低,Answer Relevance > 0.7 表示回答切题
- 端到端指标:Answer Correctness(RAGAS)> 0.7 为合格;人工评估一致率 > 80% 表示自动评估可靠
- 评估成本:RAGAS 自动评估单次 < 1s(无需 LLM 调用),LLM-as-Judge 评估约 2~5s/条(需模型推理)
- Golden Dataset 规模:核心场景 200
500 条即可做回归测试,全面评估需 10005000 条覆盖边界情况
📖 核心知识
RAG 评估三层体系
| 层面 | 指标 | 说明 |
|---|---|---|
| 检索质量 | Precision@K、Recall@K、MRR | 检索到的文档是否相关、完整 |
| 生成质量 | Faithfulness、Answer Relevance | 回答是否忠于检索内容、是否切题 |
| 端到端 | Answer Correctness、Context Precision | 最终回答是否正确 |
RAGAS 框架核心指标
| 指标 | 计算方式 | 含义 |
|---|---|---|
| Faithfulness | 生成的声明数 / 忠于上下文的声明数 | 回答是否基于检索内容(无幻觉) |
| Answer Relevance | 从回答生成问题,计算与原始问题的相似度 | 回答是否切题 |
| Context Precision | 相关文档的排名加权 | 检索的排序质量 |
| Context Recall | 标准答案中的声明被上下文覆盖的比例 | 检索的完整性 |
| Answer Correctness | 语义相似度 + 事实重叠 | 最终回答的正确性 |
评估流水线设计
1. 构建 Golden Dataset
- (question, ground_truth_answer, relevant_contexts)
2. 运行 RAG Pipeline
- 对每个 question 执行检索 → 生成
3. 自动化评估
- 检索指标:对比 retrieved_contexts vs relevant_contexts
- 生成指标:RAGAS 计算 Faithfulness、Relevance
- 端到端指标:对比 answer vs ground_truth
4. 分析瓶颈
- Faithfulness 低 → 生成模型幻觉问题
- Context Recall 低 → 检索不完整
- Answer Relevance 低 → 生成偏离问题🔬 扩展知识
扩展知识
【L3】评估数据集构建
- 从真实用户查询中采样
- 领域专家标注 ground_truth 和 relevant_contexts
- 使用 LLM 辅助生成候选 QA 对,人工审核
- 覆盖边界情况和困难样本
【L3】在线评估 vs 离线评估
- 离线评估:Golden Dataset 上的标准化评测
- 在线评估:用户反馈(点赞/点踩)、回答采纳率
- 两者结合:离线发现问题,在线验证改进
【L4】评估的挑战
- Ground truth 标注成本高且主观
- 自动评估指标与人工判断的相关性有限
- RAG 组件间的交互效应难以隔离
- 评估集的代表性和覆盖度
🏭 实战场景:RAG 系统评估实战
实战场景:RAG 系统评估实战
场景:企业知识库 RAG 系统上线前评估
- 构建 Golden Dataset:200 条真实问题 + 专家标注答案和参考文档
- 检索评估:Recall@5 = 82%,发现部分专业术语召回不足
- 生成评估:Faithfulness = 0.89,Answer Relevance = 0.92
- 瓶颈分析:Context Recall 低(0.71)→ 检索不完整是主要问题
- 优化:改进 chunk 策略 + 增加同义词扩展 → Recall@5 提升至 91%
- 回归测试:建立 CI 流水线,每次模型/chunk 更新后自动评估
⚠️ 常见误区
常见误区
- 误区 1:只看端到端准确率 → 需分组件诊断,否则无法定位瓶颈
- 误区 2:自动评估指标完全可信 → 需定期与人工评估校准
- 误区 3:评估一次就够了 → RAG 系统需持续评估,数据更新、模型更换都需重新评测
🔀 发散问题
Q1:如何区分 RAG 系统中检索问题和生成问题?
A1:Faithfulness 低但 Context Precision 高 → 生成问题(模型不忠于上下文);Context Recall 低 → 检索问题(没找到相关文档)。
Q2:RAG 评估中如何处理开放性问题的 ground truth?
A2:使用 LLM-as-Judge 评估语义等价性;或构建"关键要点清单",评估回答覆盖了多少要点。
【困难】什么是 LLM-as-Judge?它的可靠性和局限性是什么?⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:12 min | 🏷 标签:LLM / 评估
💎 关键结论
"LLM-as-Judge 用强大的 LLM(如 GPT-4)评估其他模型的输出,具有灵活、低成本、可扩展的优势,但存在位置偏差、自我偏好偏差和校准问题,需与人工评估结合使用。"
⚡ 记忆卡片
- 口诀:LLM 当裁判,灵活便宜可规模化,位置偏好自我偏爱,人工校准不可少
- 关键词:LLM-as-Judge、Position Bias、Self-Preference Bias、Calibration、Pairwise Comparison
- 链路:Prompt + 候选回答 → LLM Judge → 评分/排序 → 与人工评估校准
📖 核心知识
LLM-as-Judge 的两种模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 绝对评分 | 对单个回答打分(1-10) | 快速筛选、趋势监控 |
| 成对比较 | 比较两个回答,选出更好的 | 更可靠、更接近人类判断 |
优势
- 成本低:比人工评估便宜 10-100 倍
- 速度快:分钟级完成评估
- 可扩展:可评估大量样本
- 灵活:可定义任意评估维度
- 可复现:相同输入得到相同输出(temperature=0)
已知偏差
| 偏差类型 | 说明 | 缓解方法 |
|---|---|---|
| 位置偏差 | 倾向选择第一个/最后一个回答 | 交换顺序取平均 |
| 自我偏好 | 偏好自己风格的回答 | 使用不同模型做 Judge |
| 长度偏差 | 倾向选择更长的回答 | 在 prompt 中明确长度不是标准 |
| verbosity | 偏好冗长而非简洁的回答 | 评估维度中加入简洁性 |
| 锚定效应 | 受评分顺序影响 | 随机化评估顺序 |
校准方法
1. 人工标注 100-200 条样本作为校准集
2. LLM Judge 评估相同样本
3. 计算一致性指标:
- 成对一致率(Pairwise Agreement)
- Spearman 相关系数
- Cohen's Kappa
4. 一致率 > 75% → 可信;< 60% → 需调整 prompt 或放弃🔬 扩展知识
扩展知识
【L3】提升 LLM-as-Judge 可靠性的方法
- 详细的评分标准(Rubric):明确每个分数段的定义
- Few-shot 示例:提供参考评估案例
- 多维度评估:分别评估不同维度而非整体打分
- 多 Judge 投票:使用多个 LLM 做 Judge 取共识
- 参考评估:提供 ground truth 作为参考
【L3】LLM-as-Judge 的适用边界
- 适合:开放域生成、对话质量、创意写作
- 不适合:事实准确性验证(需知识图谱)、数学正确性(需符号验证)、安全性评估(需红队测试)
【L4】Multi-Judge 框架
- 多个 LLM(不同模型/不同 prompt)独立评估
- 通过投票或加权平均得到最终评分
- 减少单一 Judge 的偏差
- 代价:成本增加、复杂度增加
⚠️ 常见误区
常见误区
- 误区 1:LLM-as-Judge 完全替代人工评估 → 只能作为补充,需定期人工校准
- 误区 2:GPT-4 做 Judge 一定准确 → 存在系统性偏差,需验证一致性
- 误区 3:绝对评分比成对比较更可靠 → 成对比较通常更可靠,人类和 LLM 都更擅长比较而非绝对评分
🔀 发散问题
Q1:如何选择 LLM-as-Judge 的模型?
A1:选择能力强于被评估模型的 LLM。评估 GPT-3.5 级别用 GPT-4;评估 GPT-4 级别需要更强模型或人工评估。
Q2:LLM-as-Judge 的 prompt 如何设计?
A2:明确评估维度和评分标准(rubric);提供 few-shot 示例;要求输出推理过程(chain-of-thought);避免引导性措辞。
【中等】什么是 LLM 基准测试(Benchmark)?MMLU、HumanEval、MT-Bench 分别评估什么?⭐⭐⭐⭐
🎯 目标等级:L2-L3 | ⏱ 建议用时:10 min | 🏷 标签:LLM / 评估
💎 关键结论
"Benchmark 是标准化评估 LLM 能力的测试套件:MMLU 测知识广度(57 学科),HumanEval 测代码生成(164 题),MT-Bench 测多轮对话质量;需警惕数据污染和基准饱和问题。"
⚡ 记忆卡片
- 口诀:MMLU 考知识,HumanEval 写代码,MT-Bench 聊多轮,GSM8K 算数学
- 关键词:MMLU、HumanEval、MT-Bench、GSM8K、Benchmark Contamination
- 链路:选择 Benchmark → 运行评测 → 计算指标 → 对比分析
📖 核心知识
主流 Benchmark 一览
| Benchmark | 评估维度 | 题目数 | 指标 | 说明 |
|---|---|---|---|---|
| MMLU | 知识广度 | 15.9K | 准确率 | 57 个学科(STEM、人文、社科等) |
| HumanEval | 代码生成 | 164 | Pass@1 | Python 编程题 + 单元测试 |
| MT-Bench | 多轮对话 | 80 | 平均分(1-10) | 8 类多轮对话任务 |
| GSM8K | 数学推理 | 8.5K | 准确率 | 小学数学应用题 |
| MATH | 数学推理 | 12.5K | 准确率 | 竞赛级数学 |
| HellaSwag | 常识推理 | 10K | 准确率 | 句子补全 |
| ARC | 科学推理 | 7.8K | 准确率 | 科学选择题 |
| TruthfulQA | 真实性 | 817 | 准确率 | 检测幻觉和错误信息 |
| WinoGrande | 常识推理 | 12.7K | 准确率 | 代词消解 |
三大 Benchmark 详解
MMLU(Massive Multitask Language Understanding)
- 覆盖 57 个学科:数学、物理、历史、法律、医学等
- 4 选 1 选择题格式
- 评估模型的世界知识和问题解决能力
- 变体:MMLU-Pro(更难)、MMLU-Redux(修正错误)
HumanEval
- 164 道 Python 编程题
- 给出函数签名和 docstring,补全函数体
- Pass@1:第一次生成通过单元测试的概率
- 变体:HumanEval+(更多测试用例)、MBPP(更多题目)
MT-Bench
- 80 个多轮对话问题(每轮 2 次交互)
- 8 类任务:写作、角色扮演、推理、数学、编码、知识提取、 STEM、人文
- 使用 GPT-4 做 Judge 评分(1-10 分)
- 评估对话连贯性、指令遵循、多轮上下文利用
🔬 扩展知识
扩展知识
【L3】Benchmark 的局限性
- 数据污染:测试数据可能出现在训练集中
- 检测方法:n-gram 重叠、canary 注入
- 影响:分数虚高,不可靠
- 饱和问题:顶尖模型在部分 benchmark 上接近满分
- MMLU 最高已超过 90%,区分度下降
- 需要更难的新 benchmark(如 MMLU-Pro)
- Goodhart 定律:过度优化 benchmark 导致"刷分"而非真正提升
【L3】新兴 Benchmark
- GPQA:研究生级科学问题(领域专家才能回答)
- SWE-bench:真实 GitHub Issue 修复
- Arena Hard:基于 Chatbot Arena 的 ELO 排名
- LiveBench:定期更新,防止数据污染
⚠️ 常见误区
常见误区
- 误区 1:Benchmark 分数高 = 模型好 → Benchmark 不反映所有能力维度,需结合业务评估
- 误区 2:所有 Benchmark 都公平 → 不同模型可能在特定 benchmark 上被优化(训练数据包含测试集)
- 误区 3:HumanEval Pass@1 = 实际编码能力 → 仅限 Python 简单函数,不代表复杂工程能力
🔀 发散问题
Q1:Chatbot Arena 的 ELO 排名是如何工作的?
A1:用户随机对比两个匿名模型的回答,投票选出更好的。使用 Bradley-Terry 模型计算 ELO 排名,接近真实偏好。
Q2:如何判断一个模型的 Benchmark 分数是否可信?
A2:检查是否有独立第三方复现;检查训练数据是否与测试集重叠;关注多个 benchmark 的综合表现而非单一分数。
【困难】如何设计一个面向业务的 LLM 评估体系?Golden Dataset 如何构建和维护?⭐⭐⭐⭐⭐
🎯 目标等级:L3-L4 | ⏱ 建议用时:15 min | 🏷 标签:LLM / 评估
💎 关键结论
"面向业务的评估体系需将业务目标映射为可量化指标,构建覆盖真实场景 + 边界情况 + 对抗样本的 Golden Dataset,建立自动化回归测试流水线,形成'评估 → 发现问题 → 优化 → 再评估'的持续改进闭环。"
⚡ 记忆卡片
- 口诀:业务指标定方向,Golden 数据是基石,自动流水线跑回归,持续改进成闭环
- 关键词:Business Metric Mapping、Golden Dataset、Automated Pipeline、Regression Testing、Continuous Improvement
- 链路:业务目标 → 评估维度 → Golden Dataset → 自动评估 → 回归测试 → 持续迭代
📊 量化参考
- Golden Dataset 规模:核心场景 200
500 条做回归测试,全面评估 10005000 条覆盖边界+对抗样本 - 标注质量:多人标注一致性(Fleiss Kappa)> 0.7 为合格,抽样审核准确率 > 95%
- 评估频率:每次模型/Prompt 变更触发回归测试,生产环境每日自动评估,耗时 10~30 分钟/轮
- 业务指标映射:用户满意度(CSAT)提升 5% 对应评估分数提升约 0.05~0.1,解决率提升 3% 对应幻觉率降低 10%
- LLM-as-Judge:与人工评估一致率 > 80% 可替代部分人工评估,成本降低 90%+(GPT-4 评分约 $0.03/条)
📖 核心知识
评估体系设计框架
| 层次 | 内容 | 说明 |
|---|---|---|
| L1 业务指标 | 用户满意度、转化率、解决率 | 最终业务目标 |
| L2 质量维度 | 准确性、相关性、安全性、流畅度 | 业务指标的分解 |
| L3 评测指标 | Exact Match、BLEU、LLM-as-Judge 分数 | 可自动化的量化指标 |
| L4 评测数据 | Golden Dataset | 评估的输入数据 |
Golden Dataset 构建方法
| 来源 | 方法 | 优缺点 |
|---|---|---|
| 真实案例 | 从线上日志采样 | 真实性高,但需标注 |
| 边界情况 | 领域专家构造 | 覆盖长尾,但成本高 |
| 对抗样本 | 红队测试/对抗生成 | 发现脆弱点,但可能不自然 |
| LLM 辅助生成 | 用 LLM 生成候选 QA 对 | 速度快,需人工审核 |
Golden Dataset 的质量要求
| 维度 | 要求 | 检查方法 |
|---|---|---|
| 覆盖度 | 覆盖所有业务场景和意图类型 | 场景矩阵检查 |
| 准确性 | ground truth 标注正确 | 双人标注 + 一致性检查 |
| 多样性 | 包含不同难度、长度、风格 | 分布分析 |
| 时效性 | 反映最新的业务需求 | 定期更新 |
| 规模 | 足够统计显著性 | 通常 200-1000 条 |
自动化评估流水线
代码提交 → 触发 CI → 加载 Golden Dataset → 运行模型推理
→ 计算评估指标 → 与基线对比 → 生成报告
→ 指标下降 → 阻断发布 + 告警
→ 指标提升 → 更新基线🔬 扩展知识
扩展知识
【L3】Golden Dataset 的维护
- 定期从线上 bad case 中补充新样本
- 每月/每季度 review 数据集的覆盖度
- 版本管理:每次修改记录变更原因
- 分级管理:核心集(不可变)+ 扩展集(可更新)
【L3】业务指标的映射方法
- 客服场景:解决率 → 回答准确性 + 信息完整性
- 搜索场景:点击率 → 检索 Recall + 摘要相关性
- 创作场景:用户采纳率 → 内容质量评分 + 格式正确率
【L4】评估体系的组织保障
- 评估 Owner:专人负责评估体系的维护和迭代
- 评审机制:模型上线前必须通过评估门禁
- 透明性:评估结果对全团队可见
- 复盘机制:线上问题回溯到评估缺陷,补充 Golden Dataset
🏭 实战场景:构建客服 LLM 评估体系
实战场景:构建客服 LLM 评估体系
业务目标:提升客服自动回复的解决率
定义评估维度:
- 回答准确性(是否正确解决问题)
- 信息完整性(是否提供足够信息)
- 安全性(是否泄露敏感信息)
- 语气(是否礼貌专业)
构建 Golden Dataset:
- 从历史工单中采样 500 条(覆盖 Top 20 问题类型)
- 添加 50 条对抗样本(诱导泄露信息、情绪化输入)
- 双人标注 ground truth,一致性 > 85%
自动化流水线:
- 每日运行评估,生成指标趋势图
- 模型更新前必须通过回归测试
- 指标低于阈值自动告警
持续改进:
- 每周分析 bad case,补充 Golden Dataset
- 每月评估维度 review,调整权重
⚠️ 常见误区
常见误区
- 误区 1:Golden Dataset 建一次就够了 → 业务在变,数据需持续更新
- 误区 2:评估体系只看准确率 → 需多维度评估,准确率只是其一
- 误区 3:自动化评估完全替代人工 → 自动化做日常回归,人工做定期深度评估
- 误区 4:Golden Dataset 越大越好 → 质量比数量重要,500 条高质量数据 > 5000 条噪声数据
🔀 发散问题
Q1:Golden Dataset 的标注一致性如何保证?
A1:制定详细标注指南;双人独立标注 + 计算 Cohen's Kappa;分歧由第三人仲裁;定期校准标注员。
Q2:如何衡量评估体系本身的有效性?
A1:追踪评估分数与业务指标的相关性;如果评估分数提升但业务指标未改善,说明评估体系需要调整。