从零理解 RAG:它不是“让大模型记住知识”,而是给大模型接上一套外部大脑

过去很多人第一次接触大模型时,都会有一个很自然的想法:既然模型已经这么强,为什么还需要 RAG?再进一步,很多人也会把 RAG 理解成一种“外挂记忆”,好像只是把资料丢进去,模型就会自动记住并回答。但真正进入工程实践后会发现,RAG 的价值并不在“记住”,而在“访问”。它并不是让模型把所有知识重新学一遍,而是让模型在回答之前,先到指定知识范围内做一次检索,再基于检索到的内容生成答案。

因此,RAG 最核心的变化,其实不是模型结构本身,而是回答流程被重写了:从“直接回答”变成了“先查资料,再组织答案”。这也是它为什么在企业知识库、文档问答、制度检索、项目资料查询等场景中非常重要。对于这类任务来说,真正稀缺的往往不是模型的语言能力,而是模型能否在回答时拿到正确、最新、可控的外部信息。

与其把 RAG 看成一个模型功能,不如把它看成一条围绕知识调用而建立的系统链路。模型仍然负责理解和表达,但知识本身被放到了模型参数之外,交由独立的检索系统管理。这种拆分,正是 RAG 的工程本质。

1. RAG 和微调,解决的其实不是同一个问题

很多文章喜欢把 RAG 和微调放在一起比较,但它们并不处于同一层面。微调的目标,是让模型形成某种更稳定的行为习惯,比如更懂某类任务、更符合某种输出风格、更适应某个垂直领域的语言表达;而 RAG 的目标,是让模型在回答时接触到指定知识,并尽量基于这些知识输出结果。一个偏“能力与行为塑形”,一个偏“知识供给与调用”。

维度 RAG 微调
核心目标 给模型接入外部知识 改变模型的行为模式
知识更新方式 更新知识库即可 通常需要重新训练或继续训练
适合场景 文档问答、制度查询、知识库检索 风格统一、任务适配、领域表达强化
成本结构 更偏工程搭建成本 更偏数据与训练成本
可追溯性 强,容易关联来源文档 弱,知识融在参数里
常见误区 以为它是“记忆系统” 以为它能替代知识检索

所以,用一句更直接的话概括就是:微调解决“模型怎么说”,RAG 解决“模型依据什么说”。 对大多数知识密集型问答系统来说,RAG 往往是更先落地、也更值得优先建设的一层。


2. RAG 的核心链路:从一堆原始资料,到一次可控回答

如果只看最终效果,RAG 很像是“用户提问,系统回答”这样一个简单过程;但真正让它成立的,其实是中间那条并不短的处理链路。知识库并不是把 PDF、网页或扫描件直接丢给大模型就结束了,而是要先经历解析、整理、切块、编码、存储、检索,再交给生成模型组织答案。换句话说,RAG 的难点不只在“生成”,更在生成之前那整套知识准备流程。

2.1 先解析文档,而不是急着问模型

现实里的知识从来不是规整的纯文本。它可能是 PDF、Word、网页、表格、图片,也可能是扫描版材料、带复杂排版的报告、带图表和页脚的制度文件。对于机器来说,这些文件的最大问题不是“内容太多”,而是“结构太乱”。因此,RAG 的第一步通常不是问答,而是文档解析:把原始文件转成可处理的文本和结构信息。

这一步常常包括 OCR、版面分析、阅读顺序恢复、表格识别、图片区域提取以及标题层级还原。只有这些内容被整理出来,后面的检索才有意义。否则,模型检索到的可能不是正文,而是页眉页脚、断裂句子、被打乱顺序的段落,最终回答自然也会偏。

从工程上说,RAG 的前处理并不是一个可有可无的附属步骤,而是整个系统质量的起点。很多时候,后面回答不准,不是模型不够强,而是知识在进入系统时就已经被解析坏了。

2.2 Chunk 不是“切文本”,而是在定义知识最小单元

文档被解析出来之后,通常不会整篇作为一个整体去检索,而是会被切成多个小块,也就是常说的 chunk。很多初学者会以为 chunk 只是“按长度切分文本”,但真正好的 chunk 远不止如此。它本质上是在定义:知识库里,什么才算一个适合被召回的最小语义单元。

如果一个 chunk 太小,语义往往不完整,用户问题明明对应某一段内容,却只能召回零散句子;如果一个 chunk 太大,虽然信息完整,但相似度检索容易失焦,召回结果里混进大量无关内容,反而增加大模型理解成本。因此,chunk 的质量直接决定了检索质量,而检索质量又直接决定回答质量。

