尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

docling文档解析实战:从PDF到结构化Markdown,赋能RAG与知识库

发布时间:2026/9/26 14:32:07

资讯中心
01
ARTICLE

docling文档解析实战:从PDF到结构化Markdown,赋能RAG与知识库

docling文档解析实战:从PDF到结构化Markdown,赋能RAG与知识库
这两年做文档解析和 RAG 相关工作的朋友多少都听过 docling 这个名字。它是 IBM 开源的一套文档转换工具说人话就是把 PDF、Word、PPT、甚至图片里的内容转换成干净的 Markdown、JSON 或者结构化文本。我最初看到这个项目时以为又是个套壳封装真正深入用了一段时间才发现它在表格结构识别、公式识别和版面还原上的处理确实解决了不少真实工程里让人头疼的问题。这篇文章我会从项目定位讲起再带你一步步把它跑起来最后把我在实际使用中踩过的坑和调优经验都整理出来希望对正在做知识库、RAG 或文档预处理的同学有帮助。1. 项目定位与核心价值1.1 为什么文档转换偏偏“很难”这里说的“难”不是说把 PDF 里的文字读出来难而是难在还原文档的“逻辑结构”。普通 PDF 在很多情况下是没有内部语义的它只记录文字和图形在页面上的坐标。你拿一个简单的提取工具去读得到的可能是一堆片段原本的标题层级、分栏、表格、页眉页脚全部丢失。对于做知识库、RAG 或者数据分析的人来说结构化信息恰恰是最值钱的部分因为检索质量严重依赖文档切块的边界是否合理。如果切块时把表格拆得七零八落或者把一页分栏文字当成两栏混读检索效果基本是灾难性的。我之所以对 docling 抱有期待是因为它并不是单纯的“PDF 抽取”而是做成了一个完整的 Document Conversion Pipeline。什么意思它会做版面分析识别出标题、正文、表格、图片、公式这些元素然后把这些元素重新组织成有层级结构的文档对象最后再导出成各种格式。这跟“抽取”是两个层次的事情后者更接近“读懂文档”而不是“把字抠出来”。再加上它背后有 IBM Research 持续维护和迭代模型和代码更新速度都很快所以社区活跃度和质量都不错。1.2 能解决什么场景问题如果从应用场景来看docling 适合这几类需求构建企业级知识库和 RAG 系统把大量的 PDF 报告、Word 文档、PPT 方案转成带结构的 Markdown再喂给向量库做切片。相比直接用分页文本这种带标题、表格结构的内容检索命中率高得多。文档审阅与内容提取比如从财报里抽取表格从论文中抽取公式从合同里还原条款结构。docling 支持把表格转换成 HTML 或者 Markdown 的表格语法公式可以识别成 LaTeX这对后续做结构化入库非常友好。统一多格式文档处理入口你可能有数百份不同来源、不同格式的文档用 docling 的 API 可以直接完成 PDF、DOCX、PPTX、HTML、图像等格式的统一转换输出同一个模型结构省去给每种格式各找一套解析器的麻烦。为语义搜索提供干净的文本数据如果你做过文本清洗就知道页面上的页眉页脚、乱序的表格内容会污染 embedding。用 docling 做结构化提取后可以按元素类型决定是否保留比如正文保留、页眉页脚丢弃。整体来看它解决的痛点是“文档变数据”这一环。理解了这点你就知道它和单纯读取 PDF 文本的库定位完全不同。这也是我写这篇文章的初衷帮你把工具用到位把问题看清。2. 核心技术机制与管线拆解2.1 它的处理管线是怎么跑的docling 的底层思路是把文档转换拆成一条流水线每个环节负责一项特定任务。典型流程可以理解成先做页面解析拿到原始文字和坐标再做版面分析区分出不同区域然后对表格、公式这些特殊区域做专项识别最后把所有识别结果组织成统一的文档对象再按需导出。用一句话概括读进来是二进制文件出去的是结构化、带语义的文档树。这里面比较关键的动作是“版面分析”。它不是简单地把页面区域框出来而是会判断哪些是标题、哪些是正文段落、哪些是表格、哪些是图表。因为后续的表格识别、公式识别都需要版面感知结果来定位输入区域这一步做得准不准直接影响最终质量。docling 在模型层面引入了深度学习做检测实际效果比我预想中稳定尤其对多栏文档、复杂排版的处理比很多开箱即用的解析库要更接近人类阅读习惯。2.2 核心模块与技术选型docling 本身对 PDF 初解析支持两类后端一类走pdfminer这套传统文本提取一类走py_pdf之类的方式。它把文本层交给这些库先取出来再做版面分析。这里有一个有意思的设计docling 不是拿到 PDF 文字就直接结束而是还会结合视觉信息做补充。什么意思呢如果文档本身没有可复制的文字层比如扫描件docling 会调用 OCR 进行识别所以它对扫描版 PDF 也有不错的支持。表格结构识别这部分我认为是 docling 的亮点。它使用 TableFormer 这类表格结构模型能输出每个单元格的内容、行宽列宽以及单元格之间的合并关系。最终的导出不只是简单的文本拼接而是会还原成符合 Markdown 或 HTML 语义的表格。这意味着你拿到表格后可以直接渲染出和原文档结构基本一致的表格这是很多普通 PDF 库做不到的。公式识别方面docling 会输出 LaTeX 格式的公式代码。这对处理论文、技术文档特别有用因为科学类文档里大量公式如果只是转成图片或普通文本后续检索和编辑都很麻烦。除了这些docling 还内置了针对文档图像的 OCR 能力配合语言模型可以识别中英文等多种语言的文本。你需要通过配置项去指定 OCR 引擎和语言。2.3 统一的中间表示与导出能力docling 把所有解析结果都映射到它自己的DoclingDocument数据模型里。这个模型可以理解为一棵文档树包含段落、表格、列表、标题、图片、公式等节点。为什么这样做好处在于“一次解析多种导出”。解析完走到中途你想输出 Markdown 就输出 Markdown想输出 JSON 就输出 JSON甚至后续社区扩展了新格式也不需要重新解析一遍文档。另外这种统一表示对工程集成特别友好。你可以拿到 JSON 结构的全部细节包括每个元素在页面上的坐标、边界框然后根据自己的业务逻辑做精细化处理。比如你想把图片单独抽出来保存或者按表格元素切割文档都非常直接。社区里还有基于 docling 的 RAG 集成示例把DoclingDocument转成适合切块和向量化的格式整个链路跑下来比手动处理文档要舒服得多。3. 从零跑通 docling安装与实战3.1 环境准备与安装细节在开始之前说下环境要求。docling 依赖 PyTorch 和 Transformers 生态所以安装包体积不小建议你最好在虚拟环境里装避免把系统 Python 环境搞乱。个人实测在 Python 3.9 和 3.10 上都跑得很顺利3.11 也没有问题所以直接选个常用的版本就行。安装命令很简单pip install docling如果你需要 OCR 能力建议加装相关依赖推荐使用pip install docling[ocr]不过这里要提醒你docling 在首次运行时会下载模型权重文件。这些模型托管在 HuggingFace 上如果你所在的网络环境访问不了那就需要配置镜像地址或提前缓存模型。一种可靠的办法是设置环境变量export HF_ENDPOINThttps://hf-mirror.com实测来看用了镜像之后首次运行的下载体验会好很多。下载后的模型会缓存在~/.cache/huggingface目录下后续运行就不会重复下载了。3.2 基础转换把 PDF 变成 Markdown安装完成后写一个最简单的转换脚本。我一般用命令行工具直接体验效果命令是这样docling my_document.pdf --output md运行完毕你会在当前目录下看到转换后的 Markdown 文件和对应的 JSON 文件。如果是本地有复杂图片、多栏排版的文件你很快就能感受到它和普通文本提取的差异。如果要写 Python 代码来调用也比较直观from docling.document_converter import DocumentConverter converter DocumentConverter() result converter.convert(my_document.pdf) # 导出为 Markdown with open(output.md, w, encodingutf-8) as f: f.write(result.document.export_to_markdown())这里的result.document就是一个DoclingDocument对象你随时可以调用它的各种导出方法。比如要 JSON就调用export_to_dict()要 HTML就用export_to_html()。这种拆分的自由度很高你在实际工程里可以根据需要决定要哪些产物。如果你需要转换的是一批文件也有批处理模式可以用docling ./my_docs_folder --output md它会自动遍历目录下的受支持格式文档并批量处理。对于几十份上百份文件的场景这个命令能省下不少写脚本的时间。3.3 核心参数和常用配置解析这里的参数配置我结合自己的实践给你梳理一下。第一个是--from_format意思是限定输入文件的格式。比如指定pdfdocling 就不会去尝试加载其他格式避免不必要的时间损耗。第二个是--to_format指定输出格式可以是md或json。第三个是--device如果你有 GPU可以配置成使用 GPU 加速docling my_document.pdf --output md --device cuda如果没有 GPU 就默认 CPU虽然速度慢一些但小文件处理完全够用。我在一台不带独显的笔记本上处理几十页的 PDF单份大概需要十几秒到几十秒纯 CPU 模式也能接受。Python API 的配置自由度更大。比如你想指定 OCR 语言可以这样from docling.datamodel.base_models import InputFormat from docling.document_converter import DocumentConverter from docling.datamodel.pipeline_options import PdfPipelineOptions pipeline_options PdfPipelineOptions() pipeline_options.do_ocr True pipeline_options.ocr_options.lang [zh, en] pipeline_options.ocr_options.use_gpu False converter DocumentConverter(pipeline_optionspipeline_options)这里do_ocr控制是否启用 OCR某些扫描版 PDF 必须打开它才能拿到文字。ocr_options.lang则用来指定识别语言如果你的文档主要是中文就配置[zh]。要注意的是语言配置会影响模型下载所以第一次跑的时候记得把模型下好。4. 进阶构建可落地的文档解析管线4.1 解析接口的工程化封装很多场景下你不会只想跑一次转换而是要把它封装成服务或者批处理脚本。我建议在工程里把转换、导出、异常处理、日志串联起来。举个例子你可以写一个函数接收文件路径返回结构化数据from pathlib import Path from docling.document_converter import DocumentConverter def parse_document(file_path: str, export_md: bool False): file_path Path(file_path) conv DocumentConverter() try: result conv.convert(str(file_path)) data result.document.export_to_dict() md_content result.document.export_to_markdown() if export_md else None return { status: ok, data: data, markdown: md_content, file: file_path.name, } except Exception as exc: return { status: error, error: str(exc), file: file_path.name, }这样封装的好处是你后续接 API 也好写后台定时任务也罢都只需要调用这个函数不用每次都重复写转换逻辑。尤其在批量跑大量文件时单个文件失败也不会影响整个任务可以针对状态为 error 的记录做重试或者人工介入。如果你对性能有要求可以进一步做并行处理。用 multiprocessing 或 asyncio 都能明显提升吞吐。不过要注意docling 加载模型本身有一定内存开销并行开太多可能把内存吃满。我实测在 16G 内存的机器上同时跑 4 个进程是安全的再多就容易有压力。这时候可以考虑给任务队列做限流或者分批执行。4.2 表格、公式与图片的处理策略对于真实文档最复杂的往往是混合内容。比如一份技术白皮书里既有复杂表格又有公式还穿插截图。docling 对表格和公式是分别处理的你想要更好的效果就得针对性地做后处理。先拿表格来说。docling 输出的表格已经是结构化的列表格式如果你导出为 Markdown可以看到标准的表格语法。但在某些复杂表格里比如存在单元格合并、嵌套表格Markdown 的表达能力有限这时候我建议你直接读取export_to_dict()的 JSON 结构里面保留了更完整的表格信息。你可以把表格 JSON 单独存成结构化数据再在需要渲染 HTML 时用表格 HTML 导出。后续做 RAG 时则可以把表格按行列转成文本描述比如“某行某列是某值”这样语义检索效果往往比“表格原文整块切进去”要好。公式方面docling 输出的是 LaTeX 形式。我个人经验是如果你构建的是论文类知识库最好保留 LaTeX 源码而不是转成图片。因为向量化的时候LaTeX 文本和普通文本是同样处理的搜索时用户输入“Emc^2”也更容易匹配。图片处理稍微特殊一点。docling 会识别页面上的图片区域并在导出时保存图片引用。你需要留意图片可能被输出到哪个路径然后决定是否要单独转存。默认情况下导出的 Markdown 里图片引用路径可能指向原始文件或中间输出目录这在部署到服务器时要处理好否则前端展示会变成死链。4.3 与 RAG、LangChain 的集成思路RAG 是目前使用 docling 最多的场景之一。很多朋友问我是直接喂 Markdown 文本还是用它的 JSON。我的建议是根据切块策略来定。如果你按标题段落切块那么 Markdown 就够了因为标题和段落结构已经在里面了。你可以用常规的文本分割器按#标题层级切分再给每块补上必要的上下文标签。如果你希望更精细地控制比如把表格单独拎出来建索引把页眉页脚过滤掉那最好用 JSON 级别的输出。我见过一种做法是把DoclingDocument转成自定义的文档对象列表每个对象包含type标题、段落、表格等、text、page_number和bbox再按类型决定索引方式和过滤策略。LangChain 集成方面社区已经有人写了 docling 的 loader你可以直接搜DoclingLoader。如果没有现成的版本自己写一个也很简单只需要处理好DocumentConverter的调用然后把export_to_markdown()或 JSON 内容传给 LangChain 的 Document 对象就行。LlamaIndex 的思路类似主要是做好 document 到 node 的映射。从效果上看用 docling 处理过的文本比直接读原生 PDF 的文本干净得多尤其对带表格和排版的文档检索质量会有明显提升。5. 实测常见问题与排查实录5.1 首次运行模型下载失败或太慢这个问题几乎人人都会遇到因为 docling 默认从 HuggingFace 下载模型。如果你的网络环境访问不了外网运行时会报超时错误。解决办法就是前面提到的设置环境变量HF_ENDPOINThttps://hf-mirror.com。另外你也可以手动下载模型文件放到本地缓存目录然后把缓存目录拷贝到离线机器上。这样在隔离环境中也能正常使用。还有个小技巧第一次跑的时候先用一个小 PDF 触发模型下载等全部缓存完了再正式跑大批量。因为下载过程如果中断有时候会留下不完整的缓存文件导致后续反复报错。此时可以清理~/.cache/huggingface下对应目录再重新触发。实测下来镜像源能有效解决大部分下载问题但如果公司网络有更严格的限制可能需要走代理或者用内部模型仓库。5.2 OCR 中文识别效果不佳或语言设置报错如果你处理的文档是中文扫描版一定要把语言选项设置好。很多人直接使用默认配置结果 OCR 输出的中文变成乱码或识别率极低。正确做法是显式指定ocr_options.lang [zh, en]。注意如果你加了多种语言模型加载的时间会变长因为要加载相应语言的模型文件。另一个常见问题是OCR 引擎对清晰度较低的文档效果不好。这时候可以先对图片做预处理比如增强对比度、二值化再喂给 docling。不过 docling 内嵌的 OCR 已经做了很多优化大多数情况下能直接接受。如果你追求更高的识别率可以考虑另外用 PaddleOCR 或 Tesseract 先识别再组装成 docling 的数据格式但这属于换引擎的高级玩法日常场景不太必要。5.3 表格结构错乱与后处理技巧docling 对绝大多数规则表格的识别效果不错但遇到跨页表格、无边框表格、非常复杂的合并单元格时偶尔也会识别错乱。我的经验是不要指望一次识别就完美而是在工程上做容错和修正。你可以先导出 JSON 查看表格的 cell 信息看看有没有明显异常比如单元格内容为空、行列数明显不符合预期。如果需要可以自己写一个后处理脚本把异常表格转成纯文本段落而不是表格结构。这样虽然牺牲了部分结构但至少保证内容不丢失。另一个技巧是对原文档做预处理比如把页面转为高分辨率图片后再转换在某些复杂表格场景下反而能提升效果。你也可以用pipeline_options.do_ocr True强制开启 OCR让视觉信息辅助表格结构还原。5.4 CPU 推理速度太慢与内存占用控制没有 GPU 的情况下处理几十页的 PDF 会有明显等待时间。几个可用的优化思路一是尽量选择不需要 OCR 的文件纯文本 PDF 的转换速度会快不少二是用批量处理时控制并发数避免内存被撑爆三是如果你的机器内存充足可以考虑把模型加载到内存后复用同一个DocumentConverter实例而不是每次转换都重新创建。如果速度还是不能满足需求你可以先粗筛文档把有 OCR 需求的文件和纯文本文件分开处理。扫描版单独跑 OCR文本版走快速通道整体耗时能下降很多。6. 我的最终建议与实践心得如果你正在做知识库和 RAG 相关项目docling 绝对值得放进你的工具箱。它不是万能的但在文档结构化这个环节尤其是结合表格和公式处理的场景它确实能给你省下大量手工整理的时间。实际用下来我会建议你在一开始就把输出格式设计好而不是先转成 Markdown 再想办法补结构。直接使用 JSON 输出从第一版就保留表格、标题、坐标这些元信息后面的检索和展示都会更灵活。另外一个很重要的心得是不要忽视模型的下载与缓存管理。很多团队卡在第一步并不是工具能力不行而是模型下载不顺利。提前在部署文档里写清楚镜像配置和缓存路径能让你少踩很多坑。最后docling 的社区更新频率很快建议你多关注它的 Release Notes。表格模型、OCR 能力、新增的语言支持都在持续迭代隔一段时间升级一次往往能白捡不少效果提升。我对这个工具的评价是在“把文档变成结构化数据”这件事上它做到了真正“能打”。剩下的就看你怎么把它放进自己的业务链路里了。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。