L10: RAG and Language Agents

Week 5 · Thu Feb 05 2026 08:00:00 GMT+0800 (中国标准时间)

进度: 0/22 (0%)
下载 PDF
/ 0
100%
正在加载 PDF...

L10: RAG and Language Agents

  • A4 released, A3 due

Slides

中英交替版(推荐)

L10 双语 (PDF)

英文原版

L10 EN (PDF)

中文翻译版

L10 ZH (PDF)

核心知识点

0. PEFT 续讲 — Adapters

Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9
  • 函数组合视角、瓶颈设计、语言 adapter

📐 Adapter 的数学结构

Adapter 在每个 Transformer 子层后插入一个瓶颈模块:

hh+f(hWdown)Wuph \leftarrow h + f(h W_{down}) W_{up}

其中:

  • WdownRd×rW_{down} \in \mathbb{R}^{d \times r}(下投影,rdr \ll d
  • WupRr×dW_{up} \in \mathbb{R}^{r \times d}(上投影)
  • ff:非线性激活(通常 ReLU 或 GELU)
  • 残差连接保证初始化时 hhh \leftarrow hWdown,WupW_{down}, W_{up} 初始化为近零)

与 LoRA 的对比(LoRA 直接修改权重矩阵):

W=W+ΔW=W+AB,ARd×r,BRr×dW' = W + \Delta W = W + AB, \quad A \in \mathbb{R}^{d \times r}, B \in \mathbb{R}^{r \times d}

两者都用秩 rr 分解控制参数量,但 Adapter 在推理时有额外延迟,LoRA 可以合并权重消除额外延迟。

📚 已收录至 拓展阅读知识库

🔢 数值/具体示例

Adapter(Houlsby et al., 2019)在 GLUE 基准上的参数效率:

方法可训练参数GLUE 平均分
Full fine-tuning(BERT-Large)330M(100%)80.4
Adapter(r=64r=64~3.6M(1%)80.0
LoRA(r=8r=8~0.3M(0.09%)79.8

用 1% 的参数换来 99.5% 的性能保留——这是 PEFT 方法的价值所在。

⚠️ 常见误区

  1. 误区:Adapter 和 LoRA 效果相同可以互换 → 正确:Adapter 在推理时有额外的顺序计算(瓶颈前向传播),在批处理推理中会增加延迟;LoRA 可以将 ΔW\Delta W 合并到原始权重(W=W+ABW' = W + AB),推理时零额外开销

1. Question Answering 与 RAG

阅读理解(Reading Comprehension)

Slide 10 Slide 11 Slide 12 Slide 13
  • 给定段落 + 问题,提取答案 span
  • 传统方法:特征工程 + 逻辑回归
  • 神经方法:BERT 编码 [CLS] Question [SEP] Paragraph,预测 start/end 位置

开放域问答(Open-domain QA)

Slide 14
Slide 14
Slide 15
Slide 15
Slide 16
Slide 16
  • 不假设给定段落,从大规模文档集(如 Wikipedia)中找答案
  • Retriever-Reader 框架:Retriever 检索 top-K 文档,Reader 从中抽取答案

检索增强生成(RAG)

Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22
  • 核心动机:LM 无法记住所有知识,检索提供即时相关信息
  • 优势:动态(可更新文档库)+ 可解释(可追溯引用来源)
  • RAG 架构(Lewis et al., 2021):Query Encoder + Document Index (MIPS) + Generator
  • 端到端训练 retriever 和 generator

检索器类型

Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28
  • 词重叠:BM25(稀疏)
  • 向量检索:DPR(Dense Passage Retrieval,用 BERT 编码 query 和 passage,点积相似度)
  • 混合系统:ColBERT(late interaction)
  • DPR 仅用 1K Q/A 对即可超越 BM25

📐 RAG 的形式化推导

RAG(Lewis et al., 2021) 将生成过程边缘化到检索文档上:

PRAG(yx)=ztop-kP(yz,x)P(zx)P_{RAG}(y|x) = \sum_{z \in \text{top-k}} P(y | z, x) \cdot P(z | x)

其中:

  • xx:查询(问题)
  • zz:检索到的文档段落
  • P(zx)P(z|x):检索相关性分数,由 DPR(Dense Passage Retrieval) 提供:

P(zx)exp ⁣(EQ(x)TEP(z))P(z|x) \propto \exp\!\left(E_Q(x)^T E_P(z)\right)

EQ,EPE_Q, E_P 是独立的 BERT 编码器(双编码器架构),内积衡量相关性。

FAISS(MIPS):在数十亿向量中做近似最近邻搜索(Maximum Inner Product Search),时间复杂度从 O(N)O(N) 降至 O(N)O(\sqrt{N})(倒排索引)。

生成器(如 BART/GPT)的条件概率:

P(yz,x)=tP(yty<t,z,x)P(y|z,x) = \prod_{t} P(y_t | y_{<t}, z, x)

RAG-Token 变体:每个生成 token 可以从不同文档中检索,比 RAG-Sequence(整个答案基于同一文档)更灵活。

📚 已收录至 拓展阅读知识库

🔢 数值/具体示例

RAG vs 纯 LM 在开放域问答(NaturalQuestions)上的对比:

方法EM(精确匹配)特点
T5-11B(纯参数)36.6%知识存在权重中,无法更新
RAG(DPR + BART)44.5%检索 Wikipedia,可动态更新
GPT-3 175B(纯参数)29.9%大但无检索

关键数字:DPR 在 Natural Questions 上,仅用 1000 个训练样本,top-20 检索召回率达 78.4%,而 BM25 是 59.1%。

💡 为什么这样做?

LLM 的参数是”固化的记忆”——训练完成后无法更新,且存储效率低(用数十亿参数记住百科全书式的知识极其浪费)。RAG 给 LLM 提供了”活的外部记忆”:对于需要最新信息(新闻、医学指南)或具体事实(人名、日期、数字)的问题,检索 + 生成远比纯参数记忆可靠且可解释(可追溯来源)。

⚠️ 常见误区

  1. 误区:RAG 能完全替代 fine-tuning → 正确:RAG 适合”知识密集型”任务(事实问答),但对于需要改变模型行为风格(如特定写作风格、安全规则、遵循格式)的场景,RAG 效果有限,必须用 fine-tuning/RLHF。
  2. 误区:检索到的文档越多越好 → 正确:超过一定数量(通常 top-5 到 top-10),更多文档会引入噪声,生成质量反而下降(“Lost in the Middle”问题——LLM 更关注开头和结尾的文档)。

2. Language Agents 概述

Slide 29
Slide 29
Slide 30
Slide 30
Slide 31
Slide 31
  • LLM 作为 agent 的核心:感知 -> 推理 -> 行动
  • Agent = LLM + 工具 + 记忆 + 规划

📐 ReAct 框架的形式化

Agent 的决策轨迹 τ=(o0,a0,o1,a1,,oT,aT)\tau = (o_0, a_0, o_1, a_1, \ldots, o_T, a_T),其中 oto_t 是观察(observation),ata_t 是动作(action)。

ReAct(Yao et al., 2023) 的动作空间扩展为三类:

  • Thinkatthink=rta_t^{think} = r_t(内部推理步骤,不改变环境,仅更新上下文)
  • Actatact=tool_call(name,args)a_t^{act} = \text{tool\_call}(name, args)(调用外部工具)
  • Observeot=env(atact)o_t = \text{env}(a_t^{act})(处理工具返回结果)

策略由 LLM 参数 θ\theta 决定:

at=πθ(ot,ht),ht=(o0,a0,,ot1,at1)a_t = \pi_\theta(o_t, h_t), \quad h_t = (o_0, a_0, \ldots, o_{t-1}, a_{t-1})

与纯 CoT(仅有 Think,无 Act)的区别:ReAct 的 Think 步骤可以更新内部状态,而不是仅仅生成最终答案。

📚 已收录至 拓展阅读知识库

🔢 数值/具体示例

ReAct 在 HotpotQA(多跳推理问答)上的一个真实轨迹示例:

问题:“LangChain 的创始人在哪所大学读的本科?”

Thought: 需要先找到 LangChain 的创始人是谁
Act: Search("LangChain founder")
Observe: "LangChain was founded by Harrison Chase..."
Thought: 知道创始人了,现在查他的学历
Act: Search("Harrison Chase education undergraduate")
Observe: "Harrison Chase attended Harvard University..."
Thought: 找到答案了
Act: Answer("Harvard University")

ReAct vs CoT 在 HotpotQA 上:ReAct 准确率约 35%,CoT 约 29%,纯提示约 21%。

⚠️ 常见误区

  1. 误区:Language Agent = 真正意义上的 AI Agent → 正确:当前 LLM-based agent 的主要问题:规划能力弱(无法可靠地做超过 5-10 步的长距离规划)、工具调用容易出错(JSON 格式错误、参数理解错误)、记忆管理简陋(长对话性能下降)。“Agent”这个词在工业界被严重过度宣传。

3. 推理与规划(Reasoning & Planning)

Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43
  • ReAct:交替 Thought + Action + Observation
  • Chain-of-Thought 推理在 agent 场景中的应用
  • 规划方法:任务分解、子目标设定

📐 Tree-of-Thought(ToT)的形式化

标准 CoT(线性推理链):

y=Gθ(x,z1,z2,,zn),zi 按顺序生成,不可回溯y = G_\theta(x, z_1, z_2, \ldots, z_n), \quad z_i \text{ 按顺序生成,不可回溯}

ToT(Yao et al., 2023):维护推理树 T\mathcal{T},节点为推理状态 s=(x,z1,,zi)s = (x, z_1, \ldots, z_i)

  1. 生成zt+1Gθ(st)z_{t+1} \sim G_\theta(s_t)(采样多个候选下一步,宽度 kk
  2. 评估Vθ(st)[0,1]V_\theta(s_t) \in [0,1](用 LLM 自评当前状态的价值)
  3. 搜索:BFS(按层展开)或 DFS(深度优先)或 MCTS(蒙特卡洛树搜索)

关键区别:CoT 在错误分支上一路走到黑;ToT 可以**回溯(backtrack)**并探索其他分支。

MCTS 的 UCB 选择公式(用于引导搜索):

a=argmaxa[Q(s,a)+clnN(s)N(s,a)]a^* = \arg\max_a \left[Q(s,a) + c\sqrt{\frac{\ln N(s)}{N(s,a)}}\right]

其中 Q(s,a)Q(s,a) 是价值估计,N(s,a)N(s,a) 是访问次数,cc 控制探索-利用权衡。

📚 已收录至 拓展阅读知识库

🔢 数值/具体示例

Game of 24(用 4 个数字通过加减乘除凑出 24)的成功率对比:

方法成功率
标准提示(Standard I/O)4%
CoT(逐步推理)4%
ToT(BFS,宽度=5)74%

数独任务(9×9):

  • CoT 成功率:0%(一旦某个数字填错无法回溯)
  • ToT(DFS + 剪枝):显著提升,但仍受限于评估函数质量

💡 为什么这样做?

人类解难题时不是线性的——我们会尝试多种思路、发现死路后退回来。CoT 强迫 LLM 按序生成,相当于”不能打草稿”。ToT 恢复了这种探索能力,代价是计算量增加(需要多次 LLM 调用)。本质上,ToT 是在”慢思考”(System 2)和”快思考”(System 1)之间做选择。

⚠️ 常见误区

  1. 误区:更复杂的推理策略总是更好 → 正确:ToT 对简单问题是浪费(计算代价是 CoT 的 k×dk \times d 倍,kk 为宽度,dd 为深度),只对需要搜索的组合问题有优势。现代 o1/o3 类模型将”何时深思”的决策内化到训练中,而非每次都用 ToT。
  2. 误区:o1 就是 ToT → 正确:o1 的内部推理机制未完全公开,更可能是通过 RLHF 训练的内化推理过程,而非显式树搜索。

4. 记忆(Memory)

Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52
  • 短期记忆:上下文窗口内的对话历史
  • 长期记忆:外部存储(向量数据库、知识图谱)
  • 工作记忆 vs 情景记忆 vs 语义记忆

📐 LLM Agent 的四种记忆类型

记忆类型存储位置访问方式容量可更新
In-context(工作记忆)Context window直接(注意力)LL tokens(有限)否(会话结束后丢失)
External(外部记忆)向量数据库检索(MIPS)理论无限是(可随时写入)
In-weights(参数记忆)模型权重 θ\theta隐式(推理)无限但模糊需要 fine-tuning
In-cache(KV 缓存)GPU/CPU 内存前缀重用受内存限制

外部记忆的检索公式

retrieve(q,D,k)=top-k{diD:cos ⁣(E(q),ei)}\text{retrieve}(q, D, k) = \text{top-}k\left\{d_i \in D : \cos\!\left(E(q), e_i\right)\right\}

其中 ei=E(di)e_i = E(d_i) 是用嵌入模型预计算的文档向量,FAISS/Chroma/Pinecone 等向量数据库负责高效近似搜索。

KV 缓存加速:若前 nn 个 token 相同(系统提示),预计算并缓存其 Key/Value 矩阵,推理时直接复用,避免重复计算。

📚 已收录至 拓展阅读知识库

🔢 数值/具体示例

ChatGPT Memory 功能(2024 年发布)的工作原理(近似):

  1. 用户说:“我叫 Alice,是一名机器学习工程师,喜欢 PyTorch”
  2. 系统提取关键事实 → 写入向量数据库:{fact: "用户叫 Alice", embedding: [...]}
  3. 下次对话:检索 “user preferences/identity” → 召回相关记忆
  4. 注入 system prompt:“用户叫 Alice,是 ML 工程师,偏好 PyTorch”

本质:RAG 应用于个性化记忆。实际系统还需要记忆去重(新信息和旧记忆冲突时以新为准)和遗忘策略(重要性衰减)。

⚠️ 常见误区

  1. 误区:Context window 大(1M token)就不需要外部记忆 → 正确:即使 LLM 有 1M token context,把所有历史塞进去会导致注意力分散(Lost in the Middle 问题:LLM 对 context 中间部分的信息利用率显著低于开头和结尾);此外推理成本随 context 长度二次增长(O(n2)O(n^2)),检索式记忆仍然更高效。
  2. 误区:In-weights 记忆最可靠 → 正确:参数记忆存在”幻觉”——模型把常见的错误信息也记进了权重(如错误的历史日期、虚假的科学”事实”)。外部记忆+来源验证是更可靠的事实获取方式。

5. 工具使用(Tool Use)

Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58
  • Toolformer:LM 自学使用 API 工具
  • 工具类型:搜索引擎、计算器、代码执行器、数据库查询
  • Function calling 接口

📐 Function Calling 的形式化

给定工具定义集合 T={(namei,schemai,fni)}\mathcal{T} = \{(name_i, \text{schema}_i, fn_i)\},工具调用轨迹:

at={tool:namei,args:{k1:v1,,km:vm}}a_t = \{tool: name_i, args: \{k_1: v_1, \ldots, k_m: v_m\}\}

工具执行 ot=fni(args)o_t = fn_i(args),结果注入下一步 context:

P(yt+1x,o1,a1,,ot)=πθ ⁣(yt+1concat(x,fmt(a1,o1),,fmt(at,ot)))P(y_{t+1} | x, o_1, a_1, \ldots, o_t) = \pi_\theta\!\left(y_{t+1} \mid \text{concat}(x,\, \text{fmt}(a_1, o_1),\, \ldots,\, \text{fmt}(a_t, o_t))\right)

Toolformer(Schick et al., 2023) 的自监督训练方式:

  1. LM 采样可能的工具调用位置和参数
  2. 执行工具,获得结果
  3. 若插入工具结果后 loss 降低,则保留该样本(自我监督过滤
  4. 在过滤后的数据上 fine-tune LM

关键指标:工具调用是否降低了后续 token 的 perplexity——这是 Toolformer 的自动标注准则,不需要人工标注”该在何处调用工具”。

📚 已收录至 拓展阅读知识库

🔢 数值/具体示例

代码解释器工具调用示例(Wolfram Alpha + Python):

用户:“计算 k=11000k2\sum_{k=1}^{1000} k^2

  • LM 生成:<calc>sum([k**2 for k in range(1, 1001)])</calc>
  • Python 执行:333833500
  • LM 整合:“k=11000k2=333,833,500\sum_{k=1}^{1000} k^2 = 333{,}833{,}500(公式 n(n+1)(2n+1)/6n(n+1)(2n+1)/6 验证:1000×1001×2001/6=333,833,5001000\times1001\times2001/6 = 333{,}833{,}500)”

Toolformer 在数学任务上的性能(近似,Schick et al. 2023):

  • 无工具的 GPT-J 6.7B:数学 QA 准确率 ~5%
  • Toolformer(调用计算器):~40%(提升 8×)

⚠️ 常见误区

  1. 误区:工具调用失败是偶发 bug → 正确:工具调用的格式错误是系统性问题——LLM 经常生成不符合 schema 的 JSON(错误的键名、类型不匹配、嵌套层级错误),特别是工具 schema 复杂时。生产系统必须实现 retry 逻辑、schema 验证和错误修正提示(将错误信息反馈给 LLM 重新生成)。
  2. 误区:工具越多越好 → 正确:工具数量过多(>20)会显著增加 LLM 选错工具的概率(选择混淆),实践中推荐用工具路由(router)先分类再选择。

6. Agent 数据与评估

Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 66 Slide 67 Slide 68 Slide 69 Slide 70 Slide 71 Slide 72
  • Agent 评估的挑战:多步推理的正确性、效率、安全性
  • 数据收集:人工标注轨迹 vs 模拟环境
  • Language-Agents 综述

🔢 数值/具体示例

SWE-bench(软件工程基准,2024)评估流程:

  • 任务:给定真实 GitHub issue,让 agent 修复代码 bug
  • 数据:2294 个来自 12 个 Python 项目的真实 issue
  • 评估:运行项目原有单元测试,通过率 = 成功率
  • 结果演进:
系统通过率备注
GPT-4(2023)1.7%基础 agent
Claude 3.5 Sonnet(2024.10)49.0%SWE-agent 框架
人类程序员~86%有完整上下文

6个月内从 1.7% 到 49%——这个领域的进展速度超乎寻常。

⚠️ 常见误区

  1. 误区:Agent 评估”结果至上”——只要最终通过测试就行 → 正确:Agent 可能用不当手段达成目标:删除测试文件、硬编码答案(if test_case == 'x': return correct_answer)、修改测试本身。SWE-bench 已经被发现存在此类”规则利用”(cheating by test manipulation),真正的评估需要过程审计和代码质量检查。

推荐阅读

关联概念

个人笔记