这也是为什么一个看似很普通的切块策略,往往能显著拉开两个 RAG 系统的效果差距。与其简单按字符数切,不如尽可能按文档结构、标题层级、段落边界甚至表格与图注关系去切。好的 chunk 不是“均匀切开”,而是“尽量保持语义完整”。

2.3 Embedding 和向量库,负责让“相关性”可计算

当文档被切成多个 chunk 后,系统还需要解决另一个问题:用户提问时,如何从这些文本块中找到最相关的内容?这时就需要 embedding 模型和向量数据库。

embedding 模型的作用,是把文本块映射成向量表示;用户问题也会被映射成向量。之后,系统通过向量相似度去寻找最接近的问题相关内容。这里需要特别强调一点:embedding 模型通常不是用来生成答案的,它更像一个“语义表示器”,负责把文本变成可检索的数学对象。而最终负责回答的,仍然是生成模型。

向量数据库则承担存储和检索这些向量的职责。它并不只是简单“存文本”,而是同时存储文本块、向量表示以及来源页码、标题、标签等元数据。这样,在召回时系统不仅能做语义相似度匹配,还可以叠加文档范围、业务类型、时间区间等过滤条件,让检索更贴近真实业务需求。

从这个角度看,RAG 里的知识库并不是传统意义上的文件夹,而是一个由“文本块 + 向量 + 元数据”构成的可检索知识索引系统。

2.4 检索之后,生成才真正开始

真正到大模型出场的时候,系统其实已经做完了最关键的前置工作:它已经从海量原始知识中缩小范围,把若干最相关的 chunk 送到了模型面前。此时,大模型的主要职责不是“凭空知道答案”,而是理解问题、阅读上下文、提炼信息并组织输出。也就是说,在 RAG 里,大模型最重要的能力仍然是语言理解与生成,但它工作的基础已经从“内部记忆”变成了“外部证据”。

这一点非常重要,因为它解释了为什么同一个大模型,在不同 RAG 系统中的表现会差异巨大。很多时候,不是生成模型本身有多大区别,而是它喂到眼前的材料是不是对、是不是全、是不是干净、是不是够相关。RAG 的真正竞争力,往往不在最后一句话怎么生成,而在前面有没有把正确的知识送进来。

为了更直观地看这条链路,可以把它压缩成下面这个过程:

阶段 主要任务 产出
文档解析 OCR、版面恢复、结构提取 可处理的结构化文本
Chunk 切分 定义知识最小单元 若干语义相对完整的文本块
Embedding 文本向量化 文本块的向量表示
向量存储 建立知识索引 可检索的向量库
Query 检索 找到与问题最相关的内容 Top-K 相关 chunk
Generation 基于问题与上下文生成答案 最终回答

这也是为什么说,RAG 不是一个模型功能,而是一套围绕“知识调用”建立起来的工程系统。


3. RAG 各模块里常见的热门方案

理解 RAG 之后,下一步通常就是看“每一层可以选什么”。从工程视角看,RAG 很像搭积木:整体流程基本稳定,但每一层的实现方案都可以替换。不同团队的差异,往往不在逻辑顺序,而在具体选型。

为了避免把这一部分写得过于零散,下面按模块做一个紧凑梳理。

模块 作用 常见热门方案 适合的理解方式
文档解析 / OCR 把 PDF、扫描件、图片等转成可处理内容 PaddleOCR、MinerU、Docling、Unstructured 负责“把资料读出来”
Layout / 版面分析 识别标题、正文、表格、图片、阅读顺序 LayoutParser、PaddleOCR 文档版面能力、MinerU 负责“看懂文档长什么样”
Chunk 切分 把长文档切成适合检索的知识单元 LangChain Text Splitter、LlamaIndex Node Parser、按标题/段落/语义切分的自定义方案 负责“定义知识最小单元”
Embedding 把文本或图文内容编码成向量 BGE、E5、Jina Embeddings、Sentence-BERT 类方案 负责“让语义变得可检索”
向量数据库 存储向量并做相似度检索 FAISS、Chroma、Milvus、Qdrant、Weaviate 负责“存和找”
Retriever / 检索层 根据问题从知识库召回相关 chunk 向量检索、BM25、Hybrid Search、Multi-Query Retriever 负责“先把候选证据找出来”
Reranker / 重排 对召回结果再排序,提升相关性 BGE Reranker、Cohere Rerank、Cross-Encoder 类方案 负责“把最相关的排前面”
生成大模型 结合问题和检索结果组织最终回答 GPT、Qwen、DeepSeek、GLM、Claude 等 负责“看材料后回答”
编排框架 把各模块串起来,便于开发和维护 LangChain、LlamaIndex、Haystack、自定义 Python 服务 负责“把链路搭起来”

3.1 文档解析 / OCR:先把资料变成机器能用的内容

