LLM之RAG理论(十一)| 面向生产的RAG应用程序的12种调整策略指南

       本文对文本RAG涉及到的主要12种关键“超参数”进行简单总结,主要包括摄取阶段(数据清洗、数据分块、embedding模型选择、元数据过滤、多重索引和索引算法)和推理阶段【检索和生成】(查询转换、检索参数、高级检索策略、重排序、大模型和Prompt工程)。下面将分别进行介绍:

​一、摄取阶段

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

  1. 收集数据

  2. 对数据进行分块

  3. 对分块后的数据进行embedding

  4. 将分块数据embedding和块存储在矢量数据库中

1.1 数据清理

       与任何数据科学管道一样,数据的质量严重影响RAG管道的结果。在继续执行以下任何步骤之前,请确保您的数据符合以下标准:

1)数据干净:可以应用一些自然语言处理中常用的基本数据清理技术,例如确保所有特殊字符都正确编码;

2)数据准确:确保信息一致且事实准确,以避免信息冲突误导LLM

1.2 分块

       对文档进行分块是RAG管道中引入外部知识源的一个重要准备步骤,通常是将长文档分解成更小的部分(但它也可以将较小的片段组合成连贯的段落)。

       在LangChain中,支持不同的text splitters[1],比如字符、令牌等。这取决于您拥有的数据类型,例如,如果您的输入数据是代码,而不是Markdown文件,则需要使用不同的分块技术。

      块的理想长度(chunk_size)取决于具体用例:如果你的用例是问答,你可能需要更短的块;但如果你的案例是摘要,你可能会需要更长的块。此外,如果一个区块太短,它可能没有包含足够的上下文。另一方面,如果一个块太长,它可能包含太多不相关的信息。

       此外,还需要考虑块(重叠)之间的“滚动窗口”,这样可以保证块之间的语义连贯性。

1.3 嵌入模型

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

       可以在 Massive Text Embedding Benchmark (MTEB)排行榜[2]查看可用的文本嵌入模型,该排行榜涵盖164个文本嵌入模型(在撰写本文时)。

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

     请注意,无法对所有嵌入模型进行微调(例如,OpenAI的text-ebmedding-ada-002目前无法进行微调)。

1.4 元数据

      将矢量嵌入存储在矢量数据库中时,某些矢量数据库允许将它们与元数据(或未矢量化的数据)一起存储。用元数据注释矢量嵌入有助于对搜索结果进行额外的后处理,如元数据过滤(添加元数据,如日期、章节或分章引用)。

1.5 多重索引

       如果元数据不足以提供额外的信息来从逻辑上分离不同类型的上下文,可能需要尝试使用多个索引,例如,可以对不同类型的文档使用不同的索引。

1.6 索引算法

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

       这里有不同的ANN算法可以参考,如Facebook Faiss[3](聚类)、Spotify Annoy[4](树)、Google ScaNN[5](矢量压缩)和HNSWLIB[6](接近图)。此外,这些ANN算法中的许多都有一些参数可以调整,例如HNSW[1]的ef、efConstruction和maxConnections。

       此外,还可以为这些索引算法启用矢量压缩。与人工神经网络算法类似,矢量压缩会损失一些精度。然而,根据矢量压缩算法的选择及其调整,也可以对此进行优化。

      然而,这些参数已经由向量数据库和向量索引库的研究团队在基准测试实验期间进行了调整,而不是由RAG系统的开发人员进行调整。然而,如果想自己尝试使用这些参数来压榨一点性能,建议可以参考这篇文章[7]。

二、推理阶段(检索和生成)

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

2.1 查询转换

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

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

2.2 检索参数

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

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

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

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

2.3 高级检索策略

       本节的基本思想是,用于检索的块不一定与用于生成的块相同。理想情况下,应该嵌入较小的块便于检索,而应该检索较大的上下文。

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

2.4 重新排序模型

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

|“most similar” doesn’t necessarily mean “most relevant”

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

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

2.5 LLM

       LLM是生成响应的核心组件,根据用户的需求,可以有多种LLM可供选择,可以考虑例如开源模型或专有模型、推理成本、上下文长度等因素来选择大模型。

2.6 Prompt工程

       如何表达或设计你的提示将对LLM的完成产生重大影响。此外,在提示中使用一些few-shot示例可以提高生成的质量。

       如Retrieval parameters中所述,输入到提示中的上下文数量是一个超参数。虽然RAG管道的性能可以随着相关上下文的增加而提高,但如果相关上下文位于许多上下文的中间,则LLM也不会识别相关上下文,因此也可能会遇到“中间丢失”效应。

参考文献:

[1] https://python.langchain.com/docs/modules/data_connection/document_transformers/

[2] https://huggingface.co/spaces/mteb/leaderboard

[3] https://github.com/facebookresearch/faiss

[4] https://github.com/spotify/annoy

[5] https://github.com/google-research/google-research/tree/master/scann

[6] https://github.com/nmslib/hnswlib

[7] https://weaviate.io/blog/rag-evaluation?source=post_page-----7ca646833439--------------------------------#indexing-knobs

[8]  https://gpt-index.readthedocs.io/en/v0.6.9/how_to/query/query_transformations.html

[9] https://towardsdatascience.com/improving-retrieval-performance-in-rag-pipelines-with-hybrid-search-c75203c2f2f5?source=post_page-----7ca646833439--------------------------------

[10] https://cohere.com/rerank?ref=txt.cohere.com&__hstc=14363112.8fc20f6b1a1ad8c0f80dcfed3741d271.1697800567394.1701091033915.1701173515537.7&__hssc=14363112.1.1701173515537&__hsfp=3638092843

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

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

相关文章

C语言【动态内存】

1.为什么要有动态内存 我们现在掌握的内存开辟方法有: int val 20;//在栈空间开辟4个字节 char str[10]{0};//在栈空间开辟10个字节的连续的空间但是上述的方式有两个点要注意: 1.空间开辟的大小是固定的 2.数组在申明的时候,一定要指定数…

数据驱动,敏捷前行|MongoDB线下技术沙龙-杭州站活动

扫描海报中二维码或点击阅读原文,报名参加阿里云MongoDB在5月11日杭州举办的【数据驱动,敏捷前行——MongoDB企业开发加速器】线下沙龙活动,与MongoDB专家以及其他游戏行业同行一起探讨轻松获得游戏数据库高可用性和弹性的方法! 在…

安卓获取SHA

1:安卓通过签名key获取SHA 方式有两种, 1、电脑上来存在eclipse的用户或正在使用此开发工具的用户就简单了,直接利用eclipse 走打包流程,再打包的时候选择相应的签名,那么在当前面板的下面便会出现签名的相关信息。 2、…

23 重构:烟囱式、平台化、中台化的架构

上一讲里,我们介绍了两大类型的系统升级重构方案,还介绍了如何进行重构版本的上线,以及如何平滑地完成新老版本切换的方案。在本讲里,将会具体介绍如何判断系统发展到什么阶段需要重构,以及如何实施重构。 系统稳定性…

AutoBackgroundBackButton 在ScrollView上方自动根据返回键按钮下方内容动态改变颜色。自动变色返回键

在日常有时候有一些为了优化体验的需求。AutoBackgroundBackButton 一个可以根据按钮下方背景颜色动态的改版返回键自定义ImageView。这里只展示了黑白切换方式,你如果还有其他需求可以参考颜色校验来自己实现切换对应颜色按钮。【例如白色背景展示黑色样式&#xf…

Python urllib 爬虫入门(1)

本文主要为Python urllib类库函数和属性介绍及一些简单示例。 目录 urllib爬取网页 简单示例 写入文件 其他读取方法 readline函数 readlines函数 response属性 当前环境信息 返回状态码 返回url地址 对url进行编码与解码 写入文件 总结 urllib爬取网页 通过pyth…

PotatoPie 4.0 实验教程(35) —— FPGA实现摄像头图像二值化膨胀效果

手机扫码 链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 什么是图像二值化膨胀,有什么作用? 图像二值化膨胀是图像处理中的一种基本操作,它用于扩展和增强二值图像中的白色区域。具体而言,二值化膨胀操作…

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 : 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式;模型架构是基于 Transformer 的叠加解码器(掩码自注意…

LeetCode55:跳跃游戏

题目描述 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 解题思想 每次…

update_min_vruntime()流程图

linux kernel scheduler cfs的update_min_vruntime() 看起来还挺绕的。含义其实也简单,总一句话,将 cfs_rq->min_vruntime 设置为: max( cfs_rq->vruntime, min(leftmost_se->vruntime, cfs_rq->curr->vruntime) )。 画个流…

滑动窗口详解

目录 一、滑动窗口的特定步骤: 二、题目解析 1、⻓度最⼩的⼦数组---点击跳转题目 3、最⼤连续 1 的个数 III----点击跳转题目 4、将 x 减到 0 的最⼩操作数----点击跳转题目 5、⽔果成篮----点击跳转题目 滑动窗口是双指针算法中细分的一种,它由暴…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而,传统的PDF阅读器往往只能满足简单的查看需求,对于需要频繁编辑、修改或转换格式的用户来说,就显得力不从心。现在,我们为您带来一款全新的PDF高效编辑器,让…

挑战一周完成Vue3项目Day3: 品牌管理+平台属性管理+SPU管理+SKU管理

一、真实接口替换mock接口 (1)替换各个环境下的服务器地址( .env.development、.env.production、.env.test ) VITE_SERVE"http://sph-api.atguigu.cn" (2) 配饰代理跨域:vite.con…

根据标签最大层面ROI提取原始图像区域

今天要实现的任务是提取肿瘤的感兴趣区域。 有两个文件,一个是nii的原始图像文件,一个是nii的标签文件。 我们要实现的是:在标签文件上选出最大层面,然后把最大层面的ROI映射到原始图像区域,在原始图像上提裁剪出ROI…

PLC通过Modbus转Profinet网关连接变频器与电机通讯

Modbus转Profinet网关(XD-MDPN100)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口,PLC作为控制中枢,变频器作为控制电机转速,通过Modbus转Profinet网关&#…

瑞米派实时系统与EtherCAT移植-米尔Remi Pi

1.概述 Remi Pi采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A551.2GHzCortex-M33200MHz处理器,其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600 / DDR3L-1333内存…

Webshell绕过技巧分析之-base64编码和压缩编码

在网络安全运营,护网HVV,重保等活动的过程中,webshell是一个无法绕过的话题。通常出现的webshell都不是以明文的形式出现,而是针对webshell关键的内容进行,混淆,编码来绕过网络安全产品,例如IDS…

计算机提示msvcp110.dll是什么意思?msvcp110.dll丢失恢复办法

在Windows操作系统中,动态链接库(DLL)扮演着至关重要的角色,它们是实现程序间代码共享和模块化设计的关键组件。msvcp110.dll,作为Microsoft Visual C 2012运行时库的一个组成部分,是理解现代软件开发和维护…

【酱浦菌-爬虫技术细节】解决学术堂爬虫翻页(下一页)问题

首先我们通过css选择器获取页码信息,这里的css选择器,选择的是含有a标签的所有li标签,代码如下: li html_web.css(div.pd_c_xslb_left_fenye ul li>a) for li in li:li_url li.css(a::attr(href)).get()li_num li.css(a::t…

STM32入门_江协科技_3~4_OB记录的自学笔记_软件安装新建工程

3. 软件安装 3.1. 安装Keil5 MDK 作者的资料下载的连接如下:https://jiangxiekeji.com/download.html#32 3.2. 安装器件支持包 因为新的芯片层出不穷,所以需要安装Keil5提供的器件升级版对软件进行升级,从而支持新的芯片;如果不…