对于大多数用例,请从RecursiveCharacterTextSplitter开始。它在保持上下文完整性和管理块大小之间取得了良好的平衡。这种默认策略开箱即用,运行良好,只有在需要针对特定应用程序微调性能时才应考虑调整它。
基于文本结构
文本自然地组织成段落、句子和单词等层次单元。我们可以利用这种固有的结构来指导我们的分割策略,创建的分割可以保持自然语言的流畅性,在分割中保持语义连贯性,并适应不同级别的文本粒度。LangChain 的RecursiveCharacterTextSplitter实现了这一概念。
- RecursiveCharacterTextSplitter尝试保持较大的单元(例如,段落)完整。
- 如果一个单元超出块大小,它将移动到下一个级别(例如,句子)。
- 如有必要,此过程将持续到单词级别。
基于长度
一种直观的策略是根据文档的长度进行分割。这种简单而有效的方法确保每个块都不会超过指定的长度限制。基于长度分割的主要优点- 直接实现
- 一致的块大小
- 易于适应不同的模型要求
- 基于 token:根据 token 数量分割文本,这在使用语言模型时很有用。
- 基于字符:根据字符数量分割文本,这在不同类型的文本中可能更一致。
基于文档结构
某些文档具有固有的结构,例如 HTML、Markdown 或 JSON 文件。在这些情况下,根据其结构分割文档是有益的,因为它通常自然地将语义相关的文本分组。基于结构分割的主要优点- 保留文档的逻辑组织
- 在每个块中保持上下文
- 对于下游任务(如检索或摘要)可能更有效
- Markdown:根据标题(例如 #、##、###)分割
- HTML:使用标签分割
- JSON:按对象或数组元素分割
- 代码:按函数、类或逻辑块分割
特定于提供商
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。