RAG分块方法 从固定大小到自然语言处理分块——深入研究文本分块技术

发掘文本分块-准确的搜索结果和更智能的语言模型背后的秘诀,通过了解如何有效地分块文本,我们可以改进索引文档、处理用户查询和利用搜索结果的方式。准备好揭开文本分块的秘密了吗?

一、了解分块

分块是一种旨在嵌入尽可能少噪音的内容,同时保持语义相关性的过程。这个过程在语义搜索中特别有用,在语义搜索中,我们索引一个文档语料库,每个语料库包含关于特定主题的有价值的信息。

有效的分块策略可以确保搜索结果准确地捕获用户查询的本质。如果我们的块太小或太大,可能会导致不精确的搜索结果或错过展示相关内容的机会。根据经验,如果文本块在没有周围上下文的情况下对人类来说是有意义的,那么它对语言模型也可能是有意义的

二、影响分块策略的因素

(1)要编入索引的文本的大小
分块的单位和大小应根据文本的性质进行调整。数据块应该足够长,以包含相关的语义负载。例如,单个单词可能无法传达特定的信息或信息,而将整个百科全书放在一个块中可能会导致一个块“了解一切”。
(2)用户查询的长度和复杂度
较长的查询或更复杂的查询通常受益于较小的块长度。这有助于缩小搜索空间,提高搜索结果的精度。更小的块允许对嵌入进行更集中的匹配,减少查询中不相关部分的影响。
更短和更简单的查询可能根本不需要分块,因为它们可以作为单个单元进行处理。在这些情况下,分块处理可能会带来不必要的开销,潜在地影响搜索性能。
(3)在应用程序中对检索结果的利用
如果搜索结果只是应用程序整个链中的中间步骤,那么块的大小可能对应用程序的无缝运行具有重要意义。例如,如果来自多个搜索查询的结果是LLM提示的输入上下文,那么使用较小的块可能有助于将所有输入拟合到给定LLM允许的最大上下文大小中。相反,如果将搜索结果呈现给用户,则较大的块可能更合适。

分块的方法

文本分块有几种方法,每种方法都有自己的优点和缺点。方法的选择取决于用例和应用程序的具体需求。

2.1 固定大小(字符)重叠滑动窗口

固定大小的重叠滑动窗口方法是一种简单的文本分块方法,它将文本分成固定大小的块。在这种方法中,根据字符数对文本进行划分,使其易于实现。在这种方法中使用重叠有助于保持句子或思想的完整性,确保它们不会被中途切断。如果一个窗口截断了一个思想,另一个窗口可能包含完整的思想。

然而,这种方法存在一定的局限性。一个重要的缺点是缺乏对上下文大小的精确控制。大多数语言模型都基于Token而不是字符或单词进行操作,这使得这种方法效率较低。窗口的严格和固定大小的性质也可能导致在中间切断单词、句子或段落,这可能会阻碍理解并扰乱信息流。

此外,该方法不考虑语义,不能保证捕获给定想法或思想的文本的语义单元将被准确地封装在块中。因此,一个数据块可能在语义上与另一个数据块不同。

固定大小的重叠滑动窗口方法在某些情况下是有益的。它在初步探索性数据分析中特别有用,其目标是获得对文本结构的一般理解,而不是深入的语义分析。此外,它还可以用于文本数据没有强大语义结构的场景,例如某些类型的原始数据或日志。
然而,对于需要语义理解和精确上下文的任务,如情感分析、问答系统或文本摘要,更复杂的文本分块方法将更合适。

总结

优点:

  • 计数字符使实现变得容易
  • 使用重叠有助于避免句子或思想在中间被切断——如果一个窗口切断了思想,也许另一个窗口会把它完整地切断。

缺点:

  • 不能精确控制上下文大小——模型工作时,文本的大小是用Token而不是用字符或单词
  • 有一个严格的、固定大小的窗口可能会导致在中间剪掉单词、句子或段落。
  • 不考虑语义,不能保证文本的语义单元捕获给定的思想,思想将准确地捕获在块中,另一个块将致力于另一个思想。

用例:

  • 初步的探索性数据分析,其中文本的一般理解是必需的
  • 文本没有强大的语义结构的场景,例如某些类型的原始数据或日志
  • 不推荐用于需要语义理解和精确上下文的任务,如情感分析、问答系统或文本摘要

2.2 固定大小(以token表示)重叠滑动窗口

