文章目录
检索增强生成(Retrieval-Augmented Generation, RAG)是AI工程中最重要的技术之一。它解决了基础模型的两个核心问题:知识过时和幻觉。
本文深入解析RAG的工作原理、为什么有效,以及各种实施策略,帮助架构师构建可靠的知识增强AI系统。我们将从核心原理开始,逐步深入到架构设计、检索策略和优化技巧,最终掌握RAG的完整实践方法。
核心观点
RAG通过"检索-增强-生成"的机制,将外部知识注入模型上下文,解决了基础模型的知识过时和幻觉问题,是知识密集型任务的首选方案。
正如Chip Huyen在《AI Engineering: Building Applications with Foundation Models》第5章所写的:
“RAG allows models to access real-time, accurate information by injecting external knowledge into the model context, without requiring retraining.”
RAG之所以有效,核心在于:不让模型"回忆",而是"查找"。传统模型依赖训练时的记忆,知识过时且可能产生幻觉。RAG系统每次查询都从外部知识库检索相关信息,将真实文档注入提示,让模型基于真实数据生成回答。这样既保证了信息新鲜度(知识库可实时更新),又减少了幻觉(基于真实文档而非记忆),还扩展了知识边界(不受模型参数限制)。
从简单的向量检索,到复杂的多步检索和重排序,RAG让模型能够访问海量专业数据,构建可靠的知识增强系统。
一、为什么RAG有效?——核心原理
1.1 基础模型的局限性
基础模型有三个核心局限性:
- 知识过时(模型训练数据有截止日期,如GPT-4到2023年4月,训练后的事实变化无法反映,模型不知道2024年的事件)、
- 知识受限(模型只能"记住"训练数据中的信息,企业内部知识、实时数据无法访问,模型不知道公司内部政策)、
- 幻觉风险(模型可能"编造"看似合理但错误的信息,缺乏事实核查机制)。
1.2 RAG如何解决这些问题?
核心思想:不让模型"回忆",而是"查找"
RAG的工作流程很简单:检索(从外部知识库查找相关信息)、增强(将检索到的信息注入提示)、生成(模型基于真实信息生成回答)。这个流程让模型不再依赖训练时的记忆,而是每次查询都从真实知识库获取信息。这种"查找"而非"回忆"的机制,从根本上解决了基础模型的局限性。
为什么有效?
- 信息新鲜度
- 减少幻觉
- 可扩展知识
1.3 RAG vs 微调
RAG和微调是两种不同的模型适应方法,各有适用场景。
- RAG在知识更新方面具有实时性(更新知识库即可),而微调需要重新训练;RAG在成本方面较低(只需检索),而微调成本高(需要训练);
- RAG在可追溯性方面高(有来源),而微调可追溯性低(黑箱);
- RAG适用于知识密集型任务,而微调适用于任务特定优化;
- RAG在数据需求方面只需要文档即可,而微调需要标注数据。
书籍第5章建议:
“For knowledge-intensive tasks, prioritize RAG. For task-specific optimization, consider finetuning.”
这个建议基于RAG和微调的特点:
-
RAG适合需要实时、准确知识的任务(如问答系统、文档检索),因为它可以访问最新信息;微调适合需要特定格式或术语的任务(如特定领域的代码生成),因为它可以学习特定模式。选择哪种方法取决于你的任务类型和需求。如果你的任务是知识密集型,需要访问最新信息,优先选择RAG;
-
如果你的任务是任务特定优化,需要学习特定模式,考虑微调。
二、RAG架构:核心组件
2.1 整体架构
RAG系统的整体架构包括多个步骤:
- 用户查询首先经过查询理解或重写,将用户查询转换为更适合检索的形式;
- 然后进行向量化(Embedding),将查询转换为向量表示;接着进行向量检索(Vector Search),在向量库中查找相似文档;
- 然后进行文档检索(Document Retrieval),获取完整文档;接着进行文档排序或重排(Reranking),提高检索精度;
- 然后进行上下文构建(Context Construction),将检索到的文档组织成上下文; 接着进行提示增强(Prompt Augmentation),将上下文注入提示;然后进行LLM生成(Generation),模型基于增强的提示生成回答;
- 最后进行后处理(Post-processing),验证和优化输出,得到最终回答。
这个流程的核心思想是:通过检索获取相关信息,通过增强将信息注入提示,通过生成基于真实信息回答。每个步骤都有其特定作用,共同构成了完整的RAG系统。
2.2 核心组件详解
2.2.1 文档处理(Document Processing)
文档处理的任务是将原始文档转换为可检索的格式,包括三个步骤:分块(Chunking)、元数据提取、清理。
-
分块是将长文档分割为小块的过程,方法有固定大小(如512 tokens)和语义分割两种。块大小影响检索精度和上下文完整性:太小会丢失上下文,太大会检索不精确。重叠是块之间重叠避免信息丢失的关键策略,通常重叠50个tokens可以确保信息连续性。
-
元数据提取是提取文档信息的过程,包括来源、日期、作者、类型等。这些元数据不仅帮助检索,还帮助用户验证信息来源。
-
清理是去除噪声的过程,包括去除HTML标签、特殊字符等。清理后的文档更易于处理和检索,提高了检索质量。
2.2.2 向量化(Embedding)
向量化的任务是将文本转换为向量表示,这样向量可以计算相似度,支持快速检索。向量化的核心是将文本的语义信息编码为数值向量,相似的文本有相似的向量,可以通过向量相似度快速找到相关文档。
模型选择有三个方向:
- 通用模型(如OpenAI text-embedding-ada-002,适合大多数场景)、
- 多语言模型(如multilingual-e5-large,适合多语言场景)、
- 领域特定模型(在领域数据上微调,适合特定领域)。
选择哪种模型取决于你的应用场景:如果是一般应用,用通用模型;如果需要多语言支持,用多语言模型;如果是特定领域,用领域特定模型。
2.2.3 向量存储(Vector Store)
向量存储的任务是存储和检索向量,选择包括托管服务(如Pinecone,易用但需要付费)、开源方案(如FAISS,高性能但需要自己维护)、功能丰富方案(如Weaviate,开源且功能丰富)、轻量级方案(如Chroma,适合小规模应用)。
选择哪种方案取决于你的需求:如果需要快速上手,用托管服务;如果需要高性能,用开源方案;如果需要丰富功能,用功能丰富方案;如果是小规模应用,用轻量级方案。
2.2.4 检索器(Retriever)
检索器的任务是从向量库检索相关文档,检索策略有三种:
- 相似度检索(使用余弦相似度,基于向量相似度查找相关文档)、
- 混合检索(向量检索加关键词检索如BM25,结合语义相似和精确匹配)、
- 重排序(用更精确的模型重新排序,提高检索精度)。
这三种策略可以单独使用,也可以组合使用,根据需求选择。相似度检索适合语义相似的任务,混合检索适合需要精确匹配的任务,重排序适合需要高精度的任务。
2.2.5 生成器(Generator)
生成器的任务是基于检索到的上下文生成回答,提示设计的关键是明确要求模型基于文档回答,如果文档中没有相关信息,请说"我不知道"。
这种设计确保模型不会编造信息,只会基于真实文档回答。提示应该包括文档内容、用户问题、回答要求(如引用来源、不确定性表达、格式要求)等要素,确保模型生成准确、可追溯的回答。
三、RAG策略:从基础到高级
3.1 基础RAG(Naive RAG)
基础RAG的流程很简单:查询向量化、检索top-k文档、注入提示、生成回答。
这种流程适用于简单问答场景,因为流程简单、成本低、易于实施。但局限性也很明显:检索可能不准确(向量检索可能返回不相关文档)、上下文可能过长(检索到的文档可能超出模型上下文窗口)、没有重排序(无法提高检索精度)。因此,基础RAG适合简单场景,复杂场景需要高级策略。
3.2 高级RAG策略
3.2.1 查询重写(Query Rewriting)
查询重写解决的问题是用户查询可能不匹配文档,导致检索不准确。解决方法是重写查询以提高检索精度,将用户查询转换为更适合文档检索的形式。
例如,用户查询"这个怎么用?"太模糊,重写为"产品X的使用方法和操作步骤"更具体,更容易匹配文档。查询重写的核心是保持原意,但更具体,让查询更容易匹配文档。
3.2.2 多轮检索(Multi-Turn Retrieval)
多轮检索适用于复杂问题需要多步检索的场景。流程包括第一轮检索(检索初始信息)、分析(识别缺失信息)、第二轮检索(基于分析检索补充信息)、合并(整合所有信息生成回答)。
这种多轮检索机制能够处理复杂问题,因为复杂问题往往需要多步信息收集,单轮检索可能无法获取所有必要信息。多轮检索通过逐步收集信息,最终整合所有信息生成完整回答。
3.2.3 重排序(Reranking)
重排序解决的问题是向量检索可能返回不相关文档,导致生成质量下降。
解决方法是用更精确的模型重新排序,提高检索精度。重排序的优势是提高检索精度,因为重排序模型能够更准确地评估文档与查询的相关性。但成本也相应增加,因为需要额外的计算开销。因此,重排序适合需要高精度的场景,简单场景可能不需要。
3.2.4 上下文压缩(Context Compression)
上下文压缩解决的问题是检索到的文档可能很长,超出模型上下文窗口,导致无法处理。
解决方法是压缩文档,只保留相关信息,减少上下文长度。上下文压缩通过提取与查询相关的部分,去除无关内容,确保上下文在模型处理范围内。这种压缩不仅解决了上下文长度问题,还提高了生成质量,因为模型只看到相关信息。
3.2.5 多模态RAG
多模态RAG适用于需要处理图像、表格等多模态数据的场景。
实施包括图像RAG(用CLIP等模型处理图像,将图像转换为向量进行检索)、表格RAG(结构化数据检索,处理表格数据)、混合RAG(文本加图像加表格,处理多种模态数据)。
这种多模态RAG能够处理更丰富的数据类型,扩展了RAG的应用场景。例如,医学RAG可以检索文本论文和医学图像,法律RAG可以检索法规条文和法律案例图像。
3.3 代理式RAG(Agentic RAG)
代理式RAG是RAG加代理的组合,可以主动使用工具。
能力包括多步检索(可以多次检索,逐步收集信息)、工具调用(如计算器、API,可以调用外部工具处理数据)、动态决策(可以根据情况动态调整策略)。这种代理式RAG能够处理更复杂的任务,因为代理可以主动规划、使用工具、动态决策。
例如,当用户问"2023年AI投资总额是多少?"时,代理可以思考需要查找2023年AI投资数据,然后行动检索相关文档,观察找到部分数据,再行动调用计算器汇总数据,观察得到总额,最后生成回答。这种多步处理能力让代理式RAG能够处理复杂任务。
四、RAG优化:提升效果
4.1 检索优化
检索优化包括三个关键方面:分块策略、嵌入模型选择、混合检索。
分块策略的关键决策包括块大小(太小丢失上下文,太大检索不精确,需要平衡)、重叠(块之间重叠避免信息丢失,通常重叠50个tokens)、分割方法(固定大小vs语义分割,根据文档类型选择)。
推荐策略是:
小文档整文档处理,中等文档512 tokens重叠50,长文档语义分割。这种策略能够平衡检索精度和上下文完整性。
嵌入模型选择的考虑因素包括领域匹配(通用vs领域特定,根据应用场景选择)、多语言(是否需要多语言支持,根据用户需求选择)、维度(更高维度通常更精确,但成本更高,需要平衡)。
推荐选择是:通用场景用OpenAI ada-002(1536维),开源场景用sentence-transformers/all-MiniLM-L6-v2,领域特定场景在领域数据上微调。这种选择能够平衡效果和成本。
混合检索的方法是向量检索加关键词检索,
- 优势是向量检索提供语义相似(能够找到语义相关但用词不同的文档),关键词检索提供精确匹配(能够找到包含特定关键词的文档)。这种混合检索能够结合两种检索方法的优势,提高检索精度。
- 实施时,先分别进行向量检索和关键词检索,然后合并结果(去重、重排序),得到最终检索结果。
4.2 生成优化
生成优化包括两个关键方面:提示优化、链式生成。
提示优化的关键要素包括明确来源(要求模型引用文档,确保可追溯)、不确定性表达(允许说"不知道",避免编造信息)、格式要求(指定输出格式,确保一致性)。这种提示优化能够提高生成质量,确保输出准确、可追溯、格式统一。
链式生成的方法是多步生成,逐步完善。流程包括初步回答(生成初步答案)、验证和补充(验证答案准确性,补充缺失信息)、最终回答(生成最终答案)。这种链式生成能够提高生成质量,因为通过多步处理,可以逐步完善答案,减少错误。
4.3 评估优化
评估优化包括两个关键方面:检索评估、生成评估。
检索评估的指标包括召回率(相关文档是否被检索到,反映检索完整性)、精确率(检索到的文档是否相关,反映检索准确性)、MRR(平均倒数排名,反映检索质量)。这些指标帮助评估检索效果,指导检索优化。
生成评估的指标包括准确性(回答是否正确,反映生成质量)、相关性(是否回答查询,反映生成相关性)、引用准确性(引用是否正确,反映可追溯性)。
评估方法包括人工评估(准确但成本高)和自动评估(快速但可能不准确),通常结合使用,平衡准确性和成本。
五、RAG最佳实践
RAG最佳实践可以从三个维度总结:数据准备、系统设计、成本优化。
数据准备包括文档质量(确保文档准确、完整,这是RAG系统的基础)、元数据丰富(添加来源、日期等元数据,帮助检索和验证)、定期更新(保持知识库最新,确保信息新鲜度)。这三个方面确保RAG系统有高质量的数据基础。
系统设计包括模块化(检索、生成分离,便于维护和扩展)、可扩展(支持增量更新,便于知识库扩展)、可监控(追踪检索和生成质量,便于持续优化)。这三个方面确保RAG系统具有良好的架构和可维护性。
成本优化包括缓存(频繁查询结果缓存,减少重复计算)、批处理(合并多个查询,提高吞吐量)、模型选择(小模型用于检索,大模型用于生成,平衡效果和成本)。这三个方面确保RAG系统在保证效果的前提下,控制成本。
六、实战案例:RAG系统设计:案例:企业内部知识助手
企业内部知识助手的需求是回答员工关于公司政策、流程的问题。架构包括四个层次:数据层、处理层、检索层、生成层。
-
数据层包括文档(公司政策、员工手册、FAQ等)、格式(PDF、Word、Markdown等)、更新(每周同步,保持知识库最新)。这个层次确保有高质量的数据基础。
-
处理层包括分块(512 tokens,重叠50,平衡检索精度和上下文完整性)、嵌入(OpenAI ada-002,通用且效果好)、存储(Pinecone向量库,易用且性能好)。这个层次确保文档能够被有效处理和存储。
-
检索层包括混合检索(向量加BM25,结合语义相似和精确匹配)、重排序(CrossEncoder,提高检索精度)、Top-k(5个文档,平衡效果和成本)。这个层次确保能够准确检索相关文档。
-
生成层包括模型(GPT-4,生成质量高)、提示(明确要求引用来源,确保可追溯)、后处理(验证引用,确保准确性)。这个层次确保能够生成准确、可追溯的回答。
效果包括准确率(从60%无RAG提升到90%,显著提升)、用户满意度(4.2/5,用户认可)、成本($0.05/查询,成本可控)。这个案例展示了RAG系统的实际效果,说明RAG系统能够显著提升应用质量。

被折叠的 条评论
为什么被折叠?



