数据截至 (上游 commit c4b5ed6202d6)
数据模型、富化与面向 RAG 的输出
30 秒导读: 前面几章讲的是「怎么把一份文件解析开」——入口分派、后端、流水线、逐阶段的模型。这一章讲产物端:所有路径最终都汇成同一个数据结构
ConversionResult,里面装着一个DoclingDocument(统一文档表示)。这份统一表示可以被富化(往节点上贴描述、分类、公式),可以被导出成 Markdown/HTML/JSON/DocTags 等格式,也可以被**切块(chunking)**成带元数据的小块喂给 RAG 检索。理解了这一章,你就明白 Docling 为什么值钱:它把「一百种输入格式」统一成「一种可编程、可切块、可检索的文档对象」。
本章是本组文档的收束章。想先看全景,回到 index;想知道输入怎么进来,看 入口与分派、后端层、流水线层;想知道 PDF 上那些识别模型怎么跑,看 PDF 识别流水线。这一章接在它们后面:模型跑完之后,数据长什么样、怎么出去。
1. 这是什么(零基础也能懂)
一句话定义
Docling 的数据模型就是「一份文档在内存里被表示成什么」;输出端就是「这份表示怎么变成你能用的东西」。
用一个类比建立直觉
把一次转换想象成一条装配线的成品下线口:
- 原料(PDF 字节、Word、网页……)从进料口进来,经过一节节工位(后端 → 各识别模型)。
- 每一页先被组装成一个半成品托盘(
Page+AssembledUnit)。 - 所有托盘最后汇总、排好阅读顺序,压成一件统一成品——
DoclingDocument。 - 成品连同它的质检报告(状态、错误、置信度、耗时)一起放进一个出货箱——
ConversionResult。 - 出货箱到手后,你可以给成品再加工(富化)、换包装(导出成 md/html/json)、或切成零件(chunking)喂给检索。
为什么这件事重要
RAG(检索增强生成:先从你的资料里检索相关片段,再让大模型基于片段回答)最 脏最累的活,是把各种格式的文档洗成结构化、可切块的文本。市面上大多数库要么只吃某一种格式,要么吐出一坨没有结构的纯文本。
Docling 的价值主张是:无论输入是什么格式,产物都是同一个 DoclingDocument——它有标题层级、有表格结构、有图片、有出处坐标(provenance)。有了这个统一表示,下游的富化和切块就能对所有格式一视同仁地工作。这就是本章标题里「统一表示为何是 Docling 对 RAG 生态核心价值」的意思。
2. 顶层全景(数据怎么从「页」收敛成「文档」再出去)
怎么读这张图: 从上到下是时间顺序。左边是「每页各自的中间产物」,中间汇成「一份统一文档」,右边是「文档的三种去处」。
逐页处理(见 04 章)
┌───────────────────────────────┐
│ Page ① Page ② Page ③ ... │ 每页: size / predictions / assembled
│ └ AssembledUnit(该页元素) │ 元素 = TextElement / Table / FigureElement ...
└───────────────┬───────────────┘
│ _assemble_document(): 汇总所有页的 elements/headers/body
▼
conv_res.assembled (AssembledUnit, 全篇打平的中间元素)
│ reading_order_model → heading_hierarchy_model
▼
┌───────────────────────────────────────────────┐
│ DoclingDocument (统一表示) │ ← 来自外部 docling_core
│ 有阅读顺序 / 标题层级 / 表格 / 图片 / 出处坐标 │
└───────────────┬───────────────────────────────┘
│
┌────────────┼─────────────────────────┐
▼ ▼ ▼
① 富化 enrichment ② 导出 export ③ 切块 chunking
就地改写节点 save_as_markdown/html HybridChunker →
(贴描述/分类/公式) /json/doctags/vtt DocChunk(带 DocMeta 元数据)
│ │
▼ ▼
给人 / 存档 / 前端 喂给向量库 → RAG 检索
整件成品和它的质检报告,都装在 ConversionResult 这一个对象里。下表是这一章要拆解的几个关键部件:
| 部件 | 是什么 | 在哪 |
|---|---|---|
ConversionResult | 一次转换的总出货箱:输入 + 页 + 中间产物 + 最终文档 + 状态/错误/置信度 | datamodel/document.py:587 |
ConversionAssets | ConversionResult 的父类,承载可序列化的产物(status/pages/document/...) | datamodel/document.py:394 |
Page | 单页的容器:尺寸、解析结果、各模型预测、该页组装单元 | datamodel/base_models.py:472 |
AssembledUnit | 一批中间元素(文本/表/图)的打平集合 | datamodel/base_models.py:459 |
DoclingDocument | 最终统一文档(外部 docling_core 提供) | 来自 docling_core.types.doc,document.py:27 导入 |
ConversionStatus / ErrorItem / FailureCategory | 状态与错误模型 | datamodel/base_models.py:85 / 278 / 254 |
富化 _enrich_document | 在 DoclingDocument 上就地改写节点 | pipeline/base_pipeline.py:107 |
导出 export_documents | 把文档存成各种格式 | cli/main.py:443 |
| chunking | 把文档切成带元数据的块 | chunking/__init__.py(再导出 docling_core) |