如果知识源是 PDF、扫描文档、图片或复杂排版材料,那么第一步通常不是“检索”,而是“读懂文档”。这一层比较常见的方案里,PaddleOCR 在中文场景里很常见,适合 OCR 与基础文档理解;MinerU 很适合处理复杂 PDF;Docling 更偏统一文档解析;Unstructured 则在通用文档接入场景里出现频率很高。

这一层的任务不是回答问题,而是把原始资料变成可切块、可索引、可追踪的结构化内容。很多 RAG 效果差,不是后面的模型不够强,而是前面的文档解析已经把信息搞乱了。

3.2 Layout:不是所有文本都该被平等对待

当文档里存在标题、段落、页眉页脚、表格、图片、图注时,系统如果只把它们都当成普通文本,就很容易破坏语义结构。因此,版面分析模块的作用,就是识别“哪里是标题、哪里是正文、哪里是表格、哪里是图”,并尽量恢复阅读顺序。

这一层里,LayoutParser 是一个很经典的名字,适合理解文档版面分析的思路;而 PaddleOCRMinerU 也在逐渐把 OCR 与 layout 能力整合到一起。对于真正面向文档的 RAG,这一层往往非常重要,因为它会直接影响后面的 chunk 质量。

3.3 Chunk:最容易被低估,但最影响检索效果

很多人上来就关心向量库或大模型,但在真实系统里,chunk 往往是最影响效果的一个环节。因为系统最终检索的,不是整篇文档,而是切出来的知识块。切得太碎,信息不完整;切得太大,召回不精准。

这一层常见的实现方式包括基于 LangChain 的 Text Splitter、基于 LlamaIndex 的 Node Parser,以及很多团队会自己写的“按标题层级、段落边界、表格单元、语义相似度”进行切分的方案。可以说,chunk 是 RAG 的知识颗粒度设计,而不是简单的字符串切片。

3.4 Embedding:负责“表示”,不是负责“回答”

embedding 模型的作用,是把文本映射成语义向量,从而支持相似度检索。这一层里,比较常见的名字包括 BGEE5Jina Embeddings,以及一类广义的 Sentence-BERT 风格模型。它们和最终生成答案的大模型不是一回事:前者是检索侧模型,后者是生成侧模型。

如果要用一句话区分:embedding 模型解决“怎么找到相关内容”,生成模型解决“怎么把相关内容说出来”。

3.5 向量数据库:工程落地时最常被提到的一层

向量数据库的作用比较直接,就是把知识块的向量存起来,并支持快速相似检索。常见方案里,FAISS 很适合本地实验和单机原型,Chroma 适合轻量开发,MilvusQdrantWeaviate 更常出现在服务化和规模化场景中。

这里有一个很重要的认知:向量数据库不只是“存向量”,它往往还要和文本内容、文档来源、页码、标签、时间等元数据一起工作。真正的知识库检索,不会只靠“最近邻搜索”这么单一的逻辑。

3.6 Retriever 与 Reranker:一个负责召回,一个负责精排

很多初学者在这里容易混淆。Retriever 的目标是尽可能把相关内容“找出来”,所以它更关注召回;而 Reranker 的目标是对这些候选结果再判断一次,把最相关的排在最前面,所以它更关注排序质量。

简单理解就是:

  • Retriever:先广泛找候选
  • Reranker:再精细做排序

在很多效果比较好的 RAG 系统里,往往不是“一次检索直接结束”,而是“先检索,再重排”。这样可以明显减少看起来相似、但实际上答不到点上的 chunk 被送进大模型。

3.7 生成模型:RAG 的最后一环,但不是全部

当知识检索完成之后,生成模型才真正开始工作。常见的候选包括 GPTQwenDeepSeekGLMClaude 等。它们的主要职责不是自己记忆所有知识,而是根据用户问题和检索结果,组织出一个合理、通顺、符合要求的答案。

所以,在 RAG 里,大模型很重要,但它更像是最后的“表达层”,而不是整个系统的全部。很多时候,前面的检索链路决定了答案的上限,而生成模型决定了表达的质量。

3.8 编排框架:为什么很多人会提 LangChain

当模块越来越多时,就需要一个编排层把它们串起来。常见的框架包括 LangChainLlamaIndexHaystack,当然也有不少团队最后会落到自定义服务上。它们的共同点不是“替你解决所有问题”,而是帮助你更方便地管理加载器、切分器、embedding、向量库、retriever、prompt 和生成模型之间的衔接关系。

因此,如果把整个 RAG 看成一套系统,那么这些框架更像“胶水层”或“编排层”,而不是知识本身。

3.9 一个适合入门的典型组合

如果只是为了学习和快速搭原型,其实没有必要一上来就选最复杂的方案。一个很常见、也比较稳妥的起步组合可以是:

