# 第 7 章 一本正经地胡说：幻觉、RAG 与怎样考 AI

> 本章问题：怎样让模型少说错话？怎样评价 LLM 和 RAG？
> 来源：https://llm.weiborao.link/#ch7

**上一章留下的问题：**模型每一步都在挑“最像答案”的词。当它其实不知道答案时，它也会挑一个看起来最像答案的词。怎样让它少说错话、说真话？又怎样判断一个模型到底好不好？

这一章分两半。前一半解决“说真话”：先弄清幻觉从哪里来，再看一种让模型“开卷考试”的方法——检索增强生成（RAG），以及支撑它的向量数据库。后一半解决“怎么考”：怎样评价一个 RAG 系统，怎样评价一个大模型。

### 7.1 幻觉从哪里来

你问一个模型：“请列出 2019 年某某教授关于量子计算的三篇论文。”它可能给出三个格式完美、标题像模像样、期刊名真实存在的引用——而这三篇论文根本不存在。这种现象叫**幻觉**（hallucination）。

问：它为什么不直接说“我不知道”？

答：回想第 6 章：每一步它都在从概率分布里挑一个 Token。“论文标题”后面最像样的续写，是另一个像论文标题的东西，而不是“我不知道”。

问：可它读过那么多论文，怎么会记错？

答：回想第 2 章：知识不是一条条存下来的，而是被压缩进了参数。提取时，常见的知识清晰，罕见的知识模糊；模糊的地方，它会用“看起来合理”的内容补上。

问：还有别的原因吗？

答：有两个：训练数据有截止日期，之后发生的事它不知道；你公司内部的文档，它从没见过。

##### 幻觉是

- 流畅、自信、格式正确，但内容不实的输出
- “生成最像样的续写”这一机制的副作用

##### 幻觉不是

- 故意撒谎：模型没有骗你的意图
- 可以靠“调大模型”彻底消除的偶发错误：更大的模型错得更少，但不会归零

### 7.2 开卷考试：RAG

既然模型的记忆会模糊、会过期、会缺失，最直接的办法是：**答题前先把相关资料找出来，放到它眼前**。第 4 章讲过，模型非常擅长“读前文”；资料就在前文里，它就不必凭记忆去猜。

类比：

没有 RAG 的模型像**闭卷考试**的学生，只能凭记忆答，记不清时会硬着头皮编。RAG 让它变成**开卷考试**：先翻书找到相关的几页，再根据书上的内容作答，并注明“见第 37 页”。开卷不保证满分——如果翻错了页，或者书上本来就写错了，答案照样会错。

这个方法叫**检索增强生成**（Retrieval-Augmented Generation，RAG），这个名字来自 2020 年 Facebook AI 的 Lewis 等人的论文。今天它是企业落地大模型最常用的方案：模型本身不用重新训练，只要接上公司的知识库。

> 【图示】RAG 的工作流程。离线索引：文档切成小块，每块用嵌入模型变成向量，存进向量数据库。在线回答：用户的问题也变成向量，在数据库里找最相近的几块，必要时重排，再把问题和这几块资料拼成提示词交给大模型，生成带出处的回答。

1. **切块：**把文档切成几百字一块（模型一次能读的长度有限，而且小块更容易精确命中）。
2. **嵌入：**用嵌入模型把每一块变成一个向量（第 3 章）。
3. **入库：**向量和原文一起存进向量数据库。以上三步提前做好。
4. **问题变向量：**用户提问时，用同一个嵌入模型把问题也变成向量。
5. **检索：**在库里找夹角最小的 K 块。“怎么请年假”能找到“带薪休假申请流程”，尽管两者没有一个共同的词。
6. **拼提示词：**把找到的资料和问题拼在一起，并要求“只根据资料回答、注明出处”。
7. **生成：**大模型读资料、写回答。

**图 7-1** RAG 的两段流程：上面一行离线建索引，下面两行在线回答。整个过程里，大模型的参数一个都没有改。网页版可以逐步播放。

#### 向量数据库：按意思搜索

传统数据库擅长**精确匹配**：找出“部门 = 销售”的所有记录。搜索引擎擅长**关键字匹配**：找出包含“年假”二字的网页。**向量数据库**擅长的是第三种：按**意思**找。它存的是向量，查询时计算夹角，返回意思最接近的内容。

库里可能有上亿个向量，逐个比较太慢。向量数据库的核心技术是“近似最近邻”索引：事先把向量按相似程度组织好，查询时只看最有希望的那一小片区域，用一点点精度换来成百上千倍的速度。

**停一下：既然向量搜索这么聪明，为什么很多 RAG 系统还要同时保留关键字搜索？**

**参考答案：**

因为“意思相近”有时恰恰不是你要的。搜产品型号“C9300-48P”、搜人名、搜错误代码“0x80070005”时，你要的是一字不差的匹配，而向量搜索可能返回“意思差不多”的另一个型号。实践中常把两种搜索结合起来（混合检索），再用一个专门的“重排”模型把候选结果精排一遍。

