第 1 讲:导论——LLM 会幻觉,怎样把它变成可靠的智能体?

Agentic AI · Lecture 01。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS224V Fall 2026 Lecture 1(9/23 Introduction,Monica Lam 主讲)。 配套代码:code/lecture01/(只用 Python 标准库;05 号文件可选,需要 anthropic 包和 API 密钥) 预计阅读时间:3~4 小时(含运行代码)


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说出今天的 LLM 面向用户的主要能力,以及为什么它们还没有被可靠地用在医疗、科学、金融、法律这些高风险领域。
  2. 解释”准确性、可问责、长程、长上下文”这四个关键词分别指什么。
  3. 举出幻觉的真实案例,区分”事实性错误”和”不忠实于资料”两类幻觉。
  4. 从训练目标、长尾知识、知识截止、评分规则、校准五个角度解释 LLM 为什么会幻觉。
  5. 说出加了检索(RAG)之后仍然会幻觉的两个原因,并能对 RAG 的错误做归因分析。
  6. 解释”计算思维”和”把问题分解成可靠的 LLM 任务”的含义,画出 WikiChat 的 7 个阶段,算出每轮的 LLM 调用次数 5+n+c5+n+c。
  7. 用简单的概率算术分析多步任务的错误累积、核查的效果、投票的局限,以及为什么”不要相信演示”。
  8. 说出 Stanford Agentic OS 的主要组成部分,以及这门课后面每一讲在其中的位置。

0.2 先修知识

知识点用在哪里最低要求
Python 基础全部代码会读函数、类、循环、字典;不熟的语法代码注释里会讲
概率基础第 3.4、6 节条件概率、期望、独立事件;贝叶斯公式在第 6.3 节会推导一遍
LLM 是什么第 3 节知道”语言模型是根据前文预测下一个词”(CS224N 第 5、9 讲)
检索 / RAG第 4 节不需要预先了解;CS224N 第 12 讲讲过的可以快速浏览

0.3 本讲地图

第1节  这门课要解决什么问题:高风险领域需要可靠的智能体
第2节  幻觉:现象、案例、分类
第3节  幻觉从哪里来                                   ← 代码 01
第4节  加了检索(RAG)为什么还会幻觉                    ← 代码 02
第5节  核心思想:把问题分解成可靠的 LLM 任务(WikiChat) ← 代码 03、05
第6节  可靠性的算术                                   ← 代码 04
第7节  课程地图:Stanford Agentic OS
第8节  课程安排
第9–13节 小结、与作业的关系、练习、延伸阅读、下一讲预告

0.4 本讲的玩具世界:一部虚构的罕见病百科

要研究”模型什么时候会编造事实”,我们必须确切地知道三件事:每条事实的标准答案;模型在训练时见过这条事实多少次;这条事实是不是在模型的知识截止日期之后才出现的。用真实世界的知识做实验,这三件事一件都说不清。

所以代码 toy_world.py 生成了一部虚构的罕见病百科(选罕见病,是因为它正是本课作业 1 的主题):60 种名字随机拼成的疾病,分三档——

档次数量在模拟的”预训练语料”里出现的次数类比
头部(head)20几十到两千次教科书里的常见病
长尾(tail)250~12 次只在几篇论文里提过的病
新近(recent)150 次(2025 年以后才被描述,模型的知识截止于 2024 年)去年才发现的新综合征

每种疾病有 7 条可以提问的事实(标志性症状、起病年龄、致病基因、遗传方式、首次描述年份、首次报告者、患病率),写成一篇 9 句话的百科文章,切成 5 段供检索。例如:

