RAPTOR:递归摘要与树形检索的结合,提升RAG检索性能

随着 LLM 技术的发展,RAG 的价值也来越明显,可以视作 LLM 应用、落地的一个主要方向。RAG通过结合检索系统和生成模型,在生成回答时先从外部知识库种检索相关信息,辅助 LLM 进行更准确的生成。知识的粒度是多样的、零散的。如何从知识库中精准地检索到相关的知识片段是一个极具挑战性地问题。

概述

在目前构建 RAG 系统的流程中,基本都会涉及到对文档进行分块(有没有不需要进行分块的方法呢?)。现行的方式主要是通过滑动窗口进行分块,调一调分块的大小等。私以为,如何进行分块是一个很重要的问题。

目前检索增强的方法中的一个主要缺点,也是论文主要想解决的问题:检索到的主要是一些短的、连续的块。对于需要阅读整个文档才能回答的问题,检索到的块是不能包含足够的信息的。

论文的出发点很好,也是现在很多 RAG 系统的关键问题。分块的大小、如何分块是一个依赖于用户输入的问题。有些查询,只需要某个、某些块就可以回答,或者只需要块中的某句话就可以回答。而且,文本一般是涵盖多个主题的,并且具有层次化的结构

且看作者的解决方法 —— 作者设计了一个树结构的索引和检索系统 RAPTOR(Recursive Abstractive Processing for Tree-Organized Retrieval),捕捉文本的多尺度,不同层次的信息。通过对文本块进行总结,向 LLM 提供不同层次的信息。

RAPTOR方法介绍

RAPTOR 在文本块的基础上,构建了一个递归的树结构,树中的节点标识不同粒度的语义信息。

基本流程:

  • 分块与嵌入。

    • 按 100 的大小对文本进行分块,如果一个句子长度超过 100,则直接将句子作为一个文本块,保证块内语义的一致性。(如何断句也很重要!)
    • 对文本块进行 embedding。
  • 递归的构建 RAPTOR 树。文本块及其 embedding 作为树的叶子节点。
    • 通过聚类把相似的块聚在一起。
    • 利用语言模型为簇内的文本生成总结,并为总结生成 embedding,也作为树的一个节点。
    • 递归执行上述过程。
  • 查询。即如何检索相关的块。文中提供了两种策略:
    • Tree Traversal Retrieval。遍历树的每一层,剪枝并选择最相关的节点。
    • Collapsed Tree Retrieval。评估整个树中每个节点的相关性,找到最相关的几个。

RAPTOR 树构建流程:

RAPTOR 树的两种查询策略:

整个流程很简洁,方法也很直观。其中比较重要的环节不言而喻:聚类。

文中选择了软聚类的方式:每个节点可以从属于多个簇。直接上来看,如果簇作为话题,那么每个文本块并不是只属于每个话题的,选择软聚类也是很直观的。文中的聚类算法是基于 GMM 聚类的,且聚类前通过 UMAP(Uniform Manifold Approximation and Projection ) 对文本表征进行了降维。论文对聚类的过程进行了一些改造,并通过 BIC(Bayesian Information Criterion)来选择最优簇数,一些细节可以参考原文。

总结

我认为,论文想解决的问题是很关键的,也是构建 RAG 系统中一个必须要考虑的问题。论文的思路很直观,和笔者在相关的实践中可以说是不谋而合。对于一个查询,在不考虑性能和其他问题的条件下,最理想的块应该是文本中与查询最相关的那段话、几句话甚至一句话(这就有点像抽取式的文本摘要了)。 如何找到能够恰好包含答案的文本块是一个很有挑战性的工作,期待找到更好的方案。


