RAG应用程序的12种调优策略:使用“超参数”和策略优化来提高检索性能

本文从数据科学家的角度来研究检索增强生成(retrieve - augmented Generation, RAG)管道。讨论潜在的“超参数”,这些参数都可以通过实验来提高RAG管道的性能。与本文还将介绍可以应用的不同策略,这些策略虽然不是超参数,但对性能也会产生很大的影响。

本文将介绍以下索引阶段的“超参数”。

  • 数据清理
  • 分块
  • 嵌入模型
  • 元数据
  • 多索引
  • 索引算法

在推理阶段(检索和生成),可以通过一下策略进行调优:

  • 查询转换
  • 检索参数
  • 高级检索策略
  • 评估模型
  • llm
  • 提示工程

注意,本文涵盖了RAG的文本用例。对于多模式RAG应用程序,可能需要考虑不同的因素。

数据索引

数据的索引摄取阶段是构建RAG管道的准备步骤,类似于ML管道中的数据清理和预处理步骤。通常,摄入阶段包括以下步骤:

  • 收集数据
  • 数据分块
  • 生成块的矢量嵌入
  • 在矢量数据库中存储矢量嵌入和块

本节讨论可以应用和调优的有效技术和超参数,以便在推理阶段提高检索上下文的相关性。

1、数据清理

与任何数据科学管道一样,数据的质量严重影响RAG管道中的结果[8,9]。

应用一些自然语言处理中常用的基本数据清理技术,例如确保所有特殊字符都被正确编码。确保信息是一致和准确的,以避免相互矛盾的信息混淆你的LLM。

2、文本分块

对的文档进行分块处理是在RAG管道中的外部知识来源的必要准备步骤,这可能会影响性能[1,8,9]。它通常通过将长文档分解成更小的部分(但它也可以将更小的片段组合成连贯的段落)。

需要考虑的一个问题是分块技术的选择。例如,在LangChain中,不同的文本分割器通过不同的逻辑(如字符、标记等)来分割文档。这取决于拥有的数据类型。例如,如果输入数据是代码而不是Markdown文件,则需要使用不同的分块技术。

块的理想长度(chunk_size)取决于用例:如果用例是回答问题,可能需要更短的特定块,但是如果用例是总结,则可能需要更长的块。此外如果一个块太短,它可能没有包含足够的上下文,如果一个块太长,它可能包含太多不相关的信息。

初上面基本要求外,还需要考虑块之间的“滚动窗口”(重叠),以引入一些额外的上下文。

3、嵌入模型

嵌入模型是检索的核心。嵌入的质量严重影响检索结果[1,4]。通常,生成的嵌入的维数越高,嵌入的精度就越高。

要了解有哪些可用的替代嵌入模型,可以查看大规模文本嵌入基准(MTEB)排行榜,它涵盖了164个文本嵌入模型(在撰写本文时)。

在某些情况下,可能需要根据特定用例对嵌入模型进行微调以避免稍后出现域外问题[9]。根据LlamaIndex进行的实验,微调嵌入模型可以使检索评估指标的性能提高5-10%[2]。

4、元数据

在矢量数据库中存储矢量嵌入时,一些矢量数据库允许将它们与元数据(或未向量化的数据)一起存储。用元数据标注向量嵌入有助于对搜索结果进行额外的后处理,例如元数据过滤[1,3,8,9]。例如,可以添加元数据,例如日期、章节或子章节引用。

5、多索引

如果元数据不足以提供额外的信息来逻辑地分离不同类型的上下文,可能需要尝试使用多个索引[1,9]。例如可以对不同类型的文档使用不同的索引。如果使用多索引则需要在检索时合并一些索引路由[1,9]。

6、索引算法

为了在规模上实现快速的相似性搜索,矢量数据库和矢量索引库使用近似最近邻(ANN)搜索而不是k最近邻(kNN)搜索。ANN算法近似于最近邻,但可能不如kNN算法精确。

可以尝试不同的人工神经网络算法,比如Facebook Faiss(聚类)、Spotify Annoy(树)、Google ScaNN(矢量压缩)和HNSWLIB(接近图)。此外这些人工神经网络算法都有一些可以调优的参数,例如用于HNSW的ef、efConstruction和maxConnections[1]。

如果数据量比较大哦,还可以为这些索引算法启用矢量压缩。与人工神经网络算法类似,矢量压缩会损失一些精度。但是根据矢量压缩算法的选择及其调优,也可以对其进行优化。

在实践中,这些参数已经由矢量数据库和矢量索引库的研究团队在基准测试实验期间进行了调整,而不是由RAG系统的开发人员进行调整。但是如果想尝试使用这些参数来挤出性能的最后一点,也是可以试试的。

推理阶段(检索生成)

RAG管道的主要组成部分是检索组件和生成组件。本节主要讨论改进检索的策略(查询转换、检索参数、高级检索策略和重新排序模型),因为这是两者中更有影响力的组件。同时也简要地探讨了提高生成的一些策略(LLM和提示工程)。

1、查询转换

