当前位置: 首页 > news >正文

RAG 语义分块实践

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。

原文标题:Semantic chunking in practice

原文地址:https://medium.com/@boudhayan-dev/semantic-chunking-in-practice-23a8bc33d56d


语义分块的实践

回顾

2023年真是不平凡的一年!充实、丰富多彩,最重要的是,在软件开发领域取得了许多突破。

其中一个突破性进展是企业级成熟的 LLM (大型语言模型)的可用性,已经引起了行业的轰动,相信在 2024 年会有更大的发展。LLM 将成为主流,并将融入到软件和产品开发的各个方面。从商业人工智能到游戏,LLM 的影响将触及每一个领域。

是好是坏?只有时间才能证明。军备竞赛已经开始,没有回头路可走。

不过,从技术角度来看,LLM 是一个非常有趣的话题。我一直忙于了解 LLM 的最新运作情况。作为一名非数据科学家,这既让人望而生畏,又让人大开眼界。不同 LLM 的能力——多模态/单模态等,各种提示技术——ReAct、CoT(思维链)等,RAG——检索增强生成,微调……等等。我有幸参与了这些课题的研究。这些课题非常广泛,而且在不断发展。没有两个路障是相同的,而这正是让 LLM 之旅如此激动人心的原因。

本博客将讨论其中的一个障碍——分块。或者更确切地说,对文档的各个部分进行语义分块,以便(作为提示的一部分)反馈给 LLM 的数据对于提示的上下文来说更加精确和有意义。

让我们开始吧。

问题

考虑一下,你得到了一个包含一些文本和图像的文档,这些内容被组织成若干部分(也可能是嵌套的部分),就像一本书/小说/结构文档一样。

换句话说,您可能遇到过的任何结构化文件。

现在的问题是分割文档并提取各个部分内容,即保留块的语义含义。在你提出解决方案之前,这里有一些额外的限制(真实场景中的) —

  • 如前所述,必须将分块映射到章节,即不能根据页码、字数/字符长度等随意创建分块。

  • 文档没有目录或内容表。

  • 不要假设各个部分的大小。有些部分可能只有几段,而有些可能延伸到数页。

  • 不要假设文档中各个部分的起始/结束位置。它们可能在页面的开头/结尾,也可能不在。它们也可能很好地从页面的中间开始。

  • 不要假设文档的字体大小/样式。我们需要支持所有类型的文档。

  • 毋庸置疑,文档的大小超过了你可以用来解决这个问题的 (你会用吗?😛)的上下文大小(LLM 提示可以接受的最大标记数)。

例如,考虑文档中的一页,如下所示 —

这是文件中的一页,显示了如下结构——

  • Prologue

  • Methodology

注:在方法论下的方法1和方法2我已经忽略了,因为它们的相对字体高度比方法论小,表明它们是子部分。然而,如果你按以下方式识别部分结构,也是正确的。例如 —

注:我忽略了 "Methodology "下的 "Approach 1 "和 “Approach 2”,因为它们的相对字体高度比 “Methodology” 小,表明它们是子章节。不过,如果你将各部分的结构确定如下,也是正确的。例如——

  • Prologue

  • Methodology

  • Approach 1

  • Approach 2

你想要识别的嵌套级别由你决定。你可以选择将子部分组合在一起作为一个主要部分(如示例1),也可以将它们呈现为单独的部分(如示例2)。重要的是首先要识别这些部分。

您可以自行确定嵌套的程度。您可以选择将子章节合并为一个主要章节(如例 1),也可以将它们作为单独的章节(如例 2)。重要的是首先要识别这些部分。

例 1

例 2

那么,考虑到上述限制,如何提取这些部分呢?

注:由于该文件的候选者数量庞大,预计准确率不会达到 100%。

设计

正如你所猜测的那样,解决方法并不简单。至少,不能用确定性算法来解决。我们所讨论的是从文档中自主检测和提取部分内容。如果这还不够困难的话,我们还打算让解决方案适用于任何类型的文档,例如所使用的字体、书写风格、内容格式等。

困难?当然,但并非不可能。 在 LLM 时代,绝对不是。

在尝试解决方案之前,我们先来看看以下几点。

