Unstructured专家分享RAG运行中文档分块 的最佳通常 Chunking

近日,Maria Khalusova在Unstructured官网博客分享了无关分块的最佳通常。

Unstructured成立于2022年9月,努力于处置人造言语处置(NLP)和大型言语模型(LLM)运行中的数据预处置疑问。公司总部位于美国,专一于将非结构化数据转化为LLM可以处置的格局,当下盛行的pdf解析库就来自于它们,它们在数据预处置方面领有十分前沿的技术和阅历。

分块是文档处置的一个步骤,当各种格局的文档被解析变成文本文档后,接上去就须要对文档启动分块。而这一步骤也间接会影响到前期检索和模型推理总结的成果。这时刻肯定会带来一些经常出现的疑问如:为什么要分块?最佳块大小是多少?拆分文本的最佳方法是什么?等等。 在这篇文章里,博文作者将给出他们的通常分享。

为什么须要分块?

出于多种要素,在为RAG预备数据时,分块是必无法少的预处置步骤。

1)高低文窗口限制

首先从基础开局。检索到的块将间接作为高低文输入到揭示中,以便LLM生成照应。这象征着一切检索到的块的总长度至少不能超越LLM的高低文窗口。虽然当下许多LLM有相当大的高低文窗口,但实践上并不宿愿填满高低文窗口,由于这些LLM会面临“海底捞针”的疑问(加长阅读:超长高低文窗口大模型的“照妖镜”——海底捞针实验,大模型“打假”必知必会)。另外,开发者或者还想以其余模式应用这个大高低文窗口,比如提供详细的指令、角色形容或一些少样本示例(few-shot)。

此外,假设计划经常使用相似性搜查并嵌入(embedding)文档,肯定思考到嵌入模型也有一个有限的高低文窗口。这些模型不能嵌入超越其高低文窗口最大长度的文本。这个限制因详细模型而异,但可以在模型的形容中找到这些消息,例如在Hugging Face Hub上的模型卡片上。一旦知道将经常使用哪种模型来生成嵌入,就能确定文本块的最大值(以token为单位,而不是字符或单词)。嵌入模型通常在高低文窗口大小上的最大值约为8K token或更少,这相当于英语中的大概6200个单词。为了直观了解有多大,比如,整个《指环王》系列,包括《霍比特人》,大概有576,459个单词,所以假构想应用这个语料库启动RAG与相似性搜查,须要将其分红至少93个块。

2)块大小对检索精度的影响

虽然嵌入模型对其可以嵌入的标志数量规则了硬性的最大限制,但这并不象征着分块肯定到达这个长度。这只是象征着它们不能超越这个长度。理想上,在许多状况下,经常使用每个分块的最大长度(如 6200 字(8K 标志))或者会过长。这里有几个令人信服的理由来选用较小的语块。

回顾一下当咱们嵌入一段文本以取得嵌入向量时会出现什么。大少数嵌入模型都是编码器类型的转换器模型,输入文本的最大长度为 768。不论你给模型的是 10 个字的句子还是 1000 个字的段落,获取的嵌入向量的维度都是一样的,都是 768。其上班原理是,模型首先将文本转换为token,在预训练环节中为每个token学习了一个向量表征。而后,它将运行一个池化操作,将单个token表征平均为一个单向量表征。

经常出现的池化类型包括:

其指标是将细粒度的token级表征紧缩成繁多的固定长度表征,其中蕴含整个输入序列的含意。这种紧缩自身就是有损的。关于较大的块,表征或者会变得过于毛糙,或者会覆盖关键的细节。为确保准确检索,文本块肯定领有无心义且粗疏入微的表征。

如今,请思考另一个潜在疑问。一个大块或者蕴含多个主题,其中一些或者与用户查问关系,而另一些则不关系。在这种状况下,单个向量中每个主题的示意或者会变得含糊,这雷同会影响检索精度。

另一方面,较小的片段可以保稳健点突出的高低文,从而可以更准确地婚配和检索关系消息。经过将文档分解成无心义的片段,检索器可以更准确地找到特定段落或理想,从而最终提高 RAG 功能。那么,在坚持高低文完整性的前提下,文件块可以有多小?这取决于文档的性质,或者须要启动一些实验。通常状况下,250 个 token 左右的块大小(相当于约 1000 个字符)是一个正当的实验终点。

分块的经常出现方法

1)字符级分块

将大文档宰割成小块的最基本方法是将文本分红 N 个字符大小的块。通常在这种状况下,还会指定肯定数量的字符,这些字符应在延续的文本块之间堆叠。这在肯定水平上降落了句子或观念在相邻两块之间的边界被突然切断的或者性。不过,可以构想,即使有堆叠,每个块的固定字符数加上固定的堆叠窗口,也无法防止地会造成消息流终止、不同主题混合,甚至句子在一个词的两边被宰割。字符宰割法齐全不思考文档结构。

2)句子级分块或递归分块

字符宰割是一种便捷化的方法,齐全没有思考到文档的结构。这种方法齐全依赖于固定的字符数,经常会造成句子在中途甚至在词的两边被拆分,成果并不好。

处置这一疑问的方法之一是经常使用递归分块法,这种方法有助于保管单个句子。经常使用这种方法,您可以指定一个有序的分隔符列表来指点宰割环节。例如,以下是一些罕用的分隔符:

假设依照指定的顺序经常使用上述分隔符,环节将是这样的。首先,递归分块会在每次出现双新行("\n\n")时分解文档。而后,假设这些分段依然超越了所需的分块大小,它将在新行处进一步分解它们("\n"),以此类推。

虽然这种方法大大降落了中途断句的或者性,但依然无法捕捉到复杂的文档结构。文档通常蕴含多种元素,如段落、章节页眉、页脚、列表、表格等,一切这些元素都有助于文档的全体组织。但是,上述递归分块法关键思考的是段落和句子,而疏忽了其余结构上的纤细差异。

此外,文档以多种本地格局存储,因此肯定为每种不同的文档类型设计不同的分隔符。下面的列表或者对纯文本很有效,但关于标志符,你须要一个更粗疏、更有针对性的分隔符列表;假设是 HTML 或 XML 文档,还须要另一个列表,等等。将这种方法裁减四处置 PDF 和 PowerPoint 演示文稿等基于图像的文档,会带来更多复杂性。假设经常使用场景触及各种非结构化文档,那么一致运行递归分块很快就会成为一项惨重的义务。

经常使用Unstructured智能分块

Unstructured提供了多种智能分块战略,一切这些战略都比前面提到的方法有显著长处。一旦经常使用 Unstructured 对任何类型的文档启动分区,分块处置就会运行于一组独自的文档元素,这些元素代表原始文档的逻辑单元并反映其结构,而不是处置一堵带有随机潜在分隔符的纯文本墙。

这就象征着,你不用再想方法辨别文档的各个局部。Unstructured 曾经实现了这些惨重的上班,间接展现不同的文档元素,这些元素封装了文档中的段落、表格、图片、代码片段和其余任何无心义的文本单元。在实现分区步骤后,文档曾经被划分为更小的片段。这能否象征着文档曾经分块?不齐全是,但曾经成功了一半!

分区后获取的某些文档元素或者仍会超出嵌入模型的高低文窗口或所需的块大小。这些须要进一步宰割。雷同,有些文档元素或者太小,无法蕴含足够的高低文。例如,一个列表被宰割成单个的 ListItem元素,但你可以选用将这些元素兼并成一个繁多的块,只需它们依然合乎偏好设置的块大小。

从系统划分为团圆元素的文档开局,Unstructured 提供的智能分块战略可以做到这一点:

智能分块比递归分块更进一步,它实践上思考到了文档的语义结构和内容。

智能分块提供了四种战略,它们在保障分块内容污浊度方面各有不同:

Unstructured 智能分块战略的另一个长处是可广泛适用于各种文档类型。不须要像递归分块那样,为每个文档硬编码和保营养隔符列表。可以轻松尝试分块大小和分块战略,为任何给定的经常使用场景找出最佳计划。

论断

分块是任何 RAG 系统中必无法少的预处置步骤之一。设置时的选用会影响检索品质,进而影响系统的全体功能。以下是设计分块步骤时须要留意的一些事项:

原文:

本文转载自​​,作者:

您可能还会对下面的文章感兴趣: