文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

HierarchicalDocumentSplitter

使用此组件基于文本段落之间的父子关系来创建多级文档结构。

pipeline 中的最常见位置ConvertersDocumentCleaner 之后,在索引管道中
必需的初始化变量“block_sizes”:用于将文档分割成块的大小集合。块按降序分割。
强制运行变量“documents”:要分割成分层块的文档列表
输出变量“documents”:分层文档列表
API 参考PreProcessors (预处理器)
GitHub 链接https://github.com/deepset-ai/haystack/blob/dae8c7babaf28d2ffab4f2a8dedecd63e2394fb4/haystack/components/preprocessors/hierarchical_document_splitter.py

概述

HierarchicalDocumentSplitter 将文档划分为不同大小的块,创建类似树的结构。

块是分割器生成的文本块之一。这类似于将一段长文本切成小块:每块都是一个块。块形成一个树状结构,您的完整文档是根块,当您将其分割成越来越小的块时,您会得到子块和叶子块,一直到指定的最小大小。

然后,AutoMergingRetriever 组件利用这种分层结构来改进文档检索。

要初始化组件,您需要指定block_size,这是每个块的“最大长度”,以指定单位度量(请参阅split_by 参数)。传递一组大小(例如,{20, 5}),它将

  • 首先,将文档分割成每个最多 20 个单位的块(“父”块)。
  • 然后,它会将每个父块分割成每个最多 5 个单位的块(“子”块)。

这种大小的降序构建了层级结构。

在初始化组件时可以设置这些附加参数

  • split_by 可以设置为 "word"(默认), "sentence""passage""page".
  • split_overlap 是一个整数,表示块之间重叠的单词、句子或段落的数量,默认为 0。

用法

单独使用

from haystack import Document
from haystack.components.preprocessors import HierarchicalDocumentSplitter

doc = Document(content="This is a simple test document")
splitter = HierarchicalDocumentSplitter(block_sizes={3, 2}, split_overlap=0, split_by="word")
splitter.run([doc])

>> {'documents': [Document(id=3f7..., content: 'This is a simple test document', meta: {'block_size': 0, 'parent_id': None, 'children_ids': ['5ff..', '8dc..'], 'level': 0}),
>> Document(id=5ff.., content: 'This is a ', meta: {'block_size': 3, 'parent_id': '3f7..', 'children_ids': ['f19..', '52c..'], 'level': 1, 'source_id': '3f7..', 'page_number': 1, 'split_id': 0, 'split_idx_start': 0}),
>> Document(id=8dc.., content: 'simple test document', meta: {'block_size': 3, 'parent_id': '3f7..', 'children_ids': ['39d..', 'e23..'], 'level': 1, 'source_id': '3f7..', 'page_number': 1, 'split_id': 1, 'split_idx_start': 10}),
>> Document(id=f19.., content: 'This is ', meta: {'block_size': 2, 'parent_id': '5ff..', 'children_ids': [], 'level': 2, 'source_id': '5ff..', 'page_number': 1, 'split_id': 0, 'split_idx_start': 0}),
>> Document(id=52c.., content: 'a ', meta: {'block_size': 2, 'parent_id': '5ff..', 'children_ids': [], 'level': 2, 'source_id': '5ff..', 'page_number': 1, 'split_id': 1, 'split_idx_start': 8}),
>> Document(id=39d.., content: 'simple test ', meta: {'block_size': 2, 'parent_id': '8dc..', 'children_ids': [], 'level': 2, 'source_id': '8dc..', 'page_number': 1, 'split_id': 0, 'split_idx_start': 0}),
>> Document(id=e23.., content: 'document', meta: {'block_size': 2, 'parent_id': '8dc..', 'children_ids': [], 'level': 2, 'source_id': '8dc..', 'page_number': 1, 'split_id': 1, 'split_idx_start': 12})]}

在 pipeline 中

此 Haystack 管道处理.md 文件,将其转换为文档,清理文本,将其分割成基于句子的块,并将结果存储在内存文档存储中。

from pathlib import Path

from haystack import Document
from haystack import Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.converters.txt import TextFileToDocument
from haystack.components.preprocessors import DocumentCleaner
from haystack.components.preprocessors import HierarchicalDocumentSplitter
from haystack.components.writers import DocumentWriter

document_store = InMemoryDocumentStore()

Pipeline = Pipeline()
Pipeline.add_component(instance=TextFileToDocument(), name="text_file_converter")
Pipeline.add_component(instance=DocumentCleaner(), name="cleaner")
Pipeline.add_component(instance=HierarchicalDocumentSplitter(
	block_sizes={10, 6, 3}, split_overlap=0, split_by="sentence", name="splitter"
)
Pipeline.add_component(instance=DocumentWriter(document_store=document_store), name="writer")
Pipeline.connect("text_file_converter.documents", "cleaner.documents")
Pipeline.connect("cleaner.documents", "splitter.documents")
Pipeline.connect("splitter.documents", "writer.documents")


path = "path/to/your/files"
files = list(Path(path).glob("*.md"))
Pipeline.run({"text_file_converter": {"sources": files}})