开卷考的世界:什么是RAG?
第 1 章 开卷考的世界:什么是RAG?
你有没有过这样的经历?问一个AI聊天机器人"2024年奥运会在哪举办",它信誓旦旦地告诉你"在东京"——但2024年的奥运会明明在巴黎。你又问"我们公司去年的销售额是多少",它一脸真诚地说"根据公开信息,大概是3.2亿元",而你们公司其实是一家只有十几个人的小工作室,年营收从来没有超过500万。
这些"一本正经的胡说八道",在AI圈有个专业名字——幻觉(Hallucination)。它指的是大模型在生成回答时,会说出听起来很合理、但实际上完全是编造的内容。更让人头疼的是,它编造得特别自信,如果你不仔细查证,很容易就被它"骗"了。
为什么会这样?大模型不是号称"上知天文、下知地理"吗?怎么还会犯这种低级错误?
这就要从大模型的"记忆方式"说起了。
1.1 大模型的"失忆症":为什么它会胡说八道?
要理解大模型为什么会"胡说八道",我们先来打个比方。想象一个学生参加考试:
- **闭卷考试**:不能看任何资料,只能凭脑子里记住的东西作答
- **开卷考试**:可以翻书、查资料,但最终答案还是要自己组织
现在,请把所有的大语言模型——不管是GPT、Claude还是通义千问、文心一言——都想象成一个参加了超级闭卷考试的考生。它们在训练阶段把海量的文本数据"读"进了自己的脑子里,这些知识被压缩成上千亿个参数,存储在一个巨大的人工神经网络中。考试的时候,它们只能调用这些"压进脑子里的记忆"来回答问题。
问题就出在这里。
根源一:知识的"冻结"——训练完成即定型
大模型的知识来自训练数据,而训练是一件耗时、耗钱、耗电的浩大工程。GPT-3的训练据估算花费了上千万美元,消耗了相当于一个小型城镇几天的电量。一旦训练完成,模型里的知识就"冻结"了——它不可能在回答问题前先掏出手机查一下最新新闻。
打个比方,这就像一个学生在大三那年把整个图书馆的书都背了一遍,然后从大四开始就再也没看过任何新书。四年后你问他"今年奥斯卡最佳影片是哪部",他只能告诉你他背书时那一年是哪部——2020年的《寄生虫》。
这就是为什么你问ChatGPT"2024年诺贝尔物理学奖得主是谁",如果它的知识截止到2023年,它要么坦白说不知道,要么……就开始编了。
"知识截止日期"(Knowledge Cutoff)这个词,就是用来描述这种现象的。它像一道无形的墙,把大模型和现实世界隔开。
根源二:专域知识的"真空"——通用训练与垂直信息的鸿沟
大模型是"博导"——什么都懂一点,但什么都不精。它的训练数据来自互联网上的海量文本,包括维基百科、新闻、博客、小说、论坛……这些数据虽然广博,但有两个致命问题:
第一,私域信息根本进不去。你公司的内部文档、你学校的教研资料、你个人的笔记日记——这些东西不会出现在公网上,模型训练时根本没看过。当你问"我们公司Q3的战略规划重点是什么",它当然答不上来。
第二,专业深度不够。哪怕是公开的医学、法律、金融信息,互联网上的内容往往也是入门级的、碎片化的。一个真正专业的医生要读十几年书、看好几万份病历才能培养出来的临床直觉,光靠爬取一些医学科普文章是不可能获得的。
这就导致了一个尴尬的局面:你问一个通用大模型关于某个专业领域的问题,它要么"装懂"地胡说,要么给出特别浅显的答案——就像让一个只看过《急诊科医生》电视剧的观众去给你做心脏手术建议一样。
根源三:推理的"漂移"——长链路下的细节丢失
大模型的回答是一个字一个字"吐"出来的(专业说法叫"自回归生成")。在这个过程中,它会面临一个严峻挑战:长程依赖。
举个简单的例子。你问它"请把李白的《静夜思》原文默写一遍"——它能一字不差地写出来。但你让它"用李白的风格写一首关于深圳秋天的七律",它就需要做大量的推理:押韵、平仄、意象组合、上下文连贯……每一步都可能"走偏"。
更糟糕的是,模型在生成过程中没有"回头检查"的机制。它一旦说错了开头,后面就会越说越离谱,因为它会基于前面"编"的内容继续往下编。这就是为什么你让它写一个"公司创始人的生平",有时候连公司的名字、创始人的学历都能搞错——而且错得特别流畅、特别自信。
这三种根源——知识冻结、专域缺失、推理漂移——共同造就了大模型的"幻觉"问题。它不是故意的,它只是被自己的"记忆方式"所局限。
那么,有没有办法让它在回答问题的时候,能够"开卷"——去查一下最新的、专业的、准确的资料呢?
有。这就是本书要讲的主角:RAG(Retrieval-Augmented Generation,检索增强生成)。
1.2 开卷考的革命:RAG的核心思想
让我们把镜头切换回前面的考试场景。如果闭卷考试的考生有一个"小抄神器"——可以在回答问题前先去图书馆查一下相关资料,然后带着这些资料回到考场作答——那准确率是不是会大幅提升?
RAG干的就是这件事。
RAG(Retrieval-Augmented Generation),中文翻译是"检索增强生成"。这个名字拆开看有三个关键词:
- **检索(Retrieval)**:先从外部知识库中找到相关资料
- **增强(Augmented)**:把这些资料作为"参考材料"喂给模型
- **生成(Generation)**:模型基于这些参考资料,组织出最终回答
它的工作流程可以用一张图清晰地展示:
```mermaid flowchart LR subgraph "传统LLM:闭卷考" A1["用户提问"] --> A2["LLM<br/>仅依赖参数化记忆"] A2 --> A3["直接输出答案<br/>(可能幻觉)"] end subgraph "RAG:开卷考" B1["用户提问"] --> B2["检索器<br/>查找相关资料"] B2 --> B3["Top-K相关文档"] B3 --> B4["LLM<br/>结合问题+资料生成"] B4 --> B5["基于事实的准确答案"] end ```
让我们用两个具体的例子来直观感受这个差异:
例1:闭卷考模式(纯LLM) > 用户问:"我们公司的差旅报销政策是怎么规定的?" > > LLM回答:"根据一般企业的常规做法,差旅报销通常包括交通、住宿、餐饮三大类……"(开始自由发挥一堆通用建议) > > 实际上:你公司可能有非常奇葩的规定——比如"打车必须用某APP""酒店每晚不超过400元""必须当天报销否则过期作废"——这些信息LLM统统不知道。
例2:开卷考模式(RAG) > 用户问同样的话:"我们公司的差旅报销政策是怎么规定的?" > > 系统先到公司内部的知识库(可能是一堆PDF文档、Excel表格、公司Wiki)里搜"差旅报销",找到几篇最相关的文档。 > > 然后把这几篇文档连同用户的问题一起塞给LLM:"请你根据以下参考资料回答用户的差旅报销问题。" > > LLM看到资料后回答:"根据公司《差旅管理细则v3.2》,打车必须使用滴滴企业版;住宿标准为一线城市每晚不超过500元,二线城市不超过400元;报销需在行程结束7个工作日内提交至财务系统……" > > 这次的答案,准确、具体、有依据——因为它"开卷"了。
这就是RAG最直观的威力:它把大模型从一个"靠记忆答题的考生",变成了一个"带着参考资料答题的助手"。
这里有一个容易误解的点:RAG不是让大模型"记忆"更多东西,而是让它在需要的时候"去查"。
这个区别非常重要。人类的记忆会遗忘、会被覆盖、会有偏差;而一个外部知识库,只要更新到位,就能一直保持准确。RAG实际上是把"记忆"这件事从模型内部转移到了外部存储,让知识的更新维护变得可控、可追溯、可持续。
这也意味着,RAG天然地解决了我前面提到的三大根源问题:
- **针对知识冻结**:知识库可以实时更新,模型本身不用重新训练就能"知道"最新事件
- **针对专域缺失**:可以把企业内部资料、专业文献、垂直领域知识装进知识库
- **针对推理漂移**:参考资料为模型提供了"锚点",减少了凭空编造的空间
听起来是不是很美好?但先别急着高兴——RAG也不是万能的,它有自己的局限。我们会在后续章节详细讨论。
1.3 从「知识图谱」到「RAG」:一段简短的进化史
RAG并不是一夜之间冒出来的。它的诞生可以追溯到更早的技术积累。
1990年代-2010年代初:知识图谱与问答系统的早期探索
早在"AI"这个概念被炒得火热之前,研究者们就在思考一个问题:机器能不能像人一样,从一堆文档里找到答案并组织成自然语言?
这一时期出现了几个关键技术:
信息检索(Information Retrieval, IR):这是搜索引擎时代的基础技术。你在Google里输入关键词,搜索引擎从几十亿网页中找到最相关的那些页面。TF-IDF、BM25这些经典算法就是这个时代的产物。
知识图谱(Knowledge Graph):Google在2012年正式提出这个概念。它把世界上的实体(人、地点、事件)以及它们之间的关系组织成一张巨大的"关系网"。比如"姚明 - 出生于 - 上海""姚明 - 效力于 - 火箭队"。问答系统可以直接查询这张图来获得结构化答案。
阅读理解(Reading Comprehension):斯坦福大学在2016年发布了著名的SQuAD数据集,专门用来训练模型从给定段落中"读出"答案。这其实就是一种"带着短文回答问题"的早期形态。
这些技术虽然强大,但都有一个共同的局限:它们处理的是"结构化"或"半结构化"的知识。要让它们工作,你需要先把知识整理成规则、表格、图谱的形式——这在很多场景下成本极高。
2017-2019年:Transformer革命与BERT时代
2017年,Google发表了那篇改变一切的论文《Attention Is All You Need》,提出了Transformer架构。2018年,基于Transformer的BERT模型横空出世,在各种自然语言理解任务上刷榜。
BERT带来了一项关键技术:语义嵌入(Semantic Embedding)。它可以把任意一段文本转换成一个向量(一串数字),并且语义相近的文本在向量空间里距离也近。
这意味着什么?意味着我们不需要预先整理知识,可以直接把海量的原始文档丢给模型,让它自己"理解"每一段话的意思,然后根据用户问题去找语义上最匹配的内容。
这为RAG的诞生打下了基础。
2020年:RAG的正式诞生
2020年,Facebook AI(现在叫Meta AI)的研究员Patrick Lewis等人发表了一篇划时代的论文——《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》(用于知识密集型NLP任务的检索增强生成)。这篇论文首次系统地提出了"RAG"这个概念和技术框架。
论文里的核心思想非常优雅:
1. 用一个预训练的语言模型(比如BART或当时的T5)作为生成器 2. 用一个神经检索器(比如基于BERT的DPR)从维基百科这样的庞大文档库里找相关段落 3. 把找到的段落和问题一起喂给生成器 4. 生成器基于这些段落组织出最终答案
实验结果令人惊艳:在开放域问答、常识推理这些"知识密集型"任务上,RAG模型的准确率大幅超过了纯参数化的GPT模型。
更重要的是,这篇论文展示了一种全新的范式:大模型不是越大越好,让模型"学会查资料"可能比让它"记住所有东西"更有效率。
2020-2022年:稳步发展期
RAG概念提出后,并没有立刻引爆业界。大模型领域当时的主旋律还是"参数越多越强"——从GPT-3的1750亿参数,到后续各种"千亿""万亿"级别模型的军备竞赛。
但RAG的研究一直在推进。研究者们开始探索各种变体:
- **单跳 vs 多跳检索**:复杂问题需要分多次检索
- **稠密检索 vs 稀疏检索**:用语义向量还是用关键词
- **检索粒度**:按段落、按句子、按文档块
这些研究为后续的爆发积累了厚实的基础。
2022年底至今:ChatGPT引爆的RAG浪潮
2022年底,ChatGPT横空出世。整个世界第一次见识到了大模型的真正威力——流畅的对话、惊人的理解力、跨领域知识……但与此同时,它的"幻觉"问题也被前所未有地暴露出来。
人们开始意识到:大模型很强大,但不能直接信任它。你需要给它提供准确的信息、约束它的输出、验证它的回答。
而RAG,恰好就是那个"把准确信息提供给模型"的完美工具。
从2023年开始,RAG相关的论文、开源项目、企业应用如雨后春笋般涌现。LangChain、LlamaIndex这些专门做RAG应用的框架迅速成为最热门的技术栈。向量数据库(专门存储和检索文本向量的数据库,比如Pinecone、Weaviate、Chroma)成为新基建。
到了2024年,"RAG是LLM应用的事实标准"几乎成为业界共识。任何严肃的AI应用——无论是企业客服、智能助手、还是垂直领域的专业系统——都离不开RAG的身影。
可以说,RAG是从"参数为王"到"知识为王"转变的标志性技术。它告诉我们:让模型更聪明的关键,不一定是让它学得更多,而是让它学会在正确的时候找到正确的信息。
1.4 RAG三剑客:索引、检索与生成的协奏曲
现在我们已经知道了RAG是什么、为什么需要它、以及它从哪里来。让我们深入它的内部,看看它到底是怎么工作的。
RAG系统虽然花样繁多,但核心架构可以拆解为三个环节。我把它们称为"RAG三剑客":
- **索引(Indexing)**:把外部知识变成机器可快速查找的形式
- **检索(Retrieval)**:根据用户问题找到最相关的资料
- **生成(Generation)**:把资料和问题结合,组织出最终答案
这三个环节分为"离线"和"在线"两条时间线。索引是离线的(提前做好),检索和生成是在线的(用户提问时实时执行)。
剑客一:索引(Indexing)—— 给知识办"身份证"
索引阶段的目标是:把一堆杂乱的原始文档(PDF、Word、网页、数据库记录……)变成一个机器可以快速查找的"知识索引库"。
这个过程通常包括以下步骤:
第一步:文档加载(Loading)
不同的数据源有不同的加载方式。PDF需要解析每一页的文本和图片;Word需要提取段落;网页需要爬取HTML并清洗;数据库需要执行SQL查询……
这一步的工具很多,LangChain和LlamaIndex提供了几十种"文档加载器"(Document Loader)来应对各种场景。
第二步:文本分块(Chunking)
一个大文档可能几万字,但用户的问题通常只涉及其中一小段。如果直接把整个文档塞给LLM,不仅浪费token,还会让模型被无关信息干扰。
所以我们要把长文档切成"块"(Chunk)。怎么切是有讲究的:
- 按固定字数切:简单粗暴,但可能把一个完整的句子甚至段落切坏
- 按段落/句子切:保持语义完整,但块大小不一
- 按语义切:用模型识别自然段落边界,块质量最高但成本也高
- 按结构切:对于有标题层级的文档,按章节切分最合理
分块的大小也有讲究。一般来说,200-500个token(约150-400个中文字)是一个常见的选择。太短了语义不完整,太长了又可能塞下太多无关信息。
第三步:向量化(Embedding)
这是最关键的一步。我们用一个"嵌入模型"(Embedding Model)把每个文本块转换成一个高维向量(一串浮点数)。比如OpenAI的text-embedding-3模型会把一段文本变成3072个数字组成的一个向量。
神奇的是:语义相近的文本,它们的向量在数学空间里也距离相近。比如"今天天气真好"和"阳光明媚万里无云"的向量距离就很近,而和"我想吃火锅"的向量距离就很远。
这就是为什么我们可以用"向量相似度"来找到语义上相关的资料——而不必依赖关键词匹配。
第四步:存入向量数据库
生成的向量连同原始文本一起被存入一个专门的数据库——向量数据库(Vector Database),比如Chroma、Pinecone、Weaviate、Milvus等。
向量数据库的核心能力是:给定一个查询向量,快速找出与它最相似的K个向量(这个K通常是3、5、10这样的数字)。这种操作在数学上叫"近似最近邻搜索(ANN)"。
整个索引过程通常一次性完成。当有新文档时,可以增量更新;不需要每次用户提问都重新做。
剑客二:检索(Retrieval)—— 大海捞针的精确艺术
当用户提出问题时,检索环节就要登场了。
第一步:查询理解与改写
有时候用户的问题表达得不那么"检索友好"。比如用户问"那个东西多少钱来着",这对检索系统来说简直是天书。
高级的RAG系统会先用一个LLM来"理解"用户的问题,把它改写成一个更清晰的查询。这个过程叫查询改写(Query Rewriting)。
更进一步,系统还可以做多查询扩展(Multi-Query Expansion):从一个原始问题出发,生成多个不同角度的查询,分别去检索,最后合并结果。这样能大大提升召回率(找到相关资料的概率)。
第二步:向量检索
把改写后的查询用同一个嵌入模型变成向量,然后在向量数据库里搜索最相似的K个文本块。
这一步非常快——哪怕你的知识库有几百万个文档,也能在几十毫秒内完成。
第三步:重排序(Reranking)
向量检索找到的Top-K结果,不一定每一个都真的有用。它是基于"语义相似度"排序的,但语义相似 ≠ 真的相关。
比如用户问"苹果公司的CEO是谁",向量检索可能找到的第一条是"苹果是一种水果",因为它和"苹果"在语义上也很接近。
所以我们需要一个重排序模型(Reranker)来精排。它会用更复杂的算法判断每篇文档和问题的"真实相关度",把最相关的排到最前面。
重排序的代价是更慢、更贵,所以一般只对Top-K(比如前50个)做精排,而不是对全库做。
第四步:过滤与裁剪
最后,系统会过滤掉明显不相关的内容,并且根据token预算(比如只能塞4096个token给LLM)裁剪文本长度,只保留最有价值的部分。
剑客三:生成(Generation)—— 把资料变成答案
到了这一步,机器手里已经有了:
- 用户的原始问题
- K条最相关的参考资料
接下来的任务,就是把这些"原材料"交给LLM,让它组织成一段自然、流畅、准确的回答。
这一步的关键在于**提