以编程方式使用文档
    pip install -U langchain-text-splitters
    
    uv add langchain-text-splitters
    

文本分割器 将大型文档拆分为更小的块,这些块可以单独检索并适合模型上下文窗口限制。

分割文档有多种策略,每种策略都有其自身的优势。

基于文本结构

文本自然地组织成段落、句子和单词等层次结构。我们可以利用这种固有结构来指导分割策略,创建保持自然语言流程的分割,保持分割内的语义连贯性,并适应不同级别的文本粒度。LangChain 的 RecursiveCharacterTextSplitter 实现了这个概念:

  • - RecursiveCharacterTextSplitter 尝试保持较大单元(如段落)完整。
  • - 如果某个单元超过块大小,它会移动到下一个级别(例如句子)。
  • - 如有必要,此过程会继续下探至单词级别。

示例用法:

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(document)

可用的文本分割器: - 递归分割文本

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)

可用的文本分割器: - 按令牌分割 - 按字符分割

基于文档结构

某些文档具有固有结构,例如 HTML、Markdown 或 JSON 文件。在这种情况下,根据文档结构进行分割是有益的,因为它通常自然地将语义相关的文本分组。基于结构的分割的主要优点:

  • - 保留文档的逻辑组织
  • - 保持每个块内的上下文
  • - 对于检索或摘要等下游任务可能更有效

基于结构的分割示例:

  • - Markdown:根据标题分割(例如, #, ##, ###)
  • - HTML:使用标签分割
  • - JSON:按对象或数组元素分割
  • - 代码:按函数、类或逻辑块分割

可用的文本分割器: - 分割 Markdown - 拆分 JSON - 拆分代码 - 拆分 HTML