Haystack DoclingConverter 集成指南:用 Docling 将 PDF/DOCX 转换为布局感知的 Haystack Documents
【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack
DoclingConverter是 Haystack 生态中基于 Docling 文档解析库的转换组件,负责把 PDF、DOCX、HTML 等格式的文件解析为保留布局、表格、标题等结构信息的 HaystackDocument,并支持 Markdown、按块导出和 JSON 三种导出模式。阅读本文后,你将掌握该组件的完整初始化参数、三种导出模式的适用场景、元数据抽取机制,以及如何单独运行它或将其接入 RAG 索引管道进行实战部署。
本文以 Docling 集成 API 参考 为核心骨架,结合 DoclingConverter 用户指南 与仓库内数据类源码展开,确保每个参数与行为都有文档或源码依据。
一、Docling 集成在 Haystack 中的定位
Docling 是一个理解文档结构的解析库,能够识别布局、表格、标题等元素。DoclingConverter接收文件路径、URL 或ByteStream对象列表,交给 Docling 解析成富文档表示,再转成 HaystackDocument输出。
在索引管道中,它通常位于 PreProcessors 之前,也就是整个管道的起始位置。按官方用户指南的定位,它是“最常出现在管道中的位置”——处于索引管道的开头,负责把原始文件变成结构化的Document流。其核心属性如下:
| 属性 | 说明 |
|---|---|
| 管道中的常见位置 | 索引管道起始处(PreProcessors 之前) |
| 必填运行参数 | sources:文件路径、URL 或ByteStream对象列表 |
| 输出变量 | documents:HaystackDocument列表 |
| 集成包名 | docling-haystack |
说明:
DoclingConverter本身并不在本仓库的haystack/目录内,而是由独立的docling-haystack集成包提供(源码位于 deepset-ai/haystack-core-integrations 仓库的 integrations/docling 目录)。本仓库中的 API 参考文档 与 用户指南 完整记录了它的接口与用法。
二、安装与包结构
安装 Docling 集成:
pip install docling-haystack安装后,相关组件从haystack_integrations.components.converters.docling导入,模块路径为haystack_integrations.components.converters.docling.converter。API 参考文档在该模块下定义了四个公开类型:
ExportType:导出类型枚举;BaseMetaExtractor:元数据抽取器抽象基类;MetaExtractor:默认的元数据抽取器实现;DoclingConverter:核心转换组件。
三、ExportType:三种导出模式
ExportType继承自str和Enum,是可用的导出类型枚举。它是决定DoclingConverter输出形态的核心开关:
| 取值 | 行为 | 典型场景 |
|---|---|---|
ExportType.MARKDOWN(默认) | 每个输入文档导出为单个 Markdown 字符串,封装进一个Document | 需要保留完整格式化内容的场景 |
ExportType.DOC_CHUNKS | 先用 Docling 的HybridChunker对每个文档分块,每个块返回一个Document,块元数据携带 Docling 的结构上下文 | 索引管道,下游检索需要语义连贯的块 |
ExportType.JSON | 将完整 Docling 文档序列化为 JSON 字符串,封装进一个Document | 需要访问完整结构化表示的场景 |
对应关系可以直接从参考文档的__init__参数说明中确认:MARKDOWN将每个输入文档捕获为单个 markdownDocument;DOC_CHUNKS先分块再按块返回;JSON将完整 Docling 文档序列化为 JSON 字符串。
from haystack_integrations.components.converters.docling import ( DoclingConverter, ExportType, ) # 默认:整份文档输出为一个 Markdown Document converter = DoclingConverter() # 按块输出:一个块对应一个 Document converter = DoclingConverter(export_type=ExportType.DOC_CHUNKS) # JSON 模式:完整结构序列化为 JSON 字符串 converter = DoclingConverter(export_type=ExportType.JSON)当选择ExportType.DOC_CHUNKS时,DoclingConverter已经完成了分块,管道中通常不再需要单独的DocumentSplitter。
四、DoclingConverter 构造参数详解
DoclingConverter.__init__的完整签名如下:
__init__( converter: DocumentConverter | None = None, convert_kwargs: dict[str, Any] | None = None, export_type: ExportType = ExportType.MARKDOWN, md_export_kwargs: dict[str, Any] | None = None, chunker: BaseChunker | None = None, meta_extractor: BaseMetaExtractor | None = None, ) -> None各参数的语义(依据 API 参考文档):
| 参数 | 类型 | 默认行为 | 说明 |
|---|---|---|---|
converter | DocumentConverter \| None | 系统默认 | 传入预先配置好的 DoclingDocumentConverter实例以定制解析行为 |
convert_kwargs | dict[str, Any] \| None | 系统默认 | 传给 Docling 转换步骤的任意关键字参数 |
export_type | ExportType | ExportType.MARKDOWN | 导出模式,见上文三种取值 |
md_export_kwargs | dict[str, Any] \| None | 无 | 传给 Markdown 导出的参数,仅在ExportType.MARKDOWN下生效,例如控制图片占位文本 |
chunker | BaseChunker \| None | 系统默认 | 自定义 Docling 分块器实例,仅在ExportType.DOC_CHUNKS下生效 |
meta_extractor | BaseMetaExtractor \| None | 系统默认 | 用于填充输出文档元数据的抽取器实例 |
定制解析行为的典型组合是:通过converter传入预配置的DocumentConverter以改变 Docling 的解析选项,通过convert_kwargs向转换步骤追加参数,通过md_export_kwargs控制 Markdown 渲染(如图片占位文本),通过chunker提供自定义分块器。
五、方法行为详解
API 参考文档为DoclingConverter定义了四个方法,这里逐一展开。
5.1 warm_up:延迟构建默认 HybridChunker
warm_up() -> None该方法在未于初始化时传入chunker的情况下,为ExportType.DOC_CHUNKS构建默认的HybridChunker。参考文档明确指出,构建默认 chunker 会下载一个 Hugging Face tokenizer,因此被延迟到 warm-up 阶段执行——这正是 Haystack 将模型/资源加载统一推迟到warm_up阶段的设计动机。
5.2 to_dict 与 from_dict:序列化与反序列化
to_dict() -> dict[str, Any]将组件序列化为字典,产生带type和init_parameters键的字典,供管道 YAML 序列化使用。
from_dict(data: dict[str, Any]) -> DoclingConverter从to_dict产生的字典恢复组件实例。关键限制:converter和chunker参数不可序列化,反序列化时总是被忽略——恢复出的实例会分别使用默认的DocumentConverter和HybridChunker。这意味着序列化后,自定义的 Docling 解析配置与分块器不会保留,需要反序列化后手动重新注入。
5.3 run:执行转换
run( paths: list[str | Path] | None = None, sources: list[str | Path | ByteStream] | None = None, meta: dict[str, Any] | list[dict[str, Any]] | None = None, ) -> dict[str, list[Document]]参数语义:
paths:已弃用,请改用sources。sources:要转换的文件路径、URL 或ByteStream对象列表。meta:附加到输出Document上的元数据,可为单个字典或字典列表:- 传单个字典时,其内容被添加到所有产出的
Document的元数据中; - 传列表时,列表长度必须与
sources数量一致,两者按位置 zip 对应; - 当某个来源是
ByteStream时,ByteStream自身的元数据也会被合并进输出。
- 传单个字典时,其内容被添加到所有产出的
返回值:包含键"documents"的字典,值为输出的 HaystackDocument列表。
异常:
ValueError:meta是列表但长度与sources数量不匹配时抛出;RuntimeError:遇到未知的export_type时抛出。
六、元数据体系:BaseMetaExtractor 与 MetaExtractor
输出文档的元数据由MetaExtractor实例填充。API 参考定义了抽象基类BaseMetaExtractor(继承自ABC),其方法契约如下:
extract_chunk_meta(chunk: BaseChunk) -> dict[str, Any] # 抽取分块元数据 extract_dl_doc_meta(dl_doc: DoclingDocument) -> dict[str, Any] # 抽取 Docling 文档元数据 to_dict() -> dict[str, Any] # 序列化为字典 from_dict(data: dict[str, Any]) -> BaseMetaExtractor # 从字典反序列化MetaExtractor继承BaseMetaExtractor,实现extract_chunk_meta与extract_dl_doc_meta两个方法。默认MetaExtractor会将 Docling 特有的元数据(分块结构或文档来源信息)写入dl_meta键下。
参考文档将这两个方法抽象到基类层面,说明元数据抽取是可插拔的:你可以通过meta_extractor参数传入自定义的BaseMetaExtractor实现,控制输出文档的元数据内容。
两类元数据的叠加方式:
- 组件层:
MetaExtractor(默认写dl_meta键)——由 Docling 解析结果自动生成; - 运行层:
run的meta参数——手动附加业务元数据,见下文实战。
七、实战:单独使用 DoclingConverter
7.1 基础用法(Markdown 默认模式)
from haystack_integrations.components.converters.docling import ( DoclingConverter, ExportType, ) # 默认:整份文档作为 Markdown 输出 converter = DoclingConverter() result = converter.run(sources=["report.pdf", "notes.docx"]) documents = result["documents"] print(documents[0].content) # 按块输出:一个 Document 对应一个 chunk converter = DoclingConverter(export_type=ExportType.DOC_CHUNKS) result = converter.run(sources=["report.pdf"]) documents = result["documents"]7.2 接入索引管道
DoclingConverter作为Pipeline组件接入,输出documents直接连接到DocumentWriter:
from haystack import Pipeline from haystack.components.writers import DocumentWriter from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack_integrations.components.converters.docling import DoclingConverter document_store = InMemoryDocumentStore() pipeline = Pipeline() pipeline.add_component("converter", DoclingConverter()) pipeline.add_component("writer", DocumentWriter(document_store=document_store)) pipeline.connect("converter", "writer") pipeline.run({"converter": {"sources": ["report.pdf", "manual.docx"]}})管道运行时,sources通过{"converter": {"sources": [...]}}传入。若设置export_type=ExportType.DOC_CHUNKS,分块已在转换器内完成,通常无需再挂DocumentSplitter。
7.3 自定义分块器
chunker参数仅在ExportType.DOC_CHUNKS下生效。可传入自定义的 DoclingHybridChunker控制分块粒度:
from docling.chunking import HybridChunker from haystack_integrations.components.converters.docling import ( DoclingConverter, ExportType, ) chunker = HybridChunker(tokenizer="BAAI/bge-small-en-v1.5", max_tokens=256) converter = DoclingConverter(export_type=ExportType.DOC_CHUNKS, chunker=chunker) result = converter.run(sources=["report.pdf"])需要留意的是:构造HybridChunker涉及加载 tokenizer(可能需联网下载),这也是默认 chunker 被推迟到warm_up阶段构建的原因;自定义chunker实例不会在from_dict反序列化时被恢复。
7.4 附加元数据:全量或按来源
from haystack_integrations.components.converters.docling import DoclingConverter converter = DoclingConverter() # 同一份元数据附加到所有输出 Document result = converter.run( sources=["a.pdf", "b.pdf"], meta={"project": "research"}, ) # 按来源分别附加元数据(列表长度必须与 sources 一致) result = converter.run( sources=["a.pdf", "b.pdf"], meta=[{"title": "Report A"}, {"title": "Report B"}], )7.5 处理内存中的文件:ByteStream
文件已读入内存时,可直接传ByteStream对象。关键点在于:须在ByteStream的元数据中设置file_path,Docling 才能识别文件格式。这与仓库内ByteStream数据类的设计一致——它持有data(二进制内容)、meta(附加元数据字典)与mime_type字段,且run方法在来源为ByteStream时会将其自身元数据一并合并进输出Document。
from haystack.dataclasses import ByteStream from haystack_integrations.components.converters.docling import DoclingConverter with open("report.pdf", "rb") as f: data = f.read() source = ByteStream(data=data, meta={"file_path": "report.pdf"}) converter = DoclingConverter() result = converter.run(sources=[source])ByteStream还提供from_file_path、from_string、to_file、to_string等便捷方法(定义于 byte_stream.py),可灵活地在文件、字符串与字节流之间转换,便于在爬虫、下载器等内存管道中直接喂给 DoclingConverter。
八、源码级佐证与事实核对
以下关键结论均可在当前仓库中找到依据:
- 导出模式语义:
ExportType三种取值的完整行为见 API 参考 中__init__的参数说明,与 用户指南 的 Overview 一致。 ByteStream数据类:data、meta、mime_type字段及文件/字符串互转方法,定义于 haystack/dataclasses/byte_stream.py。- 输出数据类型
Document:转换结果中的每个元素都是 HaystackDocument数据类,其结构定义见 haystack/dataclasses/document.py 与 数据类概念文档。 - 集成包归属:
DoclingConverter属于外部docling-haystack包,本仓库承载其 API 参考、用户指南与示例。
九、延伸阅读
- DoclingConverter 用户指南:本文实战示例的完整来源,包含更多管道组合方式。
- DoclingServe 集成(API 参考):若不想在本地承担 Docling 的机器学习依赖,可用
DoclingServeConverter将转换卸载到远程 DoclingServe HTTP 服务(支持同步与异步执行)。 - PreProcessors 文档:
DOC_CHUNKS之外需要更细粒度清洗时,可在转换器之后串联预处理组件。 - ByteStream 数据类:理解内存文件在管道中的数据载体。
【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考