找回密码
 立即注册
首页 业界区 安全 当 AI 开始"翻书":一文读懂检索增强生成(RAG)的前世 ...

当 AI 开始"翻书":一文读懂检索增强生成(RAG)的前世今生与实战指南

蔬陶 昨天 19:00
当 AI 开始"翻书":一文读懂检索增强生成(RAG)的前世今生与实战指南

开篇:AI 很强,但它也会"胡说八道"

你一定用过 ChatGPT、Copilot 或者 Stable Diffusion。它们能写论文、补代码、画插图,看起来无所不能。但如果你问 GPT 一个上周刚发布的 API 接口叫什么,它大概率会一本正经地编一个不存在的名字——这就是所谓的"幻觉"(hallucination)。
问题不止于此。大模型的知识冻结在训练截止日期,无法自动更新;对冷门领域(长尾知识)覆盖不足;训练数据可能泄露隐私;而且模型越大,训练和推理成本越高。这些问题在实际部署中尤为突出——你不可能每次有新知识就重新训练一个百亿参数的模型。
有没有一种方法,让模型在回答之前先"翻翻书",从外部数据源里找到相关资料,再据此生成答案?这就是 检索增强生成(Retrieval-Augmented Generation, RAG) 的核心思路。北京大学 Zhao 等人在综述论文 "Retrieval-Augmented Generation for AI-Generated Content: A Survey" 中,系统梳理了 RAG 的基础范式、增强技巧和跨模态应用。本文将以这篇综述为蓝本,带你从零建立 RAG 的完整认知。
一、AIGC 的强大与"痛点":为什么需要 RAG

AIGC(AI-Generated Content)泛指由生成式模型产出的内容,涵盖文本(GPT、LLaMA)、图像(DALL-E、Stable Diffusion)、视频(Sora)等多种模态。这些模型依赖海量参数存储知识——可以理解为把整个图书馆"压缩"进了神经网络的权重里。
但"参数记忆"有四个天然短板:

  • 知识过时:模型训练后,世界还在变化,新知识无法自动写入。
  • 长尾盲区:冷门实体、小众 API、罕见病例等低频知识覆盖不足。
  • 隐私风险:训练数据中的敏感信息可能被模型"记住"并泄露。
  • 成本高昂:为了覆盖更多知识而不断扩大模型参数,训练和推理开销剧增。
RAG 的解法很直觉:给模型配一个外挂的"非参数记忆"(non-parametric memory)。你可以把它想象成考试时允许翻阅的参考资料——模型不需要把所有知识都"背"进参数里,只需要在回答时知道去哪里查、怎么查。这个外挂记忆就是一个可检索的数据仓库——可以是文档库、知识图谱、代码仓库,甚至是图片集。它易于更新(改文档比重新训练模型便宜得多)、能容纳海量长尾知识、可以通过权限控制隔离敏感数据,还能通过"用检索代替生成"来降低推理成本。
简而言之,RAG 让模型从"闭卷考试"变成了"开卷考试"。
二、RAG 是什么:一条最小可行流水线


一个最基本的 RAG 流程可以拆成五步:

  • 输入查询(Query):用户提出问题或给出生成指令。
  • 检索 Top-k(Retrieve):检索器在数据源中找到最相关的 k 条结果。
  • 增强(Augment):将检索结果与原始查询融合,形成增强后的输入。
  • 生成(Generate):生成器基于增强输入产出最终结果。
  • 可选后处理(Post-process):对输出进行改写、重排或验证。
其中,检索器是关键。综述将检索方法分为三类:

  • 稀疏检索(Sparse Retrieval):基于词频统计,如 BM25、TF-IDF。用倒排索引实现高效查找,是大规模网页搜索的经典基线。优点是无需训练、可解释性强;缺点是无法捕捉语义相似性。
  • 稠密检索(Dense Retrieval):用预训练模型(如 BERT)将查询和文档编码为稠密向量,通过余弦相似度等度量计算相关性。需要构建近似最近邻(ANN)索引(如 HNSW、DiskANN)来加速搜索。语义理解能力强,但需要训练数据和 GPU 资源。
  • 其他方法:包括编辑距离、抽象语法树(AST)匹配、知识图谱的 k-hop 邻居搜索、命名实体识别(NER)等。
Tip:对于大多数文本 RAG 场景,BM25 + Dense Retrieval 的混合检索(Hybrid Retrieval)是一个稳健的起点。稀疏检索擅长精确关键词匹配,稠密检索擅长语义泛化,二者互补。
三、生成器与检索器:你在系统里能换哪些"发动机"