观察 1 -> 对于任何结构良好的文档,各部分的大小都会遵循一种模式,即第一级部分的字体大小和样式相同,如 2X,下一级部分的字体大小可能较小,如 X,以此类推…但它们在整个文档中都是一致的。

观察 2 -> 章节页眉/标题通常均匀地分布在整个文档中。它们不会集中在文档的开头或结尾。因此,在整个文档中,遇到章节标题/页眉的机会很大。

观察 3 -> 与文件中的段落或非章节文本相比,章节标题/页眉较少。

观察 4 -> 与周围的文本块相比,章节标题/页眉一般比周围的文本大(字体大小),字符数也较少。

就是这样!只要我们能确定章节标题/页眉在文档中的位置,我们就能提取出随后两个章节之间的文本块,从而实现我们的目标。

为了将某一行识别为可能的章节标题/页眉,我们将使用 LLM(任何 LLM 都可以,本博客使用的是 GPT 3.5)。

还有什么比 LLM 更适合对给定文件进行上述推理呢?

现在,让我们来看看实现情况。

解决方案

让我们从添加依赖项开始。我们将使用 Java。为了解析文档,我们将使用 Apache PDFBox 库。

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version>
</dependency>

现在,PDFBox 库中的默认 PDF 阅读器类将不提供我们感兴趣的元数据,即字体大小、行中的总字符数,以及具有相同元数据的相应行。为了记录这些元数据(为什么?稍后会解释),在我们通过文档时,我们将不得不创建一个自定义文本解析器来记录它们。

让我们创建一个可以捕捉字体元数据的模型。

@Data
public class DocumentLineItem {float positionX;float positionY;String content;int fontHeight;int totalCharacters;@Overridepublic String toString(){return this.content;}
}

现在,让我们来实现文本解析器。

