【NLP】RAG 应用中的调优策略

检索增强生成应用程序的调优策略

没有一种放之四海而皆准的算法能够最好地解决所有问题。

本文通过数据科学家的视角审视检索增强生成(RAG)管道。它讨论了您可以尝试提高 RAG 管道性能的潜在“超参数”。与深度学习中的实验类似,例如,数据增强技术不是超参数,而是可以调整和实验的旋钮,本文还将介绍您可以应用的不同策略,这些策略本身不是超参数。

本文涵盖以下按相关阶段排序的“超参数”。在RAG 管道的

摄取阶段,您可以通过以下方式实现性能改进:

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

在推理阶段(检索和生成),您可以调整:

  • 查询转换
  • 检索参数
  • 高级检索策略
  • 重新排序模型
  • LLM
  • 及时工程

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

摄取阶段

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

  1. 收集数据
  2. 块数据
  3. 生成块的向量嵌入
  4. 将向量嵌入和块存储在向量数据库中

首先对文档进行分块,然后对块进行嵌入,并将嵌入存储在向量数据库中

RAG 管道的摄取阶段

本节讨论有影响力的技术和超参数,您可以应用和调整这些技术和超参数,以提高推理阶段检索到的上下文的相关性。

数据清洗

与任何数据科学管道一样,数据质量会严重影响 RAG 管道中的结果 。在继续执行以下任何步骤之前,请确保您的数据满足以下条件:

  • 清洗:至少应用自然语言处理中常用的一些基本数据清理技术,例如确保所有特殊字符都正确编码。
  • 准确:确保您的信息一致且事实准确,以避免信息冲突使您的LLM感到困惑。

分块

对文档进行分块是 RAG 管道中外部知识源的重要准备步骤,这可能会影响性能 。它是一种生成逻辑上连贯的信息片段的技术,通常是将长文档分解成较小的部分(但它也可以将较小的片段组合成连贯的段落)。

您需要考虑的一项是分块技术的选择。例如,在LangChain中,不同的文本拆分器通过不同的逻辑来拆分文档,例如按字符、令牌等。这取决于您拥有的数据类型。例如,如果您的输入数据是代码,则您将需要使用不同的分块技术,如果它是 Markdown 文件,您将需要使用不同的分块技术。

块 ( chunk_size)的理想长度取决于您的用例:如果您的用例是问答,您可能需要较短的特定块,但如果您的用例是摘要,您可能需要更长的块。此外,如果块太短,它可能无法包含足够的上下文。另一方面,如果块太长,它可能包含太多不相关的信息。

此外,您需要考虑块之间的“滚动窗口”( overlap)以引入一些额外的上下文。

嵌入模型

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

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

虽然您可以开箱即用地使用通用嵌入模型,但在某些情况下,根据您的特定用例微调嵌入模型可能是有意义的,以避免稍后出现域外问题 。根据 LlamaIndex 进行的实验,微调嵌入模型可以使检索评估指标的性能提高 5-10% 。

请注意,您无法微调所有嵌入模型(例如,OpenAItext-ebmedding-ada-002目前无法微调)。

元数据

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

多重索引

如果元数据不足以提供附加信息来逻辑地分隔不同类型的上下文,您可能需要尝试使用多个索引。例如,您可以对不同类型的文档使用不同的索引。请注意,您必须在检索时合并一些索引路由。

索引算法

为了实现大规模快速相似性搜索,矢量数据库和矢量索引库使用近似最近邻 (ANN) 搜索而不是 k 最近邻 (kNN) 搜索。顾名思义,ANN 算法近似最近邻,因此可能不如 kNN 算法精确。。

您可以尝试不同的 ANN 算法,例如Facebook Faiss(聚类)、Spotify Annoy(树)、Google ScaNN(矢量压缩)和HNSWLIB(邻近图)。此外,许多 ANN 算法都有一些您可以调整的参数,例如HNSW的efefConstructionmaxConnections

此外,您可以为这些索引算法启用矢量压缩。与 ANN 算法类似,矢量压缩会损失一些精度。但是,根据矢量压缩算法的选择及其调整,您也可以对此进行优化。

然而,在实践中,这些参数已经由向量数据库和向量索引库的研究团队在基准测试过程中调整,而不是由 RAG 系统的开发人员调整。但是,如果您想尝试使用这些参数来发挥最后的性能,我建议您从这篇文章开始:

推理阶段(检索和生成)

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

标准 RAG 架构

RAG 管道的推理阶段

查询转换