### 7.3 从朴素 RAG 到 Agentic RAG

图 7-1 是最朴素的版本。它只适合“一问一查一答”的简单问题，常见的失败有：问题问得含糊，检索不到；检索到的块太碎，缺了上下文；答案要跨好几份文档拼起来，一次检索拿不全；找来的资料互相矛盾。于是 RAG 沿着“让检索更聪明、再让模型自己来检索”的方向演进了三代：

表 7-1 RAG 的三代

|  | 朴素 RAG | 进阶 RAG | Agentic RAG |
| --- | --- | --- | --- |
| 流程 | 切块 → 嵌入 → 检索前 K 块 → 拼进提示词 → 生成 | 检索前改写问题；检索时混合关键字与向量；检索后用重排模型精选 | 模型自己拆解问题、决定查什么、去哪查、查几轮，查完自评“够不够”，不够再查 |
| 检索的“主人” | 固定流水线 | 更精细的固定流水线 | 模型本身（第 8 章的 Agent 循环） |
| 擅长 | 单跳事实问答 | 措辞含糊、需要精确匹配（型号、错误码）的问题 | 多跳、跨文档、需要综合研究的问题 |
| 代价 | 最便宜、最快 | 多一两次模型调用 | 多轮检索与推理，Token 消耗和延迟成倍增加 |

**Agentic RAG** 的关键变化是：检索不再是答题前的一个固定步骤，而是模型手里的一件**工具**。它可以用第 8 章的“思考 → 行动 → 观察”循环，先把大问题拆成几个子问题，分别去向量库、网页搜索、数据库甚至计算器里查，看到结果后判断信息是否完整，不完整就换个问法再查，最后综合作答。为了让 Agent 记住跨会话的上下文（比如“这个用户上周问过什么、偏好什么”），一些系统还会加一层专门的**记忆**，开源项目 Mem0 就是一个例子，它把自己定位为给 AI 助手和 Agent 用的“智能记忆层”。

类比：

朴素 RAG 像一位**只会按目录翻书**的助理：你问什么，他就去查对应的那几页念给你听。Agentic RAG 像一位**研究员**：他会先想清楚要回答这个问题需要哪些材料，分头去图书馆、网上和档案室查，发现缺一块就再去补，最后交给你一份带引用的报告。研究员更强，也更贵、更慢。

#### 一个产品化的例子：NotebookLM

Google 的 NotebookLM 是一个以“只根据你给的资料回答”为设计原则的产品：用户上传文档、网页、幻灯片等资料，它基于这些资料回答并给出出处。它也展示了 RAG 之上可以长出什么：2024 年 9 月加入的“音频概览”（Audio Overview），能一键把资料变成两位主持人之间的对话；2025 年 7 月加入的“视频概览”（Video Overviews），被 Google 形容为“带讲解的幻灯片”。底层的道理不变：先把可信的资料放到模型眼前，再让模型在资料范围内生成内容。

### 7.4 怎样评价一个 RAG 系统

RAG 的回答错了，可能是“没找对资料”，也可能是“找对了但没读对”。所以不能只看最终答案，要把检索和生成拆开来看。2023 年的 RAGAS 框架提出了三个核心分数，正好对应问题、资料、回答三者之间的三条边：

> 【图示】RAG 评价的三角：问题、检索到的资料、回答三者两两之间各有一个分数。问题与资料之间是上下文相关性，资料与回答之间是忠实度，问题与回答之间是回答相关性。

**图 7-2** RAG 评价三角。上下文相关性考检索；忠实度考生成是否“只说资料里有的”，是衡量幻觉最重要的一条；回答相关性考是否答在点子上。

后来的 RAGAS 工具把指标拆得更细，例如把“检索得好不好”分成两半：**上下文精确率**（找来的资料里有多少是真有用的，衡量噪声）和**上下文召回率**（回答需要的信息有多少被找回来了，衡量遗漏）；再加上忠实度、回答相关性和“噪声敏感度”等。

同年的 RGB 基准从另一个角度，测试 RAG 中的大模型在“资料不理想”时能否扛住压力：

表 7-2 RAG 的四项抗压能力（RGB 基准）

| 能力 | 考验的情形 | 好的表现 |
| --- | --- | --- |
| 噪声鲁棒性 | 找来的资料里混着相关但没用的内容 | 不被干扰，抓住真正有用的那句 |
| 拒答能力 | 找来的资料根本回答不了这个问题 | 承认“资料中没有答案”，而不是编一个 |
| 信息整合 | 答案分散在好几份资料里 | 把几处信息合起来回答 |
| 反事实鲁棒性 | 资料里有明显错误的信息 | 识别出矛盾，不盲从 |

#### 两份让人清醒的数据

RAG 并不是“接上知识库就万事大吉”。Meta 等机构 2024 年发布的 **CRAG** 基准包含 4,409 个问答对，覆盖五个领域，问题从热门到冷门、从多年不变到每秒在变都有。论文的结果是：最先进的大模型直接回答，准确率不超过 34%；以简单的方式加上 RAG，也只提升到 44%；当时业界最好的 RAG 方案，也只有 63% 的问题能做到完全没有幻觉。

