Haystack 集成 DoclingServeConverter:通过远程 DoclingServe 服务将 PDF、Office、HTML 等文档转换为 Haystack Document
2026/9/13 1:20:27 网站建设 项目流程

Haystack 集成 DoclingServeConverter:通过远程 DoclingServe 服务将 PDF、Office、HTML 等文档转换为 Haystack Document

【免费下载链接】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

本文基于 Haystack 仓库中的 DoclingServeConverter API 参考文档 与配套的 DoclingServeConverter 使用指南,系统讲解如何借助远程 DoclingServe HTTP 服务,在完全无需本地重型 ML 依赖的前提下,把 PDF、Word、Excel、HTML 等多种格式的文档解析并转换为 Haystack Document,再接入索引管道(Indexing Pipeline)完成后续切分与写入。读完本文,你将掌握该组件的安装部署、全部构造参数与运行参数、同步/异步两种转换模式,以及 URL 直转、元数据附加、内存文件(ByteStream)处理等实战用法。

一、组件定位:与本地 DoclingConverter 的差异化选择

DoclingServeConverter属于 Haystack 的集成组件,其模块路径为haystack_integrations.components.converters.docling_serve.converter,发布包名为docling-serve-haystack。它通过调用远程的 DoclingServe 服务完成文档解析:DoclingServe 以可扩展的 HTTP 服务形式托管 Docling,支持 PDF、Office 文档、HTML 以及多种其他格式。

它与仓库中另一款本地组件DoclingConverter的核心区别在于:

  • 本地版:所有解析在本地进程内完成,需要加载 Docling 及其模型依赖,占用本地 CPU/内存资源;
  • 服务版(本文主角):组件本身没有任何重型 ML 依赖,全部解析工作发生在远程服务器上,本地只负责上传文件、接收结果,因此非常适合资源受限的部署环境、需要共享解析能力的多服务场景,以及希望把解析负载集中管理的生产架构。

从管道(Pipeline)中的常见位置来看,DoclingServeConverter通常位于 PreProcessors 之前,即索引管道的最前端;其必填运行变量为sources(文件路径、URL 或ByteStream列表),输出变量为documents(Document 列表)。

二、安装与启动:先跑起一个 DoclingServe 实例

该组件本身不携带解析能力,使用前必须先启动一个 DoclingServe 服务。安装集成包并启动本地服务(需要 Docker):

pip install docling-serve-haystack
docker run -p 5001:5001 ghcr.io/docling-project/docling-serve-cpu:latest

服务默认监听5001端口,组件默认的base_url即为http://localhost:5001,因此上面的启动方式与组件的默认配置天然对齐,开箱即可用。若你的 DoclingServe 部署在别的地址(例如内网服务器或 Kubernetes 集群内部服务),只需在实例化时传入对应的base_url即可。

三、快速上手:最小可用示例

安装并启动服务后,一个最小可用示例只需要两步:实例化转换器、调用run传入sources

from haystack_integrations.components.converters.docling_serve import DoclingServeConverter converter = DoclingServeConverter(base_url="http://localhost:5001") result = converter.run(sources=["https://arxiv.org/pdf/2206.01062"]) print(result["documents"][0].content[:200])

run的返回值是一个字典,键为"documents",值为转换后的 Haystack Document 列表。每个输入源对应输出一个Document;转换失败的源会被跳过并打印一条警告日志,而不会中断整个转换流程。

三种输出格式的切换

通过export_type参数可以控制输出格式,默认是 Markdown:

# 默认:Markdown 输出 converter = DoclingServeConverter(base_url="http://localhost:5001") result = converter.run(sources=["report.pdf", "notes.docx"]) documents = result["documents"] print(documents[0].content[:200]) # 纯文本输出 from haystack_integrations.components.converters.docling_serve import ExportType converter = DoclingServeConverter( base_url="http://localhost:5001", export_type=ExportType.TEXT, ) result = converter.run(sources=["report.pdf"]) print(result["documents"][0].content)

四、核心 API 全解:枚举、构造参数与运行方法

4.1 ExportType:支持的导出格式

ExportType继承自strEnum,枚举了 DoclingServe 支持的三种导出格式:

枚举值说明适用场景
ExportType.MARKDOWN将文档转换为 Markdown 格式(默认)需要保留排版结构的富文本输出,适合进入 RAG 前做保留格式的切分
ExportType.TEXT提取纯文本需要干净、无格式文本的场景,如直接喂给 embedding 模型
ExportType.JSON返回完整的 Docling 文档对象,以 JSON 字符串形式输出需要访问完整结构化表示(版面、表格、标题层级等)的下游处理

4.2 ConversionMode:同步与异步执行模式

ConversionMode同样继承自strEnum,定义转换任务的执行方式:

  • ConversionMode.SYNC:调用 DoclingServe 的同步转换端点,请求发出后等待返回结果;
  • ConversionMode.ASYNC:向 DoclingServe 的异步任务端点提交转换作业,然后轮询任务状态直到完成。