由于在 RAG 管道中检索附加上下文的搜索查询也嵌入到向量空间中,因此其措辞也会影响搜索结果。因此,如果您的搜索查询没有产生令人满意的搜索结果,您可以尝试各种查询转换技术,例如:

  • 重新措辞:使用LLM重新措辞查询并重试。
  • 假设文档嵌入 (HyDE):使用 LLM 生成对搜索查询的假设响应,并将两者用于检索。
  • 子查询:将较长的查询分解为多个较短的查询。

检索参数

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

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

此外,要检索的搜索结果的数量也将发挥重要作用。检索到的上下文数量将影响所使用的上下文窗口的长度。此外,如果您使用重新排名模型,则需要考虑向模型输入多少上下文。

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

高级检索策略

从技术上讲,本节可以单独成一篇文章。对于本概述,我们将尽可能保持简洁。

本节的基本思想是用于检索的块不一定与用于生成的块相同。理想情况下,您可以嵌入较小的块进行检索,但检索更大的上下文。

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

重新排列模型

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

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

如果您使用重新排序模型,您可能需要重新调整重新排序输入的搜索结果数量以及您想要输入 LLM 的重新排序结果数量。

与嵌入模型一样,您可能需要尝试根据您的特定用例微调重新排序器

LLM

LLM是生成回复的核心组件。与嵌入模型类似,您可以根据自己的要求选择多种 LLM,例如开放模型与专有模型、推理成本、上下文长度等。

与嵌入模型或重新排序模型一样,您可能需要尝试根据您的特定用例对LLM 进行微调,以纳入特定的措辞或语气。

及时工程

你如何表达或设计你的提示将显着影响LLM完成。

请仅根据搜索结果给出您的答案,不要考虑其他任何内容!
很重要!您的答案必须基于所提供的搜索结果。
请解释为什么您的答案基于搜索结果!

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

正如检索参数中提到的,输入到提示中的上下文数量是您应该尝试的一个参数 。虽然 RAG 管道的性能可以随着相关上下文的增加而提高,但您也可能会遇到“迷失在中间”的效果,即如果将相关上下文放置在许多上下文的中间,LLM 就无法识别相关上下文。上下文。

概括

随着越来越多的开发人员获得 RAG 管道原型设计的经验,讨论将 RAG 管道引入生产就绪性能的策略变得更加重要。本文讨论了不同的“超参数”以及您可以根据相关阶段在 RAG 管道中调整的其他旋钮:

本文涵盖了摄取截断的以下策略:

  • 数据清理:确保数据干净且正确。
  • 分块:选择分块技术、块大小 ( chunk_size) 和块重叠 ( overlap)。
  • 嵌入模型:嵌入模型的选择,包括。维度,以及是否对其进行微调。
  • 元数据:是否使用元数据以及元数据的选择。
  • 多重索引:决定是否针对不同的数据集合使用多个索引。
  • 索引算法:可以调整 ANN 和矢量压缩算法的选择和调整,但通常不由从业者进行调整。

以及推理截断(检索和生成)的以下策略:

  • 查询转换:尝试改写、HyDE 或子查询。
  • 检索参数:搜索技术的选择(alpha如果启用了混合搜索)和检索的搜索结果的数量。
  • 高级检索策略:是否使用高级检索策略,例如句子窗口或自动合并检索。
  • 重新排序模型:是否使用重排序模型、重排序模型的选择、输入重排序模型的搜索结果数量以及是否微调重排序模型。
  • LLM:LLM 的选择以及是否对其进行微调。
  • 及时工程:尝试不同的措辞和少量示例。

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

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

相关文章

axios 基础的 一次封装 二次封装