同年的 **LegalBench-RAG** 则专门考 RAG 的**检索**这一步：在法律文书里，能不能精确地找出最小、最相关的那几段话，而不是一整篇文档或一大堆不准的块。它的出发点是：检索不准，后面的模型再强也只能在错误或冗长的材料上作答，长上下文还会推高成本和延迟，并让模型更容易遗忘或编造。

两份数据合起来指向同一个结论：**RAG 系统的天花板，常常是由检索决定的**。很多看起来是“模型幻觉”的错误，追下去是第一步没有找对资料。所以评价和优化 RAG，应当先看检索。（这一归纳是本书基于上述两项研究的判断。）

### 7.5 怎样评价一个大模型

评价模型本身，最常见的办法是让它参加标准化的“考试”，叫**基准测试**（benchmark）。问题在于，模型进步太快，考试很快就被考穿了。

表 7-3 几代“考卷”

| 基准 | 考什么 | 规模 | 备注（出自原论文或发布方） |
| --- | --- | --- | --- |
| GLUE（2018）/ SuperGLUE（2019） | 一组自然语言理解任务 | 多个任务 | SuperGLUE 论文称，模型在 GLUE 上已超过非专家人类，所以需要更难的新考卷 |
| MMLU（2020） | 57 个学科的选择题，从初中到专业水平 | 15,908 题 | HLE 论文称，前沿模型在 MMLU 等热门基准上已超过 90% |
| GSM8K（2021） | 小学数学应用题，需要多步运算 | 8,500 题 | 常与 MATH 一起看数学推理 |
| MATH（2021） | 竞赛数学题，每题带完整解题步骤 | 12,500 题 | 论文发表时，即使很大的模型准确率也很低 |
| HumanEval（2021） | 按描述写 Python 函数，用单元测试判对错 | 164 题 | 常用 pass@1 计分：第一次就写对的比例 |
| MBPP（2021） | 入门级 Python 编程题 | 974 题 | 论文中最大的模型用少样本提示解出 59.6% |
| GPQA Diamond（2023） | 博士级物理、化学、生物难题 | 198 题 | 非本领域的高水平验证者可以随意上网，也只答对约 34%（“Google-proof”） |
| SWE-bench Verified（2024） | 修复真实开源项目里的问题，跑测试判定 | 500 个任务 | 编程 Agent 的主要考卷之一；OpenAI 发布 GPT-5 时报告 74.9% |
| Humanity’s Last Exam（2025） | 各领域专家出的前沿难题 | 2,500 题 | 因为老考卷被考穿而专门设计 |
| ARC-AGI-2（2025） | 没见过的抽象图形规律，考“现学现用” | — | 侧重泛化而非记忆 |

各家模型在这些考卷上的最新分数变化很快，且多为厂商自报，本书不列排名。

除了这类有标准答案的考试，开放式的写作和对话很难自动判分。早期用 BLEU、ROUGE 这类“和参考答案有多少词重合”的指标，后来又有用嵌入向量比较意思相近程度的 BERTScore，但同一个意思有无数种说法，重合度并不可靠。今天常用两种办法：**让一个强模型当评委**（LLM-as-a-judge），或者**请人盲测投票**：同时看两个匿名模型的回答，选更好的那个。

**停一下：一个模型在某个基准上拿了高分，为什么不能直接说明它更好用？**

**参考答案：**

至少有三个原因。第一，考题可能在训练时“漏题”了：题目和答案出现在网上，被模型读到过。第二，当分数成为各家竞争的目标，就会出现针对考卷的优化，分数涨了，真实能力未必同步涨——这被称为古德哈特定律：“当一个指标变成目标，它就不再是好指标。”第三，考试只测了一小部分能力，你的实际任务可能完全不同。最可靠的评测，永远是在**你自己的任务**上试一试。

闭卷靠*记忆*，开卷靠*检索*；  
会考试，不等于会做事。

##### 本章带走

幻觉是“生成最像样的续写”的副作用；RAG 让模型开卷考试，用检索到的资料代替模糊的记忆。

- RAG = 离线把文档切块、嵌入、存进向量数据库 + 在线检索相近的块、拼进提示词、生成带出处的回答；它从朴素 RAG 演进到进阶 RAG，再到由模型自己规划检索的 Agentic RAG。
- CRAG：大模型直接回答 ≤34%，简单加 RAG 也只到 44%；RAG 的天花板常常由检索决定。
- 评价 RAG：上下文相关性、忠实度、回答相关性三角；再看噪声、拒答、整合、反事实四项抗压能力。
- 评价 LLM：基准测试会饱和、会漏题；LLM 评委和人类盲测是补充；最终以你自己的任务为准。

**于是，下一个问题**：会查资料的模型，仍然只会“说”。如果让它去“做”——运行代码、修改文件、调用公司的系统——会发生什么？这就是 AI Agent。