异步模式适合大文件或服务端处理耗时较长的场景,避免单个 HTTP 请求长时间占用连接。

4.3init构造参数详解

构造函数签名如下(全部参数均为关键字参数):

__init__( *, base_url: str = "http://localhost:5001", export_type: ExportType = ExportType.MARKDOWN, convert_options: dict[str, Any] | None = None, timeout: float = 120.0, api_key: Secret | None = Secret.from_env_var( "DOCLING_SERVE_API_KEY", strict=False ), mode: ConversionMode | str = ConversionMode.SYNC, poll_interval: float = 2.0, job_timeout: float = 600.0 ) -> None

各参数的完整说明如下:

参数类型默认值说明
base_urlstr"http://localhost:5001"DoclingServe 实例的基础 URL
export_typeExportTypeExportType.MARKDOWN转换输出格式,取值为MARKDOWNTEXTJSON三者之一
convert_optionsdict[str, Any] \| NoneNone直接透传给 DoclingServe API 的转换选项字典,例如{"do_ocr": True, "ocr_engine": "tesseract"}。注意:to_formats由组件根据export_type自动设置,不要convert_options中重复传入
timeoutfloat120.0HTTP 请求超时时间(秒)
api_keySecret \| None从环境变量DOCLING_SERVE_API_KEY读取用于访问受保护的 DoclingServe 实例的 API Key;默认从DOCLING_SERVE_API_KEY环境变量读取(非强制),显式传None可关闭鉴权
modeConversionMode \| strConversionMode.SYNC转换模式:sync使用同步端点,async提交异步作业并轮询直至完成
poll_intervalfloat2.0同时控制服务端长轮询等待参数(?wait=)与本地两次轮询之间的最大休眠时间。值越大,往返次数越少;值越小,轮询越频繁
job_timeoutfloat600.0每个异步转换作业的最大等待时间(秒)

关于convert_options,需要留意的是该参数会被原样传给 DoclingServe API,因此可用的键取决于 DoclingServe 服务端版本支持的选项集合,例如上例中的 OCR 开关与引擎选择。如果你需要的是本地完整可控的转换配置,可以参考仓库中本地版DoclingConverterconvert_kwargsmd_export_kwargs等参数,两者定位不同、能力互补。

4.4 run 与 run_async:同步与异步两种调用方式

runrun_async拥有完全相同的签名与语义,后者是前者的异步等价实现,适用于不希望 HTTP 请求阻塞事件循环(如 FastAPI 等异步框架内部)的场景。

run( sources: list[str | Path | ByteStream], meta: dict[str, Any] | list[dict[str, Any]] | None = None, ) -> dict[str, list[Document]]

参数说明:

  • sources:待转换的源列表。每个元素可以是 URL 字符串、本地文件路径或ByteStream对象。组件内部的请求路由规则为:
    • URL 字符串→ 发送到/v1/convert/source端点(服务端直接抓取远程文档);
    • 本地文件路径与ByteStream→ 上传到/v1/convert/file端点。
  • meta:可选,附加到输出 Document 的元数据。传单个字典时应用到所有输出 Document;传字典列表时按顺序与每个源一一对应(列表长度需与源数量一致)。

返回值:

  • 返回dict[str, list[Document]],即键为"documents"、值为转换后的 Haystack Document 列表。

五、接入索引管道:从转换到写入的完整流程

在实际项目中,DoclingServeConverter通常作为索引管道的第一环,将转换结果交给DocumentSplitter切分,再由DocumentWriter写入文档存储。下面是一个完整的管道示例:

from haystack import Pipeline from haystack.components.preprocessors import DocumentSplitter from haystack.components.writers import DocumentWriter from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack_integrations.components.converters.docling_serve import ( DoclingServeConverter, ) document_store = InMemoryDocumentStore() pipeline = Pipeline() pipeline.add_component( "converter", DoclingServeConverter(base_url="http://localhost:5001"), ) pipeline.add_component("splitter", DocumentSplitter()) pipeline.add_component("writer", DocumentWriter(document_store=document_store)) pipeline.connect("converter", "splitter") pipeline.connect("splitter", "writer") pipeline.run({"converter": {"sources": ["report.pdf", "manual.docx"]}})

这个管道演示了 Haystack 的典型索引链路:converter输出documentssplitter消费并产出切块,writer最终将结果写入InMemoryDocumentStore。生产环境中你可以把InMemoryDocumentStore替换为任何其他文档存储实现,管道结构保持不变。

六、进阶用法

6.1 直接转换远程 URL

将 URL 字符串直接作为sources传入,无需先下载文件,服务端会通过/v1/convert/source端点自行抓取并解析:

from haystack_integrations.components.converters.docling_serve import ( DoclingServeConverter, ) converter = DoclingServeConverter(base_url="http://localhost:5001") result = converter.run(sources=["https://arxiv.org/pdf/2602.17316"]) print(result["documents"][0].content[:200])

