AI 理论:RAG 介绍

关于本笔记

本笔记用于介绍 RAG(检索增强生成)的核心原理、两大工作阶段(离线建库与在线检索生成),以及语义搜索与关键词搜索的本质区别。

目录

一、大模型为什么「看不到」你的数据?

咱们先把问题说清楚,有三类「看不到」,每一类的原因都不同。

![](/img/开发进阶/AI理论/什么是 RAG?-36e920b9eec4dde61012702484969045.png)

第一类:知识截止日期

大模型是用历史数据训练的,训练完之后它的知识就冻结了。比如 Claude 的训练数据截止到 2025 年某个时间点,之后发生的事情它一概不知。你去问它「我们系统今天凌晨发生了什么故障」,它根本没有这份信息,只能瞎猜。

第二类:私有数据

你们公司的内部文档、产品设计方案、运维手册、客服问答库,这些都是保密的,不可能出现在大模型的训练数据里。模型从没见过这些内容,自然没法基于它们来回答问题。

第三类:实时数据

今天刚写完的技术方案、刚产生的 bug 日志、刚更新的配置文件,这些是动态变化的,即便大模型更新了训练数据也追不上。你的 Agent 需要访问的,往往就是这类「最新鲜」的数据。

三类问题的共同点: 大模型的知识是静态的、封闭的,但你的业务数据是动态的、私有的


二、暴力解法为什么行不通?

遇到这个问题,很多同学第一反应是: 直接把数据塞进 Prompt 里不就行了?

听起来很直接,但这个方案有三个致命问题。

问题一:Context Window 有上限

大模型一次能处理的文本是有限的,这个限制叫做 Context Window(上下文窗口)。就算是目前最大的模型,一次也只能处理几十万 token,换算成中文大概是几十万个字。

你们公司的内部文档可能有几百个文件,光是运维手册就几十万字,根本塞不进去。更别提那些有几千个历史工单的故障数据库了。

问题二:费钱又慢

Token 是要花钱的。你塞进去 10 万 token 的背景资料,每次提问都要花那 10 万 token 的钱。一天问几百次,成本直接爆炸。而且 token 越多,模型推理越慢,用户等待时间越长。

问题三:注意力稀释

这是最容易被忽视的问题。大模型处理很长的上下文时,注意力会被稀释,相关内容埋在几万字的堆料里,模型很可能找不到重点,反而表现变差。你塞进去越多,有时候回答质量越低。


三、RAG 的核心思路:先检索,再回答

直接塞数据行不通,那 RAG 到底怎么解决这个问题?

核心思路其实非常简单,一句话就能说明白:

不把所有数据都塞进 Prompt,而是在每次回答之前,先去找到最相关的那几段,再把这几段塞进 Prompt。

![](/img/开发进阶/AI理论/什么是 RAG?-a359fff0264c2cd81a17d249068fa360.png)

这就是 RAG 名字的含义:

  • Retrieval(检索) :从知识库里找出和当前问题最相关的内容

  • Augmented(增强) :把检索到的内容加进 Prompt,增强大模型的上下文

  • Generation(生成) :大模型基于增强后的上下文生成回答

打个考试时查字典的比方:你考试的时候不需要把整本字典背下来,你只需要知道去字典里查哪个词,查到了那一页,看完再写答案。

RAG 就是这个思路,大模型不需要「记住」所有知识,它只需要在需要的时候,从知识库里检索到相关内容,然后基于这些内容来回答。


四、RAG 的两大阶段

RAG 的整个工作流程分两个阶段: 离线建库 在线检索生成

![](/img/开发进阶/AI理论/什么是 RAG?-97d0548d6a6f5b74a3ba238e84b646e6.png)

离线建库是一次性的准备工作(数据更新时重做),在线检索是每次用户提问时触发的实时流程。

离线阶段

这个阶段的目标是把你的私有数据,处理成大模型能快速检索的格式,存进向量数据库。一共四步:

![](/img/开发进阶/AI理论/什么是 RAG?-9d45b0f41b7d675e798b88062c47f188.png)

Step 1:加载文档

把你的数据源统一接入进来,PDF 文档、Word 文件、Markdown 笔记、网页内容、数据库记录、代码文件……各种格式的数据,统一解析成纯文本。

Step 2:文本切块(Chunking)

拿到文本之后,不能直接整篇存起来,要先切成小块。为什么要切?

原因有两个:一是一篇文档几千字,里面涉及多个主题,检索的时候很可能只需要其中一个主题的内容,不需要整篇都召回;二是每个 chunk 要转化成向量存起来,chunk 太长,向量就无法精确代表那段文字的核心含义,检索准确率会变差。

切块就像是图书馆整理书籍:不是把整本书放一个标签,而是按章节、按小节分别标注,这样读者想找某个具体知识点,能直接找到那几页,而不用翻整本书。

Step 3:向量化(Embedding)

这是 RAG 里最难理解的一步,咱们重点讲。

切好的每个 chunk,要通过一个「Embedding 模型」转化成一串数字,这串数字就叫做 向量(Vector)

这串数字有什么神奇之处?它编码了这段文字的 语义含义 。意思相近的文字,转化出来的向量在数学空间里距离也相近。

用城市坐标来类比:每个城市都有经度和纬度,北京大约是北纬 40°、东经 116°;天津大约是北纬 39°、东经 117°,两组坐标数字很接近,在地图上两座城市确实挨着。广州是北纬 23°、东经 113°,坐标差别大,在地图上和北京也确实很远。

