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 文件。在这种情况下,根据文档结构进行分割是有益的,因为它通常自然地将语义相关的文本分组。基于结构的分割的主要优点:
- - 保留文档的逻辑组织
- - 保持每个块内的上下文
- - 对于检索或摘要等下游任务可能更有效
可用的文本拆分器: - 拆分代码