Skip to main content
许多聊天或问答应用程序在嵌入和向量存储之前涉及对输入文档进行分块。 Pinecone 的这份笔记 提供了一些有用的提示:
如前所述,分块通常旨在将具有共同上下文的文本保持在一起。考虑到这一点,我们可能希望特别尊重文档本身的结构。例如,Markdown 文件是按标题组织的。在特定的标题组内创建分块是一个直观的想法。为了解决这个挑战,我们可以使用 MarkdownHeaderTextSplitter。这将根据指定的一组标题拆分 Markdown 文件。 例如,如果我们想拆分以下 Markdown:
我们可以指定要拆分的标题:
内容会根据共同的标题进行分组或拆分:
让我们看看下面的示例。

基本用法:

默认情况下,MarkdownHeaderTextSplitter 会从输出分块的内容中剥离被拆分的标题。可以通过设置 strip_headers = False 来禁用此功能。
默认的 MarkdownHeaderTextSplitter 会剥离空格和新行。若要保留 Markdown 文档的原始格式,请查看 ExperimentalMarkdownSyntaxTextSplitter

如何将 Markdown 行作为单独文档返回

默认情况下,MarkdownHeaderTextSplitter 根据 headers_to_split_on 中指定的标题聚合行。我们可以通过指定 return_each_line 来禁用此功能:
请注意,此处每个文档的 metadata 中都保留了标题信息。

如何限制分块大小:

在每个 Markdown 组内,我们可以应用任何我们想要的文本分割器,例如 RecursiveCharacterTextSplitter,它允许进一步控制分块大小。

故障排除:chunk_overlap 似乎未生效

  • 基于标题的拆分后(例如,MarkdownHeaderTextSplitter),请使用 split_documents(docs)(而不是 split_text),以便重叠应用于每个部分内部,并且每部分的元数据(标题)保留在分块上。
  • 仅当单个部分超过 chunk_size 并被拆分为多个分块时,才会出现重叠。
  • 重叠不会跨越部分/文档边界(例如,# H1## H2)。
  • 如果标题变成很小的第一个分块,请考虑将 strip_headers 设置为 True,这样标题行就不会成为独立的分块。
  • 如果您的文本缺少换行符/空格,请在 separators 中保留一个后备 "",以便分割器仍然可以拆分并应用重叠。