向量就是文字的「语义坐标」,「数据库响应慢」和「查询性能问题」虽然词语不同,但意思相近,它们转化出来的向量在空间里也是挨着的;而「数据库响应慢」和「今天天气不错」意思毫不相关,向量距离就很远。

Step 4:存入向量数据库

转化好的向量,连同对应的原文,一起存进向量数据库(比如 Milvus、Pinecone、Weaviate 等)。向量数据库专门优化了「在海量向量里找最近邻」这个操作,能在几毫秒内从百万级向量里找出最相似的几条。


在线阶段

每次用户提问,实时触发以下四步:

![](/img/开发进阶/AI理论/什么是 RAG?-442c6cd39f19bfc5d5b47040ec7d6c30.png)

Step 1:问题向量化

用同一个 Embedding 模型,把用户的问题也转化成向量。

Step 2:语义搜索

拿着问题的向量,去向量数据库里找「最相似的几个 chunk 的向量」,这就是语义搜索。找到之后,把对应的原文 chunk 取出来,通常取 3-5 个最相关的片段。

注意,这里找的不是「包含相同关键词」的内容,而是「语义最相近」的内容。这是语义搜索和传统关键词搜索的本质区别。

Step 3:构造增强 Prompt

把检索回来的几段原文,加上用户的原始问题,拼成一个增强后的 Prompt:

Step 4:大模型生成回答

把这个 Prompt 发给大模型,大模型基于提供的背景资料生成有据可查的精准回答。


五、关键概念再讲透:语义搜索和关键词搜索的差别

这里展开说一下语义搜索,因为这是 RAG 能工作的核心,也是最容易搞混的地方。

传统关键词搜索(比如 SQL 的 LIKE 查询) :逐字匹配,你搜「数据库慢」,它就找包含「数据库慢」这几个字的文档,找不到就返回空。如果文档里写的是「query performance degradation」或者「查询响应时间过长」,关键词搜索就找不到,哪怕说的是同一件事。

语义搜索 :找意思相近的,不要求字面相同。你搜「数据库慢」,语义搜索能找到「查询性能问题」「SQL 响应延迟」「慢查询优化」这些片段,因为它们的向量距离近,语义上是相关的。

再举一个对比例子:

用户的问题 文档里的原文 关键词搜索能找到? 语义搜索能找到?
数据库连接失败 connection pool exhausted ✗(没有相同关键词) ✓(语义相关)
如何重启服务 service restart procedure
昨晚报警原因 2024-01-15 23:00 alert: high latency ✓(如果时间能对上)

语义搜索让 RAG 能真正「理解」问题,而不只是机械地找字符串。这也是为什么 RAG 系统的检索准确率通常比普通关键词搜索高得多。


六、完整流程图

把整个 RAG 的两阶段用图串起来:

![](/img/开发进阶/AI理论/什么是 RAG?-f69eff12b816e9f1535e2fc391e2fe49.png)


七、RAG 在 Agent 里处于什么位置?

学完 RAG 的原理,你可能会问:它和我们之前学的 Agent、MCP、Function Calling 是什么关系?

其实非常简单: RAG 本质上就是一个特殊的工具

还记得 Agent 章节讲的吗?Agent = 大模型(大脑)+ 工具(双手)+ 执行循环。「查询知识库」这个动作,被封装成了 Agent 里的一个 Tool。

当 Agent 接到一个需要私有知识的任务,大模型通过 Function Calling 下达「调用知识库检索工具,查询:XXX」的指令,Agent 执行这个工具调用,触发 RAG 的在线流程,检索结果回传给大模型,大模型基于检索结果继续推理。

这就是 mcp 和 agent 里预告 RAG 时说的: 「把知识库检索封装成工具」


八、一张表看懂:没有 RAG vs 有 RAG

对比维度 没有 RAG 有 RAG
私有数据访问 无法访问,模型只有通用知识 可以访问,基于私有知识库生成回答
知识更新 需要重新训练模型,慢且贵 更新文档重新建库即可,快速生效
Token 消耗 要么全量塞入(超限),要么放弃 只召回相关的几段,token 消耗极低
回答准确性 依赖训练数据,私有领域容易瞎编 基于检索到的真实文档,有据可查
可追溯性 无法知道回答依据是什么 每个回答都可以附上来源文档
扩展性 知识库扩大 = 重新训练 直接往向量数据库里加数据即可

总结

整理一下这一章的核心认知:

  • RAG 是什么 :Retrieval-Augmented Generation,检索增强生成。先从知识库里找到相关内容,再把这些内容加进 Prompt,让大模型基于私有数据生成有据可查的回答。

  • 为什么需要它 :大模型的知识是静态的、封闭的,而业务数据是动态的、私有的。把数据全量塞进 Prompt 行不通,超 token 限制、费钱、注意力稀释。RAG 用「按需检索 + 动态注入」绕开了这个死局。

  • 两大阶段 :离线阶段建知识库(加载→切块→向量化→存库),在线阶段查询生成(问题向量化→语义搜索→构造增强 Prompt→大模型生成回答)。

  • 向量化和语义搜索 :文字转化为代表语义的数字坐标(向量),语义相近的内容向量距离近。语义搜索不靠关键词匹配,靠语义相似度,能找到「意思相关但词语不同」的内容。

  • 在 Agent 里的位置 :RAG 就是一个特殊的工具,「检索知识库」被封装成一次 Function Call,是 Agent 能力体系的重要组成部分。