Lecture 18: Large Language Models — RAG, Fine-tuning, Prompt Optimization, Safety

目录 · ← l17 · l19 →

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

【算法逻辑解说】

  1. Step 1 切块是关键设计:块太大 → 检索噪声多、超上下文窗口;块太小 → 语义破碎。按段落/语义边界切,可带重叠。
  2. Step 5 检索:近似最近邻(ANN)在百万级块上毫秒级返回——向量检索的工程化核心。
  3. Step 6 Prompt 组装:把检索结果原样放进上下文——LLM 的注意力机制(L17)会自动聚焦与问题相关的片段。
  4. Step 7 生成:LLM 在“开卷”条件下作答;可加“若资料中无答案,请说明”的指令抑制幻觉。
  5. Step 8 校验闭环:高级 RAG 增加重排序(rerank 精排 top_k)、生成后引用核查(对每个事实回查资料)——把“可能幻觉”变成“可追溯引用”。
  6. 评估指标:检索质量(Recall@k)与生成质量(答案正确率、引用忠实度)分开评测——定位瓶颈在检索还是生成。

关键要点

  1. RAG = 记忆外包:检索(向量相似度)→ 上下文 → 生成;幻觉↓、知识实时更新。
  2. 微调 = 行为定制:全量 or LoRA/PEFT;指令微调是“遵循指令”的关键步骤。
  3. 提示优化 = 零成本干预:few-shot、思维链、角色约束;先 prompt 后微调。
  4. 对齐(RLHF/DPO)把“能力”变成“可控性”;越狱/注入是持续的攻防。
  5. 选型矩阵:知识时效/私密 → RAG;风格/任务格式 → 微调;快速验证/低成本 → prompt。

常见误区与注意事项

  • RAG 检索质量差就怪 LLM:幻觉往往源于“检索不到”而非“生成不好”——先评估检索 Recall@k,再谈生成。
  • 微调“教新知识”:微调学新事实慢且易灾难性遗忘;知识类需求首选 RAG。
  • 过度微调导致能力退化:任务数据太少/太偏 → 通用能力下降(灾难性遗忘);用 LoRA 等 PEFT 缓解。
  • 把 prompt 工程当万能:复杂推理/严格格式需求下 prompt 收益有限——组合使用(prompt + RAG + 微调)才是实战。
  • 忽视注入攻击:把不可信外部文本拼进 prompt 可能被劫持——隔离不可信内容、输出过滤、权限最小化。
  • 安全评估只看基准:基准通过 ≠ 真实安全(越狱持续演化)——持续红队与监控。

思考题

  1. 问题:RAG 与微调在“知识更新”上的本质区别是什么?
    • 答案:RAG 的知识在外部索引——更新文档库即更新知识,LLM 权重不动;微调把知识写进权重——更新需重新训练,且新知识易与旧知识冲突(遗忘)。RAG 适合高频更新/私密数据;微调适合稳定行为模式。
  2. 问题:LoRA 为什么能以少量参数接近全量微调效果?
    • 答案:研究表明微调时权重更新的有效秩很低(本质低维)——$W + BA$ 用低秩矩阵 $BA$(秩 $r$)近似全秩更新 $\Delta W$,参数从 $d^2$ 降到 $2dr$。低秩假设在多数任务上成立,故效果好且可插拔(多个任务 LoRA 可叠加切换)。
  3. 问题:思维链提示为什么能提升推理?它可能失效在何处?
    • 答案:显式中间步骤把“一步到位”的高难度映射分解为多步低难度映射,且每一步都在上下文可见(注意力可聚焦),减轻单步出错的影响。失效场景:问题超出模型能力上限、提示诱导错误路径、对幻觉敏感的任务(编造的“推理”同样流畅)——所以需要验证/工具结合,而非盲信 CoT 输出。