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/

相关推荐
快乐点吧11 分钟前
【深度学习基础】`view` 和 `reshape` 的参数详解
人工智能·深度学习·自然语言处理
松下J2714 分钟前
深度学习 --- stanford cs231学习笔记七(训练神经网络之梯度下降优化器)
人工智能·深度学习·神经网络·梯度下降·sgd
Wen.py.java1 小时前
Python商务数据分析知识专栏(六)——Python数据分析的应用④Python数据分析实训
人工智能·python·数据分析
不要em0啦1 小时前
PyTorch - 神经网络基础
人工智能·pytorch·神经网络
pictoexcel1 小时前
名片批量转换为结构化Excel注意的事项
人工智能·深度学习·神经网络·机器学习·ocr·excel
三花AI2 小时前
对标 GPT-4o 的开源实时语音多模态模型:Moshi
人工智能·gpt·语言模型·语音识别
Hugo_Hoo2 小时前
构建LangChain应用程序的示例代码:53、利用多模态大型语言模型在RAG应用中处理混合文档的示例
人工智能·langchain·ai编程
人工智能小豪2 小时前
LLM大模型企业应用实战-----为Langchain Agent添加记忆功能
人工智能·langchain·大模型·llm·私有化部署·产品经理·ai大模型
Elfin_z2 小时前
【深度学习练习】心脏病预测
人工智能·深度学习
山东仁科2 小时前
现代农业利器:土壤检测仪器的应用与未来
人工智能·土壤监测