[Kelenmora syndrome #0] Kelenmora syndrome is a rare genetic disorder. The hallmark feature of
                        Kelenmora syndrome is skin fragility.
[Kelenmora syndrome #1] Other features of Kelenmora syndrome include vision loss, chronic fatigue
                        and bone fractures. Symptoms of Kelenmora syndrome usually begin in infancy.
[Kelenmora syndrome #2] Kelenmora syndrome is caused by mutations in the XRK9 gene. Kelenmora
                        syndrome follows autosomal recessive inheritance.
[Kelenmora syndrome #3] Kelenmora syndrome was first described in 1971. The first cases of
                        Kelenmora syndrome were reported by Viktor Lunova, MD.
[Kelenmora syndrome #4] Kelenmora syndrome affects about 1 in 500,000 people.

问题有两种问法:直接问法和文章用词相同(“Which gene is mutated in X?”),换说法和文章几乎没有共同的词(“What is the genetic cause of X?”)。

扮演 LLM 的是代码 llm.py 里的模拟 LLM。它不是神经网络,而是一组规则,但刻意模仿了真实 LLM 的几个关键行为:见得越多记得越牢;没记住也照样回答一个看起来合理的值;读资料时偶尔读错,资料里没有答案时会用记忆补上;每个子任务(抽取、核查、起草……)都有自己的出错率。用模拟 LLM 的好处是每个现象都可控、可复现、不花钱,而且我们能看到”上帝视角”:每个答案究竟是读来的、记得的,还是编的。

关于本讲的数字:讲义里有两类数字,请注意区分。

  • 论文和报道里的真实数字(例如 WikiChat 的 97.3%),会注明出处。
  • 模拟实验的数字(例如”闭卷准确率 95.7% / 38.9% / 10.5%”),都来自 01~04 号代码的实际输出(固定随机种子,你运行会得到同样的结果)。它们说明的是机制和趋势,错误率本身是我们设定的参数,不代表任何真实模型。
  • 05 号代码需要 API 密钥,编写讲义时没有用真实的 API 运行过。

1. 这门课要解决什么问题

1.1 LLM 今天能做什么

Monica Lam 的第一张正文幻灯片列出了今天的 LLM 面向用户的八项核心能力:

能力说明
对话式问答在一次会话里保持多轮上下文的直接对话
检索增强(RAG)用外部文档、实时网页搜索作为依据回答,并给出引用
函数调用模型自己决定什么时候调用 API、数据库或外部工具
智能体工作流多步规划、使用工具、自我纠正,需要的人工监督越来越少
操作电脑直接操作图形界面:点击、输入、在网页间导航
执行代码在沙盒里运行并迭代修改代码,而不只是生成代码文本
长时间推理对数学、逻辑和复杂问题做一步一步的推理
多模态输入输出理解和生成图像、音频、视频

这张表本身就说明了这门课改名的原因:从 2023 年的”对话式虚拟助手”到 2026 年的”智能体 AI”,LLM 已经从一个”会聊天的模型”变成了一个”会做事的系统”的核心部件。

1.2 但高风险领域还没有可靠的部署

紧接着的一张幻灯片是这门课的主题:

今天的 AI 智能体还没有部署在高风险的服务里(医疗、科学、金融、法律)。

为什么?这些领域有一个共同点:错误的代价远大于”不知道”的代价。一个聊天机器人推荐了一家不存在的餐厅,用户白跑一趟;一个法律助手引用了一个不存在的判例,律师会被法院处罚(第 2 节的真实案例);一个临床试验匹配系统漏掉了一个合适的试验,病人可能错过救命的治疗。

要把 LLM 用到这些领域,这门课认为需要在四个方向上有根本性的技术进步:

关键词含义例子
准确性(accuracy)说出的每一句话都对;不知道就说不知道回答罕见病的问题时不编造致病基因
可问责(accountability)能给出可核查的理由:依据是什么、做了哪些假设、哪些条件改变会改变结论判断”病人不符合试验条件”时,说明是哪条条件、依据病历的哪一项
长程(long horizon)能可靠地完成几十上百步的任务一次文献调研要搜索、阅读、比较几十篇论文
长上下文(long context)能处理远超模型上下文窗口的材料系统综述要读几百篇长论文

1.3 为什么值得做

幻灯片给出了两个”影响”:

  1. 可负担的高风险服务。律师、医生、金融顾问的服务很贵。如果 AI 能可靠地承担其中的一部分工作,更多人能负担得起。
  2. 加速知识发现。科学研究的很大一部分时间花在”读文献、整理证据、对比数据”上。可靠的研究型智能体能让这件事快一个数量级。

作业的主题罕见病是一个很好的例子:全世界大约 4 亿人患有 7000 多种罕见病中的一种。很多罕见病的资料只存在于少数几篇论文里,普通医生一辈子可能都见不到一例,病人往往要辗转多年才能确诊。这正是”长尾知识”(第 3.2 节)最极端的情形,也正是幻觉最危险的地方。

1.4 什么是”智能体”

本课沿用一个朴素的定义:

智能体(agent)是一个能自己做决定、采取行动来实现目标的 AI 系统。

“自己做决定”的程度是一个光谱:

单次调用            工作流(workflow)                    智能体(agent)
LLM 回答一个问题 →  程序员写好步骤,LLM 完成每一步里的  →  LLM 自己决定下一步做什么、
                   小任务(第 5 节的 WikiChat)            调用哪个工具、什么时候停(第 3、8 讲)
  自主性低 ─────────────────────────────────────────────────────► 自主性高
  可控、可预测 ◄───────────────────────────────────────────────── 灵活、能应对意外

这门课的一个鲜明立场是:在高风险场景里,不要把可靠性寄托在”LLM 自己会做对”上。课程描述里的原话是”精心设计的、基于 LLM 的算法”(carefully designed LLM-based algorithms)。整门课会反复回到这个问题:哪些部分交给 LLM,哪些部分交给程序、数据库、定理证明器;自主性给到多少。第 5.6 节会更具体地讨论。


2. 幻觉:现象、案例、分类

2.1 什么是幻觉

幻觉(hallucination)指模型生成了看起来合理、但实际上不正确或没有依据的内容。这个词借自心理学(“感知到不存在的东西”),在 NLP 里最早用于机器翻译和摘要(译文里出现了原文没有的内容)。

文献里常见两种分类方式:

分类含义本讲玩具世界里的例子
事实性幻觉(factuality)和世界上的事实不符闭卷回答”Hosuldith disease was first described in 1989”(实际是 2026 年)
忠实性幻觉(faithfulness)和给定的资料不符(资料里没有,或者说反了)资料里写着基因是 ZTV8,模型却回答 FRT6

另一种分法是内在的(intrinsic,和资料矛盾)与外在的(extrinsic,资料里根本没提、无法核实)。在 RAG 系统里,外在幻觉尤其常见:资料没覆盖到的地方,模型自己”补”上了(第 4.3 节)。

幻觉最麻烦的性质是:它看起来和正确的答案一模一样。代码 01 的演示 2 让你自己体验这一点:

(1) 问:When was Kelenmora syndrome first described?
    答:Kelenmora syndrome was first described in 1971.
(3) 问:When was Salotos syndrome first described?
    答:Salotos syndrome was first described in 1977.
(5) 问:When was Hosuldith disease first described?
    答:Hosuldith disease was first described in 1989.

只有 (1) 是对的。(3) 的正确答案是 1993,(5) 是 2026——模型从没见过这种病,却给出了一个格式完全正确、数值完全合理的年份。

2.2 真实案例

第一讲用一整页幻灯片列出了法律领域的事件:

时间事件为什么重要
2023 年 5 月Mata v. Avianca律师用 ChatGPT 辅助写诉状,里面引用了虚构的判例;法院对律师处以罚款
2023 年 12 月Michael Cohen 的文件AI 生成的虚构判例出现在一起备受关注的案件里
2023 年 12 月首席大法官 Roberts 的年终报告美国最高法院首席大法官呼吁在法律中谨慎使用 AI
2024 年 1 月Stanford 的法律幻觉研究GPT-3.5、PaLM 2、Llama 2 在法律问题上的幻觉率为 69%~88%(Dahl 等,Journal of Legal Analysis 2024)
2024 年 2 月Moffatt v. Air Canada航空公司的客服机器人给出了错误的退票政策,法庭判公司承担责任
2024 年 2 月科罗拉多州的处罚律师因提交含有虚构引用的 AI 生成文件而被处罚

你可能会想:这些都是”裸用” LLM 的结果,加上检索(RAG)就好了吧?幻灯片的下一页标题是:有了 RAG,幻觉在今天依然猖獗。

  • 新闻:BBC 在 2025 年 2 月发布的研究测试了 ChatGPT、Copilot、Gemini、Perplexity 四个带检索的助手回答新闻问题:51% 的回答有明显问题;引用了 BBC 内容的回答中,19% 引入了事实错误(错误的陈述、数字、日期);从 BBC 文章里引用的原话中,13% 被改动过或者原文里根本没有。
  • 法律:Stanford 2024 年的另一项研究(Magesh 等,“Hallucination-Free?”)测试了专业的法律检索工具——它们都基于 RAG,并且宣传”无幻觉”——发现幻觉率仍在 17%~33% 之间。
  • 消费级产品:幻灯片引用了《纽约时报》2026 年 4 月的报道,大规模消费级产品的幻觉率估计在 10% 左右。
  • 医学:在专科医师考试级别的题目(MedXPertQA)上,幻灯片给出的模型准确率是 72.8%(2026 年 9 月)。
  • 金融:这里的幻觉很少被公开,但幻灯片记录了几条业内的说法:“机器人说’投资已完成’,实际上并没有”;“评估显示企业聊天机器人有大量幻觉”;一家聊天机器人供应商”不为高风险应用销售机器人”;一家大型企业基础设施供应商说”没有企业在高风险应用里部署 AI”。

2.3 用户察觉不到

这些错误之所以危险,是因为用户很难察觉。WikiChat 论文做过一个真实用户研究:用户读一篇新维基百科文章的第一句话,然后和聊天机器人讨论这个话题。

模型用户评分(满分 5)事实准确率
GPT-43.442.9%
WikiChat(基于 GPT-4)3.897.9%

GPT-4 一半以上的陈述是错的,用户给它的评分却只比 WikiChat 低一点点。幻灯片的原话是:用户甚至没有意识到一半以上的陈述是错的。这也意味着:不能靠用户的反馈来发现幻觉,必须有系统的评估方法(第 6.5 节)。

2.4 “最后的 10% 是 90% 的问题”

Monica Lam 在幻灯片上画了一条”准确率—开发时间”曲线,并给出了她的经验法则:

阶段大致准确率
直接套用 LLM约 70%
有专业团队支持(提示工程、检索、调参)约 85%
需要研究约 95%

最后的 10% 是 90% 的问题。

为什么最后一段这么难?换成错误率来看就清楚了(代码 04 演示 6):70% → 85% 是把错误从 30% 降到 15%(减半);85% → 95% 是从 15% 降到 5%(只剩三分之一);95% → 99% 是从 5% 降到 1%(只剩五分之一)。每一档都要把错误砍掉一大半,而且容易的错误先被消灭,留下的都是硬骨头:长尾知识、歧义、需要多步推理的问题。这门课要做的,正是这最后一段。


3. 幻觉从哪里来

3.1 下一个词预测:模型学的是”像”,不是”对”

直觉。想象一个读过整个图书馆、记忆力惊人但不完美的学生,参加一场闭卷考试,而且从不交白卷。遇到记得的题,他写出正确答案;遇到记不清的题,他写出一个”看起来最像答案”的东西——格式正确、用词专业、数值合理。阅卷老师如果不对照标准答案,根本看不出哪些是编的。

背景。LLM 的预训练目标是最大化训练语料的似然:给定前文,预测下一个词的概率分布,让真实出现的下一个词概率尽可能大(CS224N 第 5、9 讲):

max⁡θ∑tlog⁡Pθ(wt∣w1,…,wt−1)\max_\theta \sum_{t} \log P_\theta(w_t \mid w_1, \dots, w_{t-1})

这个目标奖励的是”生成和训练语料相像的文字”,而不是”生成正确的文字”。对于一个模型没见过几次的事实,“像样的续写”和”正确的续写”就分开了:

  • “Salotos syndrome was first described in ___” 后面最像样的是一个四位数的年份——模型会给出一个;
  • 语料里很少出现”我不知道 Salotos syndrome 是哪一年被描述的”这种句子,所以”不知道”本身就不是一个”像样的续写”。

为什么这很重要。这意味着幻觉不是一个可以”修掉”的 bug,而是这种训练方式的自然产物。后训练(指令微调、RLHF)能让模型更多地说”不知道”,但只要模型的知识来自”见过多少次”,长尾上的不确定性就一直存在。下面几节从不同角度把这件事说得更具体。

3.2 长尾:见得越多,记得越牢

背景。Kandpal 等(2023)统计了预训练语料里和每个问答题相关的文档数,发现模型答对的概率与这个数目强相关:相关文档只有几篇的问题,即使是很大的模型也很难答对。Mallen 等(2023)用实体的”流行度”(维基百科页面的浏览量)做了类似的分析,得出同样的结论,并提出”只对不流行的实体做检索”。

模拟。模拟 LLM 用一个最简单的公式来体现这个趋势:一种疾病在预训练语料里出现了 mm 次,它的每一条事实被记住的概率是

P(记住)=mm+κ,κ=8P(\text{记住}) = \frac{m}{m + \kappa}, \qquad \kappa = 8

出现 0 次 → 0;8 次 → 0.5;100 次 → 0.93;1000 次 → 0.99。没记住的事实,模型照样编一个”合理的”值:遗传方式按常见程度去猜,基因有一半概率”张冠李戴”成某种常见病的基因,年份在 1950~2015 之间随便挑一个。

代码 01 的演示 2、3 是闭卷问答的结果(每种疾病 7 道题):

档次闭卷准确率
头部95.7%
长尾38.9%
新近10.5%
全部50.7%

按出现次数分组看,准确率从”全靠猜”连续地上升到 100%:

  出现次数    准确率
        0    12.0%
      1~2    21.4%
      3~5    60.7%
     6~12    63.3%
    13~99    82.9%
  100~499   100.0%
     ≥500   100.0%

观察。知识不是”会”或”不会”,而是随曝光次数连续变化的。真实世界里,绝大多数实体都在长尾上——7000 多种罕见病,大多数只在少数论文里出现过。所以”模型在常见问题上表现很好”的演示,说明不了它在你关心的那个具体问题上可靠。

3.3 知识截止

预训练语料有一个截止日期,之后发生的事模型一概不知。我们的世界里,新近疾病在 2025 年以后才被描述,出现次数为 0。它们的 10.5% 准确率完全来自”猜中”:

关系新近疾病的闭卷准确率为什么
遗传方式46.7%只有 4 个取值,最常见的”常染色体隐性”占 45%
起病年龄13.3%5 个取值
标志性症状、患病率6.7%取值更多
致病基因、年份、报告者0%几乎不可能猜中(年份尤其不可能:模型猜的都是 2015 年以前)

这又引出幻觉难以察觉的另一个原因:模型不是总错,而是有时对、有时错,而且对错看起来一样。

3.4 猜比不答得分高

问题。就算模型对某个问题没把握,它为什么不说”不知道”?

Kalai 等(2025)的论点:因为我们训练和评测模型的方式奖励猜测。今天绝大多数基准测试按准确率打分:答对得 1 分,答错和”不知道”都得 0 分。在这种规则下,“不知道”永远得 0 分,而猜一下总有机会得分——不管多没把握,猜都比不答好。模型在后训练中被反复优化的正是这种分数,于是它学会了”大胆地猜”。

推导。设答对得 1 分,答错扣 λ\lambda 分,“不知道”得 0 分。如果模型的信心 cc 是校准的(答对的概率真的是 cc),作答的期望得分是

E[得分∣作答]=c⋅1+(1−c)⋅(−λ)=c(1+λ)−λ\mathbb{E}[\text{得分} \mid \text{作答}] = c \cdot 1 + (1 - c)\cdot(-\lambda) = c(1 + \lambda) - \lambda

它大于 0(比”不知道”好)当且仅当

c>λ1+λc > \frac{\lambda}{1 + \lambda}

  • λ=0\lambda = 0(只看准确率):阈值是 0,永远应该作答;
  • λ=1\lambda = 1:阈值 0.5;
  • λ=3\lambda = 3(高风险场景:错误的诊断比”不知道”糟糕得多):阈值 0.75。

Kalai 等因此建议在评测的说明里写明置信度目标,例如”只有当你有超过 tt 的把握时才回答,答错扣 t/(1−t)t/(1-t) 分”——这和上面的 λ\lambda 是同一回事。

模拟(代码 01 演示 4):让同一个模拟 LLM 采用”信心低于阈值 tt 就说不知道”的策略,在三种评分规则下的平均得分:

阈值 tt作答比例λ=0\lambda=0λ=1\lambda=1λ=3\lambda=3
0.0100%0.5070.014−0.971
0.567.6%0.4670.257−0.162
0.743.3%0.3740.3140.195
0.911.2%0.1020.0930.074

只看准确率时,“从不弃权”得分最高;一旦答错要扣分,“有把握才答”就成了最优策略。表里 λ=1\lambda = 1 的最优阈值比理论值 0.5 高,是因为这个模型的信心没有校准——这是下一节的主题。

3.5 校准:模型知道自己不知道吗?

校准(calibration)指模型的信心和它的实际准确率一致:信心 0.8 的回答,应该有 80% 是对的。Kadavath 等(2022)发现大模型”大体上知道自己知道什么”:让模型评估自己答案正确的概率,结果是部分校准的。但”大体上”不等于”完全”。

代码 01 演示 5 把模拟 LLM 的回答按信心分组:

信心区间题数平均信心实际准确率
[0.00, 0.30)590.1815.3%
[0.30, 0.50)770.4110.4%
[0.50, 0.70)1020.6038.2%
[0.70, 0.85)1000.7880.0%
[0.85, 1.00)820.9193.9%

信心和准确率正相关,但中等信心的那一档明显”过度自信”。选择性回答(只在信心 ≥ tt 时作答)的效果:

阈值 tt头部 覆盖 / 准确长尾 覆盖 / 准确新近 覆盖 / 准确全部 覆盖 / 准确
0.0100% / 95.7%100% / 38.9%100% / 10.5%100% / 50.7%
0.783% / 100%33% / 69.0%8% / 12.5%43% / 86.3%
0.923% / 100%7% / 84.6%2% / 0%11% / 91.5%

观察:

  • 提高阈值确实提高了准确率,代价是覆盖率急剧下降——头部疾病的大量正确答案也被一起丢掉了。
  • 阈值再高,准确率也到不了 100%:总有一些错误的答案被模型”很有信心地”说出来。
  • 模型不知道自己不知道什么。靠模型自己的信心只能缓解幻觉,不能消灭它。

3.6 小结:分布外的任务

幻灯片把”下一个词预测”训练出来的弱点归结为一句话:LLM 在分布外(out-of-distribution)的任务上不可靠。具体包括:

弱点为什么是”分布外”本课的对策
新信息训练语料里没有检索(RAG)
长尾信息训练语料里太少检索
长指令训练时很少见到几千字的复杂指令形式化的规格(第 10 讲 Genie Worksheet)
长文档模型在长输入中间的内容上表现变差分块抽取、建成数据库(第 9 讲 SLIDERS)
长程任务训练时很少见到上百步的任务分解、核查、回滚(第 3、8 讲)
长上下文上下文窗口总是不够用上下文管理,例如自动压缩(第 3 讲)

接下来先看最常用的对策——检索——为什么还不够。


4. 加了检索(RAG)为什么还会幻觉

4.1 RAG 的流程

检索增强生成(Retrieval-Augmented Generation,Lewis 等 2020)的想法很直接:既然模型记不住长尾和新近的知识,那就不要让它记,而是在回答之前先去查:

用户的问题 ──► 检索器 ──► 前 k 段资料 ──┐
                                      ├──► LLM ──► 回答(最好附上引用)
用户的问题 ───────────────────────────┘

本讲的检索器是经典的 BM25(代码 retriever.py)。它的直觉是:查询里的词在段落里出现得越多越相关(但收益递减);越罕见的词越重要(IDF);长段落要打折扣。第 5 讲会介绍更强的稠密检索。

RAG 的效果立竿见影。代码 02 演示 2,用直接问法、检索 3 段:

档次闭卷朴素 RAG
头部95.7%99.3%
长尾38.9%96.6%
新近10.5%98.1%

但前面讲过,真实的 RAG 产品仍有 17%~51% 的问题率。Monica Lam 在第一讲里给出了两个原因:

  1. 检索没有返回答案。
  2. LLM 用自己的记忆补上了答案。

4.2 原因 1:检索没有返回答案

直觉。检索器是一个”关键词匹配机”(稠密检索器是一个”语义相似度匹配机”),它不理解问题。当问题的措辞和文档的措辞不同,它就可能找错地方。

代码 02 演示 1 统计了答案所在的段落出现在前 kk 名里的比例(Recall@k):

kk直接问法换说法
1100%14.3%
2100%42.9%
3100%71.4%
5100%100%

问 “What is the genetic cause of X?” 时,文章里写的是 “X is caused by mutations in the … gene”:cause ≠ caused,genetic ≠ gene,BM25 匹配不上,只能靠疾病名在这篇文章的 5 段里”随便”排序——甚至会被开头那句 “a rare genetic disorder” 吸引过去。

增大 kk 能提高召回率,但要付出代价:上下文更长、无关内容更多、成本更高,而且 LLM 在一堆无关段落里找答案时也更容易出错。

更隐蔽的情况:文档库本身过时了。代码 02 演示 4 让检索器只索引 2024 年以前描述过的疾病,然后问新近疾病的问题:

设置新近疾病的准确率
最新的文档库 + 朴素 RAG98.1%
过时的文档库 + 朴素 RAG10.5%
过时的文档库 + “只根据资料回答”2.9%(弃权 83%)

检索器总会返回”最相关”的 kk 段——哪怕文档库里根本没有相关内容。它从不说”没有”。例如问 Hosuldith disease 的致病基因,过时的文档库返回了 Hosisdith disease #2 等三篇别的疾病的段落(名字还很像!),朴素 RAG 照样给出一个具体的基因名,而且回答带着检索的”光环”,用户更难怀疑它。

4.3 原因 2:LLM 用记忆补上了答案

检索失败本身并不致命——如果模型老老实实地说”资料里没有”,那就不是幻觉。致命的是模型不说。

代码 02 演示 3 对朴素 RAG 的全部 840 道题(直接问法 + 换说法)做了错误归因(这是只有模拟实验才能做的”上帝视角”分析):

答案的来源题数答对答错
检索命中,正确地从资料里读出7017010
检索命中,但读错了15114
检索命中,但更相信自己的记忆404
检索未命中,用记忆补上1206159

一共答错 77 道,其中 77% 来自”检索未命中 + 用记忆补上”——两个原因叠加在一起。再按档次看”用记忆补上”的那 120 道:头部疾病补对了 98%,长尾 38%,新近 10%。

这解释了一个让人困惑的现象:RAG 系统在常见问题上的演示很漂亮,到了长尾问题上却频频出错。在常见问题上,检索失败被模型的记忆”掩盖”了;在长尾问题上,记忆帮不上忙,检索失败就直接变成了幻觉。

还有一小部分错误发生在检索命中之后:资料就在眼前,模型却相信了自己(错误)的记忆。这类现象叫知识冲突(knowledge conflict):Longpre 等(2021)发现问答模型在资料和记忆冲突时常常”无视”资料;Xie 等(2024)发现 LLM 的行为取决于资料的说服力——有时像”变色龙”一样顺从资料,有时像”树懒”一样固执于记忆。

4.4 “只根据资料回答”的提示有用吗?

一个自然的补救是在提示词里写:“只根据给出的资料回答;资料里没有就说没有。“代码 02 演示 2 的换说法部分:

档次闭卷朴素 RAG只根据资料的 RAG
头部95.7%97.9%73.6%(弃权 25%)
长尾38.9%79.4%70.3%(弃权 25%)
新近10.5%72.4%69.5%(弃权 25%)

两个观察:

  1. 很多错误变成了弃权。弃权不是好结果,但在高风险场景里比自信的错误好得多(回想第 3.4 节的 λ\lambda)。即便如此,仍有错误:模型偶尔不听话(模拟 LLM 里有 15% 的概率”泄漏”记忆)。
  2. 头部疾病的准确率反而下降了:模型本来记得的答案,因为资料里没有,也不敢说了。“不幻觉”和”有用”之间有张力。

我们想要的是:既利用模型记忆里正确的部分,又不让错误的部分溜出去。这正是第 5 节 WikiChat 的设计目标。

4.5 作业 1 的缩影:过时的知识库给出”具体的错误诊断”

作业 1 的讲义里有这样一段话(大意):有些罕见病不在你通常用来匹配的表型知识库里——例如 ReNU 综合征 2024 年才被首次描述,在那之前建成的数据库里根本没有它。用这样的数据库去匹配病人,得到的不会是”不知道”,而是一个具体的、错误的诊断。修正它所需的信息是存在的,但只存在于已发表的文献里。

代码 02 演示 5 复现了这个场景。表型知识库建于 2024 年,收录 45 种疾病;对每种新近疾病生成一组 10 个病人(其中恰好一人患这种病):

  • 用知识库诊断:患新近疾病的 15 位病人全部得到了一个具体的错误诊断。他们的最佳匹配大多重合 2 个症状,而其余病人的最佳匹配大多重合 3 个——但也有 25/135 位只重合 2 个。如果规定”重合少于 3 个就说不知道”,能拦下 14/15 个错误诊断,也会让 25/135 位病人得不到诊断。单看匹配分数,分不清”诊断错了”和”症状不典型”。
  • 反过来,作业 1 的任务:已知疾病 X,在 10 个病人里找出患者(随机猜是 10%):
方法找对的比例
闭卷 LLM”回忆” X 的症状,再去匹配18%
检索文献,LLM 从文献里读出症状,再去匹配100%

闭卷的 LLM 从没见过 X,却能”回忆”出 4 个症状,然后据此自信地指认一位病人。而信息其实就在新发表的文献里。作业 1 接下来研究的,是更强的文献研究系统(GRILL,第 2 讲)怎样做到这一点、又会在哪里失败。

玩具实验的边界:这里的病人和疾病都是生成出来的,症状匹配也只是”数重合个数”。真实的罕见病诊断要处理成千上万个表型术语、术语之间的层级关系、病历里的否定和不确定表述,远比这复杂。这个演示只说明一个机制:“找最相似的那个”的算法没有”没有答案”这个选项。


5. 核心思想:把问题分解成可靠的 LLM 任务

5.1 计算思维

背景。“计算思维”(computational thinking)这个说法因 Jeannette Wing 2006 年的一篇短文而流行。它指的是计算机科学家解决问题的一套思维习惯:分解(把大问题拆成小问题)、抽象(抓住本质、忽略细节)、算法(设计一步步可执行的过程)。

在 LLM 时代的含义。Monica Lam 在第一讲里提出的基本概念是:

把问题分解成可靠的 LLM 任务。(Decompose problems into reliable LLM tasks.)

LLM 很强,但它在不同类型的任务上可靠程度差别很大:

LLM 比较可靠的任务LLM 不可靠的任务
阅读理解:判断一段话说了什么凭记忆回答长尾事实
比较:这句话和这段资料一致吗精确的计数、计算、排序(在大量数据上)
改写:把问题改写成查询,把句子拆成声明一口气完成很长的、多步的任务
翻译:把自然语言翻译成 SQL、SPARQL、逻辑公式保证几百条约束都被满足
生成流畅、得体的回复知道自己不知道什么

计算思维的做法是:让 LLM 只做左栏的事,把右栏的事交给程序——检索器负责找资料,数据库负责精确的查询和计算,定理证明器负责逻辑推理,程序负责把这些步骤串起来、检查中间结果。LLM 不再是”整个系统”,而是程序里的一个组件,像一个能处理自然语言的函数。

整门课的系统都是这个思想的实例(见 SYLLABUS.md 第 0 节的表)。本讲用第一个、也是最经典的例子来说明它:WikiChat。

5.2 为什么”核查”比”生成”可靠

在介绍 WikiChat 之前,先看一个关键的不对称。

直觉。“凭记忆说出 Salotos 综合征是哪一年被描述的”,和”读这段资料,判断’Salotos 综合征 1977 年被描述’这句话对不对”,是两个难度完全不同的任务。前者需要回忆,后者只需要阅读和比较——就像考试时”默写”和”对照课本批改”的区别。

代码 03 演示 3 让同一个模拟 LLM 做两种任务(60 种疾病各生成一段介绍,拆出 232 条声明,每条再单独检索证据核查):

任务正确率
生成(凭记忆说出事实)49.6%
核查(对照证据判断真假)97.0%

核查的混淆矩阵:

判为支持(保留)判为不支持(删除)
实际正确1105
实际错误2115

错误的声明有 98.3% 被拦下。当然,模拟 LLM 的核查出错率(3%)是我们设定的;但同样的不对称在真实 LLM 上也成立:判断”这句话和这段资料是否一致”,比”凭空说对一件事”容易得多。这类判断在 NLP 里叫自然语言推理(NLI)或事实核查,是研究得很充分的任务。05 号可选代码让真实的 Claude 做同样的核查,你可以自己验证。

5.3 WikiChat 的 7 个阶段

WikiChat(Semnani、Yao、Zhang、Lam,EMNLP 2023 Findings)是一个基于维基百科、在开放领域对话中几乎不幻觉的聊天机器人,获得了维基媒体基金会 2024 年度研究奖。它把”回复用户”这件事拆成了 7 个阶段,每个阶段是一个专门写好的提示词:

用户的话
  │
  ├─①生成查询 ─► 检索 n 段 ─► ②逐段摘要与过滤 ─────────────────────┐
  │                                                              │
  └─③LLM 自己生成回复 ─► ④拆成 c 条声明 ─► ⑤每条单独检索、核查 ──┤(只保留被证据支持的)
                                                                 ▼
                                                  ⑥根据事实起草回复 ─► ⑦润色 ─► 回复
阶段做什么为什么要这一步
① 生成查询根据对话上下文写出检索查询,检索 nn 段用户的话往往不是好查询(“它是哪年发现的?“里的”它”要换成具体名字)
② 摘要与过滤逐段读资料,只留下和话题相关的事实检索到的段落里有很多无关内容;先过滤,后面的步骤更不容易被带偏
③ LLM 生成让 LLM 凭自己的知识生成一段回复检索只查了 nn 段,可能漏掉信息;LLM 的记忆里有很多正确的东西(尤其是头部话题),可以作为线索
④ 拆分声明把第 ③ 步的回复拆成一条条独立的事实声明一段话不好整体核查;拆开后每条可以单独检索证据。还要”去语境化”:把”它”换成具体的名字
⑤ 核查每条声明用它自己做查询检索证据,判断是否被支持;不被支持的删掉这是挡住幻觉的关键一步:记忆里说的每一句话,都要有证据才能留下
⑥ 起草根据第 ② 步的事实和第 ⑤ 步留下的声明,写出回复只用经过检验的材料来写
⑦ 润色改善相关性、自然度,去掉重复,修正时态准确之外,还要像一个好的对话者

LLM 调用次数:① 1 次 + ② nn 次 + ③ 1 次 + ④ 1 次 + ⑤ cc 次 + ⑥ 1 次 + ⑦ 1 次 = 5+n+c5 + n + c 次(nn 是检索到的段数,cc 是声明数)。

第 ③ 步是 WikiChat 设计里最反直觉、也最巧妙的地方:明知 LLM 会幻觉,还要让它说。原因是”不幻觉”和”有用”之间的张力(第 4.4 节)。WikiChat 的做法是把 LLM 的记忆降级为线索:记忆提供”可能是什么”,检索和核查决定”是不是”。

代码 03 演示 1 完整地走了一遍(一种长尾疾病,预训练语料里出现 12 次)。第 ③ 步的闭卷生成说”标志性症状是 early-onset obesity”——这是编的;第 ⑤ 步用这句声明本身去检索,找到了写着 “recurrent infections” 的段落,判为”矛盾”,删掉。另外两条声明(报告者、患病率)被证据支持而留下,补充了第 ② 步资料没覆盖到的内容。最终回复 6 条声明全部正确,用了 5+3+3=115 + 3 + 3 = 11 次 LLM 调用。注意第 ④ 步:第 ③ 步说了 4 句话,只拆出了 3 条声明——抽取这个小任务也会出错。

5.4 实验结果

论文的结果(模拟用户对话,按话题的流行程度分三档:头部、长尾、新近;指标是事实准确率,即回复中被维基百科支持的声明比例):

系统头部长尾新近全部
GPT-494.9%56.0%47.5%66.1%
WikiChat(GPT-4)98.8%94.6%98.5%97.3%
WikiChat(GPT-3.5)97.1%82.2%88.2%89.2%
WikiChat(LLaMA,蒸馏)95.2%87.1%90.9%91.1%

和 GPT-4 相比,WikiChat 在头部、长尾、新近三档上分别高出 3.9、38.6、51.0 个百分点。真实用户评估(第 2.3 节):事实准确率 97.9% vs 42.9%,用户评分 3.8 vs 3.4。最后一行说明了另一个要点:7 个阶段意味着 7 种提示、十几次调用,又慢又贵;但可以把整个流水线的输入输出蒸馏(distill)进一个 70 亿参数的 LLaMA 模型,在大幅降低成本的同时保留大部分质量(第 14 讲)。

模拟实验的结果(代码 03 演示 2:60 种疾病各对话一轮):

系统头部长尾新近全部正确声明数 / 轮LLM 调用 / 轮
闭卷 LLM96.2%39.0%10.0%50.8%2.031.0
朴素 RAG(k=3k=3)98.8%83.0%73.3%85.8%3.432.0
WikiChat98.3%98.5%98.6%98.4%5.2211.9
 去掉第 ③ 步(只用检索)99.0%100%98.6%99.3%4.776.0
 去掉第 ⑤ 步(不核查)98.3%87.8%81.1%89.5%5.278.0

趋势和论文一致:闭卷 LLM 随档次急剧下降;WikiChat 三档都接近 100%,而且信息量最高。两个消融实验(ablation,去掉某个部件看效果)说明每一步都有用:

  • 去掉第 ③ 步:仍然很准,但信息变少了(只剩检索到的那几段里的内容)。
  • 去掉第 ⑤ 步:信息量”看起来”一样多,但混进了大量编造的内容,准确率跌到 89.5%。

5.5 魔鬼在细节里

幻灯片总结了 WikiChat 项目的几条经验:

  • 问题比预想的难:3 名学生做了 4 个月。
  • 魔鬼在细节里。
  • 需要新的评估技术(模拟用户、按流行度分档、声明级的事实核查)。
  • 把问题分解成可靠的 LLM 任务。
  • 速度可以通过蒸馏找回来。
  • 一个关键的基础部件——开源发布。

“魔鬼在细节里”可以在模拟实验里直观地看到(代码 03 演示 4):

设计选择准确率正确声明数 / 轮
WikiChat(默认:核查时用声明本身检索,k=3k=3)98.4%5.22
核查时用用户的原话检索98.3%4.73
每次只检索 1 段98.7%2.62

“核查时用用户的原话检索”看起来只是换了一个查询,却让每条声明拿到的都是和第 ① 步一样的那几段资料,找不到证据的正确声明被删掉,信息量下降。WikiChat 用声明本身做查询,是因为声明的措辞和文档的措辞最接近。

更有意思的是核查出错率的影响:

核查出错率k=3k=3 准确率k=1k=1 准确率k=1k=1 时新近疾病的准确率
3%98.4%98.7%100%
10%98.1%93.3%80.0%
30%97.8%82.9%58.6%

k=3k=3 时,核查出错率从 3% 升到 30%,准确率只降了不到 1 个百分点;k=1k=1 时却从 98.7% 跌到 82.9%。原因在第 ⑥ 步:起草时,同一方面优先采用第 ② 步检索到的资料,LLM 的声明只用来补充资料没覆盖的方面。检索到的资料是第一道防线,核查是第二道——这叫纵深防御。k=1k=1 时第一道防线很薄,LLM 的声明大量依赖核查把关,核查一不可靠,错误就漏进来了。

结论:分解之后,每一个小任务都必须足够可靠,而且要清楚每道防线覆盖的是哪一部分。

5.6 工作流 vs 智能体

WikiChat 是一个工作流:步骤是程序员事先定好的,LLM 只负责每一步里定义清楚的小任务。Anthropic 在 2024 年的文章《Building effective agents》里给出了一个常用的区分:

  • 工作流(workflow):LLM 和工具通过预先定义好的代码路径组织起来;
  • 智能体(agent):LLM 动态地决定自己的流程和工具的使用。

文章的建议是:先用最简单的方案,只有在任务确实需要灵活性时才用智能体——因为自主性越高,越难预测、越难保证可靠。

这门课里两种都有:

系统类型为什么这样选
WikiChat(第 5 讲)工作流每轮对话的结构是固定的:检索、生成、核查、起草
STORM(第 2 讲)工作流写综述的流程(提问、检索、大纲、写作)是固定的
SPINACH(第 8 讲)智能体写一条复杂的 SPARQL 需要探索:先查什么、发现什么、再查什么,无法事先规定
Genie Worksheet(第 10 讲)形式化规格 + 运行时任务的结构由开发者用规格写清楚,LLM 只做语义解析和回复;介于两者之间

无论哪一种,本课的原则都一样:LLM 的每一个决定,都应该有办法被检查。


6. 可靠性的算术

第 5 节用实验展示了”分解 + 核查”的效果。这一节把背后的道理写成几行简单的概率算术(代码 04),它们会贯穿整门课。

6.1 长程任务的错误累积

一个任务要走 nn 步,每步独立地以概率 pp 做对,任何一步做错整个任务就失败,那么成功率是 pnp^n:

每步可靠性 ppn=5n=5n=10n=10n=20n=20n=50n=50n=100n=100
0.9995.1%90.4%81.8%60.5%36.6%
0.9577.4%59.9%35.8%7.7%0.6%
0.9059.0%34.9%12.2%0.5%0.0%

单步 95% 听起来不错,20 步之后只剩 36%。反过来,要让一个 20 步的任务有 90% 的成功率,每一步的错误率不能超过 0.53%。这是长程任务的根本难点。两条出路:

  1. 让每一步更可靠:分解成 LLM 擅长的小任务、加核查;
  2. 打破”任何一步出错就全盘失败”的假设:让系统能发现并纠正错误——重试、回滚、检查点(第 3 讲的 harness、第 8 讲 SPINACH 的回滚)。

6.2 声明级 vs 回复级

一段回复里有 cc 条声明,每条以概率 qq 正确,那么整段回复完全正确的概率是 qcq^c。单条 95% 的系统,5 条声明的回复只有 77.4% 是完全正确的;q=0.6q = 0.6(相当于长尾话题的闭卷水平)时不到 8%。

论文报告的事实准确率通常是按声明算的(WikiChat 的 97.3% 就是这样;FActScore 等评估方法也把回复拆成”原子事实”逐条打分),而用户感受到的是按回复算的:一句错话就足以让整段回复不可信。

6.3 核查是一个过滤器

设核查之前声明的错误比例是 hh(“幻觉率”),核查器保留正确声明的概率是 rr(召回率),放过错误声明的概率是 ff(漏检率)。核查之后留下的声明有两种来源:正确且被保留 (1−h) r(1-h)\,r,错误却被放过 h fh\,f。所以核查之后的准确率是(贝叶斯公式):

准确率=(1−h) r(1−h) r+h f\text{准确率} = \frac{(1-h)\,r}{(1-h)\,r + h\,f}

代码 04 演示 3:

话题核查前好的核查器(97% / 3%)一般的(90% / 10%)差的(70% / 30%)
头部(h=0.05h=0.05)95.0%99.8%99.4%97.8%
长尾(h=0.60h=0.60)40.0%95.6%85.7%60.9%
新近(h=0.90h=0.90)10.0%78.2%50.0%20.6%

三个结论:

  1. 幻觉率越高,核查越吃力:新近话题 90% 的声明是编的,即使只放过 3%,留下的声明里错误也不少。所以 WikiChat 不只靠核查,检索到的资料提供了大部分内容(第 5.5 节的纵深防御)。
  2. 核查越严格,丢掉的正确信息越多:准确率和信息量之间要权衡。
  3. 串联两个核查器能把漏检率从 3% 降到 0.032=0.09%0.03^2 = 0.09\%,但前提是两者的错误互相独立。如果两个核查器是同一个 LLM、同样的提示词,它们往往在同样的声明上犯同样的错,串联几乎没用。

6.4 投票能挡住幻觉吗?

让模型对同一个问题回答多次、取多数(自洽性,self-consistency,Wang 等 2023)在数学推理题上很有效。它能挡住幻觉吗?代码 04 演示 4 模拟了两种错误:

错误的类型采样次数单次准确率投票后准确率投错时的平均得票率
独立的随机错误560.3%86.5%40%
独立的随机错误1560.5%99.3%31%
系统性的幻觉559.4%60.2%83%
系统性的幻觉1559.2%60.0%83%

错误是独立的随机噪声时,投票非常有效。但幻觉往往是系统性的:模型”记错了”,每次采样都倾向于说同一个错误答案。这时投票几乎没有帮助,而且投出来的错误答案得票率很高——“多次采样答案一致”反而给了我们虚假的信心。

所以本课反复强调:要挡住幻觉,需要外部的证据(检索、数据库、定理证明器),而不是让同一个模型多想几遍。

6.5 不要相信演示:系统地评估

幻灯片上有一页醒目的结论:

未来的 LLM 仍然会幻觉,而且越难的问题幻觉率越高。

  1. 不要相信演示。
  2. 理解底层的技术。
  3. 系统地评估。

“不要相信演示”有严格的统计学理由(代码 04 演示 5):

小样本的置信区间很宽。观察到 90% 的准确率时,真实准确率的 95% 置信区间(Wilson 区间):

测试题数置信区间
10[59.6%, 98.2%]
50[78.6%, 95.7%]
100[82.6%, 94.5%]
500[87.1%, 92.3%]
2000[88.6%, 91.2%]

区分两个系统需要很多题。要以 80% 的把握分辨准确率 90% 和 95% 的两个系统,每个系统约需 435 道测试题;95% 和 99% 约需 285 道。“我试了几个例子,新版本好多了”几乎没有意义。

精挑细选的演示毫无说服力。从 20 次尝试里挑出 5 个成功的例子放进演示:准确率 70% 的系统一定挑得出来,30% 的系统也有 76% 的机会,15% 的系统也有 17%。

测试题的分布决定结论。同一个模拟 LLM(闭卷),只在头部话题上测是 95.7%,三档各占三分之一是 48.3%,按假想的真实使用比例(头部 : 长尾 : 新近 = 2 : 5 : 3)是 41.7%。WikiChat 把评估分成头部、长尾、新近三档,正是为了避免这种偏差。

第 15 讲会系统地讲评估方法:模拟用户、LLM 评委及其偏差、配对比较、真实用户研究。


7. 课程地图:Stanford Agentic OS

7.1 A-OS 的架构

Monica Lam 的研究组这几年做的系统,正在被整合进一个叫 Stanford Agentic OS(A-OS,智能体操作系统) 的平台。幻灯片上的架构图可以大致画成这样:

┌──────────────────────── 用户控制台 / 团队协作(Collaboration UI、Workspace Mgmt)────────────────────────┐
│ 应用平台   交互式智能体(Genie Worksheet)          基于约束的决策(VERDICT)                           │
│ 知识策展   交互式研究员(STORM、Co-STORM)           系统综述与洞见发现(DataTalk、DataSTORM、GRILL)      │
│ 语义检索   问答(WikiChat)  约束满足式检索(SatIR)  从长文档抽取的数据库(SLIDERS)  元知识图谱(Meta KG)│
│            SUQL:文本 + 数据库的统一查询语言                                                         │
│ 语义文件系统  ← 嵌入(Embeddings)                                                                    │
│ 数据接入   文本、表格、PDF、图片、手写体、古代语言(CHURRO)                                             │
│ 数据源     文本 · 数据库 · 知识图谱                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────────────┘

从下往上读:各种格式的数据(包括历史手稿)先被接入和理解,存进一个”语义文件系统”;在它之上是各种语义检索手段(文本问答、约束检索、长文档建库、知识图谱、混合查询语言);再往上是知识策展(写综述、做系统综述、发现洞见);最上面是面向具体应用的平台(任务型对话、可问责的决策)。

幻灯片还特别提到几个”基础的知识获取”成果:

系统关键想法意义
CHURRO(2025)在 22 个世纪、45 种语言的手稿和印刷品上微调视觉语言模型和 Gemini Pro 准确率相近,成本低 15.5 倍
STORM / Co-STORM(2024)搜索—阅读—再搜索的循环;交互式地探索”不知道自己不知道”的东西第一个深度研究系统之一,约 100 万自然用户
SUQL(2024)混合数据库 + 文本的结构化 / 非结构化查询语言用于记者的 DataTalk、Wikidata 智能体 SPINACH

7.2 三类高风险智能体

幻灯片把课程的研究方向归纳为三类”高风险智能体”:

① 面向客户的智能体(第 10 讲)。怎样让客服、预订、选课这类智能体不幻觉?关键想法:需要完整的规格说明,而不只是一堆可以调用的函数。Genie Worksheet 是一种领域专用语言,同时描述知识库和任务流程(类似网页上的表单流程),由运行时来管理长上下文。真实用户评估中,基于 GPT-4 的函数调用式智能体完成率很低(订餐厅任务只有 54.5%),在选课任务上甚至会编造不存在的课程——尽管它拿到了知识库的查询结果。

② 科学研究员(第 2、9、11 讲)。两个难点:上下文永远不够长;可问责要求追踪每一条证据。

  • SLIDERS:分析大批长文档(系统综述)。根据问题自动设计表结构,语义分块、带上下文地抽取,对账合并成一张表,再用 SUQL 查询;每个答案都能追溯到具体的段落。
  • GRILL:长程的深度研究员。迭代地提出假设、寻找支持和反驳的证据。在 RNA 测序研究(“哪些基因导致癌症耐药?“)中,它的结果影响了实验设计;在罕见病研究中,研究者评价”GRILL 比 Codex 好一个数量级”。
  • DataSTORM:从数据库里自动得出洞见(例如国际冲突数据)。

③ 可问责的决策(第 4 讲)。临床试验匹配:50 多万个临床试验,数百万病人,每个试验有大量复杂的纳入 / 排除条件;80% 的临床试验因为招不到足够的病人而失败。以往的方法:用嵌入相似度检索试验(精确率低,浪费时间;召回率低,漏掉可能救命的试验),再用 LLM 判断是否匹配(约 90% 的准确率,仍有 10% 的决策是错的)。而且医生要的不只是”是 / 否”,他们需要可问责的理由:

要求含义反例
可验证(verified)理由经过验证LLM 只说”病人不符合条件”
忠实(faithful)显式写出所做的假设LLM 默认”高血压已控制”等于”没有显著的心血管疾病”
一致(consistent)遵守给定的决策政策,对所有病人一视同仁政策规定”HIV 状态缺失时应视为未知”,LLM 却自行假设
可行动(actionable)指出关键条件:改变它,结论就会翻转说”因为 ECOG > 1 而不符合”,却没发现即使 ECOG = 0 也会因为其他条件不符合

VERDICT 的核心想法:LLM 负责语言理解,定理证明器负责决策。LLM 把试验条件和病历翻译成 SMT(可满足性模理论)约束,求解器给出带证明的”是 / 否”决策;所有剩余的约束就是显式的假设;用 MaxSAT 找出关键条件。形式化迫使系统暴露歧义和缺失值;翻译成 SMT 未必 100% 忠实,但它是可解释的,并且决策相对于 SMT 是可证明正确的。SatIR 进一步把 SMT 约束投影成数据库查询,实现高召回的检索:在 3,621 个试验上每个病人只需 0.15 秒。

7.3 和这套讲义的对应

讲次主题A-OS 中的位置
1导论:幻觉与分解(WikiChat 初探)语义检索
2知识策展与深度研究(STORM、Co-STORM、GRILL)知识策展
3智能体的构件(工具、循环、harness、A-OS)整体架构
4可问责的决策(SatIR、VERDICT)语义检索 + 应用平台
5无幻觉的 RAG(WikiChat 深入)语义检索
6–8结构化数据、SUQL、SPINACH语义检索
9SLIDERS语义检索 + 知识策展
10Genie Worksheet应用平台
11DataSTORM知识策展
12编程智能体与元优化harness 的自动优化
13CHURRO数据接入
14训练 LLM、蒸馏支撑所有组件
15评估方法与期末项目贯穿始终

8. 课程安排

  • 课程历史:这门课积极地创造和推进新技术,并让它们被真实用户采用。课程相关的论文发表:2023 年 2 篇、2024 年 5 篇、2025 年 6 篇、2026 年 3 篇。每一年的课都建立在前一年的研究之上;有前途的课程项目会在下一年继续作为研究进行,成果又用到下一年的课里。成功的秘诀是:可以工作的软件支撑起越来越复杂的研究。
  • 课程目标:让你有能力推进智能体 AI 的极限。讲座讲两类内容:构建可靠智能体的核心技术;推进 LLM 能力极限的高级技术。外加一个学期的、自选题目的项目:可以创造或改进通用工具,也可以把任何工具用到任何应用上。
  • 作业:两周内完成 2 个作业,目的是为项目开题做准备:接触最先进的工具,并看到一个”有挑战、又做得完”的项目是什么样子。作业的主题是罕见病,与 Rare Genomics Institute(Anthropic 罕见病 AI 资助计划的获得者之一)合作,内容包括:罕见病的深度研究、诊断信息的抽取、在真实病历中诊断罕见病。
  • 项目:作业和项目都是两人一组。网站上有约 20 个建议的项目,也欢迎自己提出。第 4 周提交开题报告(含每周计划);第 5~10 周(感恩节除外)每周一提交书面周报,并和导师开组会;第 11 周(12 月 2 日)海报展示;最终报告 2026 年 12 月 8 日截止。
  • 评分:第一讲幻灯片上是参与 15%、作业 25%、期末项目 60%(课程网站上写的是 15% / 20% / 65%,以最新的官方信息为准)。参与包括出勤、Ed 讨论区的讨论、和项目导师的会面。

9. 本讲小结

  1. 问题:LLM 已经能对话、检索、调用工具、操作电脑、写代码、推理,但在医疗、科学、金融、法律这些高风险领域还没有可靠的部署。需要在准确性、可问责、长程、长上下文四个方向上取得进展。
  2. 幻觉是看起来合理但不正确或没有依据的内容。它的危险在于看起来和正确答案一样,用户察觉不到。
  3. 幻觉的根源:训练目标奖励”像”而不是”对”;长尾知识见得少、记不住;知识截止之后的一无所知;只看准确率的评分规则奖励猜测;模型的信心没有完全校准,不知道自己不知道什么。
  4. RAG 仍会幻觉,因为检索可能没有返回答案,而 LLM 会用记忆补上。过时的文档库和知识库不会说”不知道”,而是给出具体的错误答案。
  5. 核心思想——计算思维:把问题分解成 LLM 能可靠完成的小任务(阅读、比较、改写、翻译),把它不擅长的事交给程序、检索、数据库、求解器。核查比生成可靠得多。
  6. WikiChat 用 7 个阶段、每轮 5+n+c5+n+c 次 LLM 调用,把记忆降级为线索、用证据决定去留,在头部、长尾、新近话题上都达到约 97% 的事实准确率;蒸馏可以找回速度。
  7. 可靠性的算术:多步任务的错误按 pnp^n 累积;核查的效果由贝叶斯公式决定;投票挡不住系统性的幻觉;小样本的演示没有说服力——不要相信演示,理解底层的技术,系统地评估。

10. 与作业的关系

作业 1:找到那个病人——为罕见病诊断做智能体式的文献研究(2026 年 10 月 6 日截止)。

  • 设定:给你一组 10 个病人,每人只有一份临床表现的列表;恰好有一人患有分配给你们组的罕见病。任务是找出这个病人,并给出别人可以核查的证据。
  • 难点正是本讲第 4.5 节的场景:有些疾病不在常用的表型知识库里(例如 2024 年才被描述的 ReNU 综合征),用知识库匹配会得到一个具体的错误诊断;需要的信息只存在于已发表的文献里。
  • 流程:先做 RAG 基线(检索文献片段,让模型据此回答);再逐步检查 GRILL 的中间产物——GRILL 一边搜索阅读文献,一边维护一本信念账本(假设、支持和反驳的证据、未决问题);然后用 GRILL 的报告去匹配病人;最后做错误分析。所有 LLM 调用都已经预先算好,作业的重点是检查每个阶段、分析错误。
  • 评分重点:12 个待办项共 53 分,奖励的是解释:一个诊断正确但说不清为什么的提交,得分低于一个诊断失败但准确指出失败在哪里的提交。每个定量的结论都要指明出自哪个代码单元或哪个文件的哪一行;报告里至少要指出一个你通过有意的检查发现的流水线错误。

本讲和作业的对应:

作业部分本讲
背景:罕见病诊断是一个知识库问题第 1.3、4.5 节;代码 02 演示 5
基线:直接问 LLM、RAG第 3、4 节;代码 01、02
比较 GRILL、RAG、直接调用 LLM第 5 节的分解思想;第 2 讲会详细讲 GRILL
多次运行 GRILL 的差异第 6.4、6.5 节(方差、小样本)
错误分析第 4.3 节的错误归因方法

建议先独立完成作业,卡住了再参考这里的讲解和代码。


11. 练习

练习 1(概念)。判断下面每种情况属于”事实性幻觉”还是”忠实性幻觉”,是”内在的”还是”外在的”: (a) 闭卷回答”Velmora 综合征由 VLK2 基因突变引起”,而实际是 KRT3; (b) 资料写着”首次描述于 1987 年”,模型的回答写成”1978 年”并引用了这段资料; (c) 资料只提到了致病基因,模型的回答还说了”患病率约十万分之一”(这恰好是对的)。

参考答案

(a) 事实性幻觉(和世界事实不符;闭卷时没有资料可言)。 (b) 忠实性幻觉,内在的(和资料矛盾)。同时也是事实性错误。这类”带引用的幻觉”最有迷惑性。 (c) 相对于资料是外在的(资料里没有、无法从资料核实)。它碰巧是对的,但在 RAG 系统里,这类内容和编造的内容在形式上无法区分——WikiChat 的做法是为它单独检索证据,找到了才保留。

练习 2(计算)。模拟 LLM 的记忆公式是 P(记住)=m/(m+κ)P(\text{记住}) = m/(m+\kappa),κ=8\kappa = 8。 (a) 一条事实要在预训练语料里出现多少次,被记住的概率才能达到 90%?99%? (b) 一个长尾实体出现了 4 次。它的 7 条事实全部被记住的概率是多少?

参考答案

(a) m/(m+8)≥0.9⇒m≥72m/(m+8) \ge 0.9 \Rightarrow m \ge 72;≥0.99⇒m≥792\ge 0.99 \Rightarrow m \ge 792。从 90% 到 99%,需要的曝光次数增加了 11 倍——又一个”最后的 10%”。 (b) 每条 4/12=1/34/12 = 1/3,7 条全记住(假设独立)是 (1/3)7≈0.05%(1/3)^7 \approx 0.05\%。

练习 3(推导)。评分规则:答对 +1,答错 −2,不知道 0。 (a) 校准的模型应该在信心高于多少时作答? (b) 如果把”不知道”改成 +0.2 分(鼓励诚实),阈值变成多少?

参考答案

(a) 期望得分 c−2(1−c)=3c−2>0⇒c>2/3c - 2(1-c) = 3c - 2 > 0 \Rightarrow c > 2/3。也可以直接套公式 λ/(1+λ)=2/3\lambda/(1+\lambda) = 2/3。 (b) 作答的期望得分要超过 0.2:3c−2>0.2⇒c>11/15≈0.7333c - 2 > 0.2 \Rightarrow c > 11/15 \approx 0.733。给弃权加分会进一步提高作答的门槛。

练习 4(归因)。下面三个 RAG 的错误,分别属于第 4 节的哪一类原因?应该怎样改进? (a) 用户问”哪个基因是元凶?“,检索器返回了这种病的”症状”和”历史”两段,模型回答了一个基因名,是编的; (b) 检索返回了正确的段落,写着基因是 NKN8,模型回答 RSM3(它”记得”的值); (c) 新药批准后,文档库没有更新,模型给出了旧的治疗方案。

参考答案

(a) 原因 1 + 原因 2 叠加:措辞不匹配导致检索失败,模型用记忆补上。改进:查询改写(第 ① 步)、更好的检索器(稠密检索、混合检索,第 5 讲)、增大 kk;以及要求模型在资料里没有答案时说没有,或者像 WikiChat 一样核查每条声明。 (b) 原因 2:知识冲突中模型偏向了记忆。改进:核查(第 ⑤ 步会发现声明和证据矛盾);在提示词中强调以资料为准。 (c) 文档库过时(原因 1 的一种)。检索器不会说”没有新资料”。改进:保持数据源更新;在回答中注明资料的日期;对时效性强的问题优先检索最新来源。

练习 5(WikiChat)。WikiChat 第 ① 步检索到 5 段,第 ③ 步的回复拆出了 8 条声明。 (a) 这一轮一共调用 LLM 多少次? (b) 如果每次调用平均 1.5 秒、串行执行,用户要等多久?哪些步骤可以并行? (c) 为什么蒸馏能”找回速度”?

参考答案

(a) 5+5+8=185 + 5 + 8 = 18 次。 (b) 串行约 27 秒。第 ② 步的 5 次过滤互相独立,可以并行;第 ⑤ 步的 8 次核查也可以并行;第 ①、③ 步也可以同时开始。并行后关键路径大约是 ①→②、③→④→⑤→⑥→⑦,约 7 次调用的时间。 (c) 蒸馏用整个流水线的输入输出作为训练数据,训练一个小模型直接产生最终回复(或者每一步用小模型),每次调用更快、更便宜(第 14 讲)。

练习 6(贝叶斯)。一个系统生成的声明里有 30% 是错的。核查器保留正确声明的概率是 95%,放过错误声明的概率是 5%。 (a) 核查之后的准确率是多少? (b) 再串联一个独立的、同样水平的核查器呢? (c) 如果第二个核查器和第一个是同一个 LLM、同一个提示词,你预计 (b) 的结果会怎样变化?

参考答案

(a) 0.7×0.950.7×0.95+0.3×0.05=0.6650.68≈97.8%\dfrac{0.7 \times 0.95}{0.7 \times 0.95 + 0.3 \times 0.05} = \dfrac{0.665}{0.68} \approx 97.8\%。 (b) 召回率 0.952=0.90250.95^2 = 0.9025,漏检率 0.052=0.00250.05^2 = 0.0025:0.7×0.90250.7×0.9025+0.3×0.0025≈99.88%\dfrac{0.7 \times 0.9025}{0.7 \times 0.9025 + 0.3 \times 0.0025} \approx 99.88\%。 (c) 两次核查的错误高度相关:第一个放过的错误声明,第二个很可能也放过。实际的漏检率会接近 5% 而不是 0.25%,准确率接近 (a) 的结果,而召回率还多付出了一次代价。要让串联有效,需要不同来源的核查(不同的证据、不同的方法、不同的模型)。

练习 7(动手改代码)。在 01_why_llms_hallucinate.py 的 main() 里,把 SimulatedLLM(world, seed=0) 改成 SimulatedLLM(world, seed=0, kappa=2)(模型的记忆力更好)。 (a) 三档的闭卷准确率怎样变化?新近疾病呢? (b) 这说明”更大、更强的模型”能解决哪一部分幻觉问题,不能解决哪一部分?

参考答案(思路)

(a) 编写讲义时实际运行的结果:头部 95.7% → 98.6%,长尾 38.9% → 59.4%,新近 10.5% → 10.5%(完全不变)——出现 0 次的知识,记忆力再好也记不住。 (b) 更强的模型能把”记忆曲线”往左推,缓解长尾问题;但知识截止之后的新知识、私有的知识、从未出现在语料里的知识,只能靠检索。这和幻灯片的结论一致:未来的 LLM 仍然会幻觉,而且越难的问题幻觉率越高。

练习 8(动手改代码)。在 llm.py 的 draft() 里,“同一疾病、同一关系只保留第一条”,而 03 号文件把第 ② 步的事实放在第 ⑤ 步的声明前面。把 03 号文件 wikichat() 里的 llm.draft(utterance, evidence + kept) 改成 llm.draft(utterance, kept + evidence),再在 k=3k=3、核查出错率 30% 的设置下运行演示 4。准确率怎样变化?为什么?

参考答案(思路)

编写讲义时实际运行的结果:核查出错率 30% 时,整体准确率从 97.8% 降到 92.7%,新近疾病从 97.3% 降到 86.7%;核查出错率 3% 时两种顺序差别不大(98.4% vs 98.7%)。顺序调换后,同一方面优先采用 LLM 的声明,第一道防线(检索到的资料)不再能”覆盖”被错误放过的声明,系统的可靠性完全取决于核查。这个练习说明:一行代码里的顺序,就是一个”魔鬼在细节里”的设计决定。

练习 9(开放题)。你要为一家医院设计一个回答”某种罕见病的最新治疗方案”的助手。参照本讲的计算思维,写出你会怎样分解这个问题:哪些步骤交给 LLM,哪些交给程序或数据库?在哪里加核查?怎样评估?

参考思路

一种可能的分解:① LLM 把问题改写成检索查询(疾病名的各种别名、基因名);② 检索最新的文献和指南(注明日期,优先最近的);③ LLM 逐篇抽取结构化信息(治疗名称、证据等级、适用人群、日期);④ 程序按日期和证据等级排序、去重,标出相互矛盾的结论;⑤ LLM 起草回复,每句话附引用;⑥ 核查每条声明和引用是否一致;⑦ 资料不足时明确说”没有找到可靠证据”,并建议咨询专科医生。评估:按疾病的罕见程度和资料的新旧分档;由医生逐条核查声明;统计”错误的建议”和”漏掉的重要治疗”两类错误,前者的权重远大于后者(第 3.4 节的 λ\lambda)。


12. 延伸阅读

本讲的核心论文

  • Semnani, Yao, Zhang, Lam. WikiChat: Stopping the Hallucination of Large Language Model Chatbots by Few-Shot Grounding on Wikipedia. Findings of EMNLP 2023.(本讲第 5 节;第 5 讲会详细讲)

幻觉从哪里来

  • Kalai, Nachum, Vempala, Zhang. Why Language Models Hallucinate. 2025.(“评分规则奖励猜测”的论证)
  • Kandpal, Deng, Roberts, Wallace, Raffel. Large Language Models Struggle to Learn Long-Tail Knowledge. ICML 2023.
  • Mallen et al. When Not to Trust Language Models: Investigating Effectiveness of Parametric and Non-Parametric Memories. ACL 2023.
  • Kadavath et al. Language Models (Mostly) Know What They Know. 2022.
  • Ji et al. Survey of Hallucination in Natural Language Generation. ACM Computing Surveys 2023.

RAG 与知识冲突

  • Lewis et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020.
  • Longpre et al. Entity-Based Knowledge Conflicts in Question Answering. EMNLP 2021.
  • Xie et al. Adaptive Chameleon or Stubborn Sloth: Revealing the Behavior of Large Language Models in Knowledge Conflicts. ICLR 2024.

真实案例

  • Dahl, Magesh, Suzgun, Ho. Large Legal Fictions: Profiling Legal Hallucinations in Large Language Models. Journal of Legal Analysis 2024.
  • Magesh et al. Hallucination-Free? Assessing the Reliability of Leading AI Legal Research Tools. 2024.
  • BBC. Representation of BBC News content in AI Assistants. 2025 年 2 月.

评估与核查

  • Min et al. FActScore: Fine-grained Atomic Evaluation of Factual Precision in Long Form Text Generation. EMNLP 2023.
  • Wang et al. Self-Consistency Improves Chain of Thought Reasoning in Language Models. ICLR 2023.

智能体与计算思维

  • Wing. Computational Thinking. Communications of the ACM 2006.
  • Anthropic. Building Effective Agents. 2024.

课程阅读清单里标为必读的第一部分:Transformer(Vaswani 等 2017)、思维链提示(Wei 等 2023)。CS224N 第 7、14 讲讲过这两篇,可以对照阅读。


13. 下一讲预告

本讲的 WikiChat 回答的是”一个问题”。如果任务是从零写一篇关于某个话题的、有引用的综述——比如”写一篇关于某种罕见病的维基百科式文章”,或者”调研某个基因和哪些临床表型有关”——一次检索、一轮核查就远远不够了:你要知道该问哪些问题,要从多个视角去搜索和阅读,要把读到的东西组织成大纲,还要处理”不知道自己不知道”的东西。

第 2 讲讲知识策展与深度研究:STORM 怎样通过”模拟不同视角的提问者和专家对话”来做写作前的调研;Co-STORM 怎样让人加入这场讨论;以及作业 1 里的 GRILL 怎样用一本”信念账本”来组织一个长程的研究过程。

← 返回课程目录