Lecture 18: Large Language Models — RAG, Fine-tuning, Prompt Optimization, Safety
Lecture 18: Large Language Models — RAG, Fine-tuning, Prompt Optimization, Safety
概述
上一讲回答了“LLM 如何工作”;本讲回答工程问题:“如何把 LLM 用于真实任务并控制风险”。四大主题:RAG(外挂知识库缓解幻觉与时效)、微调(用任务数据调整模型)、提示优化(不改权重只改输入)、安全(对齐、越狱、隐私)。核心思想:知识更新、行为定制、成本控制、风险治理各有各的工具箱。
核心概念与数学直觉
- RAG(检索增强生成, Retrieval-Augmented Generation):
- 动机:LLM 的知识截止于训练时刻;幻觉(编造事实)源于“凭记忆作答”。RAG = 先检索再生成:把外部知识库作为“开卷考试”的参考书。
- 流程:查询 → 检索相关文档片段(向量相似度)→ 拼接进 prompt → LLM 基于上下文生成。
- 向量检索:文档切块 → 嵌入向量 → 建索引(FAISS);查询嵌入后找余弦相似度最高的 $k$ 个片段。余弦相似度:$\cos(u,v) = \frac{u \cdot v}{\vert u\vert \vert v\vert }$——只关心方向(语义)不关心长度。
- 为什么有效:把“事实记忆”外包给检索器,LLM 只需“阅读理解 + 组织语言”——记忆与推理解耦;幻觉率显著下降、知识可实时更新(更新文档库即可)。
- 局限:检索质量决定上限(检索不到 → 生成没依据);长文档切片策略、重排序(rerank)影响精度。
- 微调 (Fine-tuning):
- 思想:在预训练权重上继续训练,适配特定任务/风格/领域。
- 全量微调:更新全部参数——效果好但代价高(每任务一套模型)。
- 参数高效微调 (PEFT):只更新少量参数。
- LoRA:冻结原权重 $W$,训练低秩增量 $W + BA$($B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times d}, r \ll d$)——微调成本与存储大降,效果接近全量微调。
- Adapter:在层间插入小模块。
- 指令微调 (Instruction Tuning):用“(指令, 期望回答)”对训练——让模型学会“遵循指令”而非只是续写(对齐的第一步)。
- 与 RAG 对比:微调改行为/风格(内部知识固化);RAG 改知识(外部动态)。知识时效性/私密知识 → RAG;风格/任务格式 → 微调。
- 提示优化 (Prompt Optimization):
- 思想:不更新权重,只改进输入(few-shot 示例、思维链、角色设定、格式要求)。
- Few-shot 与思维链 (CoT):给 2–5 个示例(few-shot);要求“逐步推理”(Chain-of-Thought)——把复杂问题分解为中间步骤,显著提升数学/逻辑任务表现。
- 系统化方法:人工迭代(基线 → 加示例 → 加约束 → 验证)或自动优化(如 OPRO、DSPy 把 prompt 当可优化变量,用搜索/LLM 反馈迭代)。
- 何时用:任务简单/成本敏感/快速验证——先试 prompt;任务复杂/格式严格/数据量大——再考虑微调。
- 安全 (Safety) 与对齐 (Alignment):
- 对齐目标:让模型输出符合人类意图与价值观(helpful, honest, harmless)。
- RLHF(人类反馈强化学习):三步——监督微调(SFT)→ 训练奖励模型(比较人类对回答的偏好)→ 用 PPO 类算法优化策略以最大化奖励。
- DPO(直接偏好优化):跳过显式奖励模型,直接用偏好数据更新策略——更简单稳定。
- 越狱 (Jailbreak) 与注入 (Prompt Injection):对抗性 prompt 绕过安全训练(如“假装你是无约束模型”);注入攻击=在输入中隐藏指令劫持行为。
- 治理手段:输入/输出过滤、内容审查、系统提示约束、红队测试(主动攻击找漏洞)、评估基准。
- 隐私:训练数据可能泄露个人信息(记忆攻击);联邦学习/差分隐私/数据脱敏是缓解方向(L19–20 深入)。
算法伪代码与逻辑解说:RAG 流水线
伪代码
输入:
- 知识库文档集 D,查询 q,嵌入模型 E,LLM G,检索数 k
输出:
- 基于检索上下文的生成答案 a
离线阶段(构建索引):
1. 把 D 切块为 Chunks = {c_1, ..., c_N}(按语义边界,块大小 ~200-500 token)
2. 对每个块 c_j: vec_j = E(c_j) // 嵌入到 d 维
3. 建立向量索引(如 FAISS,支持近似最近邻)
在线阶段(推理):
4. 查询嵌入: q_vec = E(q)
5. 检索: top_k = 索引中与 q_vec 余弦相似度最高的 k 个块
6. 组装 prompt:
"根据以下资料回答问题。资料: [top_k 拼接] 问题: q"
7. a = G(prompt) // LLM 生成(如 L17 的自回归解码)
8. (可选)后处理: 引用标注、答案校验(LLM 自检/检索回查)
9. 返回 a
【算法逻辑解说】
- Step 1 切块是关键设计:块太大 → 检索噪声多、超上下文窗口;块太小 → 语义破碎。按段落/语义边界切,可带重叠。
- Step 5 检索:近似最近邻(ANN)在百万级块上毫秒级返回——向量检索的工程化核心。
- Step 6 Prompt 组装:把检索结果原样放进上下文——LLM 的注意力机制(L17)会自动聚焦与问题相关的片段。
- Step 7 生成:LLM 在“开卷”条件下作答;可加“若资料中无答案,请说明”的指令抑制幻觉。
- Step 8 校验闭环:高级 RAG 增加重排序(rerank 精排 top_k)、生成后引用核查(对每个事实回查资料)——把“可能幻觉”变成“可追溯引用”。
- 评估指标:检索质量(Recall@k)与生成质量(答案正确率、引用忠实度)分开评测——定位瓶颈在检索还是生成。
关键要点
- RAG = 记忆外包:检索(向量相似度)→ 上下文 → 生成;幻觉↓、知识实时更新。
- 微调 = 行为定制:全量 or LoRA/PEFT;指令微调是“遵循指令”的关键步骤。
- 提示优化 = 零成本干预:few-shot、思维链、角色约束;先 prompt 后微调。
- 对齐(RLHF/DPO)把“能力”变成“可控性”;越狱/注入是持续的攻防。
- 选型矩阵:知识时效/私密 → RAG;风格/任务格式 → 微调;快速验证/低成本 → prompt。
常见误区与注意事项
- RAG 检索质量差就怪 LLM:幻觉往往源于“检索不到”而非“生成不好”——先评估检索 Recall@k,再谈生成。
- 微调“教新知识”:微调学新事实慢且易灾难性遗忘;知识类需求首选 RAG。
- 过度微调导致能力退化:任务数据太少/太偏 → 通用能力下降(灾难性遗忘);用 LoRA 等 PEFT 缓解。
- 把 prompt 工程当万能:复杂推理/严格格式需求下 prompt 收益有限——组合使用(prompt + RAG + 微调)才是实战。
- 忽视注入攻击:把不可信外部文本拼进 prompt 可能被劫持——隔离不可信内容、输出过滤、权限最小化。
- 安全评估只看基准:基准通过 ≠ 真实安全(越狱持续演化)——持续红队与监控。
思考题
- 问题:RAG 与微调在“知识更新”上的本质区别是什么?
- 答案:RAG 的知识在外部索引——更新文档库即更新知识,LLM 权重不动;微调把知识写进权重——更新需重新训练,且新知识易与旧知识冲突(遗忘)。RAG 适合高频更新/私密数据;微调适合稳定行为模式。
- 问题:LoRA 为什么能以少量参数接近全量微调效果?
- 答案:研究表明微调时权重更新的有效秩很低(本质低维)——$W + BA$ 用低秩矩阵 $BA$(秩 $r$)近似全秩更新 $\Delta W$,参数从 $d^2$ 降到 $2dr$。低秩假设在多数任务上成立,故效果好且可插拔(多个任务 LoRA 可叠加切换)。
- 问题:思维链提示为什么能提升推理?它可能失效在何处?
- 答案:显式中间步骤把“一步到位”的高难度映射分解为多步低难度映射,且每一步都在上下文可见(注意力可聚焦),减轻单步出错的影响。失效场景:问题超出模型能力上限、提示诱导错误路径、对幻觉敏感的任务(编造的“推理”同样流畅)——所以需要验证/工具结合,而非盲信 CoT 输出。
