在大语言模型(LLM)飞速发展的当下,分块技术(Chunking)(RAG 中的分块策略:从基础到前沿的全面剖析)作为提升模型性能的关键手段,受到了广泛关注。它在优化信息处理、提高检索效率、增强模型理解能力等方面发挥着不可或缺的作用。深入探究 LLMs 中的分块技术,对于推动自然语言处理(NLP)领域的发展具有重要意义。
一、分块技术的基本概念
分块,简单来说,就是将连续的文本流分解为更小的、连贯的单元,这些单元被称为 “块”(chunks)。这些块成为后续分析的基础,能助力信息检索、情感分析、机器翻译等多种任务。在构建检索增强生成(RAG)模型时,分块的有效性尤为关键,因为输入数据的质量和相关性会显著影响模型的表现。不同的嵌入模型有不同的最大输入长度限制,传统分块方法常依据简单标准,如标记(token)、句子数量进行划分,而语义分块则深入挖掘文本的潜在含义,旨在提取能捕捉内容精髓的语义有意义片段。
二、分块技术的重要性
- 信息获取与质量提升分块能提高信息获取的质量。当文本被拆分成小块后,每一块内容更具针对性和意义,从而优化搜索和信息检索流程。例如,在文档检索系统中,用户输入特定查询时,分块后的文本能更精准地匹配相关内容,返回更符合需求的结果。
- 存储与成本优化有效的分块技术可以优化存储成本。较大的块能降低存储成本,而较小的块虽然更精细,但需要更多的存储空间。在处理海量文本数据时,合理选择分块大小可在存储成本和数据处理效率之间找到平衡。
- 减少查询延迟分块有助于减少查询延迟。较少的块数量能实现更快的信息访问,因为模型在处理数据时需要检索和分析的内容更少,从而提高响应速度,提升用户体验。
三、分块技术对 LLMs 的影响
- 上下文理解与准确性分块有助于 LLMs 更好地理解上下文。但过多的上下文信息可能导致模型生成错误信息,即 “幻觉” 现象。例如,在问答任务中,如果分块包含过多不相关信息,模型可能会基于这些干扰信息生成不准确的答案。
- 效率与成本考量较大的块能让 LLMs 处理更多上下文,但这也会增加延迟和成本。在实际应用中,需要根据具体场景权衡块的大小,以确保在可接受的成本范围内实现最佳性能。
- 适应不同问题类型用户提问的类型决定了分块策略。对于简短且具体的问题,较小的块可能更合适,因为它们能更精准地匹配问题,提供针对性的答案;而对于复杂的综合性问题,则可能需要较大的块来提供足够的上下文信息。
四、分块技术的具体方法
- 固定大小分块
- 基于标记(Token)的分块在 Langchain 和 Llam Index 中,可使用 TokenTextSplitter 进行基于标记的分块。其过程是先利用分词器将文本转换为标记,然后根据设定的标记大小(token_size)进行截断,并设置重叠大小(overlap_size)。这种方法能较好地适应模型对标记的处理要求,但可能会在句子中间截断,导致一定的上下文损失。
- 基于字符的分块该方法按固定数量的字符对文本进行分块,如将文档拆分为每块 500 字符。它简单直接,但可能会破坏单词或句子结构,造成上下文丢失。可通过 LangChain 中的 CharacterTextSplitter 尝试这种方法,它依据特定分隔符进行分块。
- 基于单词的分块把文本分割成包含固定数量单词的块,例如每块 100 个单词。这种方式能保留单词的完整性,但仍可能破坏句子边界,影响上下文理解。
- 基于句子的分块此技术依据句子边界将文本分割成块,保证每个块包含完整的句子,从而更好地保留上下文。然而,这可能导致块大小不一,给某些 AI 模型的处理带来挑战。实现基于句子的分块有多种方法和工具,如简单的按句号和换行符分割(但这种方法无法处理所有特殊情况)、使用自然语言处理工具包(NLTK)、强大的 NLP 库 spaCy 以及 llama_index 中的 SentenceSplitter。
- 递归字符分块递归字符分块以分层迭代的方式,使用一组分隔符将输入文本划分为更小的块。如果首次分割未得到理想大小或结构的块,该方法会递归调用自身,采用不同的分隔符或标准,直到达到期望的块大小或结构。虽然块大小不会完全一致,但能保持相近。在 LangChain 中,可通过 RecursiveCharacterTextSplitter 来实现这种分块方式。
- 语义分块这是一种新的实验性分块技术,由 Greg Kamradt 首次提出。其核心原理是利用嵌入模型将语义相似的句子组合在一起。传统的全局分块大小机制可能无法考虑文档内各部分的语义关系,而语义分块通过以下步骤解决这一问题:首先将文档拆分为句子;然后为每个句子创建包含其前后若干句子的组;接着为每个句子组生成嵌入,并与 “锚定” 句子关联;最后顺序比较每个组之间的距离,当主题或主题相同时,相邻句子组嵌入之间的距离较低,反之则较高,以此有效划分不同的块。LangChain 和 Llama Index 都支持语义分块,且实现方式略有不同。
- 文档特定分块(Unstructured 库)Unstructured 库支持多种文档类型,包括.pdf、.docx、.doc 等。它提供自适应分区策略,能根据文档特征自动选择最合适的分区方法,还针对不同需求提供 “fast”“hi_res”“ocr_only” 等专门策略。在处理包含表格、图像等复杂内容的文档时,Unstructured 库能更高效地提取信息并进行分块处理。
- 基于 LLM 的分块 / LLM 辅助分块这种前沿方法利用大语言模型对文本进行分析,基于对内容的理解来识别有意义的块。虽然它能实现高度准确和上下文感知的分块,但计算成本高昂,且可能需要大量训练数据支持。
五、分块技术在 RAG 中的应用
检索增强生成(RAG)是一种将信息检索系统与大语言模型相结合的技术,旨在克服 LLMs 在信息访问和处理方面的局限性。RAG 通过 “神经检索器” 从大量数据源中提取相关信息,并利用这些信息生成更准确、上下文更合适的响应。
在 RAG 系统中,分块起着至关重要的作用。它加快了信息检索的速度,使检索过程更高效,因为较小的块能针对用户查询提供更具体、准确的响应。同时,分块有助于 LLMs 更好地理解上下文,确保模型检索和使用正确的信息。此外,分块还能优化存储和处理成本,根据实际需求选择合适大小的块,平衡存储成本和模型性能。不同的查询类型也决定了分块策略的选择,以满足多样化的用户需求。
六、PDF 和 DOCX 文档分块的比较
- PDF 文档PDF 格式能保持页面、段落和行的一致格式,支持丰富的内容,如图片、表格和图表。然而,其结构复杂性较高,文本、图像和表格的定位可能使处理变得复杂,部分 PDF 文件中的文本可能以图像形式存储,需要光学字符识别(OCR)技术处理。在分块应用方面,基于行的分块较困难,因为 PDF 中的行可能不连续;而基于句子和段落的分块,如果能正确检测结构元素,则更为高效。
- DOCX 文档DOCX 作为基于 XML 的格式,更易于提取文本和样式信息,结构更规整、易管理。文本部分可根据标题、段落、表格和样式信息进行划分。虽然处理复杂表格或嵌入图像可能耗时,但总体复杂度低于 PDF。在分块应用中,基于句子或段落的分块通常更成功,因为提取结构信息并相应分割文本相对容易。
七、分块技术的未来展望
随着 LLMs 和 NLP 技术的不断发展,分块技术也将持续演进。未来,分块技术可能会更加智能化和自适应。结合深度学习和强化学习等技术,分块算法能够根据文本的语义、语法以及用户的使用习惯,动态地调整分块策略,以实现最优的性能。同时,在处理多模态数据(如文本、图像、音频结合的文档)时,分块技术也需要进一步拓展,以适应复杂的数据结构和多样化的信息表示形式。此外,如何在资源受限的环境(如移动设备、边缘计算设备)中高效地实现分块技术,也是未来研究的重要方向。