RAG原理详解

news2024/10/6 5:54:45

什么是RAG

检索增强生成(Retrieval Augmented Generation,简称RAG)为大型语言模型(LLMs)提供了从某些数据源检索到的信息,以此作为生成答案的基础。简而言之,RAG是搜索+LLM提示的结合,即在有搜索算法找到的信息作为上下文的情况下,让模型回答提出的查询。查询和检索到的上下文都被注入到发送给LLM的提示中。
在这里插入图片描述

原理流程

将文本分割成块,然后使用基于Transformer decoder的模型将这些块嵌入到向量中,将所有这些向量放入一个索引中,最后为LLM创建一个提示,告诉模型在我们在搜索步骤中找到的上下文中回答用户的查询。

在运行时,我们使用相同的编码器模型将用户的查询向量化,然后对索引执行这个查询向量的搜索,找到前k个结果,从我们的数据库中检索相应的文本块,并将它们作为上下文输入到LLM的提示中。

切分和向量化

首先,我们想创建一个向量索引,代表我们文档的内容,然后在运行时搜索这些向量与查询向量之间最小的余弦距离,对应于最接近的语义含义。

切分:Transformer模型有固定的输入序列长度,即使输入上下文窗口很大,一个句子或几个句子的向量也比几页文本的平均向量更好地代表它们的语义含义(也取决于模型,但通常如此),所以要切分你的数据——将初始文档切分为某个大小的块,不会丢失它们的含义(将文本切分为句子或段落,而不是将单个句子切成两部分)。有各种文本分割器实现能够完成这项任务。

块的大小是一个需要考虑的参数——它取决于你使用的嵌入模型及其在令牌上的容量,标准的Transformer编码器模型如基于BERT的句子转换器最多接受512个令牌,OpenAI ada-002能够处理更长的序列,如8191个令牌,但这里的折中是为LLM提供足够的上下文进行推理与执行搜索的足够具体的文本嵌入。最近的一项研究[3]说明了块大小选择的考虑因素。在LlamaIndex中,这是通过NodeParser类来覆盖的,它提供了一些高级选项,如定义自己的文本分割器、元数据、节点/块关系等。

向量化:下一步是选择一个模型来嵌入切割后的块——有很多选择,例如像bge-large或E5嵌入系列这样的搜索优化模型

向量存储索引:RAG管道的关键部分是搜索索引,它存储了我们在上一步中获得的向量化内容。最简单的实现使用平面索引——在查询向量和所有块向量之间进行暴力距离计算

分层索引:如果您需要从许多文档中检索信息,您需要能够有效地在其中搜索,找到相关信息,并将其综合为带有来源引用的单一答案。在大型数据库中做到这一点的有效方法是创建两个索引——一个由摘要组成,另一个由文档块组成,并分两步进行搜索,首先通过摘要筛选出相关文档,然后仅在这个相关组内搜索。
在这里插入图片描述
上下文丰富化:上下文丰富化是检索更小的块以提高搜索质量,但添加周围上下文让LLM进行推理。通常有两种做法——通过在检索到的较小块周围的句子扩展上下文,或者将文档递归地分割成包含较小子块的多个较大的父块。

句子窗口检索:在这个方案中,文档中的每个句子都分别嵌入,这提供了极高的查询与上下文余弦距离搜索的准确性。为了在找到最相关的单个句子后更好地推理所发现的上下文,我们通过在检索到的句子前后扩展k个句子的上下文窗口,然后将这个扩展的上下文发送给LLM
在这里插入图片描述
自动合并检索器(又称父文档检索器):这里的想法与句子窗口检索非常相似——搜索更精细的信息片段,然后在将这些上下文提供给LLM进行推理之前扩展上下文窗口。文档被分割成较小的子块,这些子块引用较大的父块。
在这里插入图片描述
在这种方法中,首先在更细粒度的子块上进行搜索,找到与查询最相关的块。然后,系统会自动将这些子块与它们所属的更大的父块结合起来。这样做的目的是在回答查询时为LLM提供更丰富的上下文。例如,如果一个子块是一段或一小节,父块可能是整个章节或文档的一大部分。这种方法既保留了检索精度(因为是在更小的块上搜索),同时也通过提供更广泛的上下文来增强LLM的推理能力。

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

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

相关文章

新标准日本语 课后练习

自学错误可能较多,听力题不需要听力的就没听录音 第二十課 スミスさんはピアノを弾くことができます 練習1-1 1張さんは日本の歌を歌うことができます 张先生会唱日本歌 2小野さんは自転車に乗ることがで…

Doris Manager 24.0 版本正式发布!

Cluster Manager for Apache Doris(简称 Doris Manager)是 SelectDB 推出的管理运维 Apache Doris 集群的工具。用户可以轻松通过该工具部署和接管集群,实时查看集群的运行状态和详情,快捷地对集群进行扩缩容、升级及重启操作。同…

App Inventor 2 计时器组件,时间相关的用法都在这里

1、计时器在界面设计中的哪里? 2、计时器怎么启动? 默认计时器是自动启用的,也可程序控制它的属性“启用计时”和“不启用计时”。 3、怎么确定计时器执行没? 定一个数字全局变量,计时方法里面自增,然后输…

2024 CVPR AIGC集合

