RAG 是什么?从一条文档的完整旅程说起

RAG 不是把文档扔给 LLM 那么简单——带你从头理解 RAG 的由来、架构和最容易翻车的地方。

你有没有想过一个问题——

LLM 训练时读了几万亿字的互联网数据,几乎什么都知道。但它不知道你的业务数据——你的产品手册、售后政策、内部文档、客服对话记录。这些它没读过。

怎么让它知道该知道的?

这就是 RAG 要解决的问题。这篇文章从为什么需要 RAG 开始,一直讲到它的完整架构和最容易翻车的地方。

LLM 什么都知道,但不知道你的业务

LLM 有两个先天缺陷,在实际落地中很难绕过去。

缺陷表现影响
知识截止训练数据停在某个时间点问最新政策、实时数据,它不知道
不知道私有数据没读过你的内部文档、产品手册、客服记录业务场景下基本不可用

怎么解决?目前有三条路可以走。

方案一:微调(Fine-tuning)

拿业务数据继续训练模型,让它把新知识学进去。

听起来最直接,但实际操作成本很高。你需要准备高质量的训练数据、处理算力资源,而且每次业务文档更新了,又得重新训一遍。更麻烦的是,微调可能会破坏模型原有的通用能力——模型学会了你的业务术语,但写邮件的能力反而变差了。

方案二:塞长上下文(Long Context)

把所有资料都塞进 Prompt 里,让模型自己翻。

实现最简单,不用动模型。现在有些模型支持 128K、1M 甚至更长的上下文,看起来够用。但实际效果没那么理想:一是 Token 成本会随着内容量线性增长;二是内容太多之后,模型很难从海量信息中找到准确的那一段——这就是著名的"大海捞针"问题。上下文再长,检索精度是会下降的。

方案三:RAG(检索增强生成)

每次提问的时候,先去知识库里检索相关内容,拼到 Prompt 里,再让 LLM 基于这些材料回答。

RAG 是目前最主流的方案。原因很实在:

  • 成本低:不需要重新训练模型,省了算力
  • 更新快:知识库加个文档就行,不需要重训
  • 可追溯:LLM 是看着你给的资料回答的,能知道它引用的是哪份文档
  • 幻觉少:基于具体材料生成,比凭空回答可靠得多

当然,RAG 也有自己的问题——它依赖检索质量。如果检索到的内容不对或者不完整,LLM 材料再好也回答不对。后面会详细讲这个。

RAG 不是搜索引擎——它和搜索引擎的区别

很多人第一次接触 RAG 的反应是:这不就是搜索引擎吗?用户搜关键词,系统返回匹配的文档——有什么新鲜的?

这个理解对了一半,错的一半恰好是 RAG 的核心。

搜索引擎(ES/BM25)怎么工作

你搜一个关键词,搜索引擎在你的文档库里找到包含这个词的所有文档,按匹配度排序返回。它做的是关键词精确匹配

比如说你搜"2025年Q3营收",它能找到包含这几个词的那份财报。但如果你问"去年第三季度营收怎么样?",它可能找不到——因为文档里写的是"2025年Q3营收同比增长15.3%",关键词对不上。

这是一直以来搜索引擎的运作方式。在"搜文档、找文件"的场景下非常好用,但在"回答问题"的场景下就显得力不从心。

RAG(向量检索)怎么工作

RAG 不一样。它先把你的文档库转成一组向量(可以理解成一组数字坐标),用户提问时也把问题转成向量,然后计算问题向量和文档向量之间的距离。距离越近,说明内容越相关。

“去年第三季度营收怎么样?“和"2025年Q3营收同比增长15.3%“在字面上没有共同的关键词,但在语义上是同一件事。向量检索能捕捉到这种语义上的相近。

维度搜索引擎(ES/BM25)RAG(向量检索)
匹配方式关键词精确匹配语义匹配
搜"苹果”返回含"苹果"二字的所有文档能区分你在问水果还是手机品牌
输出文档列表相关内容 + LLM 生成的自然语言回答
适合场景搜文档、找文件回答问题、知识问答
局限性同义词、近义词不识别对数字/专有名词匹配不如精确搜索

所以搜索引擎和 RAG 不是替代关系,而是互补关系。生产环境最常用的方案是混合检索:向量检索负责语义匹配,BM25 负责精确匹配,两者互补。

但语义检索有一个前提条件:内容必须被正确地理解和切分。这就引出了下一个问题。

一条文档在 RAG 系统中的完整旅程

语义匹配的效果,很大程度上取决于文档在入库时被处理成了什么样子。一条文档从上传到最终被 LLM 用来回答问题,中间经历了一整套加工管道。

RAG系统完整管道图

