核心模块(Modules)
数据连接(DataConnection)
文档转换器(DocumentTransformers)
Index

文本分割器

一旦加载了文档,你通常希望转换它们以更好地适配你的应用。最简单的例子 是你可能想把长文档分割成能放入模型上下文窗口的更小的块。LangChain 有许多内置的文档转换器,使分割、合并、过滤和以其它方式操作文档变得容易。

当你需要处理大段文本时,有必要把该文本分割成块。 虽然听起来简单,但这里有许多潜在的复杂性。理想情况下,你希望把语义上相关的文本片段放在一起。“语义相关”的含义可能取决于文本类型。 本笔记本展示了实现这一点的几种方式。

从高层来看,文本分割器的工作方式如下:

  1. 把文本分割成小的、语义上有意义的块(通常是句子)。
  2. 开始把这些小块合并成更大的块,直到达到某个大小(由某个函数衡量)。
  3. 一旦达到该大小,就把这个块作为独立的一段文本,然后开始创建带有一些重叠的新文本块(以保持块之间的上下文)。

这意味着你可以沿两个不同的维度自定义文本分割器:

  1. 文本如何被分割
  2. 块大小如何衡量

文本分割器的类型

LangChain 提供了许多不同类型的 text splitter。 它们都位于 langchain-text-splitters 包中。

表格各列含义:

  • Name:文本分割器的名称
  • Classes:实现该文本分割器的类
  • Splits On:该文本分割器按什么分割文本
  • Adds Metadata:该文本分割器是否添加关于每个块来源的元数据。
  • Description:分割器的描述,包括关于何时使用它的建议。
NameClassesSplits OnAdds MetadataDescription
RecursiveRecursiveCharacterTextSplitter, RecursiveJsonSplitter用户定义的字符列表递归地分割文本。这种分割尝试把相关的文本片段放在一起。这是开始分割文本的 推荐方式。
HTMLHTMLHeaderTextSplitter, HTMLSectionSplitterHTML 特定字符✅基于 HTML 特定字符分割文本。值得注意的是,它会添加关于该块来源的相关信息(基于 HTML)
MarkdownMarkdownHeaderTextSplitterMarkdown 特定字符✅基于 Markdown 特定字符分割文本。值得注意的是,它会添加关于该块来源的相关信息(基于 Markdown)
Code多种语言代码(Python、JS)特定字符基于编程语言特定字符分割文本。有 15 种不同语言可供选择。
Token多个类Token按 token 分割文本。衡量 token 有几种不同的方式。
CharacterCharacterTextSplitter用户定义的字符基于用户定义的字符分割文本。是较简单的方法之一。
[Experimental] Semantic ChunkerSemanticChunker句子先按句子分割。然后把语义足够相似的相邻句子合并。取自 Greg Kamradt (opens in a new tab)
AI21 Semantic Text SplitterAI21SemanticTextSplitter (opens in a new tab)✅识别构成连贯文本片段的独立主题,并沿着这些主题进行分割。

评估文本分割器

你可以使用 Greg Kamradt 创建的 Chunkviz 工具 (opens in a new tab) 来评估文本分割器。 Chunkviz 是一个很棒的工具,可以可视化你的文本分割器的工作情况。它会向你展示文本是 如何被分割的,并帮助调整分割参数。

其它文档转换

文本分割只是你可能想在把文档传给 LLM 之前对其进行的转换的一个例子。关于与第三方工具的内置文档转换器集成,请前往 集成 (opens in a new tab)。