RAG 是一个"检索器 + 生成器"的组合系统,两个模块都可以独立替换。
生成器侧

  • Transformer:当前主流,GPT、LLaMA、BART 等均属此类,擅长序列到序列任务。
  • LSTM:早期序列模型,在部分代码生成和摘要任务中仍有使用。
  • 扩散模型(Diffusion Model):图像和音频生成的主力,如 Stable Diffusion。
  • GAN:生成对抗网络,在图像生成中曾是主流,现逐渐被扩散模型取代。
检索器侧

  • 稀疏检索器适合对精确匹配要求高的场景(如法律条文检索)。
  • 稠密检索器适合语义理解需求强的场景(如开放域问答)。
  • 混合检索器结合两者优势,适合大多数生产环境。
关键洞察:检索器和生成器的目标可能不一致——检索器追求相关性,生成器追求流畅性和准确性。如何设计二者的交互方式,是 RAG 系统设计的核心问题。综述正是围绕这个核心问题,提出了"基础范式"和"增强方法"两大分类体系。
四、RAG Foundations:四大"接入点"


综述将 RAG 的基础范式按"检索结果在哪个阶段、以什么方式接入生成器"分为四类:
1. Query-Based RAG(查询增强)

直觉:把检索到的内容直接拼接到 prompt 里,让模型"看着资料回答"。
典型场景:你问 LLM 一个知识密集型问题,系统先检索相关文档片段,拼进 prompt,再让模型生成答案。REALM、RAG(Lewis et al.)、SELF-RAG 都属于此类。在代码领域,APICoder、CEDAR 等将检索到的 API 文档和代码示例拼入 prompt。
风险/陷阱:检索内容过多会撑爆上下文窗口,导致生成变慢甚至信息丢失;检索质量差时,噪声会误导模型。Prompt 设计至关重要。
2. Latent Representation-Based RAG(隐状态融合)

直觉:不在文本层面拼接,而是在模型内部的隐藏层通过交叉注意力(cross-attention)等机制融合检索信息。
典型场景:RETRO 在 Transformer 的中间层用 chunked cross-attention 融合检索到的文本块;在视频字幕生成中,R-ConvED 用注意力机制融合检索到的视频-句子对的隐状态。
风险/陷阱:需要额外训练来对齐检索器和生成器的隐空间,通用性受限;但能实现更精细的信息融合。
3. Logit-Based RAG(概率层融合)

直觉:在解码的每一步,将生成模型的输出概率与检索得到的概率分布进行加权融合。
典型场景:kNN-LM 在每个解码步骤将语言模型概率与检索到的相似前缀的距离概率混合;EDITSUM 在代码摘要任务中在 logit 层集成原型摘要。
风险/陷阱:主要适用于序列生成任务;融合权重的调节需要精细设计,否则检索信号可能淹没或被忽略。
4. Speculative RAG(投机式检索)

直觉:能检索到现成答案就不生成——用检索替代生成,节省计算资源。
典型场景:REST 用检索替代投机解码中的小模型来生成草稿;GPTCache 构建语义缓存,对相似查询直接返回缓存结果,避免重复调用 LLM API;COG 将文本生成分解为一系列从文档中"复制粘贴"的操作。
风险/陷阱:目前主要适用于序列数据;当检索源覆盖不足时,会退化为普通生成。
五、RAG Enhancements:把系统做"更稳更强"的五类技巧


基础范式解决了"怎么接入"的问题,增强方法则解决"怎么做得更好"。综述将增强技巧分为五组:
1. 输入增强(Input Enhancement)

在查询进入检索器之前优化输入质量:

  • 查询改写/扩展:用 LLM 重写模糊查询(如 HyDE 生成假设文档来辅助检索),或将复杂查询拆解为子查询(RQ-RAG)。
  • 数据增强:清洗、去重、更新检索源中的过时文档;合成新数据弥补稀疏性(如 Make-An-Audio 为无文本音频生成描述)。
2. 检索器增强(Retriever Enhancement)