6.2 附加元数据

meta参数支持两种形态:单个字典(应用于所有输出 Document)或字典列表(按源一一对应):

from haystack_integrations.components.converters.docling_serve import ( DoclingServeConverter, ) converter = DoclingServeConverter(base_url="http://localhost:5001") # 所有源共享同一份元数据 result = converter.run( sources=["a.pdf", "b.pdf"], meta={"project": "research"}, ) # 每个源单独指定元数据 result = converter.run( sources=["a.pdf", "b.pdf"], meta=[{"title": "Report A"}, {"title": "Report B"}], )

6.3 处理内存中的文件(ByteStream)

当文件以二进制形式存在于内存中(例如已经通过网络下载、从数据库读出或由其他组件生成)时,可以构造ByteStream传入。注意:需要在ByteStreammeta中设置file_path,DoclingServe 才能据此识别文件格式。

from haystack.dataclasses import ByteStream from haystack_integrations.components.converters.docling_serve import ( DoclingServeConverter, ) with open("report.pdf", "rb") as f: data = f.read() source = ByteStream(data=data, meta={"file_path": "report.pdf"}) converter = DoclingServeConverter(base_url="http://localhost:5001") result = converter.run(sources=[source])

ByteStream是 Haystack 的核心数据类之一(定义于 haystack/dataclasses/byte_stream.py),由data(二进制内容)、meta(元数据字典)和mime_type(MIME 类型)三部分组成,还提供了from_file_pathfrom_string等便捷构造方法。在转换场景中,meta["file_path"]承担着格式探测的职责,务必为每个内存文件显式设置。

七、序列化支持:to_dict 与 from_dict

作为标准的 Haystack 组件,DoclingServeConverter实现了组件的序列化协议:

  • to_dict() -> dict[str, Any]:将组件序列化为字典,包含组件类型与全部初始化参数。Haystack 的Pipeline在保存为 YAML 或 JSON 时会调用该方法;
  • from_dict(data: dict[str, Any]) -> DoclingServeConverter:从字典反序列化出新的组件实例,参数datato_dict的产物。

这保证了包含该转换器的管道可以被持久化、版本化管理,并在不同环境中完整还原,是 Haystack 管道可移植性的基础能力。需要说明的是,api_key作为Secret类型在序列化时遵循 Haystack 的密钥安全约定(默认从DOCLING_SERVE_API_KEY环境变量读取,strict=False表示环境变量缺失时也不报错),请勿将明文密钥写入管道配置。

八、异常体系与错误处理

组件定义了专用于转换失败的异常层级:

  • DoclingServeConversionError(继承自Exception):当 DoclingServe 报告异步任务或转换失败时抛出;
  • DoclingServeTimeoutError(继承自DoclingServeConversionError):当异步转换作业超过job_timeout(默认 600 秒)仍未完成时抛出。

在实际使用中,建议对run/run_async的调用做异常捕获;同时牢记“失败源会被跳过并记录警告日志”这一默认行为——也就是说,单个文件解析失败不会拖垮整个批处理,但你应当监控日志中的 warning,确保不会在不知情的情况下丢失文档。

九、模式选型建议:sync 与 async 如何取舍

综合前文,组件在两个维度上都提供了同步/异步选择:

维度选项建议场景
调用方式run/run_async在异步应用(如 FastAPI、异步 Pipeline)中避免阻塞事件循环时用run_async;普通脚本用run即可
转换模式ConversionMode.SYNC/ConversionMode.ASYNC小文件、低延迟场景用SYNC;大文件、长耗时转换用ASYNC并配合poll_interval(默认 2 秒)与job_timeout(默认 600 秒)控制轮询节奏与总等待上限

poll_interval的取值需要结合实际转换耗时权衡:值偏大可以减少轮询往返次数、降低服务端压力,但任务完成后的感知延迟会增加;值偏小则反之。若你的文档普遍较大(如数百页 PDF 或带 OCR 的扫描件),建议优先选择ASYNC模式并适当放宽job_timeout

十、仓库内延伸阅读

若想继续深入,可以在本仓库中查看以下相关文档与源码:

  • DoclingServeConverter 使用指南(最新版):含管道集成、URL 直转、元数据、ByteStream 等完整示例;
  • DoclingServe API 参考(最新版):与本文基于的 version-2.18 参考文档内容一致;
  • DoclingConverter 使用指南:本地解析版组件的完整用法,可与服务版对比选型;
  • Docling API 参考(version-2.18):本地版枚举、转换器与元数据提取器的接口定义;
  • ByteStream 数据类源码:内存二进制对象的字段与构造方法;
  • 外部转换器集成一览(version-2.18):了解 Docling 系列在 Haystack 生态中的定位。

以上内容覆盖了DoclingServeConverter的安装、配置、调用与管道集成全链路,你可以直接复制其中的代码示例,将其作为索引管道的第一环开始实践。

【免费下载链接】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),仅供参考

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

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

立即咨询