文本分割器
- 文档
- 分词(/docs/concepts/tokens)
概览
文档分割通常是许多应用的关键预处理步骤。 它涉及将大型文本分解为更小、更易管理的块。 这一过程提供了多种好处,例如确保对不同长度文档的一致性处理、克服模型输入大小的限制,以及提高检索系统中使用的文本表示质量。 有几种文档分割策略,每种都有其自身的优势。
关键概念

文本分割器将文档拆分为更小的块,以便在下游应用程序中使用。
为什么拆分文档?
将文档拆分为多个部分有几个原因:
- 处理非均匀文档长度: 现实世界的文档集合通常包含大小不一的文本。分割可确保对所有文档进行一致的处理。
- 克服模型限制:许多嵌入模型和语言模型都有最大输入大小限制。拆分允许我们处理原本会超出这些限制的文档。
- 提升表示质量:对于较长的文档,嵌入或其他表示的质量可能会随着试图捕获过多信息而下降。分段可以导致每个部分更聚焦和准确的表示。
- 提升检索精度: 在信息检索系统中,分块可以提高搜索结果的粒度,从而实现查询与相关文档部分更精确的匹配。
- 优化计算资源: 处理较小的文本块可以更加节省内存,并允许更好地并行化处理任务。
现在,下一个问题是 如何 将文档分割成块!有多种策略,每种都有其自身的优势。
- 查看 Greg Kamradt 的 chunkviz 以可视化下文讨论的不同分块策略。
方法
Length-based
最直观的策略是根据文档长度进行分割。这种简单而有效的方法确保每个分块不超过指定的大小限制。 基于长度的分割的关键优势:
- 直观的实现
- 一致的块大小
- 轻松适配不同模型需求
基于长度的分割类型:
- 基于令牌:根据令牌数量分割文本,这在处理语言模型时非常有用。
- 基于字符的: 根据字符数量拆分文本,这在不同类型的文本中可能更一致。
使用 LangChain 的 CharacterTextSplitter 和基于令牌的分割功能的示例实现:
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base", chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(document)
基于文本结构
文本自然地组织成层级单元,如段落、句子和单词。
我们可以利用这种固有结构来指导我们的拆分策略,创建能够保持自然语言流、在拆分内维持语义连贯性,并适应不同文本粒度的拆分。
LangChain 的 RecursiveCharacterTextSplitter 实现了这一概念:
- The
RecursiveCharacterTextSplitter尝试保持较大的单元(例如段落)完整。 - 如果单元超过块大小,它将移动到下一级(例如,句子)。
- 如果必要,此过程将继续进行到单词级别。
这是示例用法:
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(document)
- 查看有关递归文本分割的指南。
基于文档结构
某些文档具有固有的结构,例如 HTML、Markdown 或 JSON 文件。 在这种情况下,根据文档的结构进行分割是有益的,因为它通常能自然地将语义相关的文本分组。 基于结构的分割的主要优势包括:
- 保持文档的逻辑组织
- 维护每个块内的上下文
- 对于检索或摘要等下游任务可能更有效
基于结构的拆分示例:
- Markdown: 基于标题进行分割(例如,#、##、###)
- HTML: 使用标签进行分割
- JSON: 按对象或数组元素拆分
- 代码: 按函数、类或逻辑块进行分割
- 查看有关Markdown 拆分的指南。
- 查看 递归 JSON 分割 的指南。
- 查看 代码分割 的指南。
- 查看 HTML 拆分 的指南。
基于语义含义
与之前的方法不同,基于语义的分割实际上考虑了文本的内容。 虽然其他方法使用文档或文本结构作为语义意义的代理,但此方法直接分析文本的语义。 实现这一目标有几种方式,但从概念上讲,该方法是在文本含义发生显著变化时分割文本。 例如,我们可以使用滑动窗口方法来生成嵌入向量,并比较这些嵌入向量以发现显著差异:
- 从最初的几句话开始并生成嵌入向量。
- 移动到下一组句子并生成另一个嵌入(例如,使用滑动窗口方法)。
- 比较嵌入向量以找出显著差异,这些差异指示语义部分之间的潜在“断点”。
该技术有助于创建语义上更连贯的文本块,可能提升检索或摘要等下游任务的质量。
- 查看关于基于语义含义分割文本的指南。
- 查看 Greg Kamradt 的 notebook,了解语义分割的展示。