文本分割器
一旦加载了文档,你通常希望转换它们以更好地适配你的应用。最简单的例子 是你可能想把长文档分割成能放入模型上下文窗口的更小的块。LangChain 有许多内置的文档转换器,使分割、合并、过滤和以其它方式操作文档变得容易。
当你需要处理大段文本时,有必要把该文本分割成块。 虽然听起来简单,但这里有许多潜在的复杂性。理想情况下,你希望把语义上相关的文本片段放在一起。“语义相关”的含义可能取决于文本类型。 本笔记本展示了实现这一点的几种方式。
从高层来看,文本分割器的工作方式如下:
- 把文本分割成小的、语义上有意义的块(通常是句子)。
- 开始把这些小块合并成更大的块,直到达到某个大小(由某个函数衡量)。
- 一旦达到该大小,就把这个块作为独立的一段文本,然后开始创建带有一些重叠的新文本块(以保持块之间的上下文)。
这意味着你可以沿两个不同的维度自定义文本分割器:
- 文本如何被分割
- 块大小如何衡量
文本分割器的类型
LangChain 提供了许多不同类型的 text splitter。
它们都位于 langchain-text-splitters 包中。
表格各列含义:
- Name:文本分割器的名称
- Classes:实现该文本分割器的类
- Splits On:该文本分割器按什么分割文本
- Adds Metadata:该文本分割器是否添加关于每个块来源的元数据。
- Description:分割器的描述,包括关于何时使用它的建议。
| Name | Classes | Splits On | Adds Metadata | Description |
|---|---|---|---|---|
| Recursive | RecursiveCharacterTextSplitter, RecursiveJsonSplitter | 用户定义的字符列表 | 递归地分割文本。这种分割尝试把相关的文本片段放在一起。这是开始分割文本的 推荐方式。 | |
| HTML | HTMLHeaderTextSplitter, HTMLSectionSplitter | HTML 特定字符 | ✅ | 基于 HTML 特定字符分割文本。值得注意的是,它会添加关于该块来源的相关信息(基于 HTML) |
| Markdown | MarkdownHeaderTextSplitter | Markdown 特定字符 | ✅ | 基于 Markdown 特定字符分割文本。值得注意的是,它会添加关于该块来源的相关信息(基于 Markdown) |
| Code | 多种语言 | 代码(Python、JS)特定字符 | 基于编程语言特定字符分割文本。有 15 种不同语言可供选择。 | |
| Token | 多个类 | Token | 按 token 分割文本。衡量 token 有几种不同的方式。 | |
| Character | CharacterTextSplitter | 用户定义的字符 | 基于用户定义的字符分割文本。是较简单的方法之一。 | |
| [Experimental] Semantic Chunker | SemanticChunker | 句子 | 先按句子分割。然后把语义足够相似的相邻句子合并。取自 Greg Kamradt (opens in a new tab) | |
| AI21 Semantic Text Splitter | AI21SemanticTextSplitter (opens in a new tab) | ✅ | 识别构成连贯文本片段的独立主题,并沿着这些主题进行分割。 |
评估文本分割器
你可以使用 Greg Kamradt 创建的 Chunkviz 工具 (opens in a new tab) 来评估文本分割器。
Chunkviz 是一个很棒的工具,可以可视化你的文本分割器的工作情况。它会向你展示文本是
如何被分割的,并帮助调整分割参数。
其它文档转换
文本分割只是你可能想在把文档传给 LLM 之前对其进行的转换的一个例子。关于与第三方工具的内置文档转换器集成,请前往 集成 (opens in a new tab)。