RAG知识库之针对长文档的Raptor索引

news/2025/3/17 6:30:43/文章来源:https://www.cnblogs.com/softlin/p/18339788

      在现有的朴素RAG应用中其只是简单的对文档进行分块后存储的向量库中,然后在使用是根据 提问问题 从查询向量库中查询相识度较高的文档快作为问题上下文提交到LLM让其根据上下文去回答用户所提问的问题。对于小文本可以直接将整个文档作为上下文或使用上篇文章所提到的多表示索引(Multi-representation indexing)进行Context上下文的优化处理。
      朴素RAG分块大小、文本叠加值设置都对向量检索质量有着重要的影响,如文档太多可能会丢失长尾知识,缺乏对整个文档上下文的理解从而影响到RAG的质量;如针对某篇长小说文档提问主角出生经历对其结尾的结局产生了什么影响?通常小说前面几张描述的是主角出生与经历结尾描述的是其结局,文档过长不可能将整个文档作为问题上下文,异无法理解整篇文档,而只是使用 从向量库中检索到相识度最高的top K文本块最为问题上下文
      Raptor使用树形结构来捕获文本的高层级和低层级细节,其对文本块进行递归聚类、生成聚类的文本摘要总结自下而上生成一棵树,所生成的 Raptor能够作为问题上下文代表了不同级别的问题,可以回答不同层级的问题。

image.png

      图为Raptor所生成的树结构,从下往上递归生成,此树为三个层级从文本块上一层级算起。文本1、文本2、文本3、文本4为叶子结点使用长文档分割而成,先对文本块进行文本词嵌入,然后使用UMAP对嵌入向量进行降维接着使用高斯混合模型(GMM) 对降维后的向量进行聚类,嵌入词向量通常维度较高直接使用GMM可能会表现不佳所以须先 UMAP(Uniform Manifold Approximation and Projection)降维。聚类时使用软聚类,因为每个文本块通常包含多个主题信息所以一个文本块属于多个聚类主题更加合理,保证总结摘要包含多个主题信息。

      1、对文档初始分割后的文本块嵌入向量后进行降维后使用GMM聚类
      2、合并同一个聚类中的文本块使用LLM对该聚类文本块进行总结摘要
      3、如生成的聚类数大于1与层级小于指定层级则重复1、2、3、操作递归对上层级 生成的总结摘要进行:嵌入、聚类、生成摘要;

image.png

      此图为Raptor算法总体流程与层级1内部数据结构图具体流程如下:

      1、先将长文档分割为文本块。
      2、对文本块进行此嵌入,UMAP降维后使用GMM生成聚类。
      3、合并同聚类文本块,使用LLM对每个聚类文本块进行总结摘要。
      4、根据条件判断是否递归重复1、2、3流程。
      5、Raptor树折叠展平获取总结摘要列表写入向量存储。
      6、原始文本块写入向量存储。

      而本篇文章所描述的RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval)正能够避免出现这种情况,可以说其是为了大文本而生的。Raptor通过递归的对长文本块进行嵌入、聚类总结从而构造了一棵具有对该文档具有不同层级总结的树结构从而能够更全面的理解与整合该长文档信息。

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

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

相关文章

《花100块做个摸鱼小网站! 》第一篇—买云服务器和初始化环境

一、前言 大家好呀,我是summo,前面我已经写了我为啥要做这个摸鱼小网站的原因,从这篇文章开始我会一步步跟大家聊聊我是怎么搭起这个网站的。我知道对很多新手来说,建网站可能挺头大的,不知道从哪里开始,所以我会尽量写得简单明了,让大家一看就懂,少走弯路。 咱们先从买…

Outlook如果有多个邮箱,个别邮箱设定不接收邮件的设定方法

