为什么大模型需要「开卷考试」——RAG 是什么,为什么重要
第 1 章 为什么大模型需要「开卷考试」——RAG 是什么,为什么重要
1.1 一个让律师丢掉案子的故事
2023 年 5 月,美国哥伦比亚特区联邦法院收到了一份看似再普通不过的法律文件。一位名叫 Steven Schwartz 的律师援引了六个先例案件,用于支持他的委托人在一起航空事故中的主张。然而,这些案件没有一个是真实存在的。法官 P. Kevin Castel 在法庭上看到律师引用的「Varghese v. China Southern Airlines」「Martinez v. Delta Airlines」「Zhao v. China Eastern Airlines」等案件时,发现它们全部出自一个来源——ChatGPT。
这位律师后来在宣誓书中承认,他在准备法律文件时使用了 ChatGPT,并询问它「是否有支持这一立场的先例」。ChatGPT 礼貌地、自信地、虚构了一整套案件,包括引用、案号、判决内容,全部都是编造的。当法官质询时,ChatGPT 坚称这些都是真实的——它甚至为其中一些案件编造了虚假的法律数据库链接。
这并不是孤例。几乎同一时间,一位美国教授发现他的学生用 ChatGPT 写论文,引用的几篇学术论文听起来完全合理——「《Neural Networks for Computer-AI-Mediated Communication in Humans》作者 Jane Smith, 2022」——可惜这个作者不存在,这篇论文也没有发表过。同一年,加拿大一位健康网站创始人用 ChatGPT 为读者生成医疗建议,里面提到的药物相互作用听起来权威专业,却是完全的虚构。
如果你觉得这只是「用户用错了 AI」,那我们继续往下看。即使是研究机构也无法幸免。2024 年初,美国律师协会(American Bar Association)下属的一个法律期刊发表了一篇由 AI 撰写的小文章,文中引用的法律案件中,至少有一部分事后被证实是 AI 生成的「幽灵案件」(hallucinated cases)。一篇发表于《Frontiers in Cell and Developmental Biology》的论文被指包含用 AI 生成的可疑插图,期刊随后撤稿。
这些故事共同指向一个让人警醒的事实:大语言模型(Large Language Model, LLM)并不是无所不知的事实机器,而是一个会自信地编造内容的「超级模仿者」。在闭卷考试(Closed-Book Exam)的形式下,它表现出色;但当题目触及它不知道、或者「以为自己知道」的内容时,它会毫不犹豫地编出一个看起来完全合理的答案。
这本书围绕一个简单而强大的技术范式展开:检索增强生成(Retrieval-Augmented Generation,简称 RAG)。它的核心思想,就是把闭卷考试改成开卷考试(Open-Book Exam)——在回答问题之前,让模型先去「翻书」,查找真实的相关资料,然后再基于这些资料作答。这一章是整本书的起点,我们会先回答三个问题:
1. 大模型到底有哪些「先天的不足」? 2. RAG 是怎么工作的?它为什么能解决这些问题? 3. 什么时候应该用 RAG,什么时候它也无能为力?
读完之后,你不仅能用自己的话解释 RAG 是什么,还能跑通一个最小的 RAG demo,让自己的大模型回答私域问题。
---
1.2 大模型的三大先天局限:知识截止、幻觉与私域盲区
要理解 RAG 为何重要,我们必须先直面大模型的三大「先天局限」。这三大局限不是 bug,而是当前主流大模型架构与训练范式带来的结构性特征。
1.2.1 局限一:知识截止(Knowledge Cutoff)
任何一个大模型都有一个训练截止日期(Training Cutoff Date)。这个日期意味着:模型在训练过程中见过的最后一批数据,就是它「世界」的尽头。
举个例子,假设有一个大模型是基于 2024 年 6 月之前的所有公开文本训练出来的。那么:
- 它知道 2023 年世界杯阿根廷夺冠(这在它的训练数据里)。
- 它**不知道** 2024 年 7 月以后发生的任何事。
- 同样,它可能**没看过**你们公司的内部产品手册、你公司的财务报告、你们刚发布的那篇论文。
当你问它:「我们公司上周发布的新产品有几个 SKU?」它的回答不会是「我不知道」,而很可能是——编一个。
所以「知识截止」带来了两个层面的问题:
| 层面 | 含义 | |---|---| | 时间层面 | 无法回答训练截止以后发生的事件,比如最新新闻、最新政策、最新研究成果 | | 空间层面 | 无法访问未公开到互联网的内容,比如企业内部文档、个人笔记、未发表的内部资料 |
对于一个普通消费者来说,时间层面的知识截止也许只是偶尔的「过时」。但对于企业用户来说,空间层面的局限几乎是致命的——你不可能把公司所有文档都喂给大模型重新训练一次(那是另一个故事,后面章节我们会讲),但你又希望它能基于这些私域数据回答问题。
1.2.2 局限二:幻觉问题(Hallucination)
如果说「知识截止」是大模型的「被动短板」,那么「幻觉问题」就是它的主动故障。
「幻觉(Hallucination)」是大模型研究领域里的一个专业术语,指的是:模型在生成内容时,会输出那些与事实不符、无法被验证、甚至是凭空捏造的内容,但表达形式却非常自信、非常流畅,仿佛这些都是事实一样。
哈佛大学的一项研究把这种现象概括为「生成性 AI 的忠实性(Faithfulness)问题」——模型生成的文本与输入的真实信息之间,存在系统性偏差。简单说,模型并不是在「回忆事实」,而是在「生成听起来像事实的内容」。
为什么会出现幻觉?让我们从工作机制上拆解一下。大语言模型本质上是一个基于海量文本学习的概率预测机——给定前文,它会预测下一个最可能出现的 token(可以理解为「词元」或「字」)。它没有真正的「记忆检索」过程,而是把训练数据中的模式压缩到几百亿、几千亿个参数里。当被问到一个问题时,它并不是去「调取」某个事实,而是生成一段最像答案的文本。
这听起来像是哲学问题,实际上有非常具体的几种表现形式:
第一种幻觉:虚构事实——比如编造学术论文、法律案件、新闻报道。前面那位律师遇到的就是这种。
第二种幻觉:虚构数字——比如问某公司去年的营业额是多少,模型可能给出一个看起来很合理的数据,但完全是编的。
第三种幻觉:错误归因——把 A 的观点安在 B 头上,把发生在 X 国的事情说成 Y 国,把 2020 年的事情说成 2022 年。
第四种幻觉:编造引用——书籍引用、研究引用、网页链接。模型经常一本正经地给出一个 DOI 号、一个 arXiv 链接、一个引用格式——但点进去发现这个资源根本不存在。
第五种幻觉:强行回答——面对超出训练范围的问题,模型不会说「我不知道」,而是用一种模糊的、看似合理的方式给出答案。
这些幻觉的存在,让我们不能完全信任大模型的输出。任何商业场景下,「幻觉」都可能带来实际损失:法律风险、医疗风险、财务风险、品牌声誉风险。
需要强调的是,幻觉并不是模型的「缺陷」或「故障」——它是当前架构的自然产物。把模型做大、训练数据做多,可以在一定程度上降低幻觉的发生频率,但目前没有办法做到零幻觉。这不是工程问题,而是基础性的结构问题。
1.2.3 局限三:私域数据盲区(Private Domain Blindness)
即使我们解决了知识截止和幻觉,还存在第三个问题:大模型无法访问私域数据。
所谓私域数据(Private Domain Data),是相对于公域数据(互联网公开数据)而言的,包括但不限于:
- 企业内部的 wiki、Confluence、Notion 文档
- 产品手册、流程规范、客服话术
- 财务报告、销售数据、用户行为日志
- 法律法规文件、行业内部研究报告
- 客户合同、协议、邮件往来
- 学术研究人员的未发表论文、实验数据
- 律师的事务所案件档案
- 医院的电子病历(EHR)
这些数据有几个共同的特点:不出现在公开互联网上、无法被搜索引擎检索到、且通常具有高度专业性。公开的大模型训练数据中,99% 都不包含这些内容。
这意味着,即使你用 GPT-4 或者 Claude,问它:「我们公司的差旅报销政策怎么规定?」它的答案只会是一个通用的「行业惯例版本」,绝不会是你公司的实际政策。
为了应对私域数据的访问需求,过去几年业界探索了几种主流方案:
1. 人工补充上下文:每次提问时,把相关文档的内容粘贴到 prompt 里。简单,但有 token 限制(比如 GPT-4 早期版本一次最多 8000 token),无法处理大规模文档。 2. Fine-tuning(微调):用私域数据对模型进行额外的训练,让模型「记住」这些知识。理论上可行,但成本高、周期长、对每一条新数据都要重新训练,且容易出现过拟合。 3. Prompt Engineering + 长上下文窗口:例如把整本手册塞进 prompt。但大多数模型的上下文窗口有限,且成本会随着上下文长度线性甚至指数级增长。 4. RAG(检索增强生成):在回答前先检索相关资料。本书的主题。
这四种方案各有适用场景,后面我们会专门做对比。但有一点必须强调:RAG 是目前处理私域数据最主流、最灵活、成本最低的方案,尤其当数据需要频繁更新时(企业知识库几乎都是这种情况)。
1.2.4 为什么三大局限必须一起解决?
你也许会想:「既然大模型这么强,我可以在 prompt 里告诉它『如果不知道就说不知道』。」这确实能缓解一部分幻觉,但远远不够。让我们看几个真实的痛点场景:
场景 A:金融分析师 需要分析某上市公司最新季度的财报。模型不知道最新数据,于是:
- 选项 1:模型编了一份「看起来合理」的财报分析。
- 选项 2:模型说「我没有最新数据,请你提供」——分析师还得自己去找数据。
- 选项 3:RAG 自动从公司公告库检索最新财报,把相关内容喂给模型,让它基于真实数据回答。
场景 B:法律助理 需要查找某类案件在特定地区的判例。模型可能:
- 编造判例(幻觉问题)。
- 知识截止,无法涵盖最新判例。
- 看不到律所内部案件库的私域数据。
场景 C:客服系统 需要回答用户关于产品的问题:
- 模型没有产品手册(私域盲区)。
- 产品的功能更新很快,知识截止问题严重。
- 用户问题一不小心就给了一个「通用版」的回答,答非所问或引发投诉。
这三大局限是相互纠缠的:私域数据访问 + 幻觉抑制 + 知识更新,这三件事必须同时解决,才能让大模型真正服务于专业场景。RAG 正是为了同时应对这三个挑战而设计的。
---
1.3 把闭卷考试改成开卷考试——RAG 是什么
理解了三大局限之后,我们来看 RAG 的核心思想。
1.3.1 一个改变认知的比喻
想象一下两种考试形式:
- **闭卷考试(Closed-Book Exam)**:学生不能带任何参考资料,只能凭借大脑里记住的内容答题。学生可能很聪明、解题能力很强,但偶尔会记错公式、记错年代、记错人物姓名。
- **开卷考试(Open-Book Exam)**:学生可以带参考资料,但需要在规定时间内找到相关内容,然后基于这些资料作答。学生不再需要背诵所有细节,只要会**查找、筛选、理解、综合**就行。
传统的 GPT 类对话产品,对应的就是闭卷考试。模型没有外界的参考资料,只能依靠训练数据中记住的内容来回答。
而 RAG,对应的是开卷考试。模型在回答问题之前,会先「翻一翻」我们给它的资料库,找到与问题相关的内容,然后基于这些真实资料来作答。
这不是比喻——这是 RAG 的核心工作机制。学术一点说:RAG 是一种将信息检索(Information Retrieval)与文本生成(Text Generation)结合的技术范式,它在生成阶段之前,先从外部知识库中检索与查询相关的文档片段,然后把这些片段作为额外的上下文喂给大模型。
学术论文《Retrieval-Augmented Generation for Large Language Models: A Survey》(Gao et al., 2023)把 RAG 总结为三个步骤:
1. 检索(Retrieval):给定一个用户查询,先从一个大规模文档集合中找出最相关的文档或片段。 2. 增强(Augmentation):把检索到的内容与原始查询拼在一起,形成一个新的 prompt。 3. 生成(Generation):把增强后的 prompt 喂给大模型,让它基于这些真实资料生成回答。
就这么简单。我们继续拆解。
1.3.2 RAG 的标准工作流程
一个标准的 RAG 系统包含两个阶段:离线准备阶段(Offline Indexing) 和 在线检索阶段(Online Retrieval)。
离线准备阶段负责把私域数据变成「可被检索的格式」:
1. 文档加载(Document Loading):从各种来源(PDF、Word、Notion、网页、数据库)加载原始文档。 2. 文本切分(Chunking):把长文档切成一段一段的小片段(chunk),通常每段几百个字。这一步是必要的,因为模型和检索器都很难处理超长文本。 3. 向量化(Embedding):用一个 Embedding 模型把每个 chunk 转成一串数字——向量(vector)。向量的几何意义是:语义相近的文本,它们的向量在空间里也相近;语义无关的文本,向量距离较远。 4. 存储(Vector Store):把所有向量存到一个专门的数据库里,通常叫向量数据库(Vector Database),例如 FAISS、Chroma、Pinecone、Milvus 等。
在线检索阶段负责回答用户问题:
1. 用户提问:用户输入一个问题,比如「我们公司差旅报销政策是什么?」 2. 问题向量化:用同一个 Embedding 模型把问题也转成向量。 3. 相似度检索(Similarity Search):在向量数据库里搜索与问题向量最相似的 top-K 个 chunk(比如 top 5)。 4. Prompt 组装:把用户的原始问题加上检索到的内容,组装成一个新的 prompt。 5. LLM 生成:把组装好的 prompt 喂给大模型,让它基于这些真实资料作答。
我们用一张流程图来直观地呈现:
```mermaid flowchart LR Q["用户问题<br/>User Query"] E["Embedding 模型<br/>向量化"] VS["向量数据库<br/>Vector Store"] R["Top-K 检索<br/>Retrieval"] P["Prompt 组装<br/>Prompt Assembly"] LLM["大语言模型<br/>LLM"] A["最终答案<br/>Final Answer"]
Q --> E E --> R VS --> R R --> P Q --> P P --> LLM LLM --> A ```
这张图描述了 RAG 系统在「在线检索阶段」的全部流程。简单来说:问题被向量化 → 在向量数据库里检索相似 chunk → 把 chunk 和问题拼成 prompt → 喂给 LLM 生成答案。至于离线准备阶段(文档加载、切分、向量化、存储),通常是在系统搭建时一次性完成的,运行期不需要重复执行。
1.3.3 一个具体的例子
让我们用一个具体例子把流程走一遍。
假设你是一家 SaaS 公司,正在搭建内部的产品手册问答系统。手册内容约 500 页 PDF,包含产品功能介绍、操作步骤、常见问题。
离线准备阶段:
- 把 PDF 切分成大约 1500 个 chunk,每个 chunk 大约 500 字。
- 用一个 Embedding 模型(比如 OpenAI 的 `text-embedding-3-small` 或开源的 BAAI/bge)把每个 chunk 转成 1536 维向量。
- 存到向量数据库里,比如 Chroma。
在线检索阶段(用户提问):
用户问:「如何重置用户密码?」
1. 问题被向量化,得到问题向量 $q \in \mathbb{R}^{1536}$。 2. 在向量数据库里执行相似度搜索,找出 top-5 相似 chunk:
- Chunk 1:「重置用户密码的具体步骤:1. 进入后台管理 → 2. 选择『用户管理』→ 3. 点击『重置密码』按钮……」
- Chunk 2:「关于密码策略的说明:密码长度至少 8 位,必须包含大小写字母和数字……」
- Chunk 3:「账户安全相关设置:启用两步验证可以提升账号安全性……」
- 等等。
3. 组装 Prompt:
``` 你是一个产品助手,基于以下参考资料回答用户的问题。 如果参考资料里没有答案,请明确说「我不知道」。
参考资料: [1] 重置用户密码的具体步骤:... [2] 关于密码策略的说明:... [3] 账户安全相关设置:...
用户问题:如何重置用户密码?
请用清晰、分步骤的方式回答。 ```
4. 把这个 prompt 喂给 GPT-4 或 Claude,模型生成回答:
``` 要重置用户密码,请按以下步骤操作: 1. 登录后台管理系统... 2. ... ```
整个过程用户感知不到,但背后的机制完全不同——模型不再基于「训练时记住的内容」作答,而是基于真实的、私域的、新鲜的产品手册作答。
这就是 RAG 的力量。它没有改变模型本身,但改变了模型可以看到的信息。
1.3.4 为什么 RAG 能抑制幻觉?
你可能会好奇:为什么把检索到的内容塞到 prompt 里,模型就不那么容易「胡说八道」了?
答案涉及大语言模型的几个工作特性:
1. In-Context Learning(上下文学习):研究表明,大模型具有强大的「上下文学习能力」——只要在 prompt 里给出相关信息,模型就能「看图说话」式地基于这些信息作答。这类似于一个学生临时抱佛脚翻到了考试内容,即使他原本不背,也能根据资料回答问题。 2. Faithfulness to Context(对上下文的忠实性):现代大模型(尤其是 GPT-4、Claude 3 这一代)经过指令微调(Inst