解锁17种RAG秘籍,大模型生成质量狂飙之路
更多大模型知识,搜索【码上有模力】,解锁RAG全流程知识
什么是 RAG
在大模型的发展进程中,RAG(检索增强生成,Retrieval-Augmented Generation)成为了一个备受瞩目的关键技术。简单来说,RAG 是一种将信息检索技术与生成模型相结合的 AI 框架。传统的大语言模型(LLM)在处理问题时,像是在闭卷考试,只能依靠自身训练数据中学习到的知识来生成回答。这就导致其存在一些局限性,比如知识存在一定的滞后性,数据截止于训练的时间点,无法获取实时或最新的信息;还容易产生幻觉,基于概率生成看似合理却可能错误的文本 。
而 RAG 的出现,就像是给大模型开了 "外挂",让它实现了开卷考试。当用户提出问题时,RAG 系统首先会从外部的知识库中检索相关信息,这个知识库可以包含公司内部文档、产品手册、最新的新闻资讯、数据库记录等各类数据。检索到相关信息后,这些信息会和用户的原始问题一起,作为增强或补充的上下文信息输入给大语言模型。大语言模型基于这些增强后的上下文信息,生成更加准确、相关且基于事实的答案 。
举个例子,当我们询问一款新产品的详细特性和使用方法时,如果单纯依靠大语言模型,它可能由于训练数据中没有包含这款新产品的信息,而无法给出准确回答。但借助 RAG 技术,系统可以从产品的官方文档、技术手册等知识库中检索相关内容,然后辅助大语言模型生成全面且准确的解答。
RAG 的核心流程主要包括离线数据准备和在线应用两个阶段。在离线数据准备阶段,需要进行数据加载,整合多源数据;接着进行文本分割,将长文本按句或语义块切割,以适配嵌入模型的 Token 限制;再使用嵌入模型将文本转换为高维向量,即向量化;最后将向量存入向量数据库,构建索引,以便支持高效的相似性检索。在线应用阶段,用户输入问题后,问题会被向量化,然后检索模块根据向量从向量数据库中检索出 Top-K 相关文档块,这些文档块与原始问题组合成增强后的 Prompt 输入给大语言模型,大语言模型基于此生成最终回答 。
在如今大模型的实际应用场景中,RAG 发挥着不可或缺的作用,极大地提升了大模型生成内容的质量和可靠性,是推动大模型从实验室走向实际应用的重要技术支撑 。
17 种 RAG 实现方法大公开
RAG 技术体系丰富多样,在实际应用中,从文档分块、检索排序到反馈与自适应,每个环节都有多种策略可供选择,这些策略相互配合,共同提升 RAG 系统的性能和效果 。接下来就为大家详细介绍 17 种 RAG 实现方法。
文档分块策略
文档分块是 RAG 系统中的基础且关键的环节,其质量直接影响着后续检索的效率和生成内容的准确性 。不同的分块策略适用于不同的场景,旨在解决在分块过程中可能出现的语义割裂、信息冗余等问题。
基础分块(Simple RAG)
基础分块是 RAG 中最为基础的一种文档分块方式。其原理是将文本进行向量化处理,把文本转化为计算机能够理解和处理的向量形式。然后,基于这些向量在向量库中进行 TopK 检索,从大量的文本向量中筛选出与当前问题最为相似的前 K 个文档片段。最后,将这些检索到的文档片段进行拼接,把多个片段组合成一个连续的文本内容,并将其交给大语言模型(LLM)进行生成。例如,在处理一篇新闻文档集合时,当用户询问某一事件相关内容,基础分块会简单地按固定长度(如每 500 字一块)将新闻文档分割成块并向量化,检索出最相似的几块后拼接交给 LLM 。
然而,这种方法存在明显的痛点。由于它往往是按照固定的长度或规则进行分块,很容易割裂语义的连续性。比如在分割一篇科技论文时,可能会将一个完整的论点或实验描述分割在不同的块中,导致检索和生成时丢失关键信息,使得生成的回答缺乏连贯性和逻辑性 。
语义分块(Semantic Chunking)
语义分块是一种更为智能的分块策略。它利用句法树或 NLP 模型来对文档进行动态切割,与基础分块不同,它并非基于固定长度或简单规则,而是深入理解文本的语义结构 。通过分析句子之间的语法关系、词汇的语义关联等,将具有紧密语义联系的文本划分为一个块,从而保留完整的语义单元。其关键技术在于 Transformer Embedding 和动态窗口的应用。Transformer Embedding 能够有效地捕捉文本的语义特征,将文本转化为富含语义信息的向量表示;动态窗口则根据语义的连贯性来灵活调整分块的边界,而不是固定的大小 。
在处理一篇长篇的学术论文时,语义分块可以准确地将论文中的各个章节、段落按照其内在的语义逻辑进行划分,比如将介绍实验方法的部分完整地划分为一个块,将讨论实验结果的部分划分为另一个块。这样在检索和生成过程中,大语言模型能够基于完整的语义单元进行处理,大大提升了长文档推理的连贯性和准确性,使得生成的回答更符合逻辑和语义要求 。
上下文增强(Context Enriched)
上下文增强策略聚焦于为每个文本块补充丰富的上下文信息。其原理是为每个块添加前后邻居段落,从而组成 "上下文块" 。在处理一篇小说时,当对其中某一段落进行分块时,不仅将该段落本身作为一个块,还将其前一段落和后一段落纳入,形成一个包含更广泛上下文的块 。
这种方式具有显著的优势,它极大地提升了长文档推理的连贯性。因为在实际应用中,很多问题的答案并非仅依赖于单一的文本块,而是需要结合其前后的上下文信息才能准确理解和回答。通过构建上下文块,大语言模型在生成回答时能够获取更全面的信息,从而生成更准确、更连贯的回答。此外,上下文增强策略还支持滑动窗口式切块,即窗口在文本上逐步滑动,每次滑动都生成一个包含不同上下文的块,进一步丰富了上下文信息的多样性 。
块头标签(Contextual Headers)
块头标签策略主要应用于具有明确结构的文档,如技术手册、法律文书等。其原理是提取文档中的标题、章节名等作为元数据,并将这些元数据与正文内容一起进行嵌入向量处理 。在处理一份技术手册时,将手册中的各级标题,如 "第一章:产品概述""1.1 产品功能介绍" 等提取出来,与对应的正文内容组合后向量化 。
这样做能够增强文档的分类与上下文提示能力。当用户提出问题时,这些包含元数据的向量能够更准确地匹配到相关的文档内容,因为标题和章节名往往概括了该部分内容的主题,为检索提供了更明确的线索。同时,在大语言模型生成回答时,这些元数据也能作为上下文提示,帮助模型更好地理解问题的背景和意图,从而生成更贴切的回答 。
文档增强(Augmentation)
文档增强策略通过构建多视图数据来提升检索的命中率。其原理是为每个文档创建多个不同的 "视图",包括摘要、正文、元数据等,然后将这些不同视图的数据统一存入向量数据库 。可以使用 ChunkRAG 的多向量索引工具来实现这一过程。通过以下伪代码示例,可以更清晰地看到多视图向量化的过程:
ini
# 伪代码示例:多视图向量化
doc_views = [extract_summary(doc), doc.body, doc.metadata]
embeddings = [embed(view) for view in doc_views]
在这个示例中,首先从文档中提取摘要、正文和元数据,形成不同的视图。然后,对每个视图分别进行向量化处理,得到对应的嵌入向量。这样,在检索时,系统可以从多个角度对问题进行匹配,大大提高了检索的准确性和全面性 。例如,当用户查询关于某一产品的信息时,系统不仅可以通过正文内容进行匹配,还可以利用摘要的关键信息和元数据中的产品属性等进行检索,从而更精准地找到相关文档块 。
检索排序策略
检索排序在 RAG 系统中起着至关重要的作用,其目的是从海量的文档数据中精准地命中与用户问题相关的关键知识 。这一过程需要在保证召回率(尽可能多地找到相关文档)的同时,提高精准度(确保找到的文档确实与问题高度相关)。接下来介绍几种进阶的检索排序方案,它们从不同角度对检索过程进行优化,以提升检索结果的质量。
查询改写(Query Transformation)
查询改写的原理是借助大语言模型(LLM)的强大语言理解和生成能力,将用户输入的原始问题生成多个语义等价的问法 。在用户输入 "如何提高跑步速度" 这个问题时,LLM 可能会生成 "怎样有效提升跑步的速度""提升跑步速度的方法有哪些" 等多个同义问题 。
通过这样的方式,可以扩大检索的覆盖面。因为不同的表达方式可能会匹配到不同的文档内容,单一的问题表述可能会遗漏一些相关文档 。这种方法可以有效地提高低质量输入的召回能力,即使用户的提问表述不够准确或全面,也能通过生成的多个问法增加找到相关信息的机会 。在 LangChain 中,可以通过 MultiQueryRetriever 来实现这一功能,它能够方便地利用 LLM 进行查询改写,并执行相应的检索操作 。
重排序(Reranker)
重排序是在初步检索得到 TopK 结果后,对这些候选文档进行二次筛选和排序的过程 。其原理是使用 Cross-Encoder 或 BERT 等模型对初步召回的 TopK 候选文档重新打分 。这些模型能够更深入地理解问题与文档之间的语义相关性,通过对问题和文档进行联合编码和分析,给出更准确的相关性得分 。
以 Cohere Reranker 为例,它在实际应用中能够使检索结果的精度提升 30% 。在处理大量文档的检索时,初始检索可能会返回一些看似相关但实际上并非最匹配的文档,Cohere Reranker 通过对这些文档进行细致的语义分析和打分,能够将真正与问题高度相关的文档排在前面,从而显著提高检索结果的质量和相关性 。
相关片段提取(RSE)
相关片段提取旨在长段落中精准定位与问题最相关的 "片段 / 句子",而不是返回整个段落 。其技术方案通常是结合 BERT 等预训练语言模型和 Pointer Network 。BERT 模型用于对长段落和问题进行语义理解和特征提取,Pointer Network 则根据 BERT 提取的特征,通过学习问题与段落中各个位置的关联,预测出与问题最相关的片段位置 。
以下是 RSE 核心逻辑的代码示例:
ini
# RSE核心逻辑
relevant_span = pointer_net(question, retrieved_chunk)
在这个示例中,pointer_net 函数接收问题和检索到的文本块作为输入,通过内部的计算和预测,输出与问题最相关的片段 。通过这种方式,能够实现精准回答,提高对回答内容的可控性,避免返回过多无关信息,使大语言模型基于更精准的信息生成回答 。
上下文压缩(Contextual Compression)
上下文压缩主要是对检索结果进行 "信息压缩",其目的是剔除其中无关的文本内容,仅保留关键的句子或段落 。这一策略能够降低 Token 消耗,因为在将检索结果输入给大语言模型时,减少无关内容可以减少所需的 Token 数量,从而降低成本 。同时,也提高了输入效率,使大语言模型能够更快地处理输入信息,生成回答 。
在 LangChain 中,可以使用 ContextCompressor 组件来实现这一功能 。该组件通过对检索结果进行分析和筛选,识别出关键信息,去除冗余和无关部分,从而优化输入给大语言模型的上下文信息 。在处理一篇包含大量背景信息和细节描述的文档检索结果时,ContextCompressor 组件能够自动提取出与问题直接相关的核心内容,如关键论点、重要数据等,将这些关键信息传递给大语言模型,提高回答的效率和质量 。
反馈与自适应策略
反馈与自适应策略是 RAG 系统的重要组成部分,它使得系统能够根据用户的交互和问题的特点进行动态优化和调整,从而不断提升性能和用户体验 。这部分策略涵盖了多个方面,从用户行为反馈的利用到根据问题类型智能选择检索策略,再到让模型自主判断是否需要外部检索等,下面将详细介绍这些策略。
反馈闭环(Feedback Loop)
反馈闭环的原理是将用户的点击行为、满意度评价等数据收集起来,用于训练排序模型 。在智能客服对话日志场景中,当用户提出问题后,系统返回一系列的回答选项,如果用户点击了某一个回答,这一点击行为就被记录下来;或者用户对回答进行了满意度打分,这些数据都成为了反馈信息 。
通过分析这些反馈数据,系统可以了解用户对不同回答的偏好和认可程度,进而优化排序模型 。如果发现用户经常点击排在后面的回答,而很少点击排在前面的回答,说明当前的排序可能存在问题,模型可以根据这些反馈调整排序算法,使更符合用户需求的回答排在更靠前的位置,从而不断提升系统的性能和用户满意度 。
自适应路由(Adaptive RAG)
自适应路由策略能够根据问题的类型动态地选择最合适的检索策略 。其实现方案通常借助 LangChain Router 等工具,首先使用一个小模型或一些规则来识别问题的类型 。将问题分为事实性问题、观点性问题、比较性问题等不同类别 。
对于事实性问题,可能选择直接从结构化的知识库中进行检索,以获取准确的事实信息;对于观点性问题,可能会选择从包含专家观点或用户讨论的文档中进行检索,并结合语义分块和重排序等策略,以获取更全面和有价值的观点 。通过这种动态选择检索策略的方式,系统能够更好地适应不同类型的问题,提高回答的准确性和针对性,增强对多业务场景的适配能力 。
自我决策(Self RAG)
自我决策策略赋予了大语言模型自主判断是否需要外部检索的能力 。其实现方式主要通过精心设计的 Prompt 来引导模型进行判断 。以下是一个 Prompt 设计示例:"[系统] 请评估:能否直接回答该问题?若不能,请说明所需信息 。"
当用户提出问题时,大语言模型首先根据这个 Prompt 对问题进行评估 。如果模型判断自身已经具备足够的知识来回答问题,例如对于一些常见的常识性问题,模型可以直接生成回答,跳过检索流程,从而提升效率,节省资源 。而如果模型判断无法直接回答,会根据问题的内容说明需要哪些外部信息,然后触发检索流程获取相关信息,再进行回答 。
知识图谱融合(Knowledge Graph)
知识图谱融合策略是将文档数据转化为结构化的三元组图谱形式 。其原理是将文档中的实体、关系和属性等信息提取出来,构建成知识图谱 。将 "苹果公司发布了新款手机" 这句话转化为(苹果公司,发布,新款手机)这样的三元组 。
在进行检索和推理时,利用知识图谱的结构和语义关系进行图谱检索或路径推理 。当用户询问关于苹果公司产品相关问题时,系统可以通过知识图谱快速找到与苹果公司相关的产品信息,以及这些产品之间的关联关系 。这种方式支持语义联想和实体关系解释,能够提供更丰富和深入的回答 。常用的工具链包括 Neo4j 这样的图数据库和 TransE 等图谱嵌入模型,Neo4j 用于存储和管理知识图谱,TransE 则用于将知识图谱中的实体和关系转化为向量表示,以便于进行计算和推理 。
多级索引(Hierarchical Indices)
多级索引策略通过构建文档的树形索引结构,实现分层检索 。其原理类似于 "分区检索",将文档按照一定的层次结构进行划分,比如先按照文档的主题进行一级分类,再在每个主题下按照章节或时间等进行二级分类,以此类推 。在处理大量的学术论文时,可以先按照学科领域进行一级索引划分,然后在每个学科领域内按照论文发表时间进行二级索引划分 。
在检索时,首先在高层索引中进行快速筛选,缩小检索范围,然后逐步深入到下层索引进行更精确的检索 。这样可以节省大量的计算开销,提高检索效率 。可以通过 FAISS 的 Nested Indexing 技术来对多级索引进行优化,FAISS 能够有效地组织和管理这些索引结构,加速检索过程,使系统能够快速准确地找到与问题相关的文档 。
假设文档嵌入(HyDE)
假设文档嵌入策略主要用于解决文档碎片化严重或长问句的问题 。其原理是让模型先尝试生成一个 "理想答案",这个答案是模型基于自身的语言理解和生成能力,对问题进行初步分析后生成的一个可能的回答 。然后,基于这个生成的理想答案进行反向检索,即寻找可能支持这个答案的材料 。
当用户提出一个复杂的长问句时,模型先根据问题生成一个大致的回答框架,然后根据这个框架中的关键信息,在文档库中检索相关的支持材料 。通过这种方式,可以将碎片化的文档信息与问题更好地关联起来,提高回答的准确性和完整性 。其实现过程主要依赖于大语言模型生成理想答案,以及向量化再检索的技术,通过将生成的答案向量化,在向量数据库中进行检索,找到与之匹配的文档片段 。
如何选择合适的 RAG 方案
在实际应用中,选择合适的 RAG 方案至关重要,它直接影响到系统的性能、成本以及用户体验 。不同的业务场景和需求对 RAG 方案的侧重点各不相同,以下是一些根据常见目标需求的推荐方案组合 :
-
快速上线:如果项目时间紧迫,追求快速搭建并部署 RAG 系统,可以选择基础分块(Simple RAG)结合语义分块(Semantic Chunking)的方式 。基础分块实现简单,能够快速完成文本的初步处理和检索;语义分块则在一定程度上提升了语义的连贯性,确保生成内容具有一定的逻辑性和准确性 。这种组合能够在较短的时间内搭建起可用的 RAG 系统,满足基本的业务需求 。
-
高精度场景:对于对回答准确性要求极高的场景,如医疗、金融领域的专业咨询等,重排序(Reranker)和相关片段提取(RSE)是关键 。重排序通过对初步检索结果进行二次筛选和排序,显著提高了检索结果的相关性和准确性;相关片段提取能够在长段落中精准定位关键信息,避免无关信息的干扰,使大语言模型基于更精准的信息生成回答,从而满足高精度场景的严格要求 。
-
低成本运行:在成本受限的情况下,自我决策(Self RAG)和上下文压缩(Contextual Compression)策略能够有效降低成本 。自我决策策略让大语言模型自主判断是否需要外部检索,避免不必要的检索操作,节省计算资源;上下文压缩则对检索结果进行信息压缩,减少输入给大语言模型的 Token 数量,降低成本 。这两种策略结合,在保证一定性能的前提下,有效降低了系统的运行成本 。
-
复杂知识推理:当面临复杂的知识推理任务时,知识图谱融合(Knowledge Graph)和多级索引(Hierarchical Indices)是较为合适的选择 。知识图谱融合将文档数据转化为结构化的图谱形式,支持语义联想和实体关系解释,为复杂推理提供了丰富的知识基础;多级索引通过构建树形索引结构,实现分层检索,提高了检索效率,能够快速定位到相关信息,助力复杂知识推理任务的完成 。
实际应用中,还需要综合考虑数据规模、响应延迟、预算等因素 。数据规模较大时,需要选择能够高效处理大规模数据的方案,如支持分布式存储和检索的向量数据库及相应的索引策略;对响应延迟要求较高的场景,要优化检索和生成流程,减少不必要的计算和等待时间;预算有限时,则要在保证性能的前提下,选择成本较低的模型和技术方案 。通过综合评估这些因素,才能设计出最适合业务需求的 RAG 方案 。
总结
RAG 系统的核心竞争力在于其强大的模块化组合能力 。在这个技术体系中,文档分块策略是知识表示的基础,其质量直接决定了知识在系统中的表示形式和后续处理的效率;检索排序策略如同精准的导航仪,在海量的信息中快速且准确地命中关键知识,为生成高质量回答提供有力支撑;而反馈与自适应策略则是系统持续进化的动力源泉,通过不断收集用户反馈和对问题的分析,驱动系统进行动态优化和调整 。