RAG 检索增强生成论文
RAG(Retrieval-Augmented Generation)通过将外部知识库检索与语言模型生成相结合,解决了 LLM 的知识过时和幻觉问题,成为构建知识密集型 AI 应用的核心范式。
RAG 基本架构
Lewis et al. (2020) 提出的 RAG 框架包含两个核心组件:
- 检索器:从知识库中检索相关文档
- 生成器:基于检索结果生成答案
python
from typing import List
class RAG:
"""检索增强生成"""
def __init__(self, retriever, generator, top_k=5):
self.retriever = retriever
self.generator = generator
self.top_k = top_k
def retrieve(self, query: str) -> List[str]:
"""检索相关文档"""
# 向量检索
query_embedding = self.retriever.encode(query)
scores, indices = self.retriever.search(
query_embedding, top_k=self.top_k
)
documents = [self.retriever.get_doc(idx) for idx in indices]
return documents
def generate(self, query: str, documents: List[str]) -> str:
"""基于检索结果生成答案"""
context = "\n\n".join(documents)
prompt = f"""基于以下参考文档回答问题。如果文档中没有相关信息,请说明无法回答。
参考文档:
{context}
问题:{query}
答案:"""
return self.generator.generate(prompt)
def __call__(self, query: str) -> str:
documents = self.retrieve(query)
return self.generate(query, documents)RAG 的演进
Naive RAG → Advanced RAG → Modular RAG
| 阶段 | 特点 | 改进 |
|---|---|---|
| Naive RAG | 简单检索+生成 | 基线方案 |
| Advanced RAG | 查询改写+重排序 | 提升检索质量 |
| Modular RAG | 模块化组件组合 | 灵活定制 |
关键技术
- 查询改写:HyDE、Multi-Query、Step-back Prompting
- 重排序:Cross-encoder 重排、LLM 重排
- 混合检索:稠密检索 + 稀疏检索(BM25)
- 自适应检索:模型决定何时检索、检索什么
检索质量是关键
RAG 的性能上限由检索质量决定。如果检索不到相关文档,再强的生成器也无法给出正确答案。因此,Advanced RAG 的核心改进几乎都集中在提升检索质量上。
RAG 的理论分析
RAG vs 预训练知识
Borgeaud et al. (2022) 的 RETRO 模型表明:
- RAG 在知识密集型任务上持续优于纯参数化模型
- 检索可以弥补模型参数中的知识缺口
- 随着模型规模增长,RAG 的边际收益递减但仍为正
RAG 的局限性
- 检索噪声:不相关文档可能误导生成
- 上下文窗口限制:检索文档占用上下文空间
- 延迟:检索步骤增加推理延迟
- 知识库维护:需要持续更新知识库
评估框架
RAG 的评估需要同时衡量检索和生成质量:
| 指标 | 衡量内容 |
|---|---|
| 上下文精确率 | 检索文档与问题的相关性 |
| 上下文召回率 | 所需信息是否被检索到 |
| 忠实度 | 生成答案是否基于检索文档 |
| 答案相关性 | 答案与问题的相关程度 |