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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React的数据Mock实现

在前后端分类的开发模式下,前端可以在没有实际后端接口的支持下先进行接口数据的模拟,进行正常的业务功能开发 1. 常见的Mock方式 2. json-server实现Mock 实现步骤: 项目中安装json-server npm i -D json-server准备一个json文件 {"…

大数据开发工作中的数仓设计(Hadoop,hive ,mysql )

1.HUE工具介绍使用 HUE是CDH提供一个hive和hdfs的操作工具,在hue中编写了hiveSQl也可以操作hdfs的文件 http://主机名字:端口号 hdfs的web访问端口 http://主机名字:端口号 hdfs的程序访问端口 进入后确保hdfs hive yarn 开启 在点击hue开启 在这里面也可以进行h…

记录k8s以docker方式安装Kuboard v3 过程

原本是想通过在k8s集群中安装kuboad v3的方式安装kuboard,无奈在安装过程中遇到了太多的问题,最后选择了直接采用docker安装的方式,后续有时间会补上直接采用k8s安装kuboard v3的教程。 1.kuboard安装文档地址: 安装 Kuboard v3 …

华为 huawei 交换机 配置 MUX VLAN 示例(汇聚层设备)

组网需求 在企业网络中,企业所有员工都可以访问企业的服务器。但对于企业来说,希望企业内部部分员工之间可以互相交流,而部分员工之间是隔离的,不能够互相访问。 如 图 6-4 所示, Switch1 位于网络的汇聚层&#xff0…

【百度Apollo】探索自动驾驶:小白教学如何使用 Dreamview 播放数据包

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 引入一、Dreamview 简介二、使用 Dreamview 具体步骤步骤一:进入 Apollo Docker 环境步骤二&#xff…

Qt QThreadPool线程池

1.简介 QThreadPool类管理一个QThread集合。 QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance来访问该对象。 要使用其中一个QThreadPool…

VMware安装ubuntun虚拟机使用桥接模式无法上网问题解决

问题:最近准备使用VMware虚拟机搭建k8s集群服务,因为需要在同一个网段下,我使用桥接的方式,我发现主机在使用有线连接时虚拟机网络连接正常,但是使用无线网就显示连接不上网络。 解决方法 一、查看网络连接&#xff…

软考-信息系统项目管理师-论文技术架构模板(60天备考第26天)

分享一段信息系统项目管理师论文项目技术架构描述的万能模板,供大家参考。距离考试还有二十八天,如果论文写不好的可以加微进论文指导群学习论文写作。 该系统前端基于Vue开发,后端基于java开发,前后端分离部署。整体采用B/S架构&…

【论文阅读笔记】Frequency Perception Network for Camouflaged Object Detection

1.论文介绍 Frequency Perception Network for Camouflaged Object Detection 基于频率感知网络的视频目标检测 2023年 ACM MM Paper Code 2.摘要 隐蔽目标检测(COD)的目的是准确地检测隐藏在周围环境中的目标。然而,现有的COD方法主要定位…

java中的对象拷贝(包括BeanUtils和Mapstruct)

对象拷贝 借鉴: https://blog.csdn.net/weixin_43811057/article/details/122853749https://blog.csdn.net/weixin_42036952/article/details/105697234?spm1001.2101.3001.6650.8&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogComme…

目标检测应用场景—数据集【NO.33】血细胞图像分类和检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS(Linux Virtual Server)的网络地址转换(NAT)模式是一种在网络层(第四层)实现负载均衡的方法。在NAT模式中,Director Server(DS)充当所有服务…

leetcode51.N皇后(困难)-回溯法

思路 都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二维矩阵还会有点不知所措。 首先来看一下皇后们的约束条件: 不能同行不能同列不能同斜线 确定完约束条件,来看看究…

UE5 体积云

写好的体积材质放这里面 效果如上 Begin Object Class/Script/UnrealEd.MaterialGraphNode Name"MaterialGraphNode_4"Begin Object Class/Script/Engine.MaterialExpressionVectorParameter Name"MaterialExpressionVectorParameter_0"End ObjectBegin O…

人工智能_大模型044_模型微调004_随机梯度下降优化_常见损失计算算法_手写简单神经网络_实现手写体识别---人工智能工作笔记0179

然后对于,梯度下降,为了让训练的速度更好,更快的下降,又做了很多算法,可以看到 这里要知道Transformer中最常用的Adam 和 AdamW这两种算法. 当然,这些算法都是用于优化神经网络中的参数,以最小化损失函数。下面我会尽量以通俗易懂的方式解释它们的原理和适用场景。 1. **L-…

关于电路设计的一些基本知识点

目录 一,BUCK降压电路1.1 布局与布线1.1.1 高频电流环路1.1.2 小信号的地1.1.3 其他要注意的地方 1.2 输入输出电容,电感的选择1.2.1 电感的选择1.2.2 输入输出电容的选择 三,电源芯片3.1 LM2596,LM2576 四,运放电路设计4.1 运放的…

亚马逊接入时遇到的相关问题和解决方法

1、签名获取 在做amazon的SDK接入时,发现需要应用签名的一些信息:MD5签名和SHA256签名。用命令java的命令 keytool -list -v -keystore xxx.keystore 如果是Java版本不是1.8的话,结果缺少MD5值 这里有3种解决方案: 1、将jav…

医生个人品牌网红IP孵化打造赋能运营方案

【干货资料持续更新,以防走丢】 医生个人品牌网红IP孵化打造赋能运营方案 部分资料预览 资料部分是网络整理,仅供学习参考。 PPT可编辑(完整资料包含以下内容) 目录 个人IP运营方案 1. 目标设定 - 个人定位:根据医生…

【论文阅读】IPT:Pre-TrainedImageProcessingTransformer

Pre-TrainedImageProcessingTransformer 论文地址摘要1. 简介2.相关作品2.1。图像处理2.2。 Transformer 3. 图像处理3.1. IPT 架构3.2 在 ImageNet 上进行预训练 4. 实验4.1. 超分辨率4.2. Denoising 5. 结论与讨论 论文地址 1、论文地址 2、源码 摘要 随着现代硬件的计算能…

ChatGPT理论分析

ChatGPT "ChatGPT"是一个基于GPT(Generative Pre-trained Transformer)架构的对话系统。GPT 是一个由OpenAI 开发的自然语言处理(NLP)模型,它使用深度学习来生成文本。以下是对ChatGPT进行理论分析的几个主…