“一份关于为生产就绪的RAG应用程序进行的12种调优策略指南”
12种RAG应用程序优化策略指南:为您的生产准备好了
如何通过调整超参数和调优策略来提高检索增强生成(RAG)流程的性能

数据科学是一门实验性科学。它始于“无免费午餐定理”,即没有适合所有问题的通用算法。数据科学家使用实验追踪系统来帮助他们调优机器学习(ML)项目的超参数,以达到最佳性能。
本文将从数据科学家的视角探讨检索增强生成(RAG)流程,并介绍一些可能的超参数,可通过实验来提高您的RAG流程的性能。与深度学习中的实验类似,数据增强技术并非超参数,而是可以调节和实验的旋钮,本文还将介绍您可以应用的不同策略,尽管它们不属于超参数。
检索增强生成(RAG):从理论到LangChain实现
从原始学术论文到采用OpenAI、Weaviate和LangChain的Python实现
towardsdatascience.com
本文将按相关阶段列出以下“超参数”。在RAG流程的摄取阶段,您可以通过以下方式提高性能:
在推断阶段(检索和生成)中,您可以调整以下内容:
请注意,此文章涵盖了RAG的文本应用场景。对于多模态的RAG应用,可能会有不同的考虑因素。
摄取阶段
摄取阶段是建立RAG管道的准备步骤,类似于ML管道中的数据清洗和预处理步骤。通常,摄取阶段包括以下步骤:
- 收集数据
- 切分数据
- 生成切片的向量嵌入
- 将向量嵌入和切片存储在向量数据库中

本节讨论了可以应用和调整的有影响力的技术和超参数,以提高推理阶段中检索到的上下文的相关性。
数据清洗
与任何数据科学管道一样,您的数据质量对RAG管道的结果有很大影响[8, 9]。在进行以下任何步骤之前,请确保您的数据符合以下准则:
- 干净:至少应用一些常用的自然语言处理数据清洗技术,例如确保所有特殊字符被正确编码。
- 正确:确保您的信息一致且事实准确,避免混淆您的LLM的冲突信息。
切分
将文档切分成块是RAG管道中外部知识源的一项重要准备工作,可以影响性能[1, 8, 9]。这是一种生成逻辑连贯信息片段的技术,通常是通过将长文档分解成较小的部分(但也可以将较小的片段组合成连贯的段落)。
您需要考虑的一个因素是切分技术的选择。例如,在LangChain中,不同的文本分割器根据不同的逻辑将文档分割,例如按字符、标记等。这取决于您拥有的数据类型。例如,如果输入数据是代码,则需要使用不同的切分技术,如果是Markdown文件,则需要使用不同的切分技术。
您的切片的理想长度(chunk_size
)取决于您的用例:如果您的用例是问答,您可能需要较短的具体切片,但如果您的用例是摘要,您可能需要较长的切片。此外,如果切片太短,可能不包含足够的上下文。另一方面,如果切片太长,可能包含太多不相关的信息。
此外,您需要考虑切片之间的“滚动窗口”(overlap
)来引入一些额外的上下文。
嵌入模型
嵌入模型是检索过程的核心。您的嵌入质量严重影响检索结果[1, 4]。通常情况下,生成的嵌入的维数越高,嵌入的精度越高。
为了了解可用的替代嵌入模型,您可以查看Massive Text Embedding Benchmark (MTEB) Leaderboard,其中涵盖了164个文本嵌入模型(截至本文撰写时)。
MTEB Leaderboard – a Hugging Face Space by mteb
发现由社区制作的令人惊叹的ML应用
huggingface.co
虽然您可以直接使用通用嵌入模型,但在某些情况下,通过对嵌入模型进行微调以避免后续领域外的问题可能更合理[9]。根据LlamaIndex进行的实验表明,微调嵌入模型可以使检索评估指标提高5-10%[2]。(评估结果见此链接)
请注意,您不能对所有嵌入模型进行微调(例如,OpenAI的text-embedding-ada-002目前不能进行微调)。
元数据
当您将向量嵌入存储在向量数据库中时,某些向量数据库允许您将它们与元数据(或非向量化的数据)一起存储。使用元数据注释向量嵌入可以帮助对搜索结果进行附加后处理,例如元数据过滤[1, 3, 8, 9]。例如,您可以添加日期、章节或子章节引用等元数据。
多索引
如果元数据不足以为逻辑上区分不同类型的上下文提供附加信息,您可能需要尝试使用多个索引[1, 9]。例如,您可以为不同类型的文档使用不同的索引。请注意,在检索时,您将需要合并一些索引路由[1, 9]。如果您对元数据和独立集合有更深入的了解,您可能希望了解更多关于原生多租户概念的信息。
索引算法
为了实现规模化的高速相似性搜索,向量数据库和向量索引库使用近似最近邻(ANN)搜索而不是k最近邻(kNN)搜索。正如名称所示,ANN算法近似最近邻,因此可能不如kNN算法精确。
有不同的ANN算法可以尝试,例如Facebook Faiss(聚类)、Spotify Annoy(树)、Google ScaNN(向量压缩)和HNSWLIB(邻近图)。此外,许多这些ANN算法都有一些您可以调整的参数,例如HNSW的ef、efConstruction和maxConnections [1]。
此外,您可以为这些索引算法启用向量压缩。类似于ANN算法,向量压缩会导致一定的精度损失。然而,根据向量压缩算法和其调整的选择,您也可以优化这一点。
然而,实际上,这些参数已经通过向量数据库和向量索引库的研究团队在基准测试实验中进行了调整,而不是由RAG系统的开发人员进行调整。然而,如果您想尝试调整这些参数以充分发挥性能,我建议您从这篇文章开始:
RAG评估概述 | Weaviate – 向量数据库
了解RAG评估的新趋势和最新技术。
weaviate.io
推理阶段(检索和生成)
RAG流程的主要组成部分是检索和生成组件。本节主要讨论改进检索的策略(查询转换、检索参数、高级检索策略和重新排序模型),因为这是两者中影响力更大的组件。但它也简要介绍了一些改进生成的策略(LLM和提示工程)。

查询转换
由于在RAG流水线中嵌入了用于检索额外上下文的搜索查询,因此其表达方式也会影响搜索结果。因此,如果您的搜索查询没有得到满意的搜索结果,您可以尝试多种查询转换技术 [5, 8, 9],例如:
- 改写:使用LLM重新表达查询并重试。
- 假设性文档嵌入(HyDE):使用LLM生成针对搜索查询的假设性响应,并同时用于检索。
- 子查询:将较长的查询拆分为多个较短的查询。
检索参数
检索是RAG流水线的重要组成部分。首先要考虑的是语义搜索是否足够适用于您的用例,或者您是否想要尝试混合搜索。
在后一种情况下,您需要尝试调整在混合搜索中聚合稀疏和稠密检索方法的加权[1, 4, 9]。因此,调整参数alpha
,控制语义搜索(alpha = 1
)和基于关键字搜索(alpha = 0
)之间的加权将变得必要。
通过将传统基于关键字的搜索与现代向量搜索相结合来提高RAG流水线的检索性能
如何通过将传统基于关键字的搜索与现代向量搜索相结合来找到更相关的搜索结果
towardsdatascience.com
此外,检索的搜索结果数量也将起到关键作用。检索到的上下文数量将影响所使用的上下文窗口的长度(详见提示工程)。同时,如果您在使用重新排序模型,您需要考虑输入给模型的上下文数量(详见重新排序模型)。
请注意,尽管语义搜索的相似性度量是可以更改的参数,但您不应尝试进行实验,而应根据所使用的嵌入模型设置它(例如,text-embedding-ada-002
支持余弦相似度,multi-qa-MiniLM-l6-cos-v1
支持余弦相似度、点积和欧氏距离)。
高级检索策略
从某种意义上说,此部分可以是一篇独立的文章。在本概览中,我们将尽量简洁地介绍以下技术。如果您想深入了解这些技术,请参考DeepLearning.AI的课程:
构建和评估高级RAG应用
学习句子窗口检索和自动合并检索等方法,提高您的RAG流水线性能…
www.deeplearning.ai
该部分的基本思想是检索用于生成的块不一定要和用于检索的块相同。理想情况下,您会为检索嵌入较小的块(参见分块),但检索较大的上下文。[7]
- 句子窗口检索:不仅检索相关的句子,还要检索被检索句子之前和之后的适当句子窗口。
- 自动合并检索:文档被组织成类似树的结构。在查询时,相关但独立的较小块可以合并成较大的上下文。
重新排序模型
虽然语义搜索根据与搜索查询的语义相似性检索上下文,但“最相似”并不一定意味着“最相关”。重新排序模型,例如Cohere的Rerank模型,可以通过计算查询与每个检索到的上下文的相关性分数来帮助消除无关的搜索结果[1, 9]。
“最相似”并不一定意味着“最相关”
如果您正在使用重新排序模型,您可能需要重新调整重新排序器输入的搜索结果数量以及您希望将哪些重新排序结果提供给LLM。
与嵌入模型一样,您可能希望根据特定的用例对重新排序器进行微调实验。
LLMs
LLM是生成响应的核心组件。类似于嵌入模型,您可以根据需求选择各种LLM,例如开放式与专有模型,推理成本,上下文长度等[1]。
与嵌入模型或重新排序模型一样,您可能希望根据特定用例对LLM进行微调以包含特定的措辞或语气。
提示工程
您如何构造或设计提示将显著影响LLM的完成度[1, 8, 9]。
请仅根据搜索结果回答问题,不要参考其他任何信息!
非常重要!你的答案必须基于提供的搜索结果。请解释为什么你的答案与搜索结果相关联!
此外,在提示中使用少量示例可以提高完成度的质量。
如检索参数中所述,您应该根据需要进行实验的一个参数是将上下文提供给提示的数量[1]。尽管增加相关上下文可以提高RAG流水线的性能,但如果在许多上下文中的中间位置,则有可能出现“中间丢失”[6]效应,即LLM可能无法将相关上下文识别为相关上下文。
摘要
随着越来越多的开发人员在原型设计RAG流水线方面积累经验,讨论将RAG流水线推向生产就绪的性能策略变得更加重要。本文讨论了根据相关阶段调整RAG流水线中的不同“超参数”和其他参数的策略:
本文涵盖了摄取阶段中的以下策略:
- 数据清理:确保数据干净且正确。
- 分块:选择分块技术、块大小(
chunk_size
)和块重叠(overlap
)。 - 嵌入模型:选择嵌入模型,包括维度和是否进行微调。
- 元数据:是否使用元数据以及元数据的选择。
- 多索引:决定是否为不同的数据集使用多个索引。
- 索引算法:选择和调优ANN和向量压缩算法,但通常由从业者不进行调优。
以下是在推理阶段(检索和生成)中使用的策略:链接:
- 查询转换:尝试使用重新表述、HyDE或子查询。
- 检索参数:选择搜索技术(如果启用混合搜索,则为
alpha
)和检索的搜索结果数目。 - 高级检索策略:是否使用高级检索策略,例如句子窗口或自动合并检索。
- 重新排序模型:是否使用重新排序模型,选择重新排序模型,将多少个搜索结果输入到重新排序模型中,以及是否对重新排序模型进行微调。
- LLMs:选择LLM以及是否对其进行微调。
- 提示工程:尝试使用不同的措辞和少量示例。
喜欢这个故事吗?
免费订阅,以获取我发布新故事时的通知。
每当Leonie Monigatti发布新内容时,请发送电子邮件。
每当Leonie Monigatti发布新内容时,请发送电子邮件。注册即可创建一个VoAGI账户(如果您还没有)…
VoAGI.com
在 LinkedIn、Twitter 和 Kaggle 上与我互动!
参考资料
文献
[1] Connor Shorten 和 Erika Cardenas(2023)。Weaviate Blog。 RAG评估概述(访问日期: 2023年11月27日)
[2] Jerry Liu(2023)。LlamaIndex Blog。 使用合成数据对RAG进行嵌入微调(访问日期: 2023年11月28日)
[3] LlamaIndex Documentation(2023)。 构建高性能的RAG应用程序(访问日期: 2023年11月28日)
[4] Voyage AI(2023)。 嵌入式驱动RAG的质量:Chat.LangChain案例研究(访问日期: 2023年12月5日)
[5] LlamaIndex Documentation(2023)。 查询转换(访问日期: 2023年11月28日)
[6] 刘,林,休伊特,帕兰贾佩,贝维拉克瓜,彼得罗尼,梁(2023)。迷失在中间:语言模型如何使用长篇内容。arXiv预印本arXiv:2307.03172。
[7] 深度学习AI(2023)。构建和评估先进的RAG应用(访问日期:2023年12月4日)
[8] Ahmed Besbes(2023)。Towards Data Science。为什么你的RAG在生产环境中不可靠(访问日期:2023年11月27日)
[9] Matt Ambrogi(2023)。Towards Data Science。改进检索增强生成系统性能的10种方法(访问日期:2023年11月27日)
图片
除非另有说明,所有图片均由作者创建。