令牌中的固定大小滑动窗口方法是文本分块的另一种方法。与基于字符的方法不同,这种方法根据从分词器中产生的Token计数将文本划分为块,使其更符合语言模型的操作方式。
在这种方法中,上下文的大小得到了更精确的控制,因为它处理的是令牌而不是字符。一个有用的经验法则是,对于普通英语文本,一个Token通常对应于~4个文本字符。这可以避免在中间剪切单词,比在计算字符时要好一点,但问题仍然存在。它仍然可以在中间切断句子或思想,这可能会破坏信息的流动。此外,与基于字符的方法类似,这种方法不考虑语义。不能保证一个块准确地捕捉到一个独特的想法或想法,这使得块在语义上可能不一致。

总结

优点:

  • 更精确地控制LLM上下文大小,因为它操作的是Token,而不是字符。
  • 相对容易实现

缺点:

  • 仍然能在中间切断句子或思想
  • 没有考虑语义,因此不能保证一个块准确地捕捉到一个独特的思想或想法
  • 用例:
  • 与LLM进行探索性的初步工作
  • 不推荐用于需要深入理解文本的语义和上下文的任务,如情感分析或文本摘要

2.3 递归结构感知分割

递归感知结构的感知分割是一种文本分块的混合方法,它结合了固定大小滑动窗口方法和感知结构的分割方法的元素。这种方法尝试创建大约固定大小的块,可以是字符或Token,同时还尝试保留文本的原始单位,如单词、句子或段落。

在此方法中,文本使用各种分隔符递归地分割,例如段落分隔符(“\n\n”)、新行(“\n”)或空格(“”),仅在必要时移动到下一个粒度级别。这使得该方法能够平衡对固定块大小的需求与尊重文本的自然语言边界的愿望。

这种方法的主要优点是它的灵活性。与固定大小的方法相比,它提供了对上下文大小更精确的控制,同时也确保了文本的语义单元不会被不必要地切断。

然而,这种方法也有它的缺点。由于分割的递归性质,实现的复杂性更高。这也有可能导致大块的大小变化很大,尤其是结构复杂程度不同的文本。

	注意:LangChain有一个递归分割的实现	

langchain实现Recursively split by character

使用场景
递归结构感知分割在token粒度和保持语义完整性都很重要的任务中特别有用。这包括文本摘要、情感分析和文档分类等任务。

然而,由于其复杂性,它可能不适合需要快速和简单的文本分块的任务,或者涉及结构划分不一致或不明确的文本的任务。

总结

优点:

  • 平衡了对固定块大小的需求和对自然语言边界的保留
  • 对上下文大小提供更精确的控制

缺点:

  • 由于拆分的递归性质,实现的复杂性更高
  • 最终获得大小变化很大的块的风险

用例:

  • 在Token粒度和语义完整性保存都很重要的任务中非常有用,例如文本摘要、情感分析和文档分类
  • 不建议用于需要快速和简单的文本分块的任务,或者涉及不一致或不明确结构划分的文本的任务

2.4 有结构意识的拆分(按句子、段落、节、章)

结构感知分割是文本分块的一种高级方法,它考虑了文本的固有结构。这种方法不使用固定大小的窗口,而是根据文本的自然划分(如句子、段落、节或章节)将文本划分为块。

这种方法特别有益,因为它尊重文本的自然语言边界,确保单词、句子和思想不会在中间被打断。这有助于保持每个块内信息的语义完整性。

然而,这种方法确实有一定的局限性。处理结构复杂程度不同的文本可能具有挑战性。例如,一些文本可能没有明确定义的节或章,例如从OCR输出中提取的文本,未格式化的语音到文本输出,从表中提取的文本。此外,虽然它比固定大小的方法在语义上更敏感,但它仍然不能保证块内的完美语义一致性,特别是对于节或章节等较大的结构单元。

使用场景
对于需要很好地理解文本的上下文和语义的任务,结构感知分割是非常有效的。它对于文本摘要、情感分析和文档分类任务特别有用。

但是,它可能不太适合涉及缺乏已定义结构划分的文本的任务,或者需要更细粒度的任务,例如词级命名实体识别(NER)

总结

优点:

  • 尊重自然语言的界限,避免切断单词、句子或思想
  • 保留每个块内信息的语义完整性

缺点:

  • 处理具有不同结构复杂性的文本具有挑战性
  • 不能保证块内完美的语义一致性,特别是对于较大的结构单元
  • 我们无法控制数据块的大小。给定文档中的块的大小可能会有很大的不同。