提升检索结果的质量和多样性:

  • 递归检索:多轮搜索获取更丰富的内容(ReACT 用 Chain-of-Thought 分解查询进行递归检索)。
  • 分块策略(Chunking):合理切分文档,平衡粒度与完整性(RAPTOR 用递归抽象处理构建树状索引)。
  • 重排序(Rerank):用 reranker 模型对初检结果重新排序,提升相关性(Re2G、UDAPDR)。
  • 混合检索:结合稀疏和稠密检索的优势(ReACC 同时使用两种检索器)。
  • 检索器微调:用对比学习、硬负例等技术微调检索模型。
3. 生成器增强(Generator Enhancement)

让生成器更好地利用检索信息:

  • Prompt 工程:精心设计 prompt 模板,组织检索内容的呈现方式(CEDAR 用设计好的模板组织代码示例、查询和指令)。
  • 解码调优:调节温度等超参数平衡多样性和质量(InferFix);约束输出词表消除实现错误(Synchromesh)。
  • 生成器微调:固定检索器参数,微调生成器以更好地融合检索内容(RETRO、APICoder);或用 LoRA 等轻量方法适配特定领域。
4. 结果增强(Result Enhancement)

对生成结果进行后处理:

  • 输出改写:用专门模型修正生成结果以符合下游需求(SARGAM 用分类器精修代码补丁)。
  • 候选重排:对多个生成候选进行排序选优。
5. 流水线增强(Pipeline Enhancement)

从系统整体层面优化:

  • 自适应检索:根据查询复杂度动态决定是否需要检索(SELF-RAG 用批评模块判断;AdaptiveRAG 用分类器按查询复杂度决策)。
  • 迭代式 RAG:多轮检索-生成循环,逐步精炼结果(RepoCoder 用迭代检索-生成完成代码补全;ITER-RETGEN 用生成输出定位知识缺口再检索)。
工程 Checklist:搭建 RAG 系统时,按以下顺序逐步优化——

  • ✅ 先跑通基线:BM25 + Query-Based RAG
  • ✅ 加入稠密检索,尝试混合检索
  • ✅ 优化分块策略和 prompt 模板
  • ✅ 引入 reranker 提升检索精度
  • ✅ 根据场景选择自适应/迭代式流水线
  • ✅ 必要时微调检索器或生成器
六、Applications Map:不仅是问答,跨模态 RAG


RAG 绝不只是"文本问答"的专利。综述梳理了 RAG 在以下领域的应用:

  • 文本:问答(FiD、REALM)、对话(BlenderBot3)、摘要、机器翻译(kNN-MT)、事件抽取、事实验证。
  • 代码:代码生成(REDCODER、APICoder、RepoCoder)、代码摘要(Re2Com、Bashexplainer)、代码补全(CoCoMIC)、程序修复(RAP-Gen、InferFix)、Text-to-SQL(Synchromesh、CodeS)。
  • 知识图谱:知识库问答(TOG、GNN-RAG)、知识增强的开放域问答(UniK-QA)、表格问答。
  • 图像:图像生成(KNN-Diffusion、Re-imagen)、图像字幕(SMALLCAP、REVEAL)、视觉问答(PICa)。
  • 视频:视频字幕(R-ConvED、EgoInstructor)、视频问答、视频生成(Animate-A-Story)。
  • 音频:音频生成(Re-AudioLDM、Make-An-Audio)、音频字幕(RECAP)。
  • 3D:文本到 3D 运动生成(ReMoDiffuse)、3D 资产生成(RetDream)。
  • 科学:生物医学文献生成(BioReader)、药物设计、数学定理证明(LeanDojo)。
核心洞察:跨模态 RAG 的核心流程是一致的——检索相关对象、增强生成过程。变化的是检索器的模态(文本用 BM25/DPR,图像用 CLIP,音频用 CLAP,代码用 CodeBERT)和增强方式的选择(文本多用 Query-Based,图像多用 Latent Representation-Based)。这意味着你在文本 RAG 上积累的经验,可以迁移到其他模态——核心设计模式是通用的。
七、3 个实战案例

Case A(文本):校园/实验室知识库问答助手

问题:实验室积累了大量内部文档(论文笔记、实验记录、设备手册),但内容更新频繁,直接用 LLM 回答常出现过时信息,且无法给出引用来源。
数据源:Markdown/PDF 格式的实验室内部文档库,按周更新。
检索器选择:混合检索(BM25 + Dense Retrieval)。BM25 处理精确术语匹配(如设备型号),Dense Retrieval(基于 BGE 等中文嵌入模型)处理语义相似查询。用 HNSW 构建 ANN 索引。
增强策略:Query-Based RAG(基础范式)+ 输入增强(查询改写)+ 检索器增强(rerank)。
Prompt 模板
  1. 你是实验室知识助手。请根据以下检索到的参考资料回答用户问题。如果参考资料不足以回答,请明确说明"当前知识库未覆盖此问题"。请在回答末尾标注引用来源。【参考资料】{retrieved_chunk_1}来源:{source_1}{retrieved_chunk_2}来源:{source_2}{retrieved_chunk_3}来源:{source_3}【用户问题】{user_query}
复制代码
失败模式与缓解

  • 文档更新后索引未同步 → 建立定时索引刷新机制,文档变更触发增量索引更新。
  • 检索到的片段与问题相关但信息不足 → 引入递归检索,对初次结果中的关键实体进行二次检索。
  • 模型忽略检索内容,仍凭参数记忆回答 → 在 prompt 中强调"仅基于参考资料回答",并用 SELF-RAG 式的自我批评机制判断是否需要检索。
评估计划

  • 准确率:人工标注 200 条问答对,计算答案正确率。
  • 引用准确率:检查生成的引用是否指向正确的源文档。
  • 检索召回率:标注相关文档,计算 Top-5 召回率。
  • 用户满意度:实验室成员试用两周后收集反馈。
Case B(代码):API/代码补全助手

问题:开发团队使用内部框架,公开 LLM 对私有 API 一无所知,经常生成不存在的函数名和错误的参数签名。
数据源:内部 API 文档、函数签名、代码示例、README 文件。
检索器选择:稠密检索为主(用 CodeBERT 编码代码和文档),辅以稀疏检索(BM25 匹配函数名和关键词)。参考综述中 ReACC 同时使用两种检索器的做法。
增强策略:Query-Based RAG + 迭代式 RAG(参考 RepoCoder 的迭代检索-生成方法)。第一轮用当前代码上下文检索相关 API;第二轮用初步生成的代码片段作为新查询,检索更精确的示例。
Prompt 模板
  1. 你是代码补全助手。请根据以下 API 文档和代码示例,补全用户的代码。只使用文档中存在的 API,不要编造不存在的函数或参数。【相关 API 文档】{api_doc_chunk_1}【代码示例】{code_example_1}【当前代码上下文】{current_code_context}【待补全位置】{cursor_position}
复制代码
失败模式与缓解

  • 检索到的 API 版本过旧 → 数据源按版本号管理,检索时过滤当前项目依赖的版本。
  • 函数名匹配正确但参数签名错误 → 检索粒度细化到函数签名级别,而非整个文档页面。
  • 生成的代码语法正确但逻辑错误 → 引入 Synchromesh 式的约束解码,限制输出词表;结合 De-Hallucinator 的迭代验证机制。
评估计划

  • 补全准确率:在内部代码测试集上计算 exact match 和 BLEU。
  • API 幻觉率:统计生成代码中不存在的 API 调用占比。
  • 编译通过率:生成代码能否通过编译/类型检查。
  • 开发者效率:A/B 测试对比有无 RAG 辅助时的编码速度。
Case C(多模态/AIGC):图像生成的参考检索——风格与构图对齐

问题:设计师希望用文本生成特定风格的图像(如"莫奈风格的校园秋景"),但纯文本 prompt 难以精确控制风格和构图,生成结果与预期偏差大。
数据源:风格标注的参考图像库(含风格标签、构图描述、CLIP 嵌入)。
检索器选择:基于 CLIP 的稠密检索。用户输入文本 prompt 后,CLIP 文本编码器将其映射到共享嵌入空间,检索视觉上最相关的参考图像。参考综述中 KNN-Diffusion 和 RDM 的做法——训练扩散模型时以 CLIP 嵌入和图像邻居为条件。
增强策略:Latent Representation-Based RAG。参考 Retrieve&Fuse 的方法,将检索到的参考图像与噪声图像在 U-Net 的注意力模块前拼接,通过自注意力实现充分交互,避免 CLIP 嵌入的信息损失。同时结合 Re-imagen 的交错引导(interleaved guidance)平衡 prompt 对齐和检索条件。
Prompt 模板(文本侧):
  1. 请生成一张图像。【风格参考】检索到的参考图像 ID:{ref_image_ids}风格描述:{style_description}构图特征:{composition_features}【用户描述】{user_text_prompt}生成要求:保持与参考图像一致的色调和笔触风格,构图参考检索结果,内容以用户描述为准。
复制代码
失败模式与缓解

  • 检索到的参考图风格相近但内容干扰生成 → 用 RPG 的方式将画面分解为互补子区域,分别控制风格和内容。
  • CLIP 嵌入丢失细粒度风格信息 → 参考 Retrieve&Fuse,直接拼接原始图像特征而非仅用 CLIP 向量。
  • 参考图库覆盖不足导致检索结果不相关 → 设置相似度阈值,低于阈值时退化为无检索的纯文本生成。
评估计划

  • 风格一致性:用 CLIP 计算生成图像与参考图像的风格相似度。
  • Prompt 对齐度:用 CLIP 计算生成图像与文本 prompt 的匹配分数。
  • 人工评估:邀请设计师对生成结果的风格还原度和美学质量打分。
  • FID 分数:在特定风格子集上计算 FID,衡量生成质量。
八、评估、局限与未来方向

评估基准

综述梳理了多个 RAG 评估框架:

  • RAGAS、ARES、TruLens:从三个维度评估——忠实度(Faithfulness,生成内容是否基于检索结果)、答案相关性(Answer Relevance)、上下文相关性(Context Relevance)。
  • Chen et al. 的基准:测试四个能力——噪声鲁棒性、负拒绝(检索不足时能否拒绝回答)、信息整合、反事实鲁棒性。
  • CRUD-RAG:将 RAG 任务分为创建、读取、更新、删除四类,分别用文本续写、问答、幻觉纠正、多文档摘要来评估。
  • 领域专用基准:MIRAGE(医学)、CRAG(跨领域多类别)、Legalbench-RAG(法律)、Omnieval(金融)、Multihop-RAG(多跳推理)等。
当前局限

综述指出 RAG 面临五大局限:

  • 检索噪声:检索结果不可避免地包含噪声。有趣的是,研究发现噪声检索结果有时反而能提升生成质量,可能因为多样化的检索结果有助于 prompt 构建。但噪声的影响仍不明确。
  • 额外开销:检索和交互过程增加延迟,尤其在递归检索和迭代 RAG 中更为显著。检索源规模扩大也会增加存储和访问复杂度。
  • 检索器与生成器的鸿沟:两者目标和隐空间可能不一致,如何设计高效的交互方式仍是挑战。
  • 系统复杂度增加:引入检索不可避免地增加超参数(如 top-k 值、分块大小、融合权重),需要更多专业知识来调优。
  • 上下文过长:Query-Based RAG 会大幅增加上下文长度,对上下文窗口有限的模型不友好,也会拖慢生成速度。
未来方向

综述展望了七个方向:

  • 新型增强方法:探索更先进的检索器-生成器交互模式。
  • 灵活流水线:递归、自适应、迭代式 RAG 的深入发展。
  • 更广泛的应用:为特定领域设计定制化 RAG 方案。
  • 高效部署:系统级优化以降低延迟(PipeRAG、HedraRAG 等)。
  • 长尾与实时知识:构建持续更新的知识源,适配个性化信息。
  • 与其他技术结合:RAG + 微调 + 强化学习 + Chain-of-Thought + Agent 的协同。
  • Agentic RAG:将 AI Agent 引入 RAG,实现"推理-规划-行动-迭代"的动态循环,从被动响应走向主动解决问题。
综述特别指出,"长上下文模型将取代 RAG"的说法忽视了 RAG 在管理动态信息(包括实时和长尾知识)方面的灵活性。RAG 将受益于长上下文生成技术,而非被其取代。
结语

RAG 的本质是一个简洁而强大的思想:让生成模型在回答之前先"查资料"。它不需要重新训练模型,就能注入新知识、减少幻觉、保护隐私、降低成本。从文本问答到代码补全,从图像生成到科学研究,RAG 正在成为 AIGC 系统的标准组件。
如果你正在搭建自己的 AI 应用,不妨从一个最简单的 BM25 + LLM 的 Query-Based RAG 开始,然后根据本文的分类框架逐步优化。记住:好的 RAG 系统不是一次设计出来的,而是迭代出来的。 先让它跑起来,再让它跑得好。
本文基于综述论文 Retrieval-Augmented Generation for AI-Generated Content: A Survey(Penghao Zhao, Hailin Zhang, Qinhan Yu, Zhengren Wang 等,北京大学)撰写。如需深入了解某个方向的具体方法和实验结果,建议阅读原文及其引用的相关论文。
更多资源获取欢迎关注我的公众号:「木子吉星」


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册