Text Splitters
- 文本分隔
检索的关键部分时仅获取文档的相关部分,主要任务之一是将大文档分割为更小的块。
最简单的例子是,将长文档分割成更小的块,以适合模型的上下文窗口。
LangChain 有许多内置的文档转换器,可以轻松地拆分、组合、过滤和以其他方式操作文档。
理想情况下,希望将语义相关的文本片段保留在一起。“语义相关”的含义可能取决于文本的类型。下面展示了实现此目的的几种方法。
在较高层面上,文本分割器的工作原理如下:
- 将文本分成小的、具有语义意义的块(通常是句子)
- 开始将这些小块组合成一个更大的块,直到达到一定的大小(通过某些函数测量)。
- 一旦达到该大小,请将该块设为自己的文本片段,然后开始创建具有一些重叠的新文本块(以保持块之间的上下文)。
这意味着可以沿着两个不同的轴自定义文本拆分器:
- 如何分割文本
- 如何测量块大小
Types of Text Splitters
LangChain 提供了多种不同类型的文本分割器。这些都位于 langchain-text-splitters
包中。下表列出了所有这些以及一些特征:
- Name:文本分割器的名称
- Splits On:该文本分割器如何分割文本
- Adds Metadata:该文本拆分器是否添加有关每个块来自何处的元数据
- Description:分割器的描述,包括有关何时使用它的建议
Name | Splits On | Adds Metadata | Description |
---|---|---|---|
Recursive | 用户定义的字符列表 | 递归地分割文本,递归地分割文本的目的是尝试使相关的文本片段彼此相邻。(推荐) | |
HTML | HTML 特定字符 | √ | 根据 HTML 特定字符分割文本,值得注意的是,添加了有关该块来自何处的相关信息(基于 HTML) |
Markdown | Markdown 特定字符 | √ | 根据 Markdown 特定字符分割文本,值得注意的是,这添加了有关该块来自何处的相关信息(基于 Markdown) |
Code | code(Python、JS)特定字符 | 根据特定于编码语言的字符分割文本,有 15 种不同的语言可供选择。 | |
Token | Tokens | 根据token分隔文本,有几种不同的方法衡量tokens | |
Character | 用户定义的字符 | 根据用户定义的字符拆分文本,比较简单的方法之一。 | |
[Experimental] Semantic Chunker | 句子 | 首先对句子进行分割。然后,如果它们在语义上足够相似,则将它们相邻地组合起来。 |
HTMLHeaderTextSplitter
概念上类似于 MarkdownHeaderTextSplitter
、HTMLHeaderTextSplitter
是一个“结构感知”分块器,它在元素级别拆分文本,并为每个与任何给定块“相关”的标题添加元数据。它可以逐个元素返回块或将具有相同元数据的元素组合起来,目标是 (a) 保持相关文本在语义上(或多或少)分组;(b)保留文档结构中编码的上下文丰富的信息。它可以与其他文本分割器一起使用,作为分块管道的一部分。
使用示例:
- 使用 HTML 字符串
- 通过管道传输到另一个拆分器,并从 Web URL 加载 html
局限性:
一个 HTML 文档与另一个 HTML 文档之间可能存在相当多的结构变化,虽然 HTMLHeaderTextSplitter
会尝试将所有“相关”标头附加到任何给定块,但有时可能会丢失某些标头。
Split by character
最简单的方法,这基于字符(默认为“”)进行分割,并通过字符数来测量块长度。
- 通过单个字符进行文本分割
- 按字符数测量块大小
Split code
CodeTextSplitter
允许您使用支持的多种语言拆分代码。
Recursiverly split JSON
- 递归拆分JSON
JSON分割器首先遍历JSON数据深度并构建更小的JSON块。
它尝试保持嵌套的 json 对象完整,但如果需要将块保留在 min_chunk_size 和 max_chunk_size 之间,则会将它们分割。
如果该值不是嵌套的 json,而是一个非常大的字符串,则该字符串将不会被拆分。
如果需要对块大小进行硬性限制,请考虑在这些块上使用递归文本拆分器。
有一个可选的预处理步骤来分割列表,首先将它们转换为 json (dict),然后这样分割它们。
- 按json值对文本进行分割
- 按字符数测量块大小
Recursiverly split by character
- 按字符递归分割
对于一般文本,推荐使用此文本分割器。它由字符列表参数化,它尝试按顺序分割它们,直到块足够小。
默认列表为 [“\n\n”, “\n”, " ", “”]。
这样做的效果是尝试将所有段落(然后是句子,然后是单词)尽可能长时间地放在一起,因为这些通常看起来是语义相关性最强的文本片段。
- 按字符列表进行文本分割
- 按字符数测量块大小
Semantic Chunking
- 语义分块:根据语义相似性分割文本。
在较高层次上,它会分成句子,然后分成 3 个句子为一组,然后合并嵌入空间中相似的句子。