用例:

  • 对于需要很好地理解上下文和语义的任务有效,例如文本摘要、情感分析和文档分类
  • 不建议用于涉及缺乏定义结构划分的文本的任务,或需要更细粒度的任务,如词级NER

2.5 NLP分块:跟踪主题变化

带有主题跟踪的自然语言处理分块是一种复杂的文本分块方法。该方法基于语义理解将文本划分为块,特别是通过检测句子主题的显著变化。如果一个句子的主题与前一个语块的主题明显不同,则该句子被认为是一个新语块的开始。

这种方法在保持每个块的语义一致性方面具有明显的优势。通过跟踪主题的变化,该方法确保每个块在语义上与其他块不同,从而捕获文本的固有结构和含义。

然而,这种方法并非没有挑战。它需要先进的NLP技术来准确地检测主题转移,这增加了实现的复杂性。此外,分块的准确性很大程度上取决于所使用的主题建模和检测技术的有效性。

使用场景
带有主题跟踪的自然语言处理分块对于需要理解语义上下文和主题连续性的任务非常有效。它对于文本摘要、情感分析和文档分类任务特别有用。

对于涉及具有高度主题重叠的文本的任务,或者需要简单文本分块而不需要深入语义理解的任务,这种方法可能不是最适合的。

总结

优点:

  • 维护每个块内的语义一致性
  • 通过跟踪主题变化,捕捉文本的内在结构和含义

缺点:

  • 需要先进的NLP技术,增加了实现的复杂性
  • 分块的准确性很大程度上取决于主题建模和检测技术的有效性

用例:

  • 对于需要语义上下文和主题连续性的任务非常有效,例如文本摘要、情感分析和文档分类
  • 不建议用于涉及高度主题重叠文本的任务或需要简单文本分块而不需要深度语义理解的任务

2.6 内容感知分割(Markdown, LaTeX, HTML)

内容感知分割是一种文本分块方法,主要关注内容的类型和结构,特别是在结构化文档中,比如用Markdown、LaTeX或HTML编写的文档。该方法识别并尊重内容的固有结构和划分,例如标题、代码块和表,以创建不同的块。

这种方法的主要优点是,它确保不同类型的内容不会混合在一个块中。例如,包含代码块的块不会同时包含表的一部分。这有助于维护每个块内内容的完整性和上下文。

然而,这种方法也存在一定的挑战。它需要理解和解析结构化文档格式的特定语法,这会增加实现的复杂性。此外,它可能不适合缺乏明确结构划分的文档或以纯文本形式编写而没有任何特定格式的文档。

使用场景
在处理结构化文档或格式清晰的内容(如技术文档、学术论文或网页)时,内容感知拆分特别有用。它有助于确保创建的块是有意义的和上下文一致的。

但是,此方法可能不适合非结构化或纯文本文档,或者不需要深入了解内容结构的任务。

总结

优点:

  • 确保不同类型的内容不会在单个块中混合
  • 尊重并维护每个块内内容的完整性和上下文

缺点:

  • 需要理解和解析结构化文档格式的特定语法
  • 可能不适合非结构化或纯文本文档

用例:

  • 特别适用于结构化文档或格式清晰的内容,如技术文档、学术论文或网页
  • 不建议用于非结构化或纯文本文档,或者不需要深入理解内容结构的任务

2.7 向数据块添加额外的上下文(元数据、摘要)

在块中以元数据或摘要的形式添加额外的上下文可以显著提高每个块的价值,并提高对文本的整体理解。这里有两个策略:

向每个Chunk添加元数据

该策略包括向每个块添加相关元数据。元数据可以包括文本的来源、作者、出版日期等信息,甚至包括关于块本身内容的数据,如主题或关键字。这种额外的上下文可以提供有价值的见解,并使块更有意义,更容易分析。
注意:对于使用文本嵌入进行向量化的块,请注意,向量数据库通常允许在嵌入向量的同时存储元数据。

优点:

  • 提供关于每个块的附加信息
  • 增强每个块的价值,使它们更有意义,更容易分析
  • 通过为块固定更广泛的上下文,可以帮助生成更有效的嵌入。

缺点:

  • 需要额外的处理来生成和附加元数据
  • 元数据的有用性取决于它的相关性和准确性

如何使用:

  • 在涉及分析块的来源、作者或内容的任务中特别有用,例如文本分类、文档聚类或信息检索
  • 可用于过滤用于向llm提供上下文的源。

你可以通过阅读llama_index关于元数据提取和使用的文档来直观地了解什么是可能的:
llama_index

2.8 传递数据块摘要

在此策略中,对每个块进行总结,并将该总结传递给下一个块。这种方法提供了一个“运行的语境”,可以增强对文本的理解,保持信息的连续性。

优点:

  • 通过维持一个运行的上下文来增强对文本的理解
  • 有助于确保跨块信息的连续性

缺点:

  • 需要先进的NLP技术来生成准确而有意义的摘要
  • 这种方法的有效性取决于摘要的质量

如何使用:

  • 在理解文本的连续性和上下文至关重要的任务中特别有用,例如文本摘要或阅读理解任务

2.9 在块中添加上下文的其他实验策略

关键字标记:这种方法包括识别和标记每个块中最重要的关键字或短语。然后,这些标记作为块内容的快速参考或摘要。先进的自然语言处理技术可以根据关键词的相关性和频率来识别这些关键词。

情感分析:对于包含观点或评论的文本,对每个块执行情感分析并附加情感得分(积极,消极,中立)作为元数据可以提供有价值的上下文。这在客户反馈分析或社交媒体监控等任务中尤其有用。

实体识别:将命名实体识别(NER)技术应用于每个数据块,可以识别和标记实体,如人名、组织、地点、时间、数量、货币价值、百分比等。这些实体信息可以添加到每个块中,提供有价值的上下文,特别是在信息提取或知识图谱构建等任务中。

主题分类:每个块可以使用机器学习或自然语言处理技术分类为一个或多个主题。这个主题标签可以提供对每个块内容的快速理解,并添加有价值的上下文,特别是对于文档分类或推荐之类的任务。

块链接:基于共享的关键字、实体或主题,在相关块之间创建链接。这些链接可以提供内容的“地图”,显示不同的块是如何相互关联的。这在涉及大型复杂文本的任务中尤其有用,因为理解整体结构和不同部分之间的关系非常重要。

结论

在自然语言处理领域,文本分块作为一种强大的技术,显著提高了语义搜索和语言模型的性能。通过将文本分解成可管理的、与上下文相关的块,我们可以确保更准确、更有意义的搜索结果。

分块方法的选择,无论是固定大小、结构感知还是NLP分块,都取决于用例和应用程序的特定需求。每种方法都有自己的优点和局限性,理解这些对于执行有效的分块策略至关重要。

此外,在块中添加额外的上下文,如元数据或摘要,可以进一步增强每个块的价值,并提高对文本的整体理解。关键字标记、情感分析、实体识别、主题分类和块链接等实验策略为进一步探索提供了有希望的途径。

翻译参考
https://safjan.com/from-fixed-size-to-nlp-chunking-a-deep-dive-into-text-chunking-techniques/

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

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

相关文章

IDEA中Maven--下载安装自己适配的版本---理解

Maven解释: Maven是一个强大的项目管理工具和构建工具,主要用于Java项目。它能够帮助开发团队管理项目的依赖、构建项目、发布文档和报告,并能够自动化许多重复的任务。 Maven的主要作用包括: 依赖管理:Maven能够管理…

vue2面试题——路由

1. 路由的模式和区别 路由的模式:history,hash 区别: 1. 表象不同 history路由:以/为结尾,localhost:8080——>localhost:8080/about hash路由:会多个#,localhost:8080/#/——>localhost:…

【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件

需求场景: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文等等 。 商品表中有一个type字段,储存的事商品类型例如:1.热销单品,2.品类TOP10,3.销量榜TOP10等等 它的type字段值很有可能是1,2,3,4 在mysql中实现语句 select * from produc…

6.2 通过构建情感分类器训练词向量

在上一节中,我们简要地了解了词向量,但并没有去实现它。在本节中,我们将下载一个名为IMDB的数据集(其中包含了评论),然后构建一个用于计算评论的情感是正面、负面还是未知的情感分类器。在构建过程中,还将为 IMDB 数据…

第二期书生·浦语大模型实战营优秀项目一览

书生浦语社区于 2023 年年底正式推出了书生浦语大模型实战营系列活动,至今已有两期五批次同学参加大模型学习、实战,线上课程累计学习超过 10 万人次。 实战营特设项目实践环节,提供 A100 算力支持,鼓励学员动手开发。第 2 期实战…

【移动应用开发期末复习】第五/六章

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 系列文章界面布局设计线性布局表格布局帧布局相对布局约束布局控制视图界面的其他方法代码控制视图界面数据存储与共享首选项信息数据文件SQLite数据库Content…