由于在RAG管道中检索附加上下文的搜索查询也嵌入到向量空间中,因此其关键词也会影响搜索结果。如果搜索查询没有得到令人满意的搜索结果,可以尝试各种查询转换技术[5,8,9],例如:

查询改写:使用LLM重新措辞查询,然后再试一次。

假设文档嵌入(HyDE):使用LLM生成对搜索查询的假设响应,并将两者用于检索。

子查询:将较长的查询分解为多个较短的查询。

2、检索参数

检索是RAG管道的重要组成部分。首先要考虑的是,语义搜索是否足以满足用例,或者是否想尝试混合搜索。

在后一种情况下,需要在混合搜索中对稀疏和密集检索方法的聚合进行加权试验[1,4,9]。因此,有必要调整参数alpha,它控制语义(alpha = 1)和基于关键字的搜索(alpha = 0)之间的权重。

要检索的搜索结果的数量将发挥重要作用。检索上下文的数量将影响所使用上下文窗口的长度(参见提示工程)。如果使用重新排序模型,则需要考虑要向模型输入多少上下文(请参阅重新排序模型)。

虽然用于语义搜索的相似度度量是一个可以更改的参数,但不应该进行实验,而应该根据所使用的嵌入模型设置它(例如,text-embedding-ada-002支持余弦相似度,multi-qa-MiniLM-l6-cos-v1支持余弦相似度,点积和欧几里得距离)。

3、高级检索策略

从技术上讲,这一节可以单独写一篇文章。这里我们只做概述,因为我也不是搜索方面的专家

高级检索的基本思想是,用于检索的块不必与用于生成的块相同。理想情况下,检索该嵌入较小的块(参见分块),但是如果检索上下文则需要较大的块。[7]

不只是检索相关的句子,而是检索前后合适句子的窗口。并将文档以树状结构组织。在查询时,可以将独立但相关的较小块合并到更大的上下文中。

4、重排序模型

虽然语义搜索根据上下文与搜索查询的语义相似度来检索上下文,但“最相似”并不一定意味着“最相关”。重新排序模型,如Cohere的重新排序模型,可以通过计算每个检索上下文的查询相关性的分数来帮助消除不相关的搜索结果[1,9]。

“最相似”并不一定意味着“最相关”

如果使用的是重排序模型,则可能需要重新调整用于重新排序的输入的搜索结果数量,以及希望将多少重新排序的结果提供给LLM。

与嵌入模型一样,特定用例对重新排序器可以进行微调。

5、LLM

LLM是生成响应的核心组件。与嵌入模型类似,可以根据自己的需求选择广泛的llm,例如开放模型与专有模型、推理成本、上下文长度等。[1]

与嵌入模型或重新排序模型一样对LLM进行微调,以适应您的特定用例,以合并特定的措辞或语气。

6、提示工程

如何表达或设计提示将显著影响LLM的完成[1,8,9]。

 Please base your answer only on the search results and nothing else!Very important! Your answer MUST be grounded in the search results provided. Please explain why your answer is grounded in the search results!

此外,在提示中使用少量示例可以提高补全的质量。

正如检索参数中提到的,输入提示符的上下文数量是应该试验的一个参数[1]。虽然RAG管道的性能可以随着相关上下文的增加而提高,但也可能遇到“Lost in the Middle”[6]的效果,即如果将相关上下文置于许多上下文的中间,则LLM无法识别相关上下文。

总结

本文讨论了不同的“超参数”和可以根据相关阶段在RAG管道中调整的其他参数:

  1. 数据清理:确保数据干净、正确。
  2. 分块:选择分块技术,块大小(chunk_size)和块重叠(重叠)。
  3. 嵌入模型:选择嵌入模型,包括维度,以及是否对其进行微调。
  4. 元数据:是否使用元数据和选择元数据。
  5. 多索引:决定是否对不同的数据集合使用多个索引。
  6. 索引算法:人工神经网络和矢量压缩算法的选择和调整可以调整,但通常不是由应用调整。
  7. 查询转换:尝试改写、HyDE或子查询。
  8. 检索参数:搜索技术的选择(如果启用了混合搜索,则为alpha)和检索的搜索结果的数量。
  9. 高级检索策略:是否使用高级检索策略,如句子窗口或自动合并检索。
  10. 重排名模型:是否使用重排名模型,重排名模型的选择,输入重排名模型的搜索结果数量,是否对重排名模型进行微调。
  11. LLM:LLM的选择以及是否对其进行微调。
  12. 提示工程:使用不同的措辞和少量的例子进行实验。

引用资料

[1]Connor Shorten and Erika Cardenas (2023). Weaviate Blog. An Overview on RAG Evaluation (accessed Nov. 27, 2023)

[2]Jerry Liu (2023). LlamaIndex Blog. Fine-Tuning Embeddings for RAG with Synthetic Data HUB (accessed Nov. 28, 2023)

[3] LlamaIndex Documentation (2023). Building Performant RAG Applications for Production (accessed Nov. 28, 2023)

[4] Voyage AI (2023). Embeddings Drive the Quality of RAG: A Case Study of Chat.LangChain (accessed Dec. 5, 2023)

