对应:Stanford CS224V Fall 2026 Lecture 1(9/23 Introduction,Monica Lam 主讲)。 配套代码:
code/lecture01/(只用 Python 标准库;05 号文件可选,需要anthropic包和 API 密钥) 预计阅读时间:3~4 小时(含运行代码)
0. 本讲导航
0.1 学完本讲,你应该能够
- 说出今天的 LLM 面向用户的主要能力,以及为什么它们还没有被可靠地用在医疗、科学、金融、法律这些高风险领域。
- 解释”准确性、可问责、长程、长上下文”这四个关键词分别指什么。
- 举出幻觉的真实案例,区分”事实性错误”和”不忠实于资料”两类幻觉。
- 从训练目标、长尾知识、知识截止、评分规则、校准五个角度解释 LLM 为什么会幻觉。
- 说出加了检索(RAG)之后仍然会幻觉的两个原因,并能对 RAG 的错误做归因分析。
- 解释”计算思维”和”把问题分解成可靠的 LLM 任务”的含义,画出 WikiChat 的 7 个阶段,算出每轮的 LLM 调用次数 。
- 用简单的概率算术分析多步任务的错误累积、核查的效果、投票的局限,以及为什么”不要相信演示”。
- 说出 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) | 25 | 0~12 次 | 只在几篇论文里提过的病 |
| 新近(recent) | 15 | 0 次(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 为什么值得做
幻灯片给出了两个”影响”:
- 可负担的高风险服务。律师、医生、金融顾问的服务很贵。如果 AI 能可靠地承担其中的一部分工作,更多人能负担得起。
- 加速知识发现。科学研究的很大一部分时间花在”读文献、整理证据、对比数据”上。可靠的研究型智能体能让这件事快一个数量级。
作业的主题罕见病是一个很好的例子:全世界大约 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-4 | 3.4 | 42.9% |
| WikiChat(基于 GPT-4) | 3.8 | 97.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 讲):
这个目标奖励的是”生成和训练语料相像的文字”,而不是”生成正确的文字”。对于一个模型没见过几次的事实,“像样的续写”和”正确的续写”就分开了:
- “Salotos syndrome was first described in ___” 后面最像样的是一个四位数的年份——模型会给出一个;
- 语料里很少出现”我不知道 Salotos syndrome 是哪一年被描述的”这种句子,所以”不知道”本身就不是一个”像样的续写”。
为什么这很重要。这意味着幻觉不是一个可以”修掉”的 bug,而是这种训练方式的自然产物。后训练(指令微调、RLHF)能让模型更多地说”不知道”,但只要模型的知识来自”见过多少次”,长尾上的不确定性就一直存在。下面几节从不同角度把这件事说得更具体。
3.2 长尾:见得越多,记得越牢
背景。Kandpal 等(2023)统计了预训练语料里和每个问答题相关的文档数,发现模型答对的概率与这个数目强相关:相关文档只有几篇的问题,即使是很大的模型也很难答对。Mallen 等(2023)用实体的”流行度”(维基百科页面的浏览量)做了类似的分析,得出同样的结论,并提出”只对不流行的实体做检索”。
模拟。模拟 LLM 用一个最简单的公式来体现这个趋势:一种疾病在预训练语料里出现了 次,它的每一条事实被记住的概率是
出现 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 分,答错扣 分,“不知道”得 0 分。如果模型的信心 是校准的(答对的概率真的是 ),作答的期望得分是
它大于 0(比”不知道”好)当且仅当
- (只看准确率):阈值是 0,永远应该作答;
- :阈值 0.5;
- (高风险场景:错误的诊断比”不知道”糟糕得多):阈值 0.75。
Kalai 等因此建议在评测的说明里写明置信度目标,例如”只有当你有超过 的把握时才回答,答错扣 分”——这和上面的 是同一回事。
模拟(代码 01 演示 4):让同一个模拟 LLM 采用”信心低于阈值 就说不知道”的策略,在三种评分规则下的平均得分:
| 阈值 | 作答比例 | |||
|---|---|---|---|---|
| 0.0 | 100% | 0.507 | 0.014 | −0.971 |
| 0.5 | 67.6% | 0.467 | 0.257 | −0.162 |
| 0.7 | 43.3% | 0.374 | 0.314 | 0.195 |
| 0.9 | 11.2% | 0.102 | 0.093 | 0.074 |
只看准确率时,“从不弃权”得分最高;一旦答错要扣分,“有把握才答”就成了最优策略。表里 的最优阈值比理论值 0.5 高,是因为这个模型的信心没有校准——这是下一节的主题。
3.5 校准:模型知道自己不知道吗?
校准(calibration)指模型的信心和它的实际准确率一致:信心 0.8 的回答,应该有 80% 是对的。Kadavath 等(2022)发现大模型”大体上知道自己知道什么”:让模型评估自己答案正确的概率,结果是部分校准的。但”大体上”不等于”完全”。
代码 01 演示 5 把模拟 LLM 的回答按信心分组:
| 信心区间 | 题数 | 平均信心 | 实际准确率 |
|---|---|---|---|
| [0.00, 0.30) | 59 | 0.18 | 15.3% |
| [0.30, 0.50) | 77 | 0.41 | 10.4% |
| [0.50, 0.70) | 102 | 0.60 | 38.2% |
| [0.70, 0.85) | 100 | 0.78 | 80.0% |
| [0.85, 1.00) | 82 | 0.91 | 93.9% |
信心和准确率正相关,但中等信心的那一档明显”过度自信”。选择性回答(只在信心 ≥ 时作答)的效果:
| 阈值 | 头部 覆盖 / 准确 | 长尾 覆盖 / 准确 | 新近 覆盖 / 准确 | 全部 覆盖 / 准确 |
|---|---|---|---|---|
| 0.0 | 100% / 95.7% | 100% / 38.9% | 100% / 10.5% | 100% / 50.7% |
| 0.7 | 83% / 100% | 33% / 69.0% | 8% / 12.5% | 43% / 86.3% |
| 0.9 | 23% / 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 在第一讲里给出了两个原因:
- 检索没有返回答案。
- LLM 用自己的记忆补上了答案。
4.2 原因 1:检索没有返回答案
直觉。检索器是一个”关键词匹配机”(稠密检索器是一个”语义相似度匹配机”),它不理解问题。当问题的措辞和文档的措辞不同,它就可能找错地方。
代码 02 演示 1 统计了答案所在的段落出现在前 名里的比例(Recall@k):
| 直接问法 | 换说法 | |
|---|---|---|
| 1 | 100% | 14.3% |
| 2 | 100% | 42.9% |
| 3 | 100% | 71.4% |
| 5 | 100% | 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” 吸引过去。
增大 能提高召回率,但要付出代价:上下文更长、无关内容更多、成本更高,而且 LLM 在一堆无关段落里找答案时也更容易出错。
更隐蔽的情况:文档库本身过时了。代码 02 演示 4 让检索器只索引 2024 年以前描述过的疾病,然后问新近疾病的问题:
| 设置 | 新近疾病的准确率 |
|---|---|
| 最新的文档库 + 朴素 RAG | 98.1% |
| 过时的文档库 + 朴素 RAG | 10.5% |
| 过时的文档库 + “只根据资料回答” | 2.9%(弃权 83%) |
检索器总会返回”最相关”的 段——哪怕文档库里根本没有相关内容。它从不说”没有”。例如问 Hosuldith disease 的致病基因,过时的文档库返回了 Hosisdith disease #2 等三篇别的疾病的段落(名字还很像!),朴素 RAG 照样给出一个具体的基因名,而且回答带着检索的”光环”,用户更难怀疑它。
4.3 原因 2:LLM 用记忆补上了答案
检索失败本身并不致命——如果模型老老实实地说”资料里没有”,那就不是幻觉。致命的是模型不说。
代码 02 演示 3 对朴素 RAG 的全部 840 道题(直接问法 + 换说法)做了错误归因(这是只有模拟实验才能做的”上帝视角”分析):
| 答案的来源 | 题数 | 答对 | 答错 |
|---|---|---|---|
| 检索命中,正确地从资料里读出 | 701 | 701 | 0 |
| 检索命中,但读错了 | 15 | 1 | 14 |
| 检索命中,但更相信自己的记忆 | 4 | 0 | 4 |
| 检索未命中,用记忆补上 | 120 | 61 | 59 |
一共答错 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%) |
两个观察:
- 很多错误变成了弃权。弃权不是好结果,但在高风险场景里比自信的错误好得多(回想第 3.4 节的 )。即便如此,仍有错误:模型偶尔不听话(模拟 LLM 里有 15% 的概率”泄漏”记忆)。
- 头部疾病的准确率反而下降了:模型本来记得的答案,因为资料里没有,也不敢说了。“不幻觉”和”有用”之间有张力。
我们想要的是:既利用模型记忆里正确的部分,又不让错误的部分溜出去。这正是第 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% |
核查的混淆矩阵:
| 判为支持(保留) | 判为不支持(删除) | |
|---|---|---|
| 实际正确 | 110 | 5 |
| 实际错误 | 2 | 115 |
错误的声明有 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 条声明 ─► ⑤每条单独检索、核查 ──┤(只保留被证据支持的)
▼
⑥根据事实起草回复 ─► ⑦润色 ─► 回复
| 阶段 | 做什么 | 为什么要这一步 |
|---|---|---|
| ① 生成查询 | 根据对话上下文写出检索查询,检索 段 | 用户的话往往不是好查询(“它是哪年发现的?“里的”它”要换成具体名字) |
| ② 摘要与过滤 | 逐段读资料,只留下和话题相关的事实 | 检索到的段落里有很多无关内容;先过滤,后面的步骤更不容易被带偏 |
| ③ LLM 生成 | 让 LLM 凭自己的知识生成一段回复 | 检索只查了 段,可能漏掉信息;LLM 的记忆里有很多正确的东西(尤其是头部话题),可以作为线索 |
| ④ 拆分声明 | 把第 ③ 步的回复拆成一条条独立的事实声明 | 一段话不好整体核查;拆开后每条可以单独检索证据。还要”去语境化”:把”它”换成具体的名字 |
| ⑤ 核查 | 每条声明用它自己做查询检索证据,判断是否被支持;不被支持的删掉 | 这是挡住幻觉的关键一步:记忆里说的每一句话,都要有证据才能留下 |
| ⑥ 起草 | 根据第 ② 步的事实和第 ⑤ 步留下的声明,写出回复 | 只用经过检验的材料来写 |
| ⑦ 润色 | 改善相关性、自然度,去掉重复,修正时态 | 准确之外,还要像一个好的对话者 |
LLM 调用次数:① 1 次 + ② 次 + ③ 1 次 + ④ 1 次 + ⑤ 次 + ⑥ 1 次 + ⑦ 1 次 = 次( 是检索到的段数, 是声明数)。
第 ③ 步是 WikiChat 设计里最反直觉、也最巧妙的地方:明知 LLM 会幻觉,还要让它说。原因是”不幻觉”和”有用”之间的张力(第 4.4 节)。WikiChat 的做法是把 LLM 的记忆降级为线索:记忆提供”可能是什么”,检索和核查决定”是不是”。
代码 03 演示 1 完整地走了一遍(一种长尾疾病,预训练语料里出现 12 次)。第 ③ 步的闭卷生成说”标志性症状是 early-onset obesity”——这是编的;第 ⑤ 步用这句声明本身去检索,找到了写着 “recurrent infections” 的段落,判为”矛盾”,删掉。另外两条声明(报告者、患病率)被证据支持而留下,补充了第 ② 步资料没覆盖到的内容。最终回复 6 条声明全部正确,用了 次 LLM 调用。注意第 ④ 步:第 ③ 步说了 4 句话,只拆出了 3 条声明——抽取这个小任务也会出错。
5.4 实验结果
论文的结果(模拟用户对话,按话题的流行程度分三档:头部、长尾、新近;指标是事实准确率,即回复中被维基百科支持的声明比例):
| 系统 | 头部 | 长尾 | 新近 | 全部 |
|---|---|---|---|---|
| GPT-4 | 94.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 调用 / 轮 |
|---|---|---|---|---|---|---|
| 闭卷 LLM | 96.2% | 39.0% | 10.0% | 50.8% | 2.03 | 1.0 |
| 朴素 RAG() | 98.8% | 83.0% | 73.3% | 85.8% | 3.43 | 2.0 |
| WikiChat | 98.3% | 98.5% | 98.6% | 98.4% | 5.22 | 11.9 |
| 去掉第 ③ 步(只用检索) | 99.0% | 100% | 98.6% | 99.3% | 4.77 | 6.0 |
| 去掉第 ⑤ 步(不核查) | 98.3% | 87.8% | 81.1% | 89.5% | 5.27 | 8.0 |
趋势和论文一致:闭卷 LLM 随档次急剧下降;WikiChat 三档都接近 100%,而且信息量最高。两个消融实验(ablation,去掉某个部件看效果)说明每一步都有用:
- 去掉第 ③ 步:仍然很准,但信息变少了(只剩检索到的那几段里的内容)。
- 去掉第 ⑤ 步:信息量”看起来”一样多,但混进了大量编造的内容,准确率跌到 89.5%。
5.5 魔鬼在细节里
幻灯片总结了 WikiChat 项目的几条经验:
- 问题比预想的难:3 名学生做了 4 个月。
- 魔鬼在细节里。
- 需要新的评估技术(模拟用户、按流行度分档、声明级的事实核查)。
- 把问题分解成可靠的 LLM 任务。
- 速度可以通过蒸馏找回来。
- 一个关键的基础部件——开源发布。
“魔鬼在细节里”可以在模拟实验里直观地看到(代码 03 演示 4):
| 设计选择 | 准确率 | 正确声明数 / 轮 |
|---|---|---|
| WikiChat(默认:核查时用声明本身检索,) | 98.4% | 5.22 |
| 核查时用用户的原话检索 | 98.3% | 4.73 |
| 每次只检索 1 段 | 98.7% | 2.62 |
“核查时用用户的原话检索”看起来只是换了一个查询,却让每条声明拿到的都是和第 ① 步一样的那几段资料,找不到证据的正确声明被删掉,信息量下降。WikiChat 用声明本身做查询,是因为声明的措辞和文档的措辞最接近。
更有意思的是核查出错率的影响:
| 核查出错率 | 准确率 | 准确率 | 时新近疾病的准确率 |
|---|---|---|---|
| 3% | 98.4% | 98.7% | 100% |
| 10% | 98.1% | 93.3% | 80.0% |
| 30% | 97.8% | 82.9% | 58.6% |
时,核查出错率从 3% 升到 30%,准确率只降了不到 1 个百分点; 时却从 98.7% 跌到 82.9%。原因在第 ⑥ 步:起草时,同一方面优先采用第 ② 步检索到的资料,LLM 的声明只用来补充资料没覆盖的方面。检索到的资料是第一道防线,核查是第二道——这叫纵深防御。 时第一道防线很薄,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 长程任务的错误累积
一个任务要走 步,每步独立地以概率 做对,任何一步做错整个任务就失败,那么成功率是 :
| 每步可靠性 | |||||
|---|---|---|---|---|---|
| 0.99 | 95.1% | 90.4% | 81.8% | 60.5% | 36.6% |
| 0.95 | 77.4% | 59.9% | 35.8% | 7.7% | 0.6% |
| 0.90 | 59.0% | 34.9% | 12.2% | 0.5% | 0.0% |
单步 95% 听起来不错,20 步之后只剩 36%。反过来,要让一个 20 步的任务有 90% 的成功率,每一步的错误率不能超过 0.53%。这是长程任务的根本难点。两条出路:
- 让每一步更可靠:分解成 LLM 擅长的小任务、加核查;
- 打破”任何一步出错就全盘失败”的假设:让系统能发现并纠正错误——重试、回滚、检查点(第 3 讲的 harness、第 8 讲 SPINACH 的回滚)。
6.2 声明级 vs 回复级
一段回复里有 条声明,每条以概率 正确,那么整段回复完全正确的概率是 。单条 95% 的系统,5 条声明的回复只有 77.4% 是完全正确的;(相当于长尾话题的闭卷水平)时不到 8%。
论文报告的事实准确率通常是按声明算的(WikiChat 的 97.3% 就是这样;FActScore 等评估方法也把回复拆成”原子事实”逐条打分),而用户感受到的是按回复算的:一句错话就足以让整段回复不可信。
6.3 核查是一个过滤器
设核查之前声明的错误比例是 (“幻觉率”),核查器保留正确声明的概率是 (召回率),放过错误声明的概率是 (漏检率)。核查之后留下的声明有两种来源:正确且被保留 ,错误却被放过 。所以核查之后的准确率是(贝叶斯公式):
代码 04 演示 3:
| 话题 | 核查前 | 好的核查器(97% / 3%) | 一般的(90% / 10%) | 差的(70% / 30%) |
|---|---|---|---|---|
| 头部() | 95.0% | 99.8% | 99.4% | 97.8% |
| 长尾() | 40.0% | 95.6% | 85.7% | 60.9% |
| 新近() | 10.0% | 78.2% | 50.0% | 20.6% |
三个结论:
- 幻觉率越高,核查越吃力:新近话题 90% 的声明是编的,即使只放过 3%,留下的声明里错误也不少。所以 WikiChat 不只靠核查,检索到的资料提供了大部分内容(第 5.5 节的纵深防御)。
- 核查越严格,丢掉的正确信息越多:准确率和信息量之间要权衡。
- 串联两个核查器能把漏检率从 3% 降到 ,但前提是两者的错误互相独立。如果两个核查器是同一个 LLM、同样的提示词,它们往往在同样的声明上犯同样的错,串联几乎没用。
6.4 投票能挡住幻觉吗?
让模型对同一个问题回答多次、取多数(自洽性,self-consistency,Wang 等 2023)在数学推理题上很有效。它能挡住幻觉吗?代码 04 演示 4 模拟了两种错误:
| 错误的类型 | 采样次数 | 单次准确率 | 投票后准确率 | 投错时的平均得票率 |
|---|---|---|---|---|
| 独立的随机错误 | 5 | 60.3% | 86.5% | 40% |
| 独立的随机错误 | 15 | 60.5% | 99.3% | 31% |
| 系统性的幻觉 | 5 | 59.4% | 60.2% | 83% |
| 系统性的幻觉 | 15 | 59.2% | 60.0% | 83% |
错误是独立的随机噪声时,投票非常有效。但幻觉往往是系统性的:模型”记错了”,每次采样都倾向于说同一个错误答案。这时投票几乎没有帮助,而且投出来的错误答案得票率很高——“多次采样答案一致”反而给了我们虚假的信心。
所以本课反复强调:要挡住幻觉,需要外部的证据(检索、数据库、定理证明器),而不是让同一个模型多想几遍。
6.5 不要相信演示:系统地评估
幻灯片上有一页醒目的结论:
未来的 LLM 仍然会幻觉,而且越难的问题幻觉率越高。
- 不要相信演示。
- 理解底层的技术。
- 系统地评估。
“不要相信演示”有严格的统计学理由(代码 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 | 语义检索 |
| 9 | SLIDERS | 语义检索 + 知识策展 |
| 10 | Genie Worksheet | 应用平台 |
| 11 | DataSTORM | 知识策展 |
| 12 | 编程智能体与元优化 | harness 的自动优化 |
| 13 | CHURRO | 数据接入 |
| 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. 本讲小结
- 问题:LLM 已经能对话、检索、调用工具、操作电脑、写代码、推理,但在医疗、科学、金融、法律这些高风险领域还没有可靠的部署。需要在准确性、可问责、长程、长上下文四个方向上取得进展。
- 幻觉是看起来合理但不正确或没有依据的内容。它的危险在于看起来和正确答案一样,用户察觉不到。
- 幻觉的根源:训练目标奖励”像”而不是”对”;长尾知识见得少、记不住;知识截止之后的一无所知;只看准确率的评分规则奖励猜测;模型的信心没有完全校准,不知道自己不知道什么。
- RAG 仍会幻觉,因为检索可能没有返回答案,而 LLM 会用记忆补上。过时的文档库和知识库不会说”不知道”,而是给出具体的错误答案。
- 核心思想——计算思维:把问题分解成 LLM 能可靠完成的小任务(阅读、比较、改写、翻译),把它不擅长的事交给程序、检索、数据库、求解器。核查比生成可靠得多。
- WikiChat 用 7 个阶段、每轮 次 LLM 调用,把记忆降级为线索、用证据决定去留,在头部、长尾、新近话题上都达到约 97% 的事实准确率;蒸馏可以找回速度。
- 可靠性的算术:多步任务的错误按 累积;核查的效果由贝叶斯公式决定;投票挡不住系统性的幻觉;小样本的演示没有说服力——不要相信演示,理解底层的技术,系统地评估。
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 的记忆公式是 ,。 (a) 一条事实要在预训练语料里出现多少次,被记住的概率才能达到 90%?99%? (b) 一个长尾实体出现了 4 次。它的 7 条事实全部被记住的概率是多少?
参考答案
(a) ;。从 90% 到 99%,需要的曝光次数增加了 11 倍——又一个”最后的 10%”。 (b) 每条 ,7 条全记住(假设独立)是 。
练习 3(推导)。评分规则:答对 +1,答错 −2,不知道 0。 (a) 校准的模型应该在信心高于多少时作答? (b) 如果把”不知道”改成 +0.2 分(鼓励诚实),阈值变成多少?
参考答案
(a) 期望得分 。也可以直接套公式 。 (b) 作答的期望得分要超过 0.2:。给弃权加分会进一步提高作答的门槛。
练习 4(归因)。下面三个 RAG 的错误,分别属于第 4 节的哪一类原因?应该怎样改进? (a) 用户问”哪个基因是元凶?“,检索器返回了这种病的”症状”和”历史”两段,模型回答了一个基因名,是编的; (b) 检索返回了正确的段落,写着基因是 NKN8,模型回答 RSM3(它”记得”的值); (c) 新药批准后,文档库没有更新,模型给出了旧的治疗方案。
参考答案
(a) 原因 1 + 原因 2 叠加:措辞不匹配导致检索失败,模型用记忆补上。改进:查询改写(第 ① 步)、更好的检索器(稠密检索、混合检索,第 5 讲)、增大 ;以及要求模型在资料里没有答案时说没有,或者像 WikiChat 一样核查每条声明。 (b) 原因 2:知识冲突中模型偏向了记忆。改进:核查(第 ⑤ 步会发现声明和证据矛盾);在提示词中强调以资料为准。 (c) 文档库过时(原因 1 的一种)。检索器不会说”没有新资料”。改进:保持数据源更新;在回答中注明资料的日期;对时效性强的问题优先检索最新来源。
练习 5(WikiChat)。WikiChat 第 ① 步检索到 5 段,第 ③ 步的回复拆出了 8 条声明。 (a) 这一轮一共调用 LLM 多少次? (b) 如果每次调用平均 1.5 秒、串行执行,用户要等多久?哪些步骤可以并行? (c) 为什么蒸馏能”找回速度”?
参考答案
(a) 次。 (b) 串行约 27 秒。第 ② 步的 5 次过滤互相独立,可以并行;第 ⑤ 步的 8 次核查也可以并行;第 ①、③ 步也可以同时开始。并行后关键路径大约是 ①→②、③→④→⑤→⑥→⑦,约 7 次调用的时间。 (c) 蒸馏用整个流水线的输入输出作为训练数据,训练一个小模型直接产生最终回复(或者每一步用小模型),每次调用更快、更便宜(第 14 讲)。
练习 6(贝叶斯)。一个系统生成的声明里有 30% 是错的。核查器保留正确声明的概率是 95%,放过错误声明的概率是 5%。 (a) 核查之后的准确率是多少? (b) 再串联一个独立的、同样水平的核查器呢? (c) 如果第二个核查器和第一个是同一个 LLM、同一个提示词,你预计 (b) 的结果会怎样变化?
参考答案
(a) 。 (b) 召回率 ,漏检率 :。 (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),再在 、核查出错率 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 节的 )。
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 怎样用一本”信念账本”来组织一个长程的研究过程。