简介
本文详细介绍了RAG系统的高级优化技术,涵盖索引优化(数据预处理和分块策略)、预检索优化(查询转换)、检索优化(元数据过滤、混合搜索等)和后检索优化(重新排序、上下文处理、提示工程等)四大阶段。通过实施这些技术,可显著提高RAG系统的检索准确性和生成响应质量,减少大模型幻觉,为程序员提供构建高性能RAG应用的全面指导。
RAG 为 LLM 提供来自外部知识源的信息,以帮助减少幻觉并提高生成响应的事实准确性。
一个简单的 RAG 流水线由四个组件组成:嵌入模型、向量数据库、提示模板和 LLM。在推理时,它会嵌入用户查询以从向量数据库中检索相关文档信息块,并将其填充到 LLM 的提示中以生成答案。
虽然这种简单的方法很简单,但它有很多局限性,而且往往会导致低质量的响应。
本文讨论了我们可以应用的各种高级技术来提高 RAG 系统的性能。这些技术可以应用于 RAG 流水线的各个阶段,如下所示:
索引优化
索引优化技术通过以更有条理、更易于搜索的方式构建外部数据来提高检索准确性。这些技术可以应用于 RAG 流水线中的数据预处理和分块阶段,确保有效检索相关信息。
数据预处理(Data Pre-Processing)
数据预处理是任何 RAG 系统成功的基础,因为处理后数据的质量直接影响整体性能。通过精心将原始数据转换为适合 LLM 的结构化格式,我们可以在考虑更复杂的优化之前显著提高系统的效率。
虽然有几种常见的预处理技术可用,但最佳方法和顺序应根据我们的特定用例和要求进行量身定制。
该过程通常从数据采集和集成开始,也就是从多个来源收集各种文档类型并将其整合到“知识库”中。
数据提取和解析(Data Extraction & Parsing)
在原始数据上进行数据提取和解析,以便为下游任务准确处理数据。对于 Markdown、Word 文档和纯文本等基于文本的格式,提取技术侧重于在捕获相关内容的同时保留结构。
包含基于图像的文本/表格的扫描文档、图像和 PDF 需要 OCR(Optical Character Recognition,光学字符识别)技术才能转换为 LLM 可用的格式。然而,多模态检索模型(如 ColPali 和 ColQwen)的最新进展彻底改变了这一过程。这些模型可以直接嵌入文档图像,可能会使传统的 OCR 过时。
Web 内容通常涉及 HTML 解析,利用 DOM 遍历来提取结构化数据,而电子表格则需要专门的解析来处理单元格关系。元数据提取在文件类型中也至关重要,它会提取作者、时间戳和其他文档属性等关键详细信息(后面的元数据过滤部分会详细说一下)。
数据清洗和降噪(Data Cleaning & Noise Reduction)
数据清洗和降噪包括删除不相关的信息(例如页眉、页脚或样板文本)、纠正不一致之处以及处理缺失值,同时保持提取数据的结构完整性。
数据转换(Data Transformation)
无论原始文件类型如何,这一步将所有提取和处理的内容转换为标准化架构。正是在此阶段发生文档分区(不要与分块混淆),将文档内容分成逻辑单元或元素(例如段落、部分、表格)。
分块技巧(Chunking Strategies)
分块将大型文档划分为较小的、语义上有意义的片段。此过程通过平衡上下文保留和可管理的块大小来优化检索。RAG 中存在各种有效分块的常用技术,下面将讨论其中一些技术:
固定大小分块(Fixed-size chunking)是一种简单的技术,无论内容结构如何,它都会将文本拆分成预定大小的块。虽然这种方法成本低廉,但缺乏上下文感知能力。可以使用重叠块来改进这一点,让相邻的块共享一些内容。
递归分块(Recursive chunking)提供了更大的灵活性,它首先使用主分隔符(如段落)拆分文本,然后如果分块仍然太大,则应用次要分隔符(如句子)。此技术尊重文档的结构,并能很好地适应各种用例。
基于文档(Document-based chunking)的分块根据文档中的自然划分(例如标题或章节)创建分块。它对于 HTML、Markdown 或代码文件等结构化数据特别有效,但当数据缺乏明确的结构元素时用处不大。
语义分块(Semantic chunking)将文本划分为有意义的单元,然后将其矢量化。然后根据嵌入之间的余弦距离将这些单元组合成块,每当检测到显著的上下文变化时,就会形成一个新的块。这种方法平衡了语义连贯性和块大小。
基于 LLM 的分块(LLM-based chunking)是一种先进的技术,它使用 LLM 通过处理文本并创建语义上独立的句子或命题来生成块。虽然它非常准确,但它也是计算要求最高的一种方法。
上述每种技术都有其优势,具体选择取决于 RAG 系统的具体要求和所处理文档的性质。新方法不断涌现,例如后期分块(late chunking),它先通过长上下文嵌入模型处理文本,然后再将其拆分为块,以更好地保留文档范围内的上下文。
一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
预检索优化
索引优化技术通过以更有条理、更易于搜索的方式构建外部数据来提高检索准确性。这些技术可应用于 RAG 流水线中的数据预处理和分块阶段,确保有效检索相关信息。
查询转换(Query Transformation)
直接使用用户查询作为搜索查询进行检索会导致搜索结果不佳。这就是为什么将原始用户查询转换为优化的搜索查询至关重要。查询转换可以细化和扩展不清楚、复杂或模棱两可的用户查询,以提高搜索结果的质量。
查询重写(Query Rewriting)涉及重新制定原始用户查询,使其更适合检索。这在用户查询措辞不当或表达方式不同的情况下特别有用。这可以通过使用 LLM 重新措辞原始用户查询或采用专门为此任务训练的专门的小型语言模型来实现。
这种方法称为“重写-检索-阅读”(Rewrite-Retrieve-Read),而不是传统的“检索后阅读”(Retrieve-then-Read)范式。
查询扩展(Query Expansion)侧重于扩大原始查询的范围以捕获更多相关信息。这涉及使用 LLM 根据用户的初始输入生成多个类似查询。然后,这些扩展的查询将用于检索过程,从而增加检索到的文档的数量和相关性。
注意:由于检索到的文档数量增加,通常需要执行重新排序步骤以优先考虑最相关的结果(会在后面的重新排序部分介绍)。
查询分解(Query Decomposition)
查询分解是一种将复杂查询分解为更简单的子查询的技术。这对于回答需要多种信息源的多方面问题非常有用,从而获得更精确、更相关的搜索结果。
该过程通常涉及两个主要阶段:使用 LLM 将原始查询分解为更小、更集中的子查询,然后处理这些子查询以检索相关信息。
例如,复杂查询“为什么我吃得健康,但总是这么累?我应该改变饮食习惯还是尝试一些饮食趋势?”可以分解为以下三个更简单的子查询:
- 哪些常见的饮食因素会导致疲劳?
- 哪些流行的饮食趋势及其对能量水平的影响?
- 如何确定我的饮食是否均衡并支持我的能量需求?
每个子查询都针对特定方面,使检索器能够找到相关文档或块。子查询也可以并行处理以提高效率。关键词提取和元数据过滤器提取等附加技术可以帮助识别关键搜索词和结构化过滤条件,从而实现更精确的搜索。检索后,系统会汇总和综合所有子查询的结果,以生成对原始复杂查询的全面答案。
查询路由(Query Routing)
查询路由是一种根据查询的内容和意图将查询定向到特定流水线的技术,使 RAG 系统能够有效地处理各种场景。它通过分析每个查询并选择最佳检索方法或处理流水线来提供准确的响应。这通常需要实施多索引策略,将不同类型的信息组织成单独的、经过优化的专门索引。
该过程可以包括 Agentic 元素,其中 AI Agent 决定如何处理每个查询。这些 Agent 评估查询复杂性和领域等因素以确定最佳方法。例如,基于事实的问题可能会被路由到一个流水线,而需要总结或解释的问题则会被发送到另一个流水线。
Agentic RAG 的功能类似于一个专门 Agent 网络,每个 Agent 都具有不同的专业知识。它可以从各种数据存储、检索策略(基于关键字、语义或混合)、查询转换(针对结构不良的查询)和专门工具或 API(例如文本到 SQL 转换器甚至 Web 搜索功能)中进行选择。
检索优化
检索优化策略旨在通过直接操纵与用户查询相关的外部数据检索方式来改善检索结果。这可能涉及优化搜索查询,例如使用元数据筛选候选或排除异常值,甚至涉及微调外部数据的嵌入模型以提高底层嵌入本身的质量。
元数据过滤(Metadata Filtering)
元数据是附加在向量数据库中每个文档或块上的附加信息,可提供有价值的上下文以增强检索。这些补充数据可以包括时间戳、类别、作者信息、来源参考、语言、文件类型等。
从向量数据库检索内容时,元数据有助于通过过滤掉不相关的对象(即使它们在语义上与查询相似)来优化结果。这缩小了搜索范围并提高了检索信息的相关性。
使用元数据的另一个好处是时间意识。通过将时间戳合并为元数据,系统可以优先处理最近的信息,确保检索到的知识保持最新和相关。这在信息新鲜度至关重要的领域尤其有用。
为了充分利用元数据过滤,重要的是要仔细规划并选择能够改善搜索而不会增加不必要复杂性的元数据。
排除向量搜索异常值(Excluding Vector Search Outliers)
定义返回结果数量的最直接方法是明确设置前 k 个 (top_k) 结果的值。如果将 top_k 设置为 5,我们将获得五个最接近的向量,无论它们的相关性如何。虽然很容易实现,但这可能会包括较差的匹配,因为它们被截断了。
以下是两种隐式管理搜索结果数量的技术,它们可以帮助排除异常值:
距离阈值(Distance thresholding)通过设置向量之间的最大允许距离来添加质量检查。距离分数高于此阈值的任何结果都会被过滤掉,即使它本来可以达到 top_k 截止值。这有助于消除明显的不良匹配,但需要仔细调整阈值。
Autocut 更具动态性:它查看结果距离的聚类方式。它不使用固定限制,而是根据结果与查询向量的相对距离对结果进行分组。当组间距离分数出现大幅跳跃时,Autocut 可以在该跳跃处截断结果。这会捕获可能通过 top_k 或基本距离阈值的异常值。
混合搜索(Hybrid Search)
混合搜索结合了基于向量的语义搜索和传统的基于关键字的方法的优势。该技术旨在提高 RAG 系统中检索信息的相关性和准确性。
混合搜索的关键在于“alpha”(a)参数,它控制着语义和基于关键字的搜索方法之间的平衡:
- a = 1:纯语义搜索
- a = 0:纯基于关键字的搜索
- 0 < a < 1:两种方法的加权组合
当我们同时需要上下文理解和精确关键字匹配时,这种方法特别有用。
考虑一家软件公司的技术支持知识库。用户可能会提交“更新后 Excel 公式计算不正确”之类的查询。在这种情况下,语义搜索有助于了解问题的上下文,可能会检索有关公式错误、计算问题或软件更新影响的文章。同时,关键字搜索可确保不会忽略包含“Excel”和“公式”等特定术语的文档。
因此,在实施混合搜索时,根据我们的特定用例调整 alpha 参数以优化性能至关重要。
嵌入模型微调(Embedding Model Fine-Tuning)
现成的嵌入模型通常在大型通用数据集上进行训练,以嵌入广泛的数据输入。但是,嵌入模型可能无法捕获较小、特定于领域的数据集的上下文和细微差别。
在自定义数据集上微调嵌入模型可以显著提高嵌入的质量,从而提高 RAG 等下游任务的性能。微调可以改进嵌入,以更好地捕获数据集的含义和上下文,从而在 RAG 应用程序中实现更准确、更相关的检索。
我们的数据集越小众,它就越能从嵌入模型微调中受益。具有专业词汇的数据集(如医学或法律数据集)是嵌入模型微调的理想选择,这有助于扩展领域外的词汇,并提高 RAG 流水线中信息检索和生成的准确性和相关性。
要微调现有的嵌入模型,我们首先需要选择一个想要改进的基础模型。接下来,通过向模型提供特定于域的数据来开始微调过程。在此过程中,损失函数会调整模型的嵌入,以便语义相似的项目在嵌入空间中放置得更近。要评估微调后的嵌入模型,我们可以使用一组精选的查询-答案对验证集来评估 RAG 流水线中的检索质量。现在,该模型已准备好为我们的特定数据集生成更准确、更具代表性的嵌入。
后检索优化
检索后优化技术旨在提高生成的响应的质量,这意味着它们的工作在检索过程完成后开始。这组多样化的技术包括使用模型对检索结果进行重新排序、增强或压缩检索到的上下文、提示工程以及在外部数据上微调生成 LLM。
重新排序(Re-Ranking)
一种行之有效的提高信息检索系统性能的方法是利用检索和重新排序流水线。检索和重新排序流水线将向量搜索的速度与重新排序模型的上下文丰富性相结合。
在向量搜索中,查询和文档是分开处理的。首先,对文档进行预索引。然后,在查询时,处理查询,并检索向量空间中最接近的文档。虽然向量搜索是一种快速检索候选的方法,但它可能会错过上下文细微差别。
这就是重新排序模型发挥作用的地方。由于重新排序模型在查询时会同时处理查询和文档,因此它们可以捕获更多上下文细微差别。但是,它们通常很复杂且资源密集,因此不适合像向量搜索这样的第一阶段检索。
通过将向量搜索与重新排序模型相结合,我们可以快速地收集大量潜在候选者,然后对它们进行重新排序,以提高提示中相关上下文的质量。
请注意,在使用重新排序模型时,我们应该过度检索块,以便稍后过滤掉不太相关的块。
上下文后处理(Context Post-Processing)
检索后,对检索到的上下文进行后处理以便生成会大有裨益。例如,如果检索到的上下文可能受益于附加信息,则可以使用元数据对其进行增强。另一方面,如果它包含冗余数据,则可以对其进行压缩。
使用元数据进行上下文增强(Context Enhancement with Metadata)
一种后处理技术是使用元数据通过附加信息增强检索到的上下文,以提高生成准确性。虽然我们可以简单地从元数据中添加附加信息,例如时间戳、文档名称等,但我们也可以应用更具创意的技术。
当数据需要预处理成较小的块大小以实现更好的检索精度,但其不包含足够的上下文信息来生成高质量的响应时,上下文增强特别有用。在这种情况下,我们可以应用一种称为“句子窗口检索”(Sentence window retrieval)的技术。此技术将初始文档分块成较小的部分(通常是单个句子),但在其元数据中存储较大的上下文窗口。在检索时,较小的块有助于提高检索精度。检索后,检索到的较小块将被较大的上下文窗口替换,以提高生成质量。
上下文压缩(Context Compression)
RAG 系统依赖各种知识源来检索相关信息。然而,这通常会导致检索不相关或冗余的数据,从而导致响应不理想和 LLM 调用成本高昂(更多 token)。
上下文压缩通过从检索到的数据中提取最有意义的信息,有效地解决了这一挑战。此过程从基本检索器开始,该检索器检索与查询相关的文档/块。然后,这些文档/块通过文档压缩器进行压缩,以缩短它们并消除不相关的内容,确保有价值的数据不会丢失在大量无关信息中。
上下文压缩减少了数据量,降低了检索和运营成本。当前的研究主要集中在两种方法上:基于嵌入和基于词汇的压缩,这两种方法都旨在保留基本信息,同时减轻 RAG 系统的计算需求。
提示工程(Prompt Engineering)
LLM 的生成输出受其相应提示的质量、语气、长度和结构的影响很大。提示工程是优化 LLM 提示以提高生成输出的质量和准确性的实践。提示工程通常是改进 RAG 系统的技术中最容易实现的成果之一,它不需要对底层 LLM 本身进行更改。这使得它成为一种高效且易于访问的方法来提高性能,而无需进行复杂的修改。
有几种不同的提示技术在改进 RAG 流水线方面特别有用。
CoT (Chain of Thought,思维链) 提示涉及要求模型“逐步思考”,并将复杂的推理任务分解为一系列中间步骤。当检索到的文档包含需要仔细分析的冲突或密集信息时,这尤其有用。
ToT (Tree of Thoughts,思维树) 提示以 CoT 为基础,指示模型评估其在解决问题过程中每一步的响应,甚至生成问题的几种不同解决方案并选择最佳结果。当存在许多潜在证据时,这在 RAG 中很有用,并且模型需要根据多个检索到的文档权衡不同的可能答案。
ReAct(Reasoning and Acting,推理和行动)提示将 CoT 与 Agent 相结合,创建了一个系统,其中模型可以生成想法并将行动委托给 Agent,Agent 在迭代过程中与外部数据源交互。ReAct 可以通过使 LLM 能够动态地与检索到的文档交互、根据外部知识更新推理和行动来改进 RAG 流水线,从而提供更准确、更符合上下文的响应。
LLM 微调(LLM Fine-Tuning)
预训练的 LLM 在大型、多样化的数据集上进行训练,以获得一般知识,包括语言和语法模式、广泛的词汇量以及执行一般任务的能力。对于 RAG,使用预训练的 LLM 有时会导致生成的输出过于笼统、事实不正确或无法直接解决检索到的上下文。
微调预训练模型涉及在特定数据集或任务上对其进行进一步训练,以使模型的一般知识适应该特定领域的细微差别,从而提高其在该领域的性能。在 RAG 流水线中使用微调模型有助于提高生成的响应的质量,尤其是当手头的主题高度专业化时。
高质量的领域特定数据对于微调 LLM 至关重要。标记数据集(如正面和负面的客户评论)可以帮助微调模型更好地执行下游任务,如文本分类或情绪分析。另一方面,未标记的数据集(如 PubMed 上发布的最新文章)可以帮助微调模型获得更多领域特定知识并扩大词汇量。
在微调过程中,预训练的 LLM(也称为基础模型)的模型权重通过称为反向传播的过程进行迭代更新,以从领域特定数据集中学习。结果是经过微调的 LLM 可以更好地捕捉新数据的细微差别和要求,例如特定术语、风格或语气。
总结
RAG 通过使生成模型能够引用外部数据来增强生成模型,从而提高响应准确性和相关性,同时减轻幻觉和信息差距。简单的 RAG 根据查询相似性检索文档,并直接将它们输入生成模型以生成响应。但是,更先进的技术(如本指南中详细介绍的技术)可以通过增强检索信息的相关性和准确性来显著提高 RAG 流水线的质量。
本文回顾了可应用于 RAG 流水线各个阶段的高级 RAG 技术,以提高检索质量和生成响应的准确性。
- 索引优化技术(如数据预处理和分块)专注于格式化外部数据以提高其效率和可搜索性。
- 预检索技术旨在通过重写、重新格式化或将查询路由到专用流水线来优化用户查询本身。
- 检索优化策略通常侧重于在检索阶段优化搜索结果。
- 检索后优化策略旨在通过各种技术提高生成结果的准确性,包括对检索结果进行重新排序、增强或压缩(检索)上下文以及操纵提示或生成模型 (LLM)。
我建议实施验证流水线,以确定 RAG 系统的哪些部分需要优化,并评估高级技术的有效性。评估我们的 RAG 流水线可以实现持续监控和改进,确保优化对检索质量和模型性能产生积极影响。
如何系统的学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
01.大模型风口已至:月薪30K+的AI岗正在批量诞生
2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K(数据来源:BOSS直聘报告)
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
02.大模型 AI 学习和面试资料
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。