最近在研究怎么把大模型接到知识库上,RAG 是绕不开的方案。我看了一些资料,也动手试过。这篇先把它的原理、适用范围和限制理一遍。
RAG 是什么
大模型有两个常见问题:知识会过期,训练结束后不会自动更新;模型也会生成看似合理但实际错误的内容,也就是幻觉。
2020 年,Facebook AI Research 在 NeurIPS 发表了《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》,作者包括 Patrick Lewis、Ethan Perez、Aleksandra Piktus。它的想法很简单:模型回答问题前先检索资料。后来,这类方法被称为 RAG。
论文把两类记忆结合起来:
- 参数化记忆(Parametric Memory):预训练 seq2seq 模型的权重。论文使用 BART,可以理解为模型在训练中学到的知识。
- 非参数化记忆(Non-Parametric Memory):基于 Wikipedia 语料建立的密集向量索引,通过 DPR(Dense Passage Retriever)检索。需要时从索引中取回相关文本。
在开放域问答(Open-Domain QA)任务中,这种组合优于只依赖参数记忆的模型。后续的 RAG 研究大多沿着这个基本结构改进。
在工程里,常见流程有四步:
- 将文档切分为多个片段(chunk)。
- 用 embedding 模型把片段转换为向量,存入向量库。
- 用户提问时,把问题转换为向量,检索相近的 Top-K 片段。
- 将这些片段和问题一起交给 LLM,由模型基于上下文生成回答。
RAG 不要求把所有知识重新训练进模型权重。知识放在外部文档里,回答问题时再检索相关内容。
适用场景
- 企业内部知识库问答:规章制度、技术文档、历史方案等内容可以直接检索,员工不必在文件夹里逐个查找。
- 客服问答:将产品 FAQ 和历史工单作为语料,回答可以附带来源。
- 代码库问答:例如新人询问某个模块的职责时,可以从代码和文档中取回相关上下文。
- 垂直领域助手:法律条文、医疗指南等内容长且更新频繁,不适合依赖模型参数记忆。
这些场景通常有几个特点:知识更新快,内容量大,回答需要引用依据。用微调来维护这类知识往往成本更高。
带来的收益
知识可以更新。微调需要把新知识训练进权重,成本和周期都比较高。RAG 更新文档和向量索引后,就能在后续检索中使用新内容。
答案可以追溯。检索到的片段可以作为回答的来源。出错时,至少能判断问题出在原始文档、检索还是生成阶段,这对企业内部系统很重要。
它能缓解一部分幻觉。原论文的对比实验显示,检索增强模型在知识密集型任务中优于只靠参数记忆的模型。模型有明确的参考材料时,通常比完全依赖内部参数回答更可靠。
成本也更低。相比动辄数十万到上百万元的微调,向量检索加 LLM 的实现门槛低得多,小团队也能先把系统跑起来。
RAG 的限制
方案容易上手,但用它做工程知识库时,有几个问题会逐渐暴露出来。
第一个问题是重复计算。RAG 不会保留一次问答中的推理结果。一个问题如果需要综合 5 篇文档,模型每次都要重新检索这些片段,再重新组织答案。相同的问题被问一百次,检索和推理也会重复一百次。知识本身没有因此沉淀下来。
第二个问题是关系检索较弱。向量检索擅长判断一段文字和问题是否相似,但不擅长回答 “A 和 B 通过 C 有什么关系”。当答案分散在多篇文档中,需要用共同属性把它们串起来时,平坦的 Top-K 检索很难处理。像 “这个系统整体的设计思路是什么” 这类需要理解全局语料的问题也一样,Top-K 只能提供局部片段。
第三个问题是内容粒度混杂。一个 chunk 可能描述系统设计原则,也可能是某个函数第 42 到 143 行的实现。向量空间不区分抽象层次。“设计原则” 和 “代码实现” 都提到 “单一职责” 时,语义距离可能很近,但读者提出的问题并不相同。检索将它们放在一起返回,回答也容易混杂。
常见症状
这些限制在日常使用中通常表现为:
- “搜什么都是那几篇”:高词频的长文档经常占据 Top-K 结果,其他文档很少被检索到。
- “找到了但不是我要的层次”:用户想知道 “是什么”,系统却返回了大量 “怎么实现” 的内容。
- “改了一个地方不知道影响什么”:文档之间缺少关联关系,影响范围只能靠人维护。
- “新人不知道从哪看起”:知识库没有阅读路径和导航结构,向量库中的 chunk 是平铺的。
这些问题都和知识库缺少结构有关。向量检索把知识处理成一批文本片段,但工程知识有层级、模块依赖和文档引用。仅把这些内容切成 chunk 并写入向量库,检索时很难再恢复原有结构。
最后
RAG 解决的是让模型在回答前拿到相关资料,但拿到资料不等于理解资料。知识库没有结构时,再准确的检索也只是在许多片段中找出几个片段。
接下来更值得讨论的是,怎么为知识库补上结构,让知识能够积累、关联并按层次组织。