一、平常axios的请求发送方式 修改起来麻烦的一批 代码一大串 二、axios的一次封装 我们会在src/utils创建一个request.js的文件来存放我们的基地址与拦截器 /* 封装axios用于发送请求 */ import axios from axios/* (1)request 相当于 Axios 的实例对象 (2)为什么要有reque…

VSCode使用Remote-SSH连接服务器时报错:无法与“***”建立连接: XHR failed.

关于VSCode的报错问题:无法与“***”建立连接: XHR failed 问题描述问题理解解决方法手动在本地下载安装包,然后手动传到服务器端 问题描述 是的,我又踩坑了,而且这个弄了好久,也重新装了VSCode软件,好像结…

前端框架(Front-end Framework)和库(Library)的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

阿里云国际版CDN加速,如何判断网站IP已加速?

将源站接入阿里云CDN服务后,您可以通过IP检测功能,检测客户端请求实际访问的IP是否为CDN加速节点IP,判断加速是否生效。 应用场景 IP检测的应用场景如下: 场景一:成功配置CDN后,您可以检测客户端请求实际…

Postman高级应用——变量、流程控制、调试、公共函数、外部数据文件

Postman 提供了四种类型的变量 环境变量(Environment Variable) 不同的环境,使用不同的环境变量,例如:测试过程中经常会用到 测试环境,外网环境等 全局变量(Global Variable) 所有的…

【计算机网络】序列化,反序列化和初识协议

目录 ​编辑 一、概念 二、 序列化过程: 选择序列化格式: 实现序列化代码: JSON示例: Protocol Buffers示例: JSON编码示例: 传输或存储: 三、反序列化过程: 下面是反序列…

(企业 / 公司项目) 企业项目如何使用jwt?

按照企业的项目然后写的小demo, 自己搞一个登录接口然后调用jwtUtil工具类 后端实现 创建一个通用模块common来实现jwt生成token 登录注册的基本实现逻辑思路 面试| ProcessOn免费在线作图,在线流程图,在线思维导图 注释挺详细的jwtUtil工具类, 封装的…

WPF仿网易云搭建笔记(5):信息流控制之IOC容器

文章目录 专栏和Gitee仓库前言IOC容器Prism IOC使用声明两个测试的服务类MainWindow IOC 注入[单例]MainWindow里面获取UserController无法使用官方解决方案 使用自定义IOC容器,完美解决既然Prism不好用,直接上微软的IOC解决方案App.xaml.csViewModel里面…

网络测试工具:tcping-测试端口连接

网络测试工具:tcping-测试端口连接 平常使用的ping,是通过icmp协议去测试网络连通性的,tcping是通过tcp三次握手测试端口的连通性。总的来说,ping测试的是L3的连通性,tcping测试的是L4的连通性。 tcping工具下载 htt…

10.RIP路由信息协议

10.RIP 网段经常产生变化的话,建议使用动态路由协议,当网段发生变化的时候会自动通告给其他路由器 它不看链路的带宽,只看链路中的跳数,只要是跳数多的,不管带宽有多大,它就认为是不好的 RIP跳数有限 …

TYPE-C接口设备实现DRP+OTG功能芯片

随着USB-C接口的普及,欧盟的法律法规强制越来越多的设备开始采用这种接口。由于 USB-C接口的高效性和便携性,使各种设备之间的连接和数据传输变得非常方便快捷,它们不仅提供了强大的功能,还为我们的日常生活和工作带来了极大的便利…

青少年CTF-Misc(持续更新中)

FLAG:当觉得自己很菜的时候,就静下心来学习 专研方向:Web安全,CTF 每日emo:听一千遍反方向的钟,我们能回到过去吗? 1.StegoTXT: 解压缩文件。发现字母中存在覆盖。使用0宽隐写在线解密得到flag…

YOLOv8改进 | 2023主干篇 | EfficientViT替换Backbone(高效的视觉变换网络)

一、本文介绍 本文给大家带来的改进机制是EfficientViT(高效的视觉变换网络),EfficientViT的核心是一种轻量级的多尺度线性注意力模块,能够在只使用硬件高效操作的情况下实现全局感受野和多尺度学习。本文带来是2023年的最新版本…

量子算力引领未来!玻色量子出席第二届CCF量子计算大会

​8月19日至20日,中国计算机学会(CCF)主办的第二届CCF量子计算大会暨中国量子计算峰会(CQCC 2023)在中国合肥成功举办。本届大会以“量超融合,大国算力”为主题,设有量子计算软件、硬件、应用生…

计算机网络(三)

(十一)路由算法 A、路由算法分类 动态路由和静态路由 静态路由:人工配制,路由信息更新慢,优先级高。这种在实际网络中要投入成本大,准确但是可行性弱。 动态路由:路由更新快,自动…

12/11

完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&#xf…

css的Grid布局

1.简单布局 .grid { display: grid; grid-template-columns: 1fr 2fr 1fr; 布局样式 column-gap: 24px; 列间距 row-gap: 24px; 行间距 } 2.排列布局 center垂直方向居中对其 end靠下对齐 3.水平方向对齐 center居中 end靠右对齐 space-between两段对齐 4.对…

如何使用玻璃材质制作3D钻石模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

Spark与PySpark(1.概述、框架、模块)

目录 1.Spark 概念 2. Hadoop和Spark的对比 3. Spark特点 3.1 运行速度快 3.2 简单易用 3.3 通用性强 3.4 可以允许运行在很多地方 4. Spark框架模块 4.1 Spark Core 4.2 SparkSQL 4.3 SparkStreaming 4.4 MLlib 4.5 GraphX 5. Spark的运行模式 5.1 本地模式(单机) Local运行模…

初识Vue 解决vue在启动时生成的提示

让我为大家简单介绍一下吧&#xff01; Vue是一套用于构建用户界面的渐进式javaScript框架 当我们引入vue.js后 <script src"../js/vue.js"></script>我们发现&#xff0c;当我们打开网页时&#xff0c;控制台会出现以下内容 那我们该怎么解决呢&…