RAG技术详解:从由来、原理到工程实践
一、 RAG的由来:技术演进的必然选择
RAG的诞生并非偶然,它是自然语言处理领域为克服不同技术路径的固有缺陷而必然产生的融合成果。
1. 历史背景:两条互有短长的技术路径
在RAG之前,构建知识系统主要依赖两种方法:
- 基于检索的模型: 像一个“自动应答机”,从预设的问答库中匹配答案。其优点是准确、可控,但缺点极为致命:僵硬、缺乏泛化能力,无法回答知识库外的问题。
- 基于生成的模型(早期Seq2Seq及后续LLM): 像一个“自由发挥的诗人”,能够根据问题生成流畅的答案。其优点是灵活、自然,但缺点同样突出:容易产生“幻觉”,编造事实,且知识更新滞后。
核心痛点:大语言模型(LLM)的三大致命缺陷:
- 知识固化:训练数据截止后无法更新(如 GPT-4 初始版本缺失 2023 年后信息)
- 幻觉生成:无依据编造事实(医疗 / 法律领域致死级风险)
- 私有数据隔离:无法直接访问企业内部文档
核心矛盾: 我们既需要生成模型的智能与灵活,又需要检索模型的准确与可控。RAG的核心理念——“增强”——正是为了调和这一矛盾而生。
2. 技术奠基:关键技术的成熟
RAG从构想变为现实,依赖于三大技术基石的成熟:
- 强大的生成器: 以GPT-3为代表的大语言模型展现出惊人的语言生成与上下文理解能力,使其有资格作为可靠的“生成器”。
- 高效的检索器: Sentence-BERT等句子嵌入模型的出现,使得能够将文本语义转化为高维向量,并精准计算相似度。
- 海量向量的管理: Faiss、Milvus、Pinecone等向量数据库解决了海量向量数据下的毫秒级近似最近邻搜索 问题,使实时检索成为可能。
3. 正式提出与范式演化
- 论文奠基(2020年): Meta AI在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中正式提出了RAG概念,并设计了端到端可训练的RAG模型(RAG-Sequence, RAG-Token),在学术上验证了“检索增强生成”范式的有效性。
- 工程化与泛化: 随着ChatGPT引爆市场,LLM的“幻觉”和“知识滞后”问题成为落地瓶颈。工业界将RAG从一种特定的神经网络模型,泛化为一种通用的系统架构范式。各组件(检索器、向量库、生成器)被解耦,并通过LangChain、LlamaIndex等框架标准化,使其成为解决LLM痛点最实用的工程方案。
二、 RAG的核心原理:开卷考试的智慧
RAG的原理直观而优雅:为LLM配备一个“外部知识库”,让其从“闭卷考试”变为“开卷考试”。
第一阶段:知识预处理与创建向量索引(离线)
此阶段目标是为检索准备好高质量的“原材料”。
- 加载: 从各种数据源(PDF、Word、数据库、网页等)加载原始文档。
- 分割: 使用文本分割器将长文档切割成大小适中、语义完整的文本块(Chunks)。这是影响后续所有步骤的基础,需要根据文档类型(如技术文档、新闻、代码)精心调整块大小和重叠区。
- 向量化: 使用嵌入模型将每个文本块转换为一个高维向量(Embedding)。这个向量在数学上代表了文本的语义。
- 存储: 将向量和对应的原始文本(及元数据)一并存入向量数据库。
第二阶段:检索与重排序(在线)
这是RAG系统的核心环节,决定了提供给LLM的上下文质量。它包含两个关键步骤:
步骤 2.1:初步检索(召回)
- 查询向量化: 将用户查询(Query)通过相同的嵌入模型转换为查询向量。
- 相似性搜索: 在向量数据库中进行近似最近邻搜索,快速地从海量数据中召回Top K个(例如K=20)与查询向量最相似的文本块。
- 此时的问题: 向量相似度(如余弦相似度)虽然高效,但它是一个“粗糙”的衡量标准。它可能召回一些:
- 主题相关但内容不直接回答问题的块(例如,讨论问题背景而非解决方案)。
- 语义相似但关键词不匹配的块,而有时关键词匹配至关重要。
- 简单相似度算法无法理解查询的深层意图和段落与查询间的细微相关性。
步骤 2.2:重排序(精炼)
- 目的: 解决初步检索的“粗糙”问题,对召回的Top K个结果进行精细化的重新排序,筛选出最相关、最精确的Top N个(例如N=5)结果送给LLM。
- 工作原理:
- 使用一个专门的、更强大但通常也更耗时的重排序模型。
- 该模型以查询和每一个召回的文本块作为输入。
- 模型会输出一个相关性分数(如0-1之间),这个分数比简单的向量相似度更能精确地衡量该文本块对回答查询的价值。
- 技术实现:
- 专用模型: 例如
bge-reranker-large,Cohere Rerank API等。这些模型通常是交叉编码器,能够对查询和文本块进行深度的注意力交互计算,从而得出更精确的相关性判断。 - LLM充当Reranker: 也可以使用Prompt让LLM(如GPT-4)对检索结果进行排序和评分,虽然成本较高,但效果可能极佳。
- 专用模型: 例如
重排序的价值:
- 大幅提升上下文质量: 确保最终送给LLM的是“精华中的精华”,直接减少了无关信息(噪声)的输入。
- 降低LLM负担: 高质量的上下文让LLM更容易生成准确答案,减少了因上下文混乱导致的“幻觉”。
- 有效利用上下文窗口: 在有限的上下文窗口内,放入最相关的信息,性价比最高。
第三阶段:增强生成(在线)
- 构造提示词: 将经过重排序筛选出的Top N个高质量文本块作为上下文,与用户查询一起,通过精心设计的模板构造成最终提示词。
请基于以下提供的背景信息来回答问题。如果信息不足以回答问题,请明确说明。 【背景信息】 {插入经过重排序的精炼上下文} 【问题】 {用户原始查询} 【答案】 - 调用LLM生成: 将提示词发送给LLM。LLM基于高质量的、有据可查的上下文生成最终答案。
- 返回与溯源: 返回答案给用户。由于每个上下文块都有对应来源,系统可以轻松地提供引用来源,增强答案的可信度和可追溯性。
三、 RAG的技术栈:工程师的工具箱
RAG技术栈模块化清晰,工程师可根据需求灵活选型:
| 组件 | 功能 | 代表技术/工具 |
|---|---|---|
| 数据加载/分割 | 处理多源数据,切分文本 | LangChain, LlamaIndex |
| 嵌入模型 | 文本转向量(用于召回) | sentence-transformers, OpenAI Embeddings |
| 向量数据库 | 存储并高速检索向量 | Pinecone, Chroma, Qdrant |
| 重排序模型 | 对召回结果进行精细排序 | 专用模型: bge-reranker, Cohere Rerank API LLM: 通过Prompt让GPT-4等充当排序器 |
| 大语言模型 | 理解指令并生成答案 | GPT-4, Claude, Llama 3 |
| 编排框架 | 串联整个流程 | LangChain, LlamaIndex(均内置了Reranker集成接口) |
工程师选型考量: 数据隐私(是否可上云)、成本(API调用 vs. 自托管)、性能(延迟与精度)、社区支持。
四、 RAG的应用场景与高级挑战
1. 高价值应用场景
- 智能客服/问答: 基于最新产品文档提供准确回答。
- 企业知识中枢: 打通内部Wiki、代码库、会议纪要,成为企业“活”的智慧大脑。
- 内容生成与辅助: 基于事实数据撰写报告、文案,内容更具可信度。
- 学术/文献分析: 快速梳理海量论文,进行摘要、对比和问答。
2. 工程实践中的高级挑战
- 检索质量优化:
- 查询优化: 使用LLM对原始查询进行重写或扩展,提升检索命中率。
- 混合搜索: 结合关键词搜索(BM25)和向量搜索,取长补短。
- 重排序: 在初步检索后,用小模型对结果进行精细重排,提升Top结果相关性。
- 上下文管理:
- 窗口限制: 如何从大量检索结果中精炼出最关键信息,以适配LLM的上下文长度限制。
- 多轮对话: 如何有效维护对话历史,使系统能理解指代关系。
- 评估与监控:
- 建立量化指标(检索命中率、答案忠实度、有用性)以评估系统效果。
- 线上监控检索延迟、Token消耗、用户反馈等运维指标。
五、 RAG的边界:那些鞭长莫及的事
尽管RAG功能强大,但它并非“银弹”。其核心原理——通过检索外部知识来增强生成——也决定了其能力存在天然的边界。理解这些边界,对于正确的技术选型至关重要。以下场景是RAG不擅长或根本无法解决的:
1. 需要内在推理与思维链的任务
RAG提供的是“事实”,而非“推理能力”。
-
场景示例:
- 复杂数学与逻辑推理: “如果小明每小时走5公里,他出发2小时后,小红以每小时7公里的速度从同地同向出发,问小红多久能追上小明?” RAG可以检索出速度公式,但无法替代模型本身的数学计算和逻辑推理能力。
- 代码算法实现: “请写一个快速排序算法。” 优秀的代码LLM已经将排序算法内化为其核心参数,它需要的是根据编程逻辑生成代码,而非从文档中检索代码片段。RAG在这里无用武之地,甚至可能因为检索到低质量代码而引入错误。
- 抽象思维与谜题解决: 一些需要跨越概念鸿沟的脑筋急转弯或哲学思辨问题。
-
本质原因: 这类任务的成功不依赖于访问外部知识库,而依赖于模型参数本身所编码的推理路径和思维链。RAG是知识的“外挂”,无法提升模型固有的“智商”。
2. 需要学习“新技能”或“新范式”的任务
RAG提供的是“内容”,而非“能力”。
-
场景示例:
- 风格迁移: “请用鲁迅的文风写一段关于人工智能的评论。” 虽然可以有鲁迅的语料库,但“文风”是一种高度抽象和内化的模式,无法通过简单检索几段鲁迅原文就让LLM完美模仿。这需要模型在参数层面已经学会了这种风格表征。
- 遵循复杂的新指令: 教模型一个它完全没见过的新任务格式。如果这个格式非常复杂,仅通过在上下文中提供几个示例(小样本学习),模型可能无法可靠掌握。这需要通过微调来更新模型权重,使其真正学会新技能。
-
本质原因: RAG是上下文学习,其影响是暂时的、仅限于当前对话。而学习新技能需要改变模型本身的行为,这必须通过微调 来实现,即直接调整模型的权重参数。
3. 广义的常识与世界知识
RAG适用于“专有知识”,但难以覆盖“常识”。
-
场景示例:
- “为什么天空是蓝色的?” “鱼在水里怎么呼吸?” 这类问题涉及的是浩如烟海的通用常识。
- 试图为所有常识构建一个外部知识库是不切实际的。一个强大的通用LLM,其价值恰恰在于其训练数据中已经内化了海量的世界知识。
-
本质原因: 对于通用常识问题,依赖模型的内置知识通常比检索更高效、更自然。为常识构建检索系统是“杀鸡用牛刀”,成本效益极低。
4. 高度创造性且无需依据的内容生成
RAG的目的是“ grounding”( grounding),而某些创作需要“天马行空”。
-
场景示例:
- 写一首原创诗歌、一个故事开头、一个品牌口号: 这些任务的核心价值在于新颖性和创造性。强制要求模型基于现有资料生成,反而会限制其想象力,导致产出内容陈旧、缺乏亮点。
- 头脑风暴: “为新产品想10个可能的名字。” 这个过程的重点是发散思维,而非从已有资料中寻找答案。
-
本质原因: RAG的设计目标是减少幻觉、确保事实正确性,这与无拘无束的创造性在本质上是相悖的。在这些场景下,无需RAG的“纯净”LLM往往是更好的选择。
5. 对延迟极度敏感的真实交互场景
RAG引入了额外的延迟开销。
-
场景示例:
- 实时对话机器人(非知识问答型): 例如,用于闲聊或简单任务执行的语音助手。每次交互都经历“检索->重排->生成”的管道,会导致响应速度过慢,破坏对话流畅性。
- 需要毫秒级响应的应用。
-
本质原因: RAG的检索和重排步骤需要额外的网络请求和计算时间,这会增加系统的整体响应延迟。在延迟为王的应用中,直接调用优化过的LLM API是更优方案。
6. 动态、非预设的复杂多轮对话
RAG难以处理对话中隐含的、动态变化的上下文。
-
场景示例:
- 一场复杂的谈判或辩论模拟,其中每个回合都基于上一回合的动态结果。
- 开放式角色扮演游戏,剧情发展无法预测。
-
本质原因: RAG的知识库是静态的。它擅长回答基于固定知识的事实性问题,但无法有效理解和跟踪一个动态演变、高度依赖对话历史本身的上下文。这时,模型强大的长上下文能力和对话状态跟踪能力比外部检索更重要。
总结:RAG的定位
| 特征 | 适合RAG的场景 | 不适合RAG的场景 |
|---|---|---|
| 知识依赖 | 依赖外部、私有、最新的知识 | 依赖模型内置的推理能力、常识或创意 |
| 任务目标 | 准确、可溯源的信息提供 | 创造性、推理型、技能型的任务 |
| 性能要求 | 可接受数百毫秒至秒级的延迟 | 要求毫秒级响应的实时交互 |
| 数据性质 | 知识相对静态,可被预先索引 | 上下文高度动态,随交互实时演变 |
结论: RAG是解决LLM “知识” 问题(无知、过时、幻觉)的利器,但它无法赋予LLM新的 “能力”(推理、创造、技能)。在选择技术方案时,应清晰地判断核心需求是“增强知识”还是“提升能力”。后者往往需要依赖更强大的基座模型、微调(Fine-tuning)或智能体(Agent)等其他技术路径。
总结
RAG是NLP技术长期演进与LLM时代实际需求碰撞下的必然产物。它从一个创新的学术概念(Meta论文),通过工业界的工程化泛化,演变为当前解决LLM知识瓶颈的主流架构范式。其核心价值在于巧妙地将检索的准确性与生成的灵活性相结合,通过“增强”的手段,使LLM的能力得以在真实、严肃的应用场景中安全、可靠地释放。对于工程师而言,理解RAG的来龙去脉和技术细节,是构建新一代AI应用的关键。
额外说一下,RAG技术性价比极高,适合快速迭代,相对模型训练和微调都要更方便更迅捷,效果也很好。千万不要什么都往模型训练上靠。而且RAG的应用不局限于知识问答。智能写作、智能审批、智能提取都可以用上。希望大家重视。
附录:
1、常用向量化模型
| 模型名称 | 开发者 | 向量维度 | 主要特点 | 是否开源 | 适用场景 |
|---|---|---|---|---|---|
| BGE-M3 | BAAI | 1024 | 支持多语言,性能优异,支持长文本处理,检索能力强 | 是 | 通用文本检索、问答系统、文档搜索 |
| text-embedding-ada-002 | OpenAI | 1536 | 通用性强,API调用简单,稳定性好 | 否 | 通用文本嵌入、语义搜索、聚类分析 |
| text-embedding-3-small | OpenAI | 1536 | 性价比高,性能优于ada-002,响应速度快 | 否 | 成本敏感的应用场景、大规模文本处理 |
| text-embedding-3-large | OpenAI | 3072 | 性能最强,支持更大维度,语义理解能力突出 | 否 | 高精度要求的场景、复杂语义理解 |
| e5-mistral-7b | E5团队 | 4096 | 基于Mistral架构,多语言支持好,上下文理解能力强 | 是 | 多语言文本处理、跨语言检索 |
| jina-embeddings-v2-base-en | Jina AI | 768 | 专为检索优化,支持8192 token长文本 | 是 | 文档检索、语义搜索、长文本处理 |
| bge-large-zh | BAAI | 1024 | 中文优化,性能优异,适合中文场景 | 是 | 中文文本处理、中文检索、问答系统 |
| text2vec-large | shibing624 | 1024 | 中文领域训练,轻量级部署方便 | 是 | 中文语义相似度计算、文本分类 |
| voyage-2 | Voyage AI | 1536 | 专为检索优化,支持长文档,性能优异 | 否 | 企业级搜索、文档智能检索 |
| cohere-embed-english-v3.0 | Cohere | 1024 | 多语言支持,检索精度高,支持长文本 | 否 | 多语言应用、企业级搜索系统 |
2、常用Rerank模型
以下是当前常用的Rerank模型列表:
| 模型名称 | 开发者 | 是否开源 | 主要特点 | 适用场景 |
|---|---|---|---|---|
| BGE-reranker | 智谱AI | 是 | 基于BERT架构,支持中英文,性能优异 | 通用检索重排序,企业级应用 |
| bge-reranker-v2 | 智谱AI | 是 | BGE系列的升级版本,推理速度更快 | 高并发检索系统,实时重排序 |
| Cohere Rerank | Cohere | 否 | 商业化模型,API调用简单,效果稳定 | 企业级搜索,商业应用 |
| Cross-Encoder | Hugging Face | 是 | 经典的双塔架构,准确率高 | 学术研究,中小规模检索系统 |
| RankNet | Microsoft | 是 | 基于神经网络的排序模型,训练稳定 | 搜索引擎,推荐系统 |
| LambdaMART | Microsoft | 是 | 基于梯度提升树的排序算法,可解释性强 | 传统搜索系统,需要可解释性的场景 |
| ColBERT | 斯坦福大学 | 是 | 基于BERT的上下文感知排序,效果优秀 | 学术搜索,专业领域检索 |
| MonoT5 | 是 | 基于T5架构的单塔模型,支持长文本 | 长文档排序,复杂查询处理 | |
| DuoT5 | 是 | MonoT5的扩展版本,支持多轮交互 | 对话式搜索,多轮检索 | |
| jina-reranker | Jina AI | 是 | 轻量级设计,部署简单,性能均衡 | 边缘计算,资源受限环境 |
3、常用向量库
| 向量库名称 | 开发者/公司 | 开源状态 | 主要特点 | 适用场景 |
|---|---|---|---|---|
| FAISS | Meta (Facebook) | 开源 | 高性能相似性搜索,支持GPU加速 | 大规模向量搜索,推荐系统 |
| Pinecone | Pinecone | 商业闭源 | 托管服务,易于使用,自动扩展 | 企业级RAG应用,无需运维 |
| Milvus | Zilliz | 开源 | 分布式架构,支持多种索引类型 | 大规模生产环境,多模态数据 |
| ChromaDB | Chroma | 开源 | 轻量级,简单易用,支持内存存储 | 开发测试,中小型应用 |
| Weaviate | Weaviate | 开源 | GraphQL API,支持模块化扩展 | 知识图谱,语义搜索 |
| Qdrant | Qdrant | 开源 | Rust编写,高性能,支持过滤 | 高性能实时搜索,地理空间数据 |
| Redis | Redis | 开源 | 内存数据库,向量搜索插件 | 实时应用,缓存+向量搜索 |
| Elasticsearch | Elastic | 开源 | 全文搜索+向量搜索结合 | 混合搜索,已有ES生态 |
100

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