[5] LlamaIndex Documentation (2023) DEEP HUB. Query Transformations (accessed Nov. 28, 2023)

[6] Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F., & Liang, P. (2023). Lost in the middle: How language models use long contexts. arXiv preprint arXiv:2307.03172.

[7] DeepLearning.AI (2023). Building and Evaluating Advanced DEEP RAG HUB Applications (accessed Dec 4, 2023)

[8] Ahmed Besbes (2023). Towards Data Science DEEP. Why Your RAG Is Not Reliable in a Production Environment (accessed Nov. 27, 2023)

[9] Matt Ambrogi(2023). Towards Data Science. 10 Ways to Improve the Performance of Retrieval Augmented Generation Systems DEEP (accessed Nov. 27, 2023)

[10] MTEB https://huggingface.co/spaces/mteb/leaderboard

https://avoid.overfit.cn/post/548ad625830a4645beba60a37a2b59d6

作者:Leonie Monigatti

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/257263.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

看图学源码之 CopyOnWriteArrayList 源码分析

基本简介: 是Java中的一个线程安全的List实现,也是ArrayList 的安全版本,所以就不会有ArrayList 的并发修改异常 的问题产生了 原理 每次在对 List 进行修改时,创建一个新的副本(即拷贝),而不…

web:[GXYCTF2019]BabyUpload(文件上传、一句话木马、文件过滤)

题目 页面显示为文件上传 随便上传一个文件看看 上传一个文本文件显示 上传了一个图片显示 上传包含一句话木马的图片 上传了一个包含php一句话木马的文件,显示如上 换一个写法 上传成功 尝试上传.htaccess,上传失败,用抓包修改文件后缀 …

Open-Falcon(一)环境配置

目录 ip划分一、主机准备二、环境配置2.1修改主机名、修改hosts文件2.2配置阿里源,安装工具2.3关闭防火墙、selinux2.4配置时间2.5安装go2.6安装redis2.7 安装mysql初始化MySQL表结构 ip划分 主机名IP服务open-faclon-server192.168.150.200open-faclon-serverngin…

【Python】Faker库详解:创建测试数据轻而易举

Python Faker库详解:创建测试数据轻而易举 在软件开发和测试过程中,通常需要大量的测试数据来模拟真实环境。Python的Faker库为开发者提供了一个方便、灵活且强大的工具,用于生成各种虚构数据。本文将深入介绍Faker库,演示其基本…

基于ssm人事管理信息系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本人事管理信息系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

优化系统性能:深入性能测试的重要性与最佳实践

目录 引言 1. 为什么性能测试重要? 1.1 用户体验 1.2 系统稳定性 1.3 成本节约 1.4 品牌声誉 2. 性能测试的关键步骤 2.1 制定性能测试计划 2.2 确定性能测试类型 2.3 设计性能测试用例 2.4 配置性能测试环境 2.5 执行性能测试 2.6 分析和优化 2.7 回…

编程实战:自己编写HTTP服务器(系列3:处理框架)

系列入口:编程实战:自己编写HTTP服务器(系列1:概述和应答)-CSDN博客 本文介绍处理框架。 一、框架概述 处理框架针对的是一个连接,里面用了循环,支持HTTP1.1,如果不循环就是1.0了&am…

Spring 依赖注入的三种方式优缺点

小王学习录 前言属性注入1. 属性注入的优点2. 属性注入的缺点 Setter注入Setter注入的优点Setter注入的缺点 构造方法注入1. 构造方法的优点 总结补充Aurowired注解和Resource注解的区别 前言 在前面的文章中介绍了基于注解的方式将Bean存储到Spring中, 接下来介绍如何基于注解…

什么是https加密协议,相比http的好处在哪?

先了解什么是http HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络上传输超文本的应用层协议。它是一种无状态的、无连接的协议,通常用于在Web浏览器和服务器之间传输HTML页面、图片、音频、视频以及其他数据资源。 以下是HTTP的…

光伏项目开发的步骤

光伏项目开发是一种将太阳能转化为电能的过程,它涉及到多个步骤和因素。下面将详细介绍光伏项目开发的步骤。 一、项目选址 选择合适的场地是光伏项目开发的第一步。选址时要考虑太阳辐射强度、地理位置、地形和气候等因素。通常来说,阳光充足、遮挡物少…

docker镜像仓库hub.docker.com无法访问

docker镜像仓库hub.docker.com无法访问 文章主要内容: 介绍dockerhub为什么无法访问解决办法 1 介绍dockerhub为什么无法访问 最近许多群友都询问为什么无法访问Docker镜像仓库,于是我也尝试去访问,结果果然无法访问。 大家的第一反应就是…

Python-滑雪大冒险【附源码】

滑雪大冒险 《滑雪大冒险》是一款充满趣味性和挑战性的休闲竞技游戏,在游戏中,玩家将扮演一位勇敢的滑雪者,在雪山上展示他们的滑雪技巧,游戏采用2D图形界面,以第三人称视角呈现 运行效果:用方向键及方向键…