RAG总结及前沿之Meta-Chunking切分思路及VisRAG多模态实现机制解读

news2024/10/22 14:09:18

今天我们来看两个工作,一个是关于RAG的切分策略,Meta-Chunking,里面基于数学常识提到的边际采样分块(Margin Sampling Chunking)通过LLMs对连续句子是否需要分割进行二元分类,基于边际采样得到的概率差异来做出决策,和困惑度分块(Perplexity Chunking):通过分析困惑度分布特征来精确识别文本块边界的思路值得看看,此外,我们再回顾下切分的一些现有方法跟优缺点。

另一个是直接的文档多模态思路,VisRAG,其中提到的文档图像向量化、召回思路,尤其是为了处理多个检索到的页面,提出的三种机制:页面拼接、加权选择和多图像VLM。页面拼接将所有页面水平拼接成一个图像;加权选择为每个页面生成一个答案,并根据置信度选择最终答案;多图像VLM可以直接接受多个图像作为输入,适用于跨图像推理,是个思路。

多看,多思考,多总结,供大家一起参考并思考。

一、Meta-Chunking文本切分方法

文本分块是RAG落地过程中的一个重要步骤,我们之前也讲过多重方案。

传统的文本分块方法主要基于规则或语义相似性,但这些方法在捕捉句子间细微的逻辑关系方面存在不足。

LumberChunker利用LLMs识别内容开始偏离的位置,但其对LLMs的指令跟随能力要求较高,资源消耗和时间成本较大。

先回顾下已有的方法。

一个是基于规则的分块方法,这种方法将长文本分割成固定长度的段落,例如两百个中文字或单词,不考虑句子边界,例如,Llama index在分割时同时考虑句子的完整性和令牌数量。它优先保持句子边界,同时确保每个块中的令牌数量接近预设阈值。可以使用Llama index中的SimpleNodeParser函数,通过调整块大小参数来控制段落长度。重叠部分通过使用块重叠参数动态重叠段落来处理,确保在分割和重叠过程中保持句子的完整性。

一个是动态分块方法,例如相似性分块使用预训练的句子嵌入模型计算句子之间的余弦相似度。通过设置相似度阈值,选择相似度较低的句子作为分割点,确保每个块内的句子在语义上高度相关。这种方法可以使用Llama index中的SemanticSplitterNodeParser。对于英文文本,可以利用bge-large-en-v1.5模型,对于中文文本,则使用bge-base-zh-v1.5模型。通过调整相似度阈值来控制文本块的大小。

也可以直接利用大模型来进行分块,例如LumberChunker,利用LLMs的推理能力来预测文本中合适的分割点,例如使用具有15亿和72亿参数的Qwen2模型,设置为全精度。

对应的prompt如下:

进一步的,可以看一个新思路,《Meta-Chunking: Learning Efficient Text Segmentation via Logical Perception,designed two strategies based on LLMs: Margin Sampling Chunking and Perplexity Chunking》,https://arxiv.org/abs/2410.12788,提出关于chunk的方案,Meta-Chunking是指在句子和段落之间的粒度,包含段落内具有深度语言逻辑连接的句子集合,通过引入Meta-Chunking,可以在文本分块过程中更好地保持逻辑连贯性。

设计了两种基于LLMs的策略,一种是边际采样分块(Margin Sampling Chunking):通过LLMs对连续句子是否需要分割进行二元分类,基于边际采样得到的概率差异来做出决策;

另一种是困惑度分块(Perplexity Chunking):通过分析困惑度分布特征来精确识别文本块边界。这种方法通过计算每个句子的困惑度,并分析这些困惑度的分布特征来确定文本块的边界。

先说结论:Meta-Chunking通过识别句子间的深层语言学和逻辑联系,生成逻辑上更加连贯的文本块,这个符合直觉,但也存在一些局限性,特别是在模型依赖性和计算资源需求方面,此外,性能在很大程度上依赖于LLMs的质量和能力,如果模型本身对某些类型的文本理解不足,可能会影响分块的效果。

来看下其实现步骤:

Meta-Chunking的整个过程概述如下图所示:

每个圆圈代表一个完整的句子,句子长度不一致。垂直线表示分段的位置。图底部的两侧揭示了Margin Sampling Chunking和Perplexity Chunking。具有相同背景颜色的圆圈代表一个元块,动态组合以使最终块长度满足用户需求。

1、Margin Sampling Chunking