层级 入门型选择
文档解析 PaddleOCR / Docling
Chunk LangChain 或 LlamaIndex 默认切分器
Embedding BGE / E5
向量库 FAISS / Chroma
检索 Top-K 向量检索
重排 先不加,后续再补
生成模型 你当前可用的通用大模型
编排 LangChain / LlamaIndex

这套组合的优点不是“最强”,而是结构清晰、门槛适中,足以帮助你真正跑通一条从文档到回答的完整 RAG 链路。等你把链路理解透,再去替换某一层,思路就会清楚很多。

4. 真正影响 RAG 效果的,往往不是“大模型够不够大”

在讨论大模型应用时,很多人最先关注的是模型参数量、上下文窗口长度、推理能力强弱,但一旦进入 RAG 场景,就会发现决定系统上限的并不只有这些。很多看起来像“模型问题”的现象,实际上都可以追溯到检索链路前面的某一环。

4.1 RAG 的效果,通常由前半段决定

一个回答是否可靠,至少要经过这样几层筛选:文档是否被正确解析,chunk 是否被合理切分,embedding 是否能表达真正的语义相似度,检索是否召回了正确证据,重排或过滤是否把最相关内容放到了模型面前。如果这些步骤中有一层失真,生成阶段即使表达流畅,也可能只是把错误材料说得更像真的。

所以在很多项目中,真正值得优先优化的,往往不是“再换一个更大的生成模型”,而是下面这些更基础的问题:

常见问题 表面现象 更可能的根因
回答偏题 模型说了很多,但没答到点上 检索召回内容不相关
回答遗漏关键信息 只答了一部分 chunk 太碎或检索数量不足
回答逻辑混乱 内容拼接感强 chunk 切分不合理或文档顺序解析错误
回答看似合理但依据不足 模型“脑补”明显 提示约束弱,且检索证据不充分
不同问题答复不稳定 同类问题结果差异大 检索链路不稳定,而非单纯模型波动

如果只从结果看,容易把这些问题都归因于“大模型幻觉”;但更准确地说,很多所谓幻觉,其实是“检索错误后的自然后果”。模型被交付了错误材料,或者材料不够,它就只能在有限信息上组织语言。这时再去责怪生成模型“不够聪明”,往往并不公平。

4.2 为什么说 RAG 不是“加个知识库”那么简单

很多宣传语会把 RAG 说得非常轻松,好像只要把文档接进来,系统就自动具备知识问答能力。但真正做过之后就会知道,文档进入系统只是开始,不是结束。你还要考虑文档如何被解析、图片和表格如何处理、知识如何切块、检索如何约束、来源如何追踪、索引如何更新、召回如何评估,甚至还要处理长文档、重复内容、版本更新、权限隔离等现实问题。

也正因为如此,RAG 更像是一项“知识工程”,而不是一个简单的模型调用动作。它的价值不只在于提升回答效果,更在于给大模型建立了一条可维护、可更新、可控的知识访问路径。对于面向业务的系统来说,这种可控性往往比一次性的惊艳回答更重要。

4.3 一个更实用的理解方式

如果要用一句尽量简洁的话概括 RAG,我更倾向于这样表述:

RAG 的本质,不是增强模型记忆,而是增强模型在回答时调用外部知识的能力。

从这个定义出发,很多问题就会变得更清楚。为什么 RAG 不等于微调?因为它不试图把知识写进参数。为什么 chunk 很重要?因为模型访问外部知识时,访问的是被切分后的知识单元。为什么 embedding 和向量库不能省?因为没有它们,系统就无法在海量材料里做语义级别的查找。为什么模型输出有时看起来不可靠?因为模型在 RAG 中只是最后一环,它依赖前面整条链路的质量。


结语:理解 RAG,最好不要从“模型”开始,而要从“知识流动”开始

真正理解 RAG,关键不在于先背下多少名词,而在于先接受一个观念变化:在这套系统里,知识不再主要依赖模型参数存放,而是通过外部索引系统按需供给;模型也不再总是“直接作答”,而是更多扮演一个在证据基础上组织语言的角色。

因此,RAG 最值得学习的地方,恰恰不是某个具体框架怎么调用,而是整条知识流动路径如何设计:原始文档如何变成结构化内容,结构化内容如何变成可检索单元,可检索单元如何被准确召回,召回结果又如何被模型消费并生成答案。只要把这条链路真正看清楚,很多工具、框架和组件的选择就会顺理成章,因为它们本质上都只是这条链路上的不同实现。

如果把全文压缩成最后一句话,那么可以这样收束:

RAG 不是让模型“知道更多”,而是让模型在需要回答时,能够更可靠地“找到该知道的内容”。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