本文涉及到的详细测试代码和测试步骤放置于:
https://github.com/xinyuwei-david/david-share.git
下的:LLMs/5-ways-chunking,本文中不再赘述代码实现。
1. 固定大小分块(Level 1: Fixed Size Chunking)
描述
固定大小分块是一种最简单的文本分割方法,它将文本按固定的字符数分割成块,不考虑文本的内容或结构。
实现
这种方法实现简单,按照指定的字符数进行分割。例如,如果设定每块不超过100个字符,文本将被直接分割成每块100个字符的片段。
优点
实现简单,适用于对文本结构要求不高的场景。
缺点
可能会在不合适的位置(如单词中间、句子中间)进行分割,导致语义不完整,影响后续处理。
举个例子
假设我们有一段文本:
这是第一段。这段话有点长,需要分割。
这是第二段。它也需要分割。
如果我们设定每块不超过20个字符,分割结果可能是:
块1: 这是第一段。这段
块2: 话有点长,需要分
块3: 割。这是第二段。
块4: 它也需要分割。
可以看到,分割在单词和句子中间进行,语义不完整。
2. 递归分块(Level 2: Recursive Chunking)
描述
递归分块是一种考虑文本结构的分块方法,通过分层和迭代的方式将文本分割成较小的块。它使用一组分隔符(如段落、句子、单词等)来逐步分割文本。
实现
首先尝试使用较大的分隔符(如段落),如果分割后的块仍然太大,则使用较小的分隔符(如句子),依此类推,直到达到所需的块大小。
优点
能够更好地保留文本的结构和语义关系,避免在不合适的位置进行分割。
缺点
实现相对复杂,需要考虑多层次的分隔符和递归调用。
举个例子
假设我们有一段文本:
这是第一段。这段话有点长,需要分割。
这是第二段。它也需要分割。
递归分块过程:
第一步:使用段落分隔符“\n\n”进行分割,得到两个段落:
段落1: 这是第一段。这段话有点长,需要分割。
段落2: 这是第二段。它也需要分割。
2. 第二步:检查每个段落的长度,如果段落1仍然太长,则使用句子分隔符“.”进行分割:
句子1: 这是第一段。
句子2: 这段话有点长,需要分割。
3. 第三步:检查每个句子的长度,如果句子2仍然太长,则使用单词分隔符“ ”进行分割:
单词1: 这段话有点长,
单词2: 需要分割。
通过这种逐层分割的方法,递归分块能够在尽量保持语义完整性的前提下,将文本分割成合适大小的块。
3. 基于文档的分块(Level 3: Document Based Chunking)
描述
基于文档的分块方法根据文档的自然结构(如章节、段落、标题等)来分割文本。这种方法特别适用于结构化文档,如书籍、报告、论文等。
实现
通过识别文档中的自然分隔符(如章节标题、段落标记等)来分割文本。
优点
能够保留文档的自然结构,适用于结构化文档。
分割点通常在自然的语义边界上,保留了文本的完整性。
缺点
依赖于文档的结构,适用范围有限。
对于非结构化文本,效果不佳。
举个例子
假设我们有一篇文章:
# 第一章
这是第一章的内容。
# 第二章
这是第二章的内容。
基于文档的分块过程:
识别章节标题:使用“#”作为章节标题的标记。
分割文本:根据章节标题分割文本。
分割结果:
块1: 第一章\n这是第一章的内容。
块2: 第二章\n这是第二章的内容。
4. 语义分块(Level 4: Semantic Chunking)
描述
语义分块是一种高级的文本分割方法,旨在根据文本的语义内容和上下文关系来分割文本,而不是简单地依赖字符数或固定的分隔符。
实现
利用嵌入(embeddings)技术,将文本转换为向量表示,然后通过计算这些向量之间的相似性来确定分割点。
优点
能够保留文本的语义关系,提高信息检索和处理的效果。
适用于各种类型的文本,尤其是结构复杂的文本。
缺点
需要计算嵌入和相似性,计算量较大。
需要依赖预训练的语言模型,可能需要较高的计算资源。
举个例子
假设我们有一段文本:
机器学习是一种人工智能技术。它使计算机能够从数据中学习和改进。深度学习是机器学习的一个子领域,使用神经网络进行复杂的数据分析。
语义分块过程:
文本嵌入:将文本转换为嵌入向量。
相似性计算:计算每个句子之间的相似性得分。
确定分割点:根据相似性得分,确定分割点。
假设相似性得分如下:
句子1和句子2的相似性得分高
句子2和句子3的相似性得分低
根据相似性得分,我们可以将文本分割为两个块:
块1: 机器学习是一种人工智能技术。它使计算机能够从数据中学习和改进。
块2: 深度学习是机器学习的一个子领域,使用神经网络进行复杂的数据分析。
5. 代理分块(Level 5: Agentic Chunking)
描述
代理分块是一种利用大型语言模型(LLM)来动态确定文本分割策略的方法。它依赖于LLM的智能和上下文理解能力,根据具体的任务和上下文来决定如何分割文本。
实现
通过让LLM作为“代理”来分析文本,并根据需要生成或调整分块策略。
优点
利用LLM的智能和上下文理解能力,能够动态调整分块策略。
适用于各种类型的文本和任务,能够根据具体需求进行调整。
缺点
需要依赖LLM进行分析,计算量较大。
实现过程相对复杂,需要结合多种技术和方法。
参考:https://medium.com/@anuragmishra_27746/five-levels-of-chunking-strategies-in-rag-notes-from-gregs-video-7b735895694d