Margin Sampling Chunking的核心思想是利用LLMs对连续句子是否需要分割进行二元分类,并基于分类结果中的概率差异来决定是否进行分块。

步骤如下:

1)句子分割:首先将文本分割成一系列句子,记为 (x_1, x_2, …, x_n)。

2)二元分类:对于每个句子 (x_i),使用LLMs进行二元分类,判断它是否应该与前一个句子 (x_{i-1}) 分开,对应的prompt如下:

3)概率差异计算:通过边际采样(Margin Sampling)方法计算出两个分类(是/否分割)的概率差异,记为 (MarginM(x_i))。

4)阈值比较:将计算出的概率差异 (MarginM(x_i)) 与预设的阈值 (\theta) 进行比较。如果 (MarginM(x_i)) 大于 (\theta),则将 (x_i) 与 (x_{i-1}) 分开;否则,将它们合并为一个块。

5)动态阈值调整:阈值 (\theta) 可以动态调整,初始值设为0,然后根据历史的概率差异 (MarginM(x_i)) 计算平均值来更新 (\theta)。

2、Perplexity Chunking

Perplexity Chunking的出发点是通过分析句子的困惑度(Perplexity,PPL)分布特征来精确识别文本块的边界。

困惑度是衡量语言模型对文本预测能力的一个指标,困惑度越低,表示模型对文本的预测越准确。对于大规模文本处理任务,增加上下文长度有助于LLMs做出更有效的逻辑推理和语义理解,从而降低了PPL。这表明高PPL可能反映了LLMs对真实内容的认知幻觉,这些部分不应被分块。

步骤如下:

1) 句子分割:与Margin Sampling Chunking类似,首先将文本分割成一系列句子;

2)困惑度计算:对于每个句子 (x_i),基于前面的文本来计算其困惑度 (PPLM(x_i));

3)寻找最小值:通过分析困惑度序列 (PPLseq = (PPLM(x_1), PPLM(x_2), …, PPLM(x_n))) 的分布特征,尤其是寻找序列中的最小值点。这些最小值点被视为潜在的分块边界;

4) 确定分块边界:如果某个句子 (x_i) 的困惑度 (PPLM(x_i)) 小于其前一个和后一个句子的困惑度(即 (PPLM(x_{i-1})) 和 (PPLM(x_{i+1}))),并且差异超过设定的阈值 (\theta),则将 (x_i) 作为分块的边界;

5) 处理长文本:对于超出LLMs处理范围的长文本,引入关键值(KV)缓存机制。在计算困惑度时,适时移除前面部分文本的KV对,以避免GPU内存溢出,同时尽量保持上下文连贯性。

第二种思路很符合直接,很有趣,我们来清洗预训练数据时候,也经常用到这种思路。

二、关于多模态文档RAG思路VisRAG

多模态的文档RAG目前也出现了许多思路,而现有的RAG系统主要基于文本,无法有效利用视觉信息如布局和图像,这些信息在现实世界中的多模态文档中起着至关重要的作用,因此一种思路是采用基于视觉的RAG方法(VisRAG),通过使用视觉语言模型(VLM)直接处理文档图像,从而保留原始文档中的所有信息。

例如下图所示:

文本检索增强生成(TextRAG)在左侧,与基于视觉的检索增强生成(VisRAG)在右侧的对比。传统的基于文本的检索增强生成(TextRAG)依赖于解析后的文本进行检索和生成,这在多模态文档中会丢失视觉信息。

一个具体的例子如下:

最近的工作《VisRAG: Vision-based Retrieval-augmented Generation on Multi-modality Documents》(https://arxiv.org/abs/2410.10594, https://github.com/openbmb/visrag)可以看看,核心在于如何做多模态数据检索,并融合做生成,从实现思路上,包括两个阶段:

一个是检索阶段: VisRAG-Ret使用双编码器范式,但采用VLM而不是LLM来编码查询和文档。具体来说,查询和文档分别作为文本和图像输入到VLM中,生成一系列隐藏状态,然后通过位置加权平均池化得到最终的嵌入。相似度得分通过余弦相似度计算,优化使用InfoNCE损失。

另一个是生成阶段: VisRAG-Gen使用VLM生成答案。为了处理多个检索到的页面,提出了三种机制:页面拼接、加权选择和多图像VLM。页面拼接将所有页面水平拼接成一个图像;加权选择为每个页面生成一个答案,并根据置信度选择最终答案;多图像VLM可以直接接受多个图像作为输入,适用于跨图像推理。

我们来详细看下具体实现细节:

1、检索(Retrieval)

VisRAG的检索阶段(VisRAG-Ret)的目标是给定一个查询q,从文档库D中检索出一组页面。这一阶段采用了双编码器(dual-encoder)范式,但与基于文本的密集检索模型不同,VisRAG使用VLM而不是LLM来编码查询和页面。

编码过程:查询和页面在VLM中分别作为文本和图像进行编码,生成一系列隐藏状态;

嵌入获取:为了得到最终的嵌入,采用了位置加权平均池化(position-weightedmeanpooling)在最后一层VLM隐藏状态上,给予后续的token更高的权重;

相似性评分:通过余弦相似度计算查询和页面嵌入之间的相似性得分;

优化损失:VisRAG-Ret使用InfoNCE损失进行优化,该损失函数考虑了正文档和负文档集合。

2、生成(Generation)

VisRAG的生成阶段(VisRAG-Gen)关注于根据用户查询和检索到的页面使用VLM生成答案。针对多页检索结果,VisRAG提出了以下机制:

页面拼接(PageConcatenation):将检索到的所有页面在DR中拼接成单个图像,以适应大多数只接受单个图像输入的VLM。这通常通过水平拼接实现;

加权选择(WeightedSelection):对于从top-k页面中生成的每个页面的答案,选择置信度最高的答案作为最终答案。最终置信度定义为生成答案的概率的加权和;

接受多个图像的VLM:一些最新的VLM,如MiniCPM-V2.6和Qwen-VL2,被设计和训练为接受多个图像输入以执行跨图像推理。这对于生成可能是有益的,因为所需信息可能位于检索文档集DR的单个页面上,或者对于多跳问题,信息可能分布在多个页面上。

这一步可以看看模型的微调思路,采用的是GPT-4o:

也适用GPT4-O来做图像内容描述:

总结

本文主要介绍了两个工作,一个是知识图谱用于RAG查询扩展的思路,属于知识图谱与RAG的结合范畴,一个是关于RAG发展的一个阶段性综述,提到的几个演化的点和未来的方向,值得看看。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

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

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

相关文章

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有,个人中心,用户管理,中介管理,房屋信息管理&#xff…

Nest.js 实战 (十五):前后端分离项目部署的最佳实践

☘️ 前言 本项目是一个采用现代前端框架 Vue3 与后端 Node.js 框架 Nest.js 实现的前后端分离架构的应用。Vue3 提供了高性能的前端组件化解决方案,而 Nest.js 则利用 TypeScript 带来的类型安全和模块化优势构建了一个健壮的服务端应用。通过这种技术栈组合&…

信雅纳Chimera 100G网络损伤仪助力Parallel Wireless开展5G RAN无线前传网络的损伤模拟

背景介绍 Parallel Wireless 为移动运营商提供唯一全覆盖的(5G/4G/3G/2G)软件支持的本地 OpenRAN (ORAN) 解决方案。该公司与全球 50 多家领先运营商合作,并被 Telefonica 和 Vodafone 评为表现最佳的供应商。Parallel Wireless 在多技术、开放式虚拟化…

【多视图聚类】【ICCV 2023】基于交叉视图拓扑一致互补信息的深度多视图聚类

0.论文摘要 多视图聚类旨在从不同的来源或视角提取有价值的信息。多年来,深度神经网络在多视图聚类中展示了其优越的表示学习能力,并取得了令人印象深刻的性能。然而,大多数现有的深度聚类方法致力于合并和探索跨多个视图的一致潜在表示&…

Java网络编程的基础:计算机网络

在学习 Java 网络编程之前,我们先来了解什么是计算机网络。 计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。 下面是一张简化的网络拓扑图…

工业以太网之战:EtherCAT是如何杀出重围的?

前言 EtherCAT 是一种开放的实时工业以太网协议,由德国倍福公司开发并在 2003 年 4 月的汉诺威工业博览会上首次亮相,目前由 EtherCAT 技术协会(ETG)进行维护和推广。经过 21 年的不断发展,EtherCAT 显示出极强的生命…

2.1_Linux发展与基础

Linux基础知识 Shell 命令执行环境: 命令提示符的组成:(用户名主机名)-[当前路径]权限提示符,例:(kali㉿kali)-[~]$ ~ 表示所在目录为家目录:其中root用户的家目录是/root,普通用户的家目录在/home下 # 表示用户的权…

Python酷库之旅-第三方库Pandas(148)

目录 一、用法精讲 671、pandas.Timestamp.day_name方法 671-1、语法 671-2、参数 671-3、功能 671-4、返回值 671-5、说明 671-6、用法 671-6-1、数据准备 671-6-2、代码示例 671-6-3、结果输出 672、pandas.Timestamp.dst方法 672-1、语法 672-2、参数 672-3、…

JAVA二手交易发布闲置好物回收系统小程序源码

🎉二手交易新风尚!发布闲置好物,回收系统助你环保又赚钱✨ 🏠闲置物品大变身,开启绿色生活新篇章🌿 嘿宝贝们!是不是家里总有一些东西,明明还很新却因为种种原因被束之高阁&#x…

PROFINET开发或EtherNet/IP开发嵌入式板有用于工业称重秤

这是一个真实案例,不过客户选择不透露其品牌名称。稳联技术的嵌入式解决方案助力工业称重设备制造商连接至任意工业网络。多网络连接使得称重设备能够轻松接入不同的控制系统,进而加快产品的上市时间。 我们找到了稳联技术的解决方案。他们成熟的技术与专…

使用Shell脚本对Java应用等服务进行启停控制(支持批量)

通过shell脚本对Java服务启停进行控制。支持单个服务和多个服务的 start、stop、status、restart。支持自定义启动命令。(不限于Java服务,适用于各类通过命令行启动的服务) 脚本名称为 runjar.sh , 底部提供源码。通过三部分进行说明&#xf…

【Dv2Admin】Django配置线上ws反向代理

在 Web 应用程序的部署过程中,安全性、稳定性和实时通信是开发者们普遍关注的重点。Django 是一个非常流行的 Web 框架,常与 Nginx 配合使用,以便实现反向代理、负载均衡以及 SSL 加密等功能。除此之外,实时功能(如 WebSocket)也是现代应用中经常使用的技术。 在项目中实…

用户一键注册登录(一)- 对接短信平台

1. 流程图 2. 详细设计 2.1 用户表结构设计 CREATE TABLE users (id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,mobile varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 手机号,nickname varchar(16) CHARACT…

回忆Web编程的岁月变迁

目录 引子 记忆的片断 CGI / ISAPI 何为 CGI / ISAPI ? 一个小插曲 ASP与我的ASP Builder ASP编程技术 何为 Windows DNA ? 什么是 COM ? ASP.NET 什么是 ActiveX ? IntraBuilder与我的InterBuilder 结尾 引子 凌晨三点醒了,大多的时候是…

数据结构(JAVA)JDK17语法新增特性

目录 yield关键字var关键字空指针异常密封类接口中的私有方法instanceof其他 yield关键字 yield关键字用于case的代码块中返回值。 正常switch语句 public static void main(String[] args) {int result 0;String str "a";switch (str) {case "a" :resu…

根据发生异常的汇编指令以及函数调用堆栈,从内存的角度出发,估计出问题的可能原因,确定排查方向,快速定位C++软件问题

目录 1、前言 2、初步分析dump文件 3、加载更多模块的pdb文件,可能能看到更多行的函数调用堆栈 4、从内存的角度去看,估计是访问了野指针导致的,沿着这个怀疑的方向快速地定位了问题 5、最后 C软件异常排查从入门到精通系列教程&#xf…

【安当产品应用案例100集】024-BYOE及BYOK在IaaS场景中的应用

在云计算环境中,尤其是涉及到敏感数据时,企业用户可能会选择自带加密工具或密钥(即BYOE或BYOK),以确保数据在传输和存储过程中的安全性。这种方式可以防止云服务提供商访问或泄露加密数据,增强数据保护。 …

离散数学 第二讲 特殊集合和集合间关系 笔记 [电子科大]王丽杰

1.2 特殊集合与集合间关系 空集 不含任何元素的集合叫做空集(empty set),记作∅. 空集可以符号化为 ∅ { x ∣ x ≠ x } ∅ \{ x|x ≠ x\} ∅{x∣xx} . 空集是绝对唯一的。 全集 针对一个具体范围,我们考虑的所有对象的集合叫做全集(universal se…

基于springboot招聘信息管理系统设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

视频美颜平台是如何搭建的?基于直播美颜SDK源码的开发技术详解

今天,笔者将详细讲解如何基于直播美颜SDK源码搭建视频美颜平台的技术路径。 一、理解视频美颜技术 视频美颜技术主要通过图像处理算法对视频流进行实时处理,包括肤色优化、瑕疵修复、面部特征增强等。实现这一目标需要高效的图像处理算法和稳定的实时渲…