大模型RAG问答中的文档分段

news2024/11/25 20:56:51

昨天,我们谈了句子分段,我们再来回顾一下段落的分段方法,目前已经有其他方案,图来自于:https://www.rungalileo.io/blog/mastering-rag-advanced-chunking-techniques-for-llm-applications,可以看到其中的一些优劣势;

例如:

1、递归分块:文档根据段落分隔符、新行、空格和单个字符等分隔符的层级进行分割,使用Langchain的RecursiveCharacterTextSplitter函数(https://api.python.langchain.com/en/latest/character/langchain_text_splitters.character.RecursiveCharacterTextSplitter.html)。

图片

2、语义分块:段落块被嵌入了OpenAI的text-ada-embedding-002。通过识别相邻块嵌入距离发生显著变化的断点来分割文本,如果两个连续段落的嵌入向量之间的距离超过了某个阈值,这可能表明它们在语义上有很大的不同,因此可以在这个位置设置断点。当然,这个的核心点在于阈值。

一旦确定了断点,就可以根据这些断点将文本分割成独立的块。每个块在语义上相对独立,但可能仍然与前一个或后一个块有联系。这对于在更大的文本体中识别连贯且相关的信息块非常有用。

这块可以参考:https://github.com/agamm/semantic-split

图片

3、命题分块:这其实已经是基于大模型的方式来切分了。文本按照论文 《Dense X Retrieval》(https://arxiv.org/abs/2312.06648) 中介绍的方式进行分割,其是一种新的检索单元——命题(proposition),就是将一个文本送入到chagpt等大模型中,生成命题,,核心在于prompt的设计:

图片

然后,在检索生成阶段,将其作为混合来源之一参与召回。

图片

问题2:基于大模型进行动态分块的LumberChunker思想

而针对较长规模的叙事文本而言,也有另一个工作,《LumberChunker: Long-Form Narrative Document Segmentation》(https://arxiv.org/pdf/2406.17526) 这个工作提出了一个名为LumberChunker的文本分割方法,利用大型语言模型(LLM)动态地将长篇叙事文档分割成语义独立的部分。

我们可以重点看几个点:

1、先看实现思想

这种方法的核心思想是,通过允许内容块具有动态大小,可以更好地捕捉内容的语义独立性,从而提高检索效率。LumberChunker通过迭代地提示LLM,在一系列连续段落中识别内容开始转变的点,确保每个分割后的块在语义上是连贯的,但与相邻块有所区别,从而增强了信息检索的有效性。

如下图所示,LumberChunker遵循一个三步流程。

图片

首先,按段落对文档进行分割。将目标文档按照段落进行分割,每个段落被赋予一个唯一的递增ID编号。

其次,通过追加连续的块,创建一个组(Gi),直到超过预定义的标记计数θ;将这些段落按顺序串联起来,直到它们的总标记数超过预定义的阈值θ。

值得注意的是,这个阈值θ是一个经验值,旨在避免将相关较大的段落分割开,同时确保它不会太大以至于用过多的上下文超出模型最大长度,影响其推理准确性。例如,实验表明,θ=550时,LumberChunker在所有测试的k值上都达到了最高的DCG@k得分,表明大约550个标记的提示在捕获上下文和段落长度之间实现了有效平衡。

最后,将段落组合Gi作为输入提供给LLM(例如Gemini 1.0-Pro),并指示LLM找出Gi中内容与前文显著不同的特定段落。这种检测标志着一个块的结束。

这个的细节在于prompt的设计:

图片

文档继续以循环方式被分割成块,每个新的Gi+1组的起始点是前一次迭代中识别出的段落。这个过程在整个文档中重复进行。

2、再看其实现效果

为了评估LumberChunker的性能,作者们创建了一个新的基准测试GutenQA,它包含3000对问题-答案对,这些数据对是从Project Gutenberg网站上的100本公共领域叙事书籍中手动提取的。

其中关于其RAG的设计框架也有一些借鉴的点:

构建了一个特别为传记类书籍量身定制的基于RAG的问答流程,采用了一种混合检索格式,结合了OpenAI text-ada-embedding-002密集嵌入和BM25。

图片

如图4所示:

1)查询路由和文档集成(Query Routing and Document Integration): 每个查询都经过一个检测器的评估,该检测器识别人名或事件的提及。如果检测器在查询中识别到相关提及,使用BM25算法检索前3个最相关的块。

如果没有检测到相关提及(承认偶尔的检测器失败),则作为预防措施检索单个文档

同时,通过密集检索机制检索前15个块。这一步旨在通过访问BM25可能错过的深层语义关系来提高检索质量。

此外,其还实现了BM25检索的文档和密集检索的文档之间的交集检查,并删除了BM25中的重叠文档以避免冗余。然后,将BM25检索到的排名最高的文档优先放置在检索列表的顶部,第二和第三个(如果有的话)放在最后,确保检索策略的混合

2)文档重新排序和重新排名(Document Re-Ordering and Re-Ranking):检索到的块被集成到ChatGPT(gpt-3.5-turbo)的上下文窗口中。如果上下文包含六个或更多的块,则采用一种策略,从中间点开始反转块的顺序。 这种重新排序旨在潜在地最小化模型的“中间丢失”问题,即模型对于长上下文中位于中间位置的信息的性能下降,但开始朝着末端恢复,形成一个U形的性能曲线。然后提示ChatGPT根据它们与查询的相关性递减来识别和重新排序文档。

3)最终答案生成(Final Answer Generation):在这最后一步生成响应。模型确定的前5个文档被保留用于最终答案生成。模型从顶级文档中综合信息,形成一个连贯且上下文准确的答案,旨在全面解决查询。

