基于文本结构
文本自然组织成层次单元,例如段落、句子和单词。我们可以利用这种固有结构来指导拆分策略,创建保持自然语言流畅性、在拆分内保持语义连贯性并适应不同文本粒度级别的拆分。LangChain 的RecursiveCharacterTextSplitter 实现了这个概念:
- RecursiveCharacterTextSplitter 尝试保持较大单元(例如段落)完整。
- 如果单元超过块大小,它会移动到下一级(例如句子)。
- 如果需要,此过程会继续到单词级别。
基于长度
一种直观的策略是根据文档的长度来拆分文档。这种简单而有效的方法确保每个块不超过指定的大小限制。基于长度拆分的主要优点:- 实现简单直接
- 一致的块大小
- 易于适应不同的模型要求
- 基于令牌:根据令牌数量拆分文本,这在使用语言模型时很有用。
- 基于字符:根据字符数量拆分文本,这在不同类型的文本中可以更一致。
基于文档结构
某些文档具有固有结构,例如 HTML、Markdown 或 JSON 文件。在这些情况下,基于文档结构拆分是有益的,因为它通常会自然地将语义相关的文本分组。基于结构拆分的主要优点:- 保留文档的逻辑组织
- 在每个块内维护上下文
- 对于检索或摘要等下游任务可能更有效
- Markdown:基于标题拆分(例如 #、##、###)
- HTML:使用标签拆分
- JSON:按对象或数组元素拆分
- 代码:按函数、类或逻辑块拆分