RAPTOR:递归摘要与树形检索的结合,提升RAG检索性能的更多相关文章

  1. 数据检索|文献检索|事实检索|yandex|Title vs topic|检索技术|检索技巧|

    信息检索: 信息检索原理是,将书写不规范的原始数据先存储,再通过归纳化or标准化手段进行拆分,便于用户搜索. 信息检索类型可依据数据内容进行分类,文献检索是通过输入关键字进入搜索引擎,搜索仅找到含有关 ...

  2. Vue.js 递归组件实现树形菜单

    最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...

  3. vue之递归组件实现树形目录

    递归组件的应用===>可以通过组件命名来自己使用自己的组件 实例如下 父组件 <div class="content"> <detail-list :lis ...

  4. 公用表表达式CTE简单递归使用-简单树形结构

    1.建表脚本 CREATE TABLE [dbo].[tb_tree]( ,) NOT NULL, [ParentId] [int] NULL, ) NULL, CONSTRAINT [PK_tb_t ...

  5. vue递归组件 (树形控件 )

    首先我们要知道,既然是递归组件,那么一定要有一个结束的条件,否则就会使用组件循环引用,最终出现“max stack size exceeded”的错误,也就是栈溢出.那么,我们可以使用v-if=&qu ...

  6. java不需要递归列表转树形结构

    有时候我们需要将列表结构的数据转成树形结构的数据 废话不多说直接上代码 基础类 `@Data public class TreeNode { private Long id; private Long ...

  7. 递归生成treeview树形节点(没有用递归函数之后会有补充,这里只用系统的内置方法去生成)

    using System;using System.Collections.Generic;using System.ComponentModel;using System.IO;using Syst ...

  8. hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)

    hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 ...

  9. .Net调用Office Com组件的原理及问题检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败

    我是在本地32位操作系统+vs2010+office2007做创建并下载Excel,ppt文件的操作没有问题,发布到64位系统的服务器上报错,最开始报错:: 1:Retrieving the COM ...

  10. Python学习日记(十三) 递归函数和二分查找算法

    什么是递归函数? 简单来说就是在一个函数中重复的调用自己本身的函数 递归函数在调用的时候会不断的开内存的空间直到程序结束或递归到一个次数时会报错 计算可递归次数: i = 0 def func(): ...

随机推荐

  1. C# 双向链表的实现

    类数据 public class Objects { private int number; /**//* 货物编号 */ private string name; /**//* 货物名称 */ pr ...

  2. navicat 查看,设计并导出数据库 ER图

    转载请注明出处: 1. navicat 查看 ER 图,有两种方式: 第一种:选中数据库,并右键点击选中逆向数据库到模型. 第二种:可以在工具栏点击查看,选中 ER,打开 某数据库,便会展示 该数据库 ...

  3. 15-TTL与非门

    TTL与非门 集成电路有两大类COMOS和TTL(三极管) 电路结构 工作原理 多发射结的三极管,两个输入之间是与的关系 输入低电平 输入高电平 A.B都是高电平 倒置放大 压差大的先导通 T3,T4 ...

  4. expect 的简单学习与使用

    背景 最近工作中总有很多重复的事项. 比较繁琐,想着能够简单一点是一点的角度 准备采用expect来建华部分工作量. 其实还可以使用其他方式来处理. 但是感觉expect还是能够简单明了的. 所以暂时 ...

  5. 文盘Rust -- 安全连接 TiDB/Mysql

    作者:京东科技 贾世闻 最近在折腾rust与数据库集成,为了偷懒,选了Tidb Cloud Serverless Tier 作为数据源.Tidb 无疑是近五年来最优秀的国产开源分布式数据库,Tidb ...

  6. TypeScript中typeof的简单介绍

    简单介绍typeof 我们都知道js提供了typeof,用来获取基本数据的类型. 实际上,TS也提供了 typeof 操作符. 可以在 [类型上下文]中进行类型查询. 只能够进行变量或者属性查询. 定 ...

  7. MySQL知识点总结(完整版)

    MySQL学习笔记 登录和退出MySQL服务器 # 登录MySQL $ mysql -u root -p12345612 # 退出MySQL数据库服务器 exit; 基本语法 -- 显示所有数据库 s ...

  8. 【译】PEP-3129 类装饰器

    PEP原文 : https://www.python.org/dev/peps/pep-3129 PEP标题: Class Decorators PEP作者: Collin Winter 创建日期: ...

  9. 每日一库:cobra 简介

    当你需要为你的 Go 项目创建一个强大的命令行工具时,你可能会遇到许多挑战,比如如何定义命令.标志和参数,如何生成详细的帮助文档,如何支持子命令等等.为了解决这些问题,github.com/spf13 ...

  10. 给python脚本传递命令行参数

    记录一下给python脚本传参数的几种方式 最简单的方式 在cmd/bat脚本中调用python脚本传递参数 #传递参数 python test.py arg1 arg2 arg3 #在python中 ...