检索增强生成(RAG)详解

B6
概念 · 核心构件

检索增强生成(RAG)详解。

模型只知道训练数据里有的,以及当前提示词里有的。RAG 通过在查询时取来相关文本并插入提示词来弥补这个缺口,于是模型从提供的文档作答,而非从记忆。本文讲解 RAG 为何存在、检索→增强→生成的流程、每个阶段真正在做什么,以及决定一个 RAG 系统是否可信的故障模式。

STEP 1

RAG 解决的问题。

裸 LLM 的三个结构性局限,根因相同——模型从冻结的训练权重作答:

  • 知识截止。它无法知道训练之后发生的事件、价格或创建的文档。
  • 没有私有数据。它从未见过你的代码库、你的内部 wiki、你客户的账户。
  • 自信地填补空白。问它一个一知半解的事,它产出看似可信、自信而错误的文本。这就是训练分布缺口型幻觉机制。

RAG 的洞见:模型阅读并综合所提供文本的能力,远强于从训练中回忆。所以别问它知道什么——把相关文档递给它,请它据此作答。接地(grounding)把工作量从不可靠的记忆转移到可靠的阅读。

STEP 2

检索 → 增强 → 生成。

User question
   |
   v
[1 RETRIEVE]  search a knowledge source for passages
              relevant to the question  -->  top-k chunks
   |
   v
[2 AUGMENT]   build a prompt:
              system rules + retrieved chunks + the question
   |
   v
[3 GENERATE]  model answers using ONLY the supplied chunks,
              ideally citing which chunk each claim came from
   |
   v
Grounded answer (+ citations)

RAG 不是某个模型或某个库——它是这个模式。模型本身不变;变的是你按每个问题动态地组装它的上下文。与本节的联系:检索实际上是模型上下文所接入的一个工具,而增强步骤不过是用刚取来的材料做提示。

STEP 3

每个阶段实际在做什么。

检索

你无法把整个语料放进提示词——装不下,还会触发迷失在中间。于是在一个索引里搜索最可能包含答案的少数段落。现代 RAG 通常用语义(基于嵌入的)搜索,使"我怎么重置密码"即便无共享关键词也能匹配标题为"账户找回步骤"的文档。分块与向量搜索值得单独一篇;这里把检索当作"找出 top-k 相关片段"即可。

增强

检索到的片段以显式框定插入提示词:"仅使用下面的上下文作答。若答案不在上下文中,就说你不知道。引用你用到的片段。"正是这条指令把原始检索转化为接地生成——没有它,模型会把检索文本和训练记忆混在一起,你就失去了那些保证。

生成

模型在问题加片段的条件下写出答案。做得好时,它跨段落综合并把论断归因到来源,这让答案可核查——这是 RAG 在生产中被信任的最大原因。

STEP 4

RAG 对比其他方案。

  • 对比微调。微调教行为和风格;用它注入事实既差又贵,且更新一个事实意味着重新训练。RAG 即时更新——改文档,下一个答案就反映它。用微调解决"如何回应",用 RAG 解决"此刻什么是真的"。
  • 对比长上下文。2025–2026 的共识比"RAG 胜出"更细致。对一个小型、稳定、有界的语料,把它整个粘进长上下文窗口,在答案质量上可以追平甚至超过 RAG——因为模型看到了全部,没有东西因检索失误而丢失。对大型或会变的语料,RAG 仍然便宜得多、延迟更低、更新鲜,并且绕开了迷失在中间的位置偏差。所以现代的答案是路由:简单、动态或大型 → RAG;需要整篇文档推理的小型固定集合 → 长上下文;智能体系统往往两者兼用。RAG 没有死——只是框定从"谁胜出"转向了"该路由到哪个"。
STEP 5

RAG 在哪里崩。

"我们加了 RAG"不保证正确。大多数 RAG 故障是检索故障,而非生成故障:

  • 检索未命中。正确段落根本没被取来,于是模型用错误片段或凭记忆作答。检索一旦未命中,生成无法挽救。这是主导性故障;要把检索召回率与答案质量分开评估。
  • 分块糟糕。答案被切到两个片段、只检索到其一,于是模型只看到半边故事。
  • 索引陈旧。源文档变了但索引未重建。RAG 只新鲜到它上一次建索引为止。
  • 未接地生成。片段被正确检索,但模型无视它们、仍用训练记忆。用显式接地指令,以及一个核查每个论断是否能追溯到检索片段的生成后检查来缓解。
  • 上下文被投毒。检索到的内容是不可信数据。含"忽略先前指令"的文档是提示词注入向量。把检索文本分隔并标注为数据,绝非指令。

分两半调试 RAG。先问:正确片段到底有没有被检索到?(直接检视检索集合。)只有为是时,再问:模型用对它了吗?把这两者混为一谈,正是团队花数周调提示词、而真正 bug 是检索器从未返回答案的原因。

要点

交付物

你能把 RAG 解释为检索→增强→生成:取 top-k 相关段落,构建一个指示模型仅据此作答并引用它们的提示词,然后生成可核查的接地答案。你知道它存在是因为模型读所提供文本远胜于回忆训练,且在事实上胜过微调、在规模下的成本与质量上胜过长上下文倾倒。最重要的是,你分两半调试它——先检索、后生成——因为大多数 RAG bug 是检索器没找到答案,而那是任何提示词都修不了的。