🚀RAG中分块的最佳实践🚀
原文链接:Chunking for RAG: best practices
作者:Maria Khalusova
译者:倔强青铜三
前言
大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
乍一看,分块似乎是一个简单的概念。它是一个预处理步骤,涉及在为检索增强生成(RAG)准备数据时,将文档或文本语料库划分为更小的段落或“块”。然而,事实证明,有许多因素会影响最佳处理方法。什么是最佳的块大小?什么是最佳的文本分割方法?这些决策会显著影响 RAG 系统的性能。在本篇博客文章中,我们将探讨分块的重要性、常见的分块方法,并介绍 Unstructured 提供的智能分块策略,这些策略考虑了文档的语义结构和内容。
为什么需要分块?
分块是为 RAG 准备数据时必不可少的预处理步骤,原因如下。
上下文窗口限制
让我们从基础开始。检索到的块将直接作为上下文输入到提示中,供您的大型语言模型(LLM)生成响应。这意味着,所有检索到的块的总长度不能超过 LLM 的上下文窗口。尽管如今许多 LLM 都有较大的上下文窗口,但您可能仍不想将其完全填满,因为这些 LLM 会在“大海捞针”问题上遇到困难。您可能还希望以其他方式利用这个大的上下文窗口,例如提供详细的指令、人物描述或一些少样本示例。
此外,如果您打算使用相似性搜索并对文档进行嵌入,您必须考虑嵌入模型也有有限的上下文窗口。这些模型无法嵌入超过其上下文窗口最大长度的文本。这个限制因具体模型而异,但您可以在模型的描述中轻松找到这些信息,例如在 Hugging Face Hub 的模型卡中。一旦您知道将使用哪个模型来生成嵌入,您就拥有了块长度的硬性最大值(以令牌为单位,而不是字符或单词)。嵌入模型通常在上下文窗口大小上最多支持 8K 个令牌,这相当于英语中大约 6200 个单词。为了说明这一点,《指环王》系列,包括《霍比特人》,总共有大约 576,459 个单词,因此如果您想利用该语料库进行带有相似性搜索的 RAG,您需要将其至少划分为 93 个块。
块大小对检索精度的影响
虽然嵌入模型对可以嵌入的令牌数量施加了硬性最大限制,但这并不意味着您的块需要达到该长度。这仅仅意味着它们不能超过该长度。事实上,在许多情况下,使用每个块的最大长度(例如 6200 个单词或 8K 个令牌)可能是过度的。有多个令人信服的理由选择更小的块。
让我们退一步,回顾一下当我们嵌入一段文本以获取嵌入向量时会发生什么。大多数嵌入模型都是编码器型 Transformer 模型,它们接受最大长度的文本作为输入,并返回一个固定维度的单一向量表示,例如 768。无论您给模型一个 10 个单词的句子还是一个 1000 个单词的段落,生成的嵌入向量都将具有相同的 768 维度。其工作原理是,模型首先将文本转换为令牌,对于这些令牌中的每一个,它在预训练过程中都已学习了一个向量表示。然后,它应用一个池化步骤,将各个令牌表示平均为一个单一的向量表示。
常见的池化类型包括:
- CLS 池化:特殊 CLS 令牌的向量表示成为整个序列的表示。
- 均值池化:返回令牌向量表示的平均值,作为整个序列的表示。
- 最大池化:具有最大值的令牌向量表示成为整个序列的表示。
目标是将粒度的令牌级表示压缩为一个固定长度的表示,以概括整个输入序列的含义。这种压缩本质上是损失的。对于较大的块,表示可能会变得过于粗糙,可能会掩盖重要的细节。为了确保精确检索,块需要具有文本的有意义且细致的表示。
现在,考虑另一个潜在问题。一个大的块可能涵盖多个主题,其中一些可能与用户查询相关,而另一些则不相关。在这种情况下,单个向量中的每个主题的表示可能会被稀释,这将再次影响检索精度。
另一方面,保持聚焦上下文的较小块允许更精确的匹配和检索相关信息。通过将文档划分为有意义的段落,检索器可以更准确地定位特定段落或事实,从而最终提高 RAG 的性能。那么,块可以在保持其上下文完整性的同时变得多小?这取决于您的文档性质,可能需要一些实验。通常,大约 250 个令牌的块大小,相当于大约 1000 个字符,是一个合理的实验起点。
现在我们已经涵盖了分块的原因,让我们看看它的一些实际方面。
常见的分块方法
按字符分割
将大文档划分为小块的最基本方法是将文本划分为 N 个字符大小的块。通常,在这种情况下,您还会指定连续块之间应重叠的字符数量。这在一定程度上减少了句子或想法在两个相邻块之间边界处突然中断的可能性。然而,正如您所能想象的,即使有重叠,每个块的固定字符数加上固定的重叠窗口,不可避免地会导致信息流中断,混合不同主题,甚至在单词中间拆分句子。按字符分割方法完全不考虑文档结构。
句子级分块或递归分块
按字符分割是一种简单的方法,完全不考虑文档结构。仅依赖固定字符数,这种方法通常会导致句子在中间或甚至在单词中间被拆分,这并不理想。
一种解决此问题的方法是使用递归分块方法,该方法有助于保留单个句子。使用此方法,您可以指定一个分隔符有序列表,以指导分割过程。例如,以下是一些常用的分隔符:
- "\n\n" - 双换行符,通常表示段落分隔。
- "\n" - 单换行符。
- "." - 句号。
- " " - 空格。
如果按上述顺序应用这些分隔符,过程将如下进行。首先,递归分块将在每个双换行符 ("\n\n") 处将文档拆分。然后,如果这些结果段落仍然超过所需的块大小,它将进一步在换行符 ("\n") 处拆分它们,依此类推。
虽然这种方法显著降低了句子在单词中间被截断的可能性,但它仍然未能捕捉到文档的复杂结构。文档通常包含各种元素,如段落、章节标题、页脚、列表、表格等,这些元素共同构成了文档的整体组织结构。然而,上述递归分块方法主要考虑段落和句子,忽略了其他结构细节。
此外,文档以多种本机格式存储,因此您需要为每种不同的文档类型制定不同的分隔符集。上述列表可能适用于纯文本,但如果您有 Markdown 文档,则需要一个更细致且定制的分隔符列表;如果您有 HTML 或 XML 文档,则需要另一个列表,依此类推。将此方法扩展到处理基于图像的文档(如 PDF 和 PowerPoint 演示文稿)会进一步增加复杂性。如果您的用例涉及各种非结构化文档,统一应用递归分块将迅速成为一个非平凡的任务。
使用 Unstructured 进行智能分块
Unstructured 提供了几种智能分块策略,这些策略与上述方法相比具有显著优势。与其处理一大段纯文本和一组随机的潜在分隔符,一旦您使用 Unstructured 对任何类型的文档进行划分,分块将应用于一组单独的文档元素,这些元素代表原始文档的逻辑单元并反映其结构。
这意味着您无需费力区分文档的各个部分。Unstructured 已经完成了繁重的工作,为您呈现了包含段落、表格、图像、代码片段以及文档中任何其他有意义的文本单元的独立 文档元素。在划分步骤之后,文档已经被划分为更小的段落。这是否意味着文档已经被分块了?还不完全是,但您已经完成了一半!
从划分中得出的一些文档元素可能仍然超过嵌入模型的上下文窗口或您期望的块大小。这些将需要进一步拆分。相反,一些文档元素可能太小,无法包含足够的上下文。例如,列表被划分为单独的 ListItem
元素,但您可以选择将这些元素合并为一个块,前提是它们仍然适合您首选的块大小。
从一个系统地划分为离散元素的文档开始,Unstructured 提供的智能分块策略允许您:
- 确保信息流保持不间断,避免简单字符分块所遭受的单词中间拆分。
- 控制块的最大和最小大小。
- 确保不同主题或想法(如不同主题的独立章节)不会被合并。
智能分块是递归分块的进一步发展,实际上考虑了文档的语义结构和内容。
智能分块提供四种策略,这些策略在如何保证块内内容的纯净度方面有所不同:
- “基本”分块策略:此方法允许您将连续元素组合起来,以最大限度地填充每个块,同时遵守最大块大小限制。如果单个孤立元素超过硬性最大值,它将被拆分为两个或更多块。
- “按标题”分块策略:此策略利用划分过程中识别的文档元素类型来理解文档结构,并保留章节边界。这意味着单个块将永远不会包含出现在两个不同章节中的文本,确保主题保持自包含,以提高检索精度。
- “按页面”分块策略(仅在 Serverless API 中提供):此策略专为每页传达唯一信息的文档量身定制,确保不同页面的内容从不在同一块中混合。当检测到新页面时,现有块将完成并开始一个新的块,即使下一个元素可以适合前一个块。
- “按相似度”分块策略(仅在 Serverless API 中提供):当文档结构未能提供清晰的主题边界时,您可以使用“按相似度”策略。此策略采用
sentence-transformers/multi-qa-mpnet-base-dot-v1
嵌入模型来识别主题相似的连续元素并将它们组合成块。
Unstructured 的智能分块策略的另一个优势是其在各种文档类型中的通用适用性。您无需像递归分块那样为每种文档硬编码和维护分隔符列表。这使得您可以轻松地对块大小和分块策略进行实验,从而确定任何给定用例的最佳方法。
结论
分块是任何 RAG 系统中必不可少的预处理步骤之一。您在设置分块时所做的选择将影响检索质量,进而影响系统的整体性能。在设计分块步骤时,请牢记以下几点:
- 对不同块大小进行实验:虽然大块可能包含更多上下文,但它们也会导致表示过于粗糙,从而对检索精度产生负面影响。最佳块大小取决于您的文档性质,但应优化为在不丢失重要上下文的情况下使用较小的块。
- 使用智能分块策略:选择允许您在语义上有意义的边界处分离文本的分块策略,以避免中断信息流或混合内容。
- 评估分块选择对整体 RAG 性能的影响:为您的特定用例设置一个评估集,并跟踪您对块大小和分块策略的实验如何影响整体性能。Unstructured 通过允许您简单地调整一两个参数(无论文档类型如何)来简化分块实验。
最后感谢阅读!欢迎关注我,微信公众号:倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。