RAG 系统完整管道:入库阶段 → 检索阶段(点击图片查看大图)

入库阶段:让机器能"读懂"文档

环节做什么为什么重要
文档解析把 PDF、Word、HTML 等格式转成纯文本PDF 看着是文字,实际是一堆坐标指令。解析不好,后面的所有环节都白费
文本清洗去噪、去重、格式归一化把乱码、多余的空格、无关的页眉页脚清掉
分块把长文本切成语义完整的片段不能整篇检索——太大了检索不准,太小了语境不够
向量化用 Embedding 模型把文本片段转成向量向量是语义匹配的基础
存入向量库把向量和原文存入向量数据库供后续检索使用

检索阶段:找到相关内容并让 LLM 回答

环节做什么
问题向量化把用户提问也转成向量
向量检索在向量库里找距离最近的文档片段
重排序对检索结果重新精排,提升 Top 结果的准确率
拼入 Prompt把检索到的内容拼到 Prompt 里,加上指令让 LLM 基于材料回答

为什么检索质量是关键

整个管道里,最核心的瓶颈不是 LLM 本身,而是检索质量

Andrew Ng 在一个分享里提过一个数据:优化 RAG 系统时,检索质量的提升对最终答案准确率的影响远大于模型本身的升级。换句话说,用更强的模型不能弥补检索结果差的问题——模型再聪明,材料给错了也答不对。

而检索质量又依赖于前面的入库环节:文档解析是否正确、分块是否合理、向量化是否准确。这是一个完整的链路,短板出在任何一环都会影响最终效果。

最容易在哪里翻车?

把各个环节按翻车概率排序,前三个是:

1. 文档解析——最大的坑

你传上去的文档是 PDF。PDF 看着是文本,但本质上是一堆坐标指令的集合——“在坐标 (x,y) 处渲染字符 A,在 (x+5,y) 处渲染字符 B”。它并不知道什么是段落、什么是表格、什么是页眉。

遇到以下几种 PDF,解析很容易翻车:

PDF 类型难度翻车方式
数字原生 PDF⭐ 简单基本没问题
扫描件 PDF(图片)⭐⭐⭐ 中等需要 OCR,识别率取决于清晰度
双栏/多栏排版⭐⭐⭐⭐ 困难阅读顺序恢复错误,左右栏混在一起
含表格 PDF⭐⭐⭐⭐⭐ 极难无线框表格、合并单元格、跨页表格,很容易解析错位
含公式 PDF⭐⭐⭐⭐⭐ 极难LaTeX 公式、化学结构式,专用模型才能处理好

2. 分块——切得不合适

解析完的文本不能整篇扔进去检索。整篇检索的问题:一篇文档可能几千字,但用户问的只是其中一小段。整篇匹配会让不相关的内容稀释相关内容的信号。

但切得太细也不行。比如只切一两句话——检索时可能命中了,但上下文缺失,LLM 看了也不知道前因后果。

这就是分块的核心矛盾:检索精度 vs 上下文完整性。切小了检索精准但语境不足,切大了语境完整但检索不精准。

实际生产中有好几种分块策略来解决这个矛盾——按固定大小切、按语义边界切、按文档结构切、父子分块等等。每种策略各有优缺点,选型取决于你的文档类型和场景。

3. 检索——精确匹配 vs 语义匹配的盲区

即使解析和分块都做好了,检索环节仍然可能翻车。典型场景:

  • 找不到相关内容:你的文档里确实有答案,但向量检索没把它排到前面
  • 找到太多噪音:检索返回了大量不太相关的内容,稀释了有效信号
  • 数字/专有名词匹配弱:向量检索对"Q3-2025营收同比增长率15.3%“这种精确表达不如关键词搜索

这也是为什么生产环境通常用混合检索——语义 + 关键词组合,取长补短。

回头看看

把整篇文章的问题串起来:

LLM 不知道你的业务数据
  → 三种方案对比,RAG 最实用(成本低、更新快、可追溯)
  → RAG 不是搜索引擎,是语义匹配
  → 但语义匹配的前提是内容被正确加工
    → 入库阶段:解析 → 清洗 → 分块 → 向量化 → 存储
    → 检索阶段:检索 → 重排序 → 拼入 Prompt → 生成
    → 最容易翻车的地方:解析、分块、检索

RAG 看起来简单——“查资料再回答”——但做了才发现,每一步都有坑。理解了这个全貌,后续不管是选型还是排查问题,都知道问题可能出在哪一环。


参考资料

  1. Andrew Ng, Building RAG Agents with LLMs, DeepLearning.AI, 2025 — 检索质量对 RAG 效果影响的分享
  2. Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, arXiv:2005.11401, 2020 — RAG 论文原文