Haystack DoclingConverter 集成指南:用 Docling 将 PDF/DOCX 转换为布局感知的 Haystack Documents
2026/9/22 17:29:08 网站建设 项目流程

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继承自strEnum,是可用的导出类型枚举。它是决定DoclingConverter输出形态的核心开关:

取值行为典型场景
ExportType.MARKDOWN(默认)每个输入文档导出为单个 Markdown 字符串,封装进一个Document需要保留完整格式化内容的场景
ExportType.DOC_CHUNKS先用 Docling 的HybridChunker对每个文档分块,每个块返回一个Document,块元数据携带 Docling 的结构上下文索引管道,下游检索需要语义连贯的块
ExportType.JSON将完整 Docling 文档序列化为 JSON 字符串,封装进一个Document需要访问完整结构化表示的场景

对应关系可以直接从参考文档的__init__参数说明中确认:MARKDOWN将每个输入文档捕获为单个 markdownDocumentDOC_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 参考文档):

参数类型默认行为说明
converterDocumentConverter \| None系统默认传入预先配置好的 DoclingDocumentConverter实例以定制解析行为
convert_kwargsdict[str, Any] \| None系统默认传给 Docling 转换步骤的任意关键字参数
export_typeExportTypeExportType.MARKDOWN导出模式,见上文三种取值
md_export_kwargsdict[str, Any] \| None传给 Markdown 导出的参数,仅在ExportType.MARKDOWN下生效,例如控制图片占位文本
chunkerBaseChunker \| None系统默认自定义 Docling 分块器实例,仅在ExportType.DOC_CHUNKS下生效
meta_extractorBaseMetaExtractor \| 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]

将组件序列化为字典,产生带typeinit_parameters键的字典,供管道 YAML 序列化使用。

from_dict(data: dict[str, Any]) -> DoclingConverter

to_dict产生的字典恢复组件实例。关键限制converterchunker参数不可序列化,反序列化时总是被忽略——恢复出的实例会分别使用默认的DocumentConverterHybridChunker。这意味着序列化后,自定义的 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列表。

异常:

  • ValueErrormeta是列表但长度与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_metaextract_dl_doc_meta两个方法。默认MetaExtractor会将 Docling 特有的元数据(分块结构或文档来源信息)写入dl_meta键下。

参考文档将这两个方法抽象到基类层面,说明元数据抽取是可插拔的:你可以通过meta_extractor参数传入自定义的BaseMetaExtractor实现,控制输出文档的元数据内容。

两类元数据的叠加方式:

  1. 组件层MetaExtractor(默认写dl_meta键)——由 Docling 解析结果自动生成;
  2. 运行层runmeta参数——手动附加业务元数据,见下文实战。

七、实战:单独使用 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_pathfrom_stringto_fileto_string等便捷方法(定义于 byte_stream.py),可灵活地在文件、字符串与字节流之间转换,便于在爬虫、下载器等内存管道中直接喂给 DoclingConverter。

八、源码级佐证与事实核对

以下关键结论均可在当前仓库中找到依据:

  1. 导出模式语义ExportType三种取值的完整行为见 API 参考 中__init__的参数说明,与 用户指南 的 Overview 一致。
  2. ByteStream数据类datametamime_type字段及文件/字符串互转方法,定义于 haystack/dataclasses/byte_stream.py。
  3. 输出数据类型Document:转换结果中的每个元素都是 HaystackDocument数据类,其结构定义见 haystack/dataclasses/document.py 与 数据类概念文档。
  4. 集成包归属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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询