01. 什么是 RAG?它主要解决了什么问题?

整理 什么是 RAG?它主要解决了什么问题? 的核心概念、工程要点与面试回答。

简单回答

RAG(Retrieval-Augmented Generation,检索增强生成)是一种把外部知识检索和大模型生成结合起来的技术方案。它的核心思路是:用户提问后,先从知识库中检索出相关文档片段,把这些片段拼进 Prompt,让模型基于检索到的内容来生成回答。RAG 主要解决的是大模型知识过时、领域知识不足、以及容易产生幻觉这三个核心问题。

详细解释

为什么需要 RAG

大模型虽然在预训练阶段学到了大量知识,但它有几个根本性的局限。

知识有截止日期。模型训练完成后,世界继续在变,但模型的参数是冻结的。比如你问一个 2024 年初训练的模型"2024 年 Q3 财报数据",它不可能知道。要更新这些知识,传统方式是重新训练或微调,但成本极高,周期也长。

领域知识不足。通用大模型的预训练数据以互联网公开数据为主,对于企业内部文档、私有知识库、专业领域的细节覆盖是不够的。你不能指望一个通用模型精确回答"我们公司的报销制度第三条第二款说了什么"。

幻觉问题。大模型的生成本质上是基于概率的 token 预测,它没有"事实核查"机制。当模型对某个问题的知识不够充分时,它依然会自信地编出一个看上去合理但实际错误的答案——这就是幻觉(Hallucination)。

RAG 的出发点就是:与其让模型完全依赖参数中的知识,不如在推理时给它提供"参考资料"。就像一个人开卷考试,答题前先翻阅相关资料,然后基于资料作答。这样既能覆盖最新信息,又能引用具体来源,大幅降低编造内容的风险。

RAG 的基本工作流程

一个最简版的 RAG 流程可以概括为三步:索引(Indexing)、检索(Retrieval)、生成(Generation)。

索引阶段是离线进行的。把知识库中的文档切成合适大小的片段(Chunk),用 Embedding 模型把每个 Chunk 编码成向量,存入向量数据库。这一步相当于"建图书馆的索引系统"。

检索阶段是在线进行的。用户的查询同样被 Embedding 模型编码成向量,然后在向量数据库中做近似最近邻搜索(ANN),找到语义上最相关的 K 个 Chunk。

生成阶段就是把检索到的 Chunk 和用户的原始问题一起组装成 Prompt,送给大模型生成最终回答。Prompt 通常长这样:

请基于以下参考资料回答用户的问题。如果资料中没有相关信息,请说明无法回答。

参考资料:
{chunk_1}
{chunk_2}
...

用户问题:{query}

RAG 解决了什么,没解决什么

RAG 真正解决的核心问题是让模型能够利用它训练时没有见过的知识。这包括实时信息、私有数据、频繁更新的文档等。同时,因为回答有据可查,可以做到"引用来源",给用户一定的可验证性。

但 RAG 不是万能的。如果检索环节没有找到正确的文档,后面的生成再好也是白搭——"垃圾进,垃圾出"。如果检索到了正确文档但模型没有正确理解或选择性忽略,照样会产生幻觉。RAG 降低了幻觉的概率,但没有彻底消除。

另外,RAG 对推理延迟和成本是有代价的。多了一次 Embedding 计算和向量检索的开销,Prompt 变长意味着更多的 token 消耗。这些在工程上都需要权衡。

RAG 和微调的关系

这是面试里经常被追问的点。简单说:RAG 是"给模型看资料",微调是"让模型学知识"。RAG 适合知识频繁更新、需要精确引用来源的场景;微调适合需要改变模型行为风格、或者知识相对稳定且需要深度内化的场景。实际项目中两者经常配合使用——微调让模型更懂怎么利用检索到的内容,RAG 负责提供最新的知识。

面试时可以这样答

RAG,全称 Retrieval-Augmented Generation,核心思路是在大模型生成之前,先从外部知识库检索相关内容,把检索结果作为上下文喂给模型,让模型"开卷答题"。

它主要解决三个问题:知识时效性——模型训练后就不再更新了,但业务知识是在变的;领域覆盖——企业私有数据不可能全部预训练进去;幻觉——有了参考资料做锚点,模型编造答案的概率会低很多。

基本流程就是离线把文档切片、向量化、存入向量库,在线时把用户查询也向量化,做相似度检索拿到相关片段,拼进 Prompt 让模型生成。听起来简单,但实际上每一步——怎么切、用什么 Embedding、怎么检索、怎么组装 Prompt——都直接影响最终效果。

值得注意的是 RAG 不是万能解药,它高度依赖检索质量,检索没召回正确文档,后面生成再好也没用。实际项目中通常是先把检索链路打磨好,再去优化生成端。

常见追问

  1. RAG 和 Fine-tuning 分别适合什么场景?两者能不能结合?
  2. RAG 系统中,检索和生成哪个环节对最终效果影响更大?
  3. 如果知识库非常大(比如百万级文档),RAG 的性能和效果会有什么变化?