背景:大家是不是经常用到outlook的时候,因为种种原因,某个邮箱暂时不用,或者之前的工作邮箱因为离职而导致无法正常登录,但是很多有用的邮件或者回忆都在这个邮箱里,因此不忍心删除掉,并且又不想总是被提示“邮箱登录异常……”等弹出框,现在告诉大家一个解决办法。 1、…

【解决方案】Java 互联网项目中消息通知系统的设计与实现(下)

书接上回,消息通知系统(notification-system)作为一个独立的微服务,完整地负责了 App 端内所有消息通知相关的后端功能实现。该系统既需要与文章系统、订单系统、会员系统等相关联,也需要和其它业务系统相关联,是一个偏底层的通用服务系统。目录前言四、技术选型五、后端…

查看matplotlib中默认字体

import matplotlib.pyplot as plt# 显示默认字体的属性 font_properties = plt.matplotlib.font_manager.FontProperties() print(font_properties.get_name()) # 默认字体名称 print(font_properties.get_size()) # 默认字体大小 print(font_properties.get_family()) # 默…

分享一个 BACnet 调试工具 工程师必备

BACnet 调试工具 工程师必备 官网地址 BACnet(Building Automation and Control Networks)是由美国采暖、制冷与空调工程师学会(American Society of Heating, Refrigerating and Air-Conditioning Engineers,简称ASHRAE)开发和维护的。ASHRAE 是一个专业协会,致力于采暖…

读零信任网络:在不可信网络中构建安全系统09用户信任

用户信任1. 用户信任 1.1. 将设备身份和用户身份混为一谈会导致一些显而易见的问题1.1.1. 特别是当用户拥有多台设备时,而这种情况很普遍1.1.2. 应该针对不同类型的设备提供相匹配的凭证1.1.3. 在存在共用终端设备的情况下,所有的这些问题将更加凸显1.2. 需要将用户的识别和信…

Golang语言之管道channel快速入门篇

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.channel的基本使用1.channel概述2.管道入门案例2.1 有缓冲管道和无缓冲管道概述2.2 有缓冲管道2.3 无缓冲管道3.管道的关闭3.1 管道关闭操作结果概述3.2 管道关闭案例3.3 判断通道是否关闭4.管道的遍历…

Golang语言之channel快速入门篇

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录五.channel1.channel概述2.管道入门案例2.1 有缓冲管道和无缓冲管道概述2.2 有缓冲管道2.3 无缓冲管道3.管道的关闭3.1 管道关闭操作结果概述3.2 管道关闭案例3.3 判断通道是否关闭4.管道的遍历5.协程和管…

《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统

《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统 视频讲解【第1季】8.第8章_激光SLAM系统-视频讲解【第1季】8.1.第8章_激光SLAM系统_Gmapping算法-视频讲解【第1季】8.2.第8章_激光SLAM系统_Cartographer算法-视频讲解【第1季】8.3.第8章_激光SLAM系统_LOAM算法-视…

Sharding-JDBC 几行配置实现读写分离~

Sharding-JDBC 几行配置实现读写分离~ 2022-05-252,435阅读6分钟 大家好,我是不才陈某~ 今天聊一下如何通过Sharding-JDBC简单的实现读写分离~ 为什么要读写分离? 读写分离则是将事务性的增、改、删操作在主库执行,查询操作在从库执行。 一般业务的写操作都是比较耗时,为了…

redis为什么用单线程不用多线程

1.线程上下文切换开销。 2.线程之间共享变量,加锁解锁开销。瓶颈不在cpu而是在内存和网络io带宽。 3.多线程代码复杂。

全网最适合入门的面向对象编程教程:32 Python 的内置数据类型-类 Class 和实例 Instance

在Python中,类(Class)是创建对象(实例,Instance)的模板。类定义了对象的属性和行为,而实例是类的具体对象,具有独立的属性值。全网最适合入门的面向对象编程教程:32 Python 的内置数据类型-类 Class 和实例 Instance摘要: 在Python中,类(Class)是创建对象(实例,…