HarmonyOS Next开发学习手册——进程模型线程模型

进程模型 系统的进程模型如下图所示: 应用中(同一包名)的所有PageAbility、ServiceAbility、DataAbility、FormAbility运行在同一个独立进程中,即图中绿色部分的“Main Process”。 WebView拥有独立的渲染进程,即图中…

AI问答-ERP:理解 ERP / 我国ERP发展现状 / ERP软件有哪些 / 华为自研ERP

一、理解ERP 1.1、定义 ERP(Enterprise Resource Planning)是企业资源计划的缩写,它集成了企业各个业务领域,包括采购、销售、库存、生产制造、财务等多个方面,进行全面管理、智能决策的一种企业管理系统。 1.2、功…

2023: 芒种集•序言

2023: 芒种集•序言 2023: 芒种集•序言 从西南旅游回来,一直忙着整理游记“2024:追寻红色足迹”,之后又应初建平索要刘桂蓉遗作“我们一起走过”,于是把“别了,老屋”和诗作“二月”一并合编,把我写的悼念…

oceanbase数据库安装和连接实战(阿里云服务器操作)

本文主要是安装oceanbase的单机版进行数据库的基础使用,oceanbase的数据库是兼容mysql数据库的,实际的兼容程度需要更深度的测试,本文主要是安装oceanbase并使用SQLynx的mysql驱动连接使用oceanbase数据库。 目录 1. 基础介绍 2. 安装说明 …

【LeetCode】每日一题:合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 解题思路 分治加两个链表合并,或者用根堆,根堆的初始化方法很值得背诵,还涉及lambda的用法 AC代码 # Defini…

【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间

文章目录 前言一、datetime模块简介二、常用类和方法三、date类四、time类五、datetime类六、timedelta类七、常用的函数和属性八、代码及其演示 前言 Python的datetime模块提供了日期和时间的类,用于处理日期和时间的算术运算。这个模块包括date、time、datetime和…

STL迭代器的基础应用

STL迭代器的应用 迭代器的定义方法: 类型作用定义方式正向迭代器正序遍历STL容器容器类名::iterator 迭代器名常量正向迭代器以只读方式正序遍历STL容器容器类名::const_iterator 迭代器名反向迭代器逆序遍历STL容器容器类名::reverse_iterator 迭代器名常量反向迭…

Java中的构造器

在Java中,构造器(Constructor)是用于创建对象的一种特殊方法。构造器在类的实例化过程中被调用,用来初始化新对象的状态。构造器在面向对象编程中起着至关重要的作用,它确保每个对象在创建时都有一个有效的初始状态。本…

C# SerialPort串口通讯

串口通信 在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。 创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重…

5.1 线性反馈控制系统的基本结构及其特性

控制系统的基本结构是由受控对象和反馈控制器两部分构成的闭环系统。经典理论中采用输出反馈,而现代控制理论中采用状态反馈。 1、状态反馈 状态反馈是将系统的每一个状态变量乘以相应的反馈系数,然后反馈到输入端与参考输入相加形成控制律&#xff0c…

web学习笔记(七十)

目录 1.webpack和vite区别 2. vue2声明数据和绑定事件 3.vue2 data为什么必须是函数? 4.vue2事件传参 5.计算属性和watch 6.this.$router和this.$route 1.webpack和vite区别 它们都是代码构建工具,就是把项目中的.vue文件转换为浏览器认识的html和…

solidity智能合约如何实现跨合约调用函数

背景 比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整,主要是两个函数内统计转移量。然后再提供外部获取函数。 /*** dev Sets amount as the allowance of spender over the callers tokens.** Ret…

文化财经wh6boll带macd多空转折点提示指标公式源码

文化财经wh6boll带macd多空转折点提示指标公式源码: DIFF:EMA(CLOSE,12) - EMA(CLOSE,26); DEA:EMA(DIFF,9); MACD:2*(DIFF-DEA); MID:MA(CLOSE,26);//求N个周期的收盘价均线,称为布林通道中轨 TMP2:STD(CLOSE,26);//求M个周期内的收盘价的标准差 …

onlyoffice实现在单页面加载文档的功能

草图 实现案例的基本原型 这里我们的样式库使用的是Tailwindcss,我们的前端UI组件库使用的是Ant Design Vue。 基本原型是,有个按钮,没有点击按钮的时候,页面显示的时普通的内容。当点击这个按钮的时候,页面加载文档…