实验结果表明,LumberChunker在检索性能上超越了其他竞争性基线方法7.37%(在DCG@20指标上),并且当集成到RAG(检索增强生成)流程中时,LumberChunker证明比其他分块方法和竞争性基线(例如Gemini 1.5M Pro)更有效。

3、最终看看其方案评价

但是,其缺陷也很明显。正如该工作所说的,LumberChunker的局限性,包括它需要使用LLM,这使得它比其他传统方法更昂贵和更慢。

此外,LumberChunker是为叙事文本设计的,这些文本结构松散,能从语义文本解释中受益。然而,在处理像法律领域这样高度结构化的文本时,LumberChunker可能是一个过于复杂的解决方案。

代码:https://github.com/joaodsmarques/LumberChunker

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

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

相关文章

Java17-时间类、包装类

目录 Date类 概述 常用方法 SimpleDateFormat类 概述 构造方法 格式规则 常用方法 Calendar类 概述 常用方法 get方法示例 set方法示例 add方法示例 JDK8时间相关类 ZoneId 时区 Instant 时间戳 ZoneDateTime 带时区的时间 DateTimeFormatter 用于时间的格式…

【Lua】第一篇:在Linux系统中安装搭建lua5.4.1环境

文章目录 一. 远程下载安装包二. 解压安装包三. 编译安装Lua环境 一. 远程下载安装包 输入以下命令即可在当前目录下,远程下载安装包lua-5.4.1.tar.gz: wget http://www.lua.org/ftp/lua-5.4.1.tar.gzPS:其他版本的安装包如下,可…

Django 模版继承

1&#xff0c;设计母版页 Test/templates/6/base.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 修正了模板标签的全角字符问题 -->{% block title %}<title>这个是母版页</title>{…

教师资格证(教资)笔试如何备考?含备考资料

教师资格证&#xff08;教资&#xff09;笔试如何备考&#xff1f;含备考资料 前言 教师&#xff0c;一直以来的热门职业&#xff0c;而要成为一名教师&#xff0c;考取教师资格证则是基本条件&#xff0c;那么教资笔试如何备考呢&#xff1f;&#xff0c;这里准备笔试备考攻…

南方空调企业疑似暗讽对手用铝代铜,偷工减料,空调不耐用

空调行业卷到何种程度了&#xff1f;已经开始偷工减料了&#xff0c;日前南方一家空调企业的老板就公开指出一些企业用铝管替代铜管&#xff0c;如此做后果将是导致空调的耐久性和稳定性不足&#xff0c;其实还有散热效果不好&#xff0c;导致耗电量、制冷效果下降。 今年空调的…

Spring-循环依赖是如何解决的

1、bean被创建保存到spring容器的过程 1、实例化 -> 获取对象&#xff1b; 2、填充属性&#xff1b;这里可能需要依赖其它的bean。 3、AOP代理对象替换&#xff1b; 4、加入单例池&#xff1b; 问题&#xff1a; 循环依赖怎么处理 ServiceA 中有属性ServiceB b&#…

记一次小程序渗透

