以编程方式使用文档
    npm install @langchain/textsplitters @langchain/core
    # Requires Node.js 22+
    
    pnpm add @langchain/textsplitters @langchain/core
    # Requires Node.js 22+
    
    yarn add @langchain/textsplitters @langchain/core
    # Requires Node.js 22+
    
    bun add @langchain/textsplitters @langchain/core
    # Requires Node.js 22+
    

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

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

基于文本结构

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

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

示例用法:

const splitter = new RecursiveCharacterTextSplitter({ chunkSize: 100, chunkOverlap: 0 })
const texts = splitter.splitText(document)

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

Length-based

一种直观的策略是根据文档的长度来分割文档。这种简单而有效的方法确保每个块不超过指定的大小限制。基于长度的分割的主要优点:

  • - 直接实现
  • - 一致的块大小
  • - 易于适应不同的模型要求

基于长度的分割类型:

  • - 基于令牌:根据令牌数量分割文本,这对于处理语言模型特别有用。
  • - 基于字符:根据字符数量分割文本,这在处理不同类型文本时可能更加一致。

使用 LangChain 的示例实现 CharacterTextSplitter 使用基于令牌的分割:

const splitter = new TokenTextSplitter({ encodingName: "cl100k_base", chunkSize: 100, chunkOverlap: 0 })
const texts = splitter.splitText(document)

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

基于文档结构

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

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

可用的文本拆分器: - 拆分代码