完全外行,不建议参考 一、3D重建 PointAvatar: Deformable Point-based Head Avatars from Videos 对原始颜色进行解纠缠,得到固有反射和相关阴影。 基于可变形点云对表情、颜色、位置等信息进行建模。 总结:可以看作是对局部像素的分解与扩…

gcc原理和使用

gcc gcc是什么 GCC,全称 GNU Compiler Collection(GNU 编译器套件),是一套功能强大的编程语言编译器,由自由软件基金会(Free Software Foundation, FSF)作为GNU项目的一部分开发和维护。它最初…

【文献分享】机器学习 + 分子动力学 + 第一性原理 + 电导率 + 微观结构

​【文献分享】机器学习 分子动力学 第一性原理 电导率 微观结构 分享一篇关于机器学习 分子动力学 第一性原理 电导率 微观结构的文章。 感谢论文的原作者! 关键词: 1. Machine learning force field 2. Molecular dynamics 3. Solid state …

刷题日记——质因数的个数

题目 分析(从质数的判断角度出发)(递归) 判断n是否是质数需要: 遍历,i从2开始到sqrt(n),每次判断n是否能整除i,若能则不是质数,若不能则是 思路: 先判断n…

你也许不知道的 Confluence 快捷操作

Confluence 是一种企业知识管理和协作平台,用于创建、共享和组织团队的文档、知识和想法。它支持团队成员进行实时协作、评论和编辑文档,提供了强大的搜索功能,方便用户快速找到需要的信息。 Confluence 快捷键解析,标注了对应的…

SpringBoot多数据源(二)

SpringBoot多数据源AbstractRoutingDataSource(二) 1.多数据源配置2.多数据源调用流程3.实现 1.多数据源配置 spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource, 然后在运行时来动态的访问数据库 2.多数据源…

新型大数据架构之湖仓一体(Lakehouse)架构特性说明——Lakehouse 架构(一)

文章目录 为什么需要新的数据架构?湖仓一体(Lakehouse)——新的大数据架构模式同时具备数仓与数据湖的优点湖仓一体架构存储层计算层 湖仓一体特性单一存储拥有数据仓库的查询性能存算分离开放式架构支持各种数据源类型支持各种使用方式架构简…

1.总结串口的发送和接收功能使用到的函数2.总结DMA的作用,和DMA+空闲中断的使用方式3.使用PWM+ADC光敏电阻完成光控灯的实验

1.总结串口的发送和接收功能使用到的函数 串口发送函数:HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) UART_HandleTypeDef *huart:指定要使用的串口 const uint8_t *pData&…

数智时代的AI人才粮仓模型解读白皮书(2024版)

来源:极客邦 自 2023 年上半年起,ChatGPT 等大模型技术蓬勃发展,AI 技术不断突破边界,展现 出惊人的潜力和发展速度。从早期的逻辑推理、专家系统,到如今的深度学习、神经网络, AI 技术显著缩小了科学与实…

宝宝洗衣机买几公斤?四款精心挑选实用婴儿洗衣机推荐

家里有孩子的,条件允许的话,婴儿洗衣机还是非常有必要买的。由于宝宝的年纪还小,使得宝宝的皮肤比较娇嫩,与成人衣物分开洗护,可以为宝宝带来更加健康的生长环境,并且可以避免与大人衣物混洗所带来的细菌的…

线圈、寄存器、存储区代号、功能码 案例说明

线圈和寄存器 表示数据类型 线圈:表示Boolean数据类型 寄存器:表示非Boolean数据类型,用来暂时存放参与运算的数据和运算结果,具有接收数据、存放数据和输出数据的功能。 ModbusRTU 读输出线圈 存储区代号 0区 功能码 0x01 读输入…

【过程11】——教育被点燃的路上

这里写目录标题 一、背景二、过程1.两年四十万的认知改变2.三年打工仔的经历改变3.一年计算机的人生蜕变4.后面的展望 三、总结 一、背景 人生在世,对于一些事情的笃信笃行;背后真的会有莫大无以言表的波涛。 这个事情到现在已经五年半左右时间了&#…

数据的插入、修改和删除

一、 插入数据 1. 向表中所有字段插入数据 (1) 指定所有字段及其相对应的值 insert into 表名(字段1,字段2,……) values(字段值1,字段值2,……);**【案例】**向goods表中插入一条新记录 步骤1&#xff…

C语言【数组】

一、数组基本语法 1. 什么是数组 数组是c语言的一种数据结构,用于存储一组具有相同数据类型的数据; 数组中每个元素可以通过下标进行访问,索引从0开始,最大值为数组长度-1。 2. 数组的使用 类型 数组名[元素个数]; int arr[5]…

网络基础-TCP/IP和OSI协议模型

一、OSI和TCP/IP模型 二、OSI七层模型 三、TCP/IP模型 参考:https://www.cnblogs.com/f-ck-need-u/p/7623252.html

JS-42-Node.js01-Node.js介绍

一、浏览器大战 众所周知,在Netscape设计出JavaScript后的短短几个月,JavaScript事实上已经是前端开发的唯一标准。 后来,微软通过IE击败了Netscape后一统桌面,结果几年时间,浏览器毫无进步。(2001年推出…

最优贸易题解

图论学习总结-CSDN博客https://blog.csdn.net/smile__everydays/article/details/137881868?spm1001.2014.3001.5501点击上面连接根据目录即可找到最优贸易的题解