微信扫码
添加专属顾问
我要投稿
深入探索检索增强生成技术,提高大型语言模型的准确性与可靠性。 核心内容: 1. RAG技术原理与系统组成 2. 索引阶段优化策略 3. 数据预处理与转换技巧
检索增强生成(Retrieval-Augmented Generation,简称 RAG)指在大型语言模型(LLM)的生成过程中,引入外部知识检索,以提高回答的准确性和可靠性。通过让LLM在生成回答时参考外部知识库的信息,RAG技术可以有效减少模型产生事实性错误(即所谓的“幻觉”)并提升答案的事实正确性。典型的RAG系统包含四个基本组件:嵌入模型、向量数据库、提示模板以及生成式LLM。在查询时,系统会先将用户查询通过嵌入模型编码成向量表示,然后在向量数据库中检索出与查询最相关的文档片段,将这些片段填充到预先设计的提示模板中,一并提供给LLM生成最终答案。这种**“检索-再生成”**的管线简单直观,但基础实现往往存在诸多局限,可能导致回答不准确或不完整。
为了提升RAG系统的回答质量,我们需要在上述流程的各个环节应用更高级的优化技术。例如,可以优化知识库的构建方式、改写用户的查询、改进检索算法,或者在检索后对结果进行后处理等。接下来,我们将分阶段介绍RAG的优化方法,包括索引阶段的优化、检索前优化、检索阶段优化和检索后优化,并通过实例讲解每种技术如何提高RAG的性能。
索引阶段的优化关注如何预处理和组织知识库数据,以提升后续检索的效率和准确性。通过对原始数据进行清洗、结构化和切分,可以使有用的信息更容易被检索到。索引优化包括数据预处理和文档切分两个主要方面。高质量的索引是RAG系统成功的基础,因为进入知识库的数据质量直接影响检索效果。
数据预处理是将各种原始数据转化为适合LLM利用的结构化格式的过程。这一过程通常从数据收集与整合开始,将不同来源、不同格式的文档汇总形成统一的“知识库”语料。随后,对原始数据进行提取和解析:例如,对于Markdown、Word或纯文本等文件,解析过程中要尽可能保留其结构并提取出有用的内容;对于扫描件或图片中的文本,需要借助光学字符识别(OCR)将其转为可处理的文本格式。然而,最新的多模态模型已经可以直接处理图像形式的文档嵌入,在一定程度上减少了对传统OCR的依赖。另外,对于HTML网页,需要解析DOM提取正文,对于电子表格则需特殊处理单元格关系;同时应提取文档的元数据(如作者、时间戳、标题等)作为后续检索的附加标签。
预处理的下一步是数据清洗与规范化。清洗旨在去除噪音和无关信息,例如删除页眉页脚、导航栏等模板化内容,修正格式不一致之处,填补缺失值等,同时保持文档内容的完整结构。然后将不同来源的内容转换为统一的标准结构或模式(schema),以便后续步骤可以用一致的方式处理所有数据 。在这个阶段通常还会进行文档分段(Document Partitioning),即根据文档的自然结构(章节、段落、表格等)将内容划分为逻辑单元。需要注意的是,文档分段不同于后面的“切分”操作:分段更侧重依据文档原有的结构划分内容,而切分是一种面向检索的进一步段落拆解技术。
完成预处理后,我们得到结构化且清洁的文档集合。然而,原始文档往往篇幅较长,直接使用全文进行向量检索既低效又可能引入过多不相关内容。文档切分(Chunking)技术通过将长文档划分为较小的语义段落或文本块,平衡了检索内容的上下文完整性和片段的粒度。合理的切分可以让向量搜索既有足够的上下文来判断相关性,又不会因为段落过长而影响匹配准确性。常见的文档切分策略包括:
固定大小切分:将文本每隔预定长度强行划分为块,不考虑内容边界。这种方法实现简单且速度快,但缺乏对内容的理解,可能打断上下文。在实践中可通过滑动重叠窗口方式改进,即相邻块共享一部分重叠内容,以缓解硬切分带来的上下文缺失问题。
递归切分:先按较大的单元(如段落)初步切分,如果得到的块仍过长,再在每个块内按较小单位(如句子)进一步切分。这种方法利用文档原有结构,自适应不同文档的层次,能够在保留章节逻辑的同时控制块大小。
语义切分:先将文本划分为若干语义单元(例如句子或小段落),对每个单元生成向量嵌入,然后根据嵌入向量之间的相似度(如余弦距离)将这些单元动态聚合成块 。当语义内容出现显著变化时就开始新的块,从而保证每个块内部语义连贯。这种方法使得切分更贴合内容意义,但计算开销相对增加。
基于LLM的切分:利用强大的语言模型来智能划分文本。LLM阅读整段文本后,生成适当划分边界,将内容拆成彼此独立且语义完整的句子或命题 。这种方法通常能得到高质量的语义块,但计算代价最高,需要消耗较多算力和时间。
基于文档结构的切分:按照文档中已有的结构(如标题、小节)来划分块。这种策略在像HTML、Markdown、代码文件等结构清晰的数据上非常有效——利用现有的段落、列表、函数等作为天然边界。但对于缺乏明确层次结构的纯文本,此法作用有限。
上述每种切分技术各有优劣,选择取决于具体的数据特点和应用需求。例如,固定切分简单但可能割裂语义,语义切分精准但较慢。实践中也可以组合多种方法,如先按文档结构粗切,再对过长部分应用语义切分。值得一提的是,一些新研究方向提出了**“延迟切分”**(Late Chunking)策略:即先利用支持超长上下文的模型对整篇文档建模(如生成整篇的嵌入向量),然后再进行切分,以最大程度保留全文的全局语境信息。这种思路有望在特定场景下进一步提高长文档的检索效果。
经过数据预处理和合理的切分后,我们就能构建出结构优化的向量索引,为后续的查询提供高召回率和高精度的知识库支持。
检索前优化侧重于在向量搜索之前,对用户的查询进行改写和增强,使其更利于检索得到相关结果。用户的原始提问可能过于简短、含糊或复杂,直接用其作为检索词往往效果不佳。通过在检索前对查询进行转换(transformation),可以提升检索召回的数量和质量。常见的检索前优化技术包括:查询改写、查询扩展、查询分解和查询路由等。下面分别介绍这些方法及其作用。
查询改写是指将用户的原始查询进行重新表述,使其更加适合向量检索或关键词检索的需要。当用户查询过于口语化、含糊不清或措辞不当时,改写可以澄清意图、补充必要细节并采用与知识库内容更匹配的表述 。一种常用做法是利用一个语言模型(可以是一个小型专用模型或直接调用LLM)将原查询换一种说法:保持原意不变但使用更正式、明确的措辞 。例如,将“帮我找一下去年夏天最火的电影”改写为“2024年夏季上映的票房最高的几部电影有哪些?”这样包含了更明确的时间范围和评价标准。改写后的查询更接近知识库中内容的表述,有助于检索到相关文档。实际上,通过先改写再检索再生成回答的流程,被称为重写-检索-生成(Rewrite-Retrieve-Read)管道,相对于直接“检索-生成”可以显著提高检索质量。
查询扩展关注拓宽查询的语义范围,以获取更多相关信息。具体来说,就是基于用户初始查询,生成若干语义上类似或相关的查询,一同用于检索。这些扩展查询可以由LLM根据原始问题的不同方面来自动生成。例如,对于查询“冥想有哪些好处?”,扩展出的查询可能包括:“冥想如何减轻压力和焦虑?”、“冥想是否能提高专注力?”、“长期冥想对心理健康的影响有哪些?”等。通过扩展,检索时将同时使用多个相关查询,从而增加召回的文档数量,也提高涵盖不同侧面信息的机会。需要注意,扩展会带来大量结果,因此常常需要加入后续的重排序步骤以从众多文档中挑选最相关的内容(详见后文“重新排序”部分)。
查询分解是针对复杂查询的一种处理技术,它将一个复合、多层次的问题拆解成数个更易回答的子问题。这种方法适用于用户的问题涉及多个方面或需要从不同信息源获取答案的情形。通过分解,每个子查询都更加聚焦单一子任务,便于检索到更精确的资料。查询分解通常包含两个阶段:首先利用LLM将原始复杂问题解析成若干子问题,然后分别对这些子问题进行检索,最后将所有子查询的结果汇总以构造针对原始问题的完整回答。例如,对于复杂询问“为什么我总是觉得很累,即使我饮食健康?我是不是该改变饮食习惯,或者尝试一些流行的饮食方法?”可以拆解为三问:“哪些常见饮食因素会导致疲劳?”、“当前有哪些流行的饮食法,它们对精力的影响如何?”以及“如何判断我的饮食是否均衡且支撑我的精力需求?”。针对每个子问检索相关文献,然后整合答案,就能比直接回答原复杂问题得到更全面准确的结果。
查询分解还能结合其它技巧使用。例如可以先对复杂查询提取出关键词或识别适用的元数据过滤条件,以帮助每个子查询更有效地搜索到目标信息 。另外,在实现上可以并行地处理各子查询以提升效率 。经过分解-检索-整合流程后,RAG系统能够针对复杂提问给出更有依据的综合性答案。
查询路由是一种动态决策机制,根据查询的内容和意图,将其分配到最合适的检索管线或数据库中处理 。现实中用户的提问千差万别,一个单一的检索方案往往无法在所有情况下都取得最佳效果。通过查询路由,RAG系统可以针对不同类型的问题采用不同的处理策略,从而更高效地返回正确答案。实现查询路由通常需要预先设计多索引或多模态的管线:例如,将结构化数据(如表格)存储在一个索引,不同语言的文档分别在不同索引,实时信息与长期知识分开存储等。然后系统根据查询判断其类别,将查询发往对应的索引或检索方式。
一种高级形式的查询路由是引入智能代理(Agent)的RAG架构。代理模型会先对用户查询进行分析,判断其所属领域、复杂程度以及需要的工具,然后选择相应的方案处理。例如,对于一个纯事实型的问题,代理可能将其路由到使用百科知识库的管线;而若问题需要计算或最新资讯,代理则调用计算器或网络搜索等工具。在这种代理架构下,RAG系统仿佛由多个专家代理组成的网络,每个代理专长不同:有的擅长数据库查询,有的擅长调用API,还有的专注文本总结 。代理通过推理和调度来决定采用关键词检索、语义检索还是混合检索,是否需要改写查询或使用特殊工具来得到答案。总之,查询路由使RAG系统具备了根据提问灵活调整检索策略的能力,在应对多样化查询时更加高效且准确。
检索阶段的优化直接面向向量数据库的检索过程,旨在改进检索结果的相关性和覆盖率。这些优化方法有的通过约束或调整检索范围,过滤掉潜在的不相关结果;有的通过改进相似度计算或模型本身,提高相关内容被检索出的概率。典型的检索阶段优化包括元数据过滤、排除离群结果、混合检索以及嵌入模型微调等。下面分别介绍这些策略:
元数据(Metadata)是指附加在文档或片段上的结构化信息,例如时间戳、作者、类别、数据来源、语言、文件类型等 。充分利用元数据可以帮助我们在检索时精确筛选结果,从而提升相关性 。当使用向量语义检索时,有时会出现语义上相似但在上下文上并不相关的结果,而引入元数据过滤可以将这些结果剔除 。例如,我们可以在查询时指定仅检索特定年份之后的文件,或者限定只从某个数据源获取答案,这样即使有一些文本在语义上匹配但因不符合时间或来源要求,也会被过滤掉。
元数据过滤的另一个重要用途是引入时间意识或其他上下文约束。通过在索引时为文档添加时间戳元数据,系统可以在检索时优先返回最新的信息,以确保答案的时效性。类似地,可以通过元数据确保只检索指定语言的资料、某个作者的文章等等。合理选择和设计元数据非常关键:既要有用的信息帮助筛选,又不能过多增加复杂性。总之,在RAG检索中结合元数据能够缩小搜索范围、提高检索精度,让返回的内容更加贴合用户需求。
在向量检索中,我们通常会指定返回前k个(top k)相似结果。然而仅依据固定的k值可能导致引入离群的无关结果。例如设置top_k=5
时,不管相关性高低都会取前5个向量,这其中可能有与查询关联很弱的“漏网之鱼”。为了更智能地排除这些离群结果,可以采用以下技巧:
通过以上手段,RAG系统可以在不牺牲召回率的前提下,提高检索结果的质量,避免将噪音向量送入后续生成过程。
混合检索(Hybrid Search)同时结合了向量语义检索和传统关键词检索的优势,目的是利用二者互补的特性来提升RAG系统检索结果的相关性和准确率 。在混合检索模式下,系统既考虑文本的语义相似度,又考虑精确的关键词匹配,从而兼顾上下文理解和关键字命中。
混合检索通常通过调整一个α参数来控制两种检索方式的权重比例。例如,设定α=1则表示纯粹依赖向量语义检索,α=0则表示只采用关键词检索,而0<α<1时则按照比例融合语义分数和关键词匹配分数。通过调节α,可以针对不同应用场景平衡语义相关性和精确匹配的重要性 。混合检索在以下场景中特别有用:一方面,需要语义检索来理解用户表达的上下文含义,另一方面,又需要关键词匹配确保某些关键术语一定出现在结果中。
举例来说,针对一个技术支持知识库,用户查询“Excel 更新后公式无法正确计算”时,语义检索能够理解这是关于“软件更新导致公式计算错误”的问题,找出可能相关的文章(如讨论公式错误原因或更新影响的帖子);而关键词检索则确保凡是包含“Excel”“公式”等字样的文档不会被漏掉。通过混合这两方面的结果,最终返回的信息既涵盖了语义相关的经验说明,也包含了与查询字面匹配的技术细节。实践中,需要结合验证不断微调α值以取得最佳效果,并根据检索任务调整混合策略,使其适应具体的需求场景。
向量检索的效果高度依赖于嵌入模型的质量。如果嵌入模型未能很好地表示文档和查询的语义关系,那么无论索引和检索算法多么先进,都可能无法召回真正相关的内容。通用的预训练嵌入模型往往在海量通用语料上训练,只关注通用语言模式,对于垂直领域的专有名词或细微语义区分可能捕捉不佳。因此,在有条件的情况下,对嵌入模型进行微调是提高检索性能的有效途径。
微调嵌入模型是指在一个特定领域或数据集上进一步训练预训练模型,使其更好地适应该领域语料的分布和语义特点。微调后的嵌入模型可以更准确地度量该领域中句子或文档之间的相似度,从而提高向量检索的精度。尤其当你的知识库内容具有明显的行业术语或专业用语时(例如医学论文、法律文件),微调嵌入模型的收益会非常大:它能够扩展模型对领域特有词汇和意义的掌握,让相似主题的文档在向量空间中更加聚集。
微调过程一般包括:选择一个合适的预训练嵌入模型作为基础,准备好领域数据用于训练,然后通过对比学习或其它嵌入训练方法,让模型学会将语义相关的项彼此靠近,不相关的拉远。训练完成后,通常会使用一套验证集(例如预先准备的查询-文档对)评估微调后模型的检索质量,以确保其确实在RAG任务上有所改进。经过微调的嵌入模型能为特定领域提供更具辨识力的向量表示,让RAG系统在该领域的知识检索上如虎添翼。
检索后优化指在得到初步检索结果后,对结果集合或生成过程进行进一步处理,以提升最终回答的质量 。这些技术在检索步骤完成后才开始发挥作用,包括对检索到的文档片段重新排序、增强或压缩提供给LLM的上下文信息,以及调整提示或微调生成模型本身等 。检索后优化旨在最大程度地利用检索到的内容来生成准确、有依据且连贯的答案。下面依次介绍主要的检索后优化方法:结果重新排序、上下文增强、上下文压缩、提示词工程和LLM微调。
当向量数据库返回了一批初步候选文档片段后,我们可以引入一个重排序模型对这些候选结果进行二次排序,以确保最相关、最有用的内容排在前列。重排序模型一般是一个可以同时考虑查询和文档内容的模型(例如基于BERT的交互式模型),它会在检索阶段之后,对每一对“查询-文档片段”计算一个相关性得分,然后根据得分对片段列表重新排列。由于重排序模型在计算时将查询与文档拼接输入模型,可以捕捉到更精细的匹配信息和上下文关联。相比之下,纯向量检索阶段查询和文档是分别编码的,难以捕获字词间的精确对应和含义差异。
典型的做法是构建一个**“先检索、再重排”的双阶段管线:第一阶段用高效的向量相似度检索快速筛选出若干候选(例如top 50);第二阶段用较精准但较慢的重排序模型对这50个候选逐一打分,选出最相关的前几篇作为最后提供给LLM的上下文。这样结合了向量检索的速度和重排序模型的精度。需要注意,为了让重排序发挥作用,在第一阶段往往有意过度检索**,即取一个相对较大的top k(比如top 50-100),然后让重排序模型来过滤掉其中不相关的内容。通过引入重排序,RAG系统可以显著提高提供给LLM的上下文质量,减少无关或次要信息对生成答案的干扰。
在某些场景下,为了提高检索召回率,我们可能将文档切分得非常细小(例如按句切分)。这样虽然检索能精确匹配到相关句子,但单个片段所包含的上下文有限,LLM在生成答案时可能缺少背景信息。上下文增强技术就是为了解决这一问题:在检索后扩充那些被选中的片段的上下文,以提供给LLM更完整的信息。一个代表性的做法是**“句子窗口检索”** :
通过上述过程,我们同时兼顾了检索精度和生成阶段的上下文完整性:检索时利用细粒度切分提升准确率,生成时又还原出较大语境供模型参考 。上下文增强特别适用于那些必须切成小片段才能检索到相关内容,但又需要较大段落才能回答复杂问题的场景。
有时候初步检索到的内容很多,总字数可能远超LLM的输入长度限制,或者包含一些与问题无关的冗余信息。这不仅增加了调用LLM的开销(更多的token意味着更高的计算成本),还可能干扰模型的注意力。上下文压缩技术旨在从检索结果中提炼出最关键信息,在保持答案所需内容的同时压缩文本长度 。
上下文压缩通常以一个压缩器模型(Compressor)的形式出现。基本流程是:先用基础检索器得到一批相关文档或片段,然后将这些文本送入压缩模型,生成一个精简版本。压缩模型会剔除与查询无关的段落、句子,或者对冗长部分进行摘要,但确保与问题相关的要点被保留下来 。最终,我们将压缩后的精华内容提供给LLM用于生成答案。由于无关内容被滤除,LLM能够将更多注意力放在关键信息上,回答也往往更精准。同时,总文本量减少也降低了调用LLM的费用和延迟。
当前的研究中,主要有两类压缩方法:基于向量的压缩和基于词汇的压缩。基于向量的压缩一般利用嵌入模型来度量每个句子/段落与查询的相关度,选择阈值上最相关的部分保留;而基于词汇的压缩则更多采用信息检索中的技术,如根据关键词出现频率或预定义的重要词,将含有这些词的句子提取出来,或者干脆让一个小型语言模型生成一个总结。无论哪种方法,其目标都是筛掉冗余,保留精华,让后续LLM以较小的上下文代价获取所需的信息。
需要注意上下文压缩与前述上下文增强并不矛盾,它们解决的是不同的问题:前者是在信息过载时进行信息滤减,后者是在信息不足时进行信息补全。实际应用中可以视情况单独或组合使用这两种技术,以既保证LLM有足够信息作答,又不至于提供太多无关内容。
LLM生成答案的质量在很大程度上取决于我们提供给它的提示(prompt)的设计。提示词工程指的是通过优化和设计输入给LLM的提示内容,来引导模型产生更准确、有用的结果。对于RAG系统而言,提示词工程往往是见效最快且成本最低的改进手段之一,因为它不需要更改底层模型或数据,只需调整与模型交互的方式。
高质量的提示设计涉及确定何种语气、格式和信息顺序最适合让模型理解问题并利用检索上下文。例如,在提示中明确要求模型“依据以上文档回答以下问题:…,请给出逐步推理过程和最终答案”,往往会比直接问“…?”得到更可靠的回答。又或者,通过加入示例格式(Few-shot示例)来暗示模型回答时的风格和详略程度。这些都是提示工程的范畴。
在RAG中,有几种特别有用的提示技巧:
通过上述各种提示工程技巧,我们可以在不更改模型参数的情况下,显著改善LLM的响应表现。应根据任务需求尝试不同的提示方法,并观察哪个对提升回答准确度最有效。
除了优化提示,我们还可以从根本上提升生成模型本身在特定任务或领域的能力,即对LLM进行微调(Fine-tuning) 。预训练的大型语言模型掌握了广泛的一般知识和语言模式,但在RAG中直接使用预训练模型,有时会出现回答泛泛、不够精准,或者无法有效利用检索内容的情况。通过在领域数据或特定任务数据上微调LLM,可以使其更好地适应该领域的知识分布和表达要求,从而在生成时更加贴合检索到的内容 。
微调LLM本质上是让模型的参数根据新数据进行再训练。例如,如果我们的应用是医学问答,我们可以收集大量医学文献摘要、医学QA对、甚至临床报告来微调模型。经过微调的LLM会更加熟悉医学领域的专业术语和事实,在RAG管线中也就更能充分利用检索到的医学文献来回答问题 。研究表明,当话题或用语非常专业时,微调后的模型生成答案的专业性和准确性均明显优于未微调模型。
需要微调的内容可以是监督任务(有标准答案的问答对,方便模型学习如何根据检索内容回答)或纯无监督语料(让模型继续在领域语料上做语言模型训练,增强其领域知识)。微调过程通常也要注意避免灾难性遗忘(即新知识覆盖了模型原有的一般能力),为此可以在训练中混入一部分通用数据或者使用较小的学习率等技巧。最后,和嵌入模型微调一样,我们需要用验证集评估微调后LLM在目标任务上的效果,确保它既保持语言流畅又更准确地利用了外部知识来回答问题。
通过LLM微调,RAG系统能够将“外部检索+内部生成”这两部分更加紧密地结合起来:检索提供的新知识能够被模型更充分地吸收利用,最终产出让用户满意的高质量回答。
检索增强生成(RAG)通过让大型语言模型结合外部知识库作答,大幅提高了生成答案的准确性和相关性,减少了内容臆造。本文系统介绍了RAG管线各阶段的一系列高级优化技术,从索引构建、查询处理,到检索算法和生成后处理,每一步都提供了实践指南和改进思路。应用这些技术,可以在很大程度上提升RAG系统对检索信息的利用效率,使生成结果更加切题、可靠。
需要强调的是,优化需服务于实际效果。不同应用场景中,RAG管线的瓶颈可能各不相同,有时是检索召回不足,有时是生成内容不精确。因此在实践中应构建评估验证流程,对RAG系统进行持续的性能监控 。我们建议对管道的各个模块进行模块化评估:例如评估索引阶段的覆盖率、检索阶段的准确率召回率、生成阶段的回答正确率等,找出最影响系统性能的环节。然后有针对性地应用本文介绍的优化技术,并通过A/B测试或指标对比验证其效果。同时,可以不断调整超参数(如chunk大小、top_k值、混合检索的α权重、提示设计等),结合业务需求进行细致调优。
RAG系统的开发是一个迭代优化的过程:引入新技术 -> 评估效果 -> 调整改进,再评估。通过这样的循环,我们才能确保每一项优化确实带来了更好的结果,而不是徒增复杂度。总的来说,只要合理地设计和调优各个模块,RAG将成为解决知识密集型任务的有力工具,在保证答案准确性的前提下充分发挥大型模型的语言生成能力,为用户提供可信赖的智能问答服务。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-21
改进RAG:利用混合搜索与重排序优化检索效果(含代码示例)
2025-04-21
MCP 实践:基于 MCP 架构实现知识库答疑系统
2025-04-20
谈谈RAG 的四个级别
2025-04-20
大模型能像专业分析师一样提取用户需求吗?
2025-04-19
基于Embedding分块 - 文本分块(Text Splitting),RAG不可缺失的重要环节
2025-04-19
RAG升级-基于知识图谱+deepseek打造强大的个人知识库问答机器人
2025-04-19
RAG vs. CAG vs. Fine-Tuning:如何为你的大语言模型选择最合适的“脑力升级”?
2025-04-19
低代码 RAG 只是信息搬运工,Graph RAG 让 AI 具备垂直深度推理能力!
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-04-20
2025-04-19
2025-04-18
2025-04-16
2025-04-14
2025-04-13
2025-04-11
2025-04-09