这次的小程序渗透刚好每一个漏洞都相当经典所以记录一下。 目录 前言 漏洞详情 未授权访问漏洞/ 敏感信息泄露&#xff08;高危&#xff09; 水平越权&#xff08;高危&#xff09; 会话重用&#xff08;高危&#xff09; 硬编码加密密钥泄露&#xff08;中危&#xff0…

FFmpeg 命令行 音视频格式转换

&#x1f4da;&#xff1a;FFmpeg 提供了丰富的命令行选项和功能&#xff0c;可以用来处理音视频文件、流媒体等&#xff0c;掌握命令行的使用&#xff0c;可以有效提高工作效率。 目录 一、视频转换和格式转换 &#x1f535; 将视频文件转换为另一种格式 &#x1f535; 指定…

代码随想录--字符串--替换数字

题目 给定一个字符串 s&#xff0c;它包含小写字母和数字字符&#xff0c;请编写一个函数&#xff0c;将字符串中的字母字符保持不变&#xff0c;而将每个数字字符替换为number。 例如&#xff0c;对于输入字符串 “a1b2c3”&#xff0c;函数应该将其转换为 “anumberbnumber…

cesium使用cesium-navigation-es6插件创建指南针比例尺

cesium-navigation-es6 是一个为 Cesium.js 提供导航控件的库&#xff0c;它提供了一些常见的用户界面组件&#xff0c;用于在 Cesium 场景中实现用户导航和交互。下面将介绍如何在项目中使用 cesium-navigation-es6。 使用步骤 1. 安装 cesium-navigation-es6 首先&#xf…

flex讲解

随着前端技术的不断发展和更新&#xff0c;flex布局成为前端布局的主流。但是仍然有很多前端新手搞不懂flex到底怎么用&#xff01;&#xff01;&#xff01;今天我们就来好好讲讲flex布局 老规矩先上定义 什么是flex布局 布局的传统解决方案&#xff0c;基于盒状模型&#x…

K8S 集群节点扩容

环境说明&#xff1a; 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233&#xff08;需上线&#xff09;192.168.99.2332C4Gwoker1.23.1720.10.24 当现有集群中的节点资源不够用&…

kinect2.0问题:四、DiscreteGestureBasics-WPF更换自己的gbd文件后报错

1、报错状况 “System.InvalidOperationException”类型的异常在 Microsoft.Kinect.VisualGestureBuilder.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: This API has returned an exception from an HRESULT: 0x800040052、解决方案 原设置 改成下图就不报错了…

【面试题】信息系统安全运维要做什么

信息系统安全运维是确保信息系统稳定、可靠、安全运行的一系列活动和措施。 其主要包括以下几个方面&#xff1a; 1.系统监控&#xff1a; 实时监测信息系统的运行状态&#xff0c;如服务器的性能指标、网络流量、应用程序的运行情况等。通过监控工具&#xff0c;及时发现系统…

1966 ssm 流浪猫领养网站系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 流浪猫领养网站系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/…

产品经理系列1—如何实现一个电商系统

具体笔记如下&#xff0c;主要按获客—找货—下单—售后四个部分进行模块拆解

机器学习原理和代码实现专辑

1. 往期文章推荐 1.【机器学习】图神经网络(NRI)模型原理和运动轨迹预测代码实现 2. 【机器学习】基于Gumbel-Sinkhorn网络的“潜在排列问题”求解 3. 【机器学习】基于Gumbel Top-k松弛技术的图形采样 4. 【机器学习】基于Softmax松弛技术的离散数据采样 5. 【机器学习】正则…

MySQL高级-MVCC-原理分析(RR级别)

文章目录 1、RR隔离级别下&#xff0c;仅在事务中第一次执行快照读时生成ReadView&#xff0c;后续复用该ReadView2、总结 1、RR隔离级别下&#xff0c;仅在事务中第一次执行快照读时生成ReadView&#xff0c;后续复用该ReadView 而RR 是可重复读&#xff0c;在一个事务中&…

INFINI Easysearch尝鲜Hands on

INFINI Easysearch 是一个分布式的近实时搜索与分析引擎&#xff0c;核心引擎基于开源的 Apache Lucene。Easysearch 的目标是提供一个自主可控的轻量级的 Elasticsearch 可替代版本&#xff0c;并继续完善和支持更多的企业级功能。 与 Elasticsearch 相比&#xff0c;Easysear…

从一到无穷大 #30 从阿里云盘古的屠龙之术看使用blob storage作为统一存储层的优势

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言盘古演进过程盘古2.0 第一阶段Append-Only File System统一持久化层与ClientClie…