public class TextParser extends PDFTextStripper {private static final Logger

相关文章:

RAG 语义分块实践

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 原文标题:Semantic chunking in practice 原文地址:https://medium.com/@boudhayan-dev/semantic-chunking-in-practice-23a8bc33d56d 语义分块的实践 回顾 …...

12 Autosar_SWS_MemoryMapping.pdf解读

AUTOSAR中MemMap_autosar memmap-CSDN博客 1、Memory Map的作用 1.1 避免RAM的浪费&#xff1a;不同类型的变量&#xff0c;为了对齐造成的空间两份&#xff1b; 1.2 特殊RAM的用途&#xff1a;比如一些变量通过位掩码来获取&#xff0c;如果map到特定RAM可以通过编译器的位掩码…...

【Linux取经路】文件系统之缓冲区

文章目录 一、先看现象二、用户缓冲区的引入三、用户缓冲区的刷新策略四、为什么要有用户缓冲区五、现象解释六、结语 一、先看现象 #include <stdio.h> #include <string.h> #include <unistd.h>int main() {const char* fstr "Hello fwrite\n"…...

华为OD机试真题-查找接口成功率最优时间段-2023年OD统一考试(C卷)--Python3--开源

题目&#xff1a; 考察内容&#xff1a; for 时间窗口list(append, sum, sort) join 代码&#xff1a; """ 题目分析&#xff1a;最长时间段 且平均值小于等于minLost同时存在多个时间段&#xff0c;则输出多个&#xff0c;从大到小排序未找到返回 NULL 输入…...

缓存篇—缓存雪崩、缓存击穿、缓存穿透

缓存异常会面临的三个问题&#xff1a;缓存雪崩、击穿和穿透。 其中&#xff0c;缓存雪崩和缓存击穿主要原因是数据不在缓存中&#xff0c;而导致大量请求访问了数据库&#xff0c;数据库压力骤增&#xff0c;容易引发一系列连锁反应&#xff0c;导致系统奔溃。不过&#xff0…...

Python实现视频转音频、音频转文本的最佳方法

文章目录 Python实现视频转音频和音频转文字视频转音频步骤 1&#xff1a;导入moviepy库步骤 2&#xff1a;选择视频文件步骤 3&#xff1a;创建VideoFileClip对象步骤 4&#xff1a;提取音频步骤 5&#xff1a;保存音频文件 音频转文字步骤 1&#xff1a;导入SpeechRecognitio…...

阿里云SSL免费证书到期自动申请部署程序

阿里云的免费证书只有3个月的有效期&#xff0c;不注意就过期了&#xff0c;还要手动申请然后部署&#xff0c;很是麻烦&#xff0c;于是写了这个小工具。上班期间抽空写的&#xff0c;没有仔细测试&#xff0c;可能存在一些问题&#xff0c;大家可以自己clone代码改改&#xf…...

Vue全局事件防止重复点击(等待请求)【进阶版】

继《Vue全局指令防止重复点击&#xff08;等待请求&#xff09;》之后&#xff0c;感觉指令方式还是不太友好&#xff0c;而且嵌套闭包比较麻烦&#xff0c;于是想到了Vue的全局混入&#xff0c;利用混入&#xff0c;给组件绑定click事件。 一、实现原理 与指令方式大致一样&…...

C#程序反编译经验总结

1. 反编译出的代码有问题时&#xff0c;可以用多个反编译工具之间的代码相互印证。&#xff08;比如.net reflector 与ILSpy&#xff09; 2. 有时Visual Studio编译的错误信息不明确时, 可以msbuild编译程序&#xff0c;msbuild的错误信息相对完整一些。 2.1 编译错误&#xf…...

Android系统启动流程

android的启动流程是从底层开始进行的&#xff0c;具体如下所示&#xff1a; Android是基于Linux内核的系统&#xff0c;Android的启动过程主要分为两个阶段&#xff0c;首先是Linux内核的启动&#xff0c;然后是Android框架的启动。 可以将Andorid系统的启动流程分为以下五个…...

Flask——基于python完整实现客户端和服务器后端流式请求及响应

文章目录 本地客户端Flask服务器后端客户端/服务器端流式接收[打字机]效果 看了很多相关博客&#xff0c;但是都没有本地客户端和服务器后端的完整代码示例&#xff0c;有的也只说了如何流式获取后端结果&#xff0c;基本没有讲两端如何同时实现流式输入输出&#xff0c;特此整…...

crmeb多门店商城系统二次开发 增加车辆车牌搜索功能、车辆公里数

1、增加的数据库 ALTER TABLE eb_store_order ADD cart_number VARCHAR(255) NOT NULL DEFAULT COMMENT 车牌 AFTER erp_order_id, ADD curmileage VARCHAR(255) NOT NULL DEFAULT COMMENT 当前里程 AFTER cart_number; ALTER TABLE eb_store_cart ADD cart_number VARCHAR(…...

深度好文|关于人类智能与自主系统

上个世纪 50 年代&#xff0c;在二战结束没多久&#xff0c;人们开始研究和设计智能系统。作为信息学的分支&#xff0c;人类开始了最早对于人工智能的研究。时间来到 60 年代&#xff0c;人们对于计算机的发展充满了信心&#xff0c;人们断言“20年内机器能够做任何人所能做的…...

防火墙内容安全笔记

目录 DFI和DPI IDS和IPS 签名 AV URL过滤 HTTPS过滤 内容过滤 文件类型过滤 文件内容过滤 邮件过滤 VPN概述 DFI和DPI DFI和DPI技术 --- 深度检测技术 DPI DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#…...

应用于温度报警器中的高精度温度传感芯片

温度报警器通常由温度传感器、控制电路和报警装置组成。温度传感器能够将温度变化转换为电信号&#xff0c;控制电路则对这些信号进行处理&#xff0c;当检测到的温度达到或超过预设的报警阈值时&#xff0c;报警装置会通过声音、灯光或其他方式发出警报&#xff0c;以提醒用户…...

微信小程序swiper 视频中间大,两边小,轮播滑到中间视频自动播放组件教程

静态效果&#xff1a; 进入下面小程序可以体验效果&#xff0c;点击底部 看剧 栏目 一、创建小程序组件 二、代码 1、WXML <view class"swiper-wrapper"><swiperclass"main-sw"autoplay"{{false}}"circular"{{true}}"inte…...

ARM服务器上部署zookeeper集群

由于ARM服务器上部署zookeeper集群,会存在加载不到主类问题,现在把遇到的问题进行总结下,问题如下: [rootnode206 apache-zookeeper-3.5.10]# bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /data1/software/apache-zookeeper-3.5.10/bin/../conf/…...

利用Ubuntu22.04启动U盘对电脑磁盘进行格式化

概要&#xff1a; 本篇演示利用Ubuntu22.04启动U盘的Try Ubuntu模式对电脑磁盘进行格式化 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 开机按F2进入BIOS 开机按F12进入Boot Manager 2、Ubuntu22.04启动U盘 制作方法参考笔者的文章&#xff1a; Ubuntu制作Ubun…...

Nginx基础入门

一、Nginx的优势 nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个SMTP&#xff08;邮局&#xff09;服务器。 Nginx的web优势&#xff1a;IO多路复用&#xff0c;时分多路复用&#xff0c;频分多路复用 高并发&#xff0c;IO多路复用&#xff0c;epoll&#xf…...

分布式和微服务

分布式和微服务是两个不同的概念。 分布式系统是说多个独立的计算机或服务器组成的系统&#xff0c;这些计算机通过网络进行通信和协作&#xff0c;共同完成一个任务或提供一个服务。 分布式系统的目标是通过协作实现高性能、高可用性和高扩展性。 微服务是一种架构风格&…...

【无标题】学习Markdown

https://shadows.brumm.af 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些…...

由于 vscode 版本更新为 1.86.1引起的相关问题。

通过vscode ssh来远程连接linux服务器的代码&#xff0c;由于vscode 1.86.1的更新&#xff0c;在连接服务器时就开始报 两个错误了&#xff1a; Missing GLIBCXX > 3.4.25! Missing GLIBC > 2.28! lwd192.168.66.148s password: 075b6e8e3a87: runningMissing GLIBCXX &g…...

四、矩阵的分类

目录 1、相等矩阵 2、同形矩阵 3、方阵&#xff1a; 4、负矩阵、上三角矩阵、下三角矩阵&#xff1a; 5、对角矩阵&#xff1a;是方阵 ​编辑7、单位矩阵&#xff1a;常常用 E或I 来表示。它是一个方阵 8、零矩阵&#xff1a; 9、对称矩阵&#xff1a;方阵 1、相等矩阵 …...

Windows环境下查看磁盘层级占用空间的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

超级实用的python代码片段汇总和详细解析(16个)

目录 1. 生成随机文本 2. 计算文本文件中的字数 3. 替换文件文件中的字串 4. 多文件名的批量替换 5. 从网站提取数据 6. 批量下载图片 7.批量删除空文件夹 8.Excel表格读写 9.合并Excel表格工作簿 10.数据库SQL查询 11. 系统进程查杀 12.图像尺寸调整和裁剪 13.图…...

npm/nodejs安装、切换源

前言 发现自己电脑上没有npm也没有node很震惊&#xff0c;难道我没写过代码么&#xff1f;不扯了&#xff0c;进入正题哈哈…… 安装 一般没有npm的话会报错&#xff1a; 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称而且报这个错&#xff0c;我们执行…...

【Kotlin】流程控制

1 选择结构 Kotlin 中选择结构主要包含 if -else、when 语句&#xff0c;并且可以返回结果。 1.1 if-else 1.1. 条件选择 fun main() {var score 85if (score > 90) {println("优秀")} else if (score > 80) {println("良好")} else if (score &…...

Devc++ Easyx 实现 瓦片地图编辑数据导入游戏

导出的DLC 直接放入 exe 同文件夹下即可自动读取。 // 程序&#xff1a;DLC 自动读取加载框架示例 // 作者&#xff1a;民用级脑的研发记录 // 邮箱&#xff1a;1309602336qq.com // 编译环境&#xff1a;Devc/VC 2010/Visual Studio 2022&#xff0c;EasyX_20220901/Easyx_202…...

去年面试的运维开发面试题二

VPN有哪些协议&#xff0c;不同协议之间有何区别&#xff1f; 2.内部组网通常使用哪些类型的网段&#xff0c;两个不同网段如何通信&#xff1f; 3.Linux中绝对路径&#xff0c;相对路径的区别 4. Linux如何添加磁盘&#xff0c;扩容系统文件&#xff1f; 5. Linux如何查看进程…...

【Unity编辑器扩展】Unity编辑器主题颜色设置工具

可以用来应用和自定义你的Unity编辑器。14个主题可供选择。轻松创建自己的主题。 主题展示:...