赞
踩
检索的关键部分时仅获取文档的相关部分,主要任务之一是将大文档分割为更小的块。
最简单的例子是,将长文档分割成更小的块,以适合模型的上下文窗口。
LangChain 有许多内置的文档转换器,可以轻松地拆分、组合、过滤和以其他方式操作文档。
理想情况下,希望将语义相关的文本片段保留在一起。“语义相关”的含义可能取决于文本的类型。下面展示了实现此目的的几种方法。
在较高层面上,文本分割器的工作原理如下:
这意味着可以沿着两个不同的轴自定义文本拆分器:
LangChain 提供了多种不同类型的文本分割器。这些都位于 langchain-text-splitters
包中。下表列出了所有这些以及一些特征:
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 | 句子 | 首先对句子进行分割。然后,如果它们在语义上足够相似,则将它们相邻地组合起来。 |
概念上类似于 MarkdownHeaderTextSplitter
、HTMLHeaderTextSplitter
是一个“结构感知”分块器,它在元素级别拆分文本,并为每个与任何给定块“相关”的标题添加元数据。它可以逐个元素返回块或将具有相同元数据的元素组合起来,目标是 (a) 保持相关文本在语义上(或多或少)分组;(b)保留文档结构中编码的上下文丰富的信息。它可以与其他文本分割器一起使用,作为分块管道的一部分。
使用示例:
局限性:
一个 HTML 文档与另一个 HTML 文档之间可能存在相当多的结构变化,虽然 HTMLHeaderTextSplitter
会尝试将所有“相关”标头附加到任何给定块,但有时可能会丢失某些标头。
最简单的方法,这基于字符(默认为“”)进行分割,并通过字符数来测量块长度。
CodeTextSplitter
允许您使用支持的多种语言拆分代码。
JSON分割器首先遍历JSON数据深度并构建更小的JSON块。
它尝试保持嵌套的 json 对象完整,但如果需要将块保留在 min_chunk_size 和 max_chunk_size 之间,则会将它们分割。
如果该值不是嵌套的 json,而是一个非常大的字符串,则该字符串将不会被拆分。
如果需要对块大小进行硬性限制,请考虑在这些块上使用递归文本拆分器。
有一个可选的预处理步骤来分割列表,首先将它们转换为 json (dict),然后这样分割它们。
对于一般文本,推荐使用此文本分割器。它由字符列表参数化,它尝试按顺序分割它们,直到块足够小。
默认列表为 [“\n\n”, “\n”, " ", “”]。
这样做的效果是尝试将所有段落(然后是句子,然后是单词)尽可能长时间地放在一起,因为这些通常看起来是语义相关性最强的文本片段。
在较高层次上,它会分成句子,然后分成 3 个句子为一组,然后合并嵌入空间中相似的句子。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。