文档智能与实践

摘要

文档智能把非结构化文档转成机器可理解、可校验、可驱动业务动作的结构化数据,本质是解析、理解、校验、驱动四段能力链,而非 OCR 的精度升级,识别准只是起点,数据能算、能查、能触发动作才算跑通。

关键词:文档智能;OCR;版面分析;结构还原;文档VLM;MinerU;Docling;精度评估

引言

从字符识别到结构化数据,中间隔着一条完整的能力链。合同、发票、报关单、订单、物流单等业务凭证都是非结构化的,版式千变万化且年年更新。纯人工录入慢且错,纯靠通用 OCR 又常常"识别准但业务跑不通"1。

根源在 OCR 的输出形态:它解决"页面上有什么字",输出文本流;而业务需要"这份文档意味着什么、该触发什么动作",两者之间隔着一整套结构还原与语义判断。遇到多栏排版、跨页表格、公式、印章压字时,文本流不仅丢失二维关系,还会因阅读顺序错乱而彻底失真。

文档智能是一条四段能力链,而非一个识别模型,任何一段缺失业务都跑不通。全文按此展开------先立定义与阶梯,再拆解析层五支线,继而对比两条工程路线,最后落到校验、部署与评估。


1 定义与能力阶梯

1.1 四段能力链

文档智能可以定义为把非结构化文档(PDF、扫描件、图片、表格)转换成机器可理解、可校验、可驱动下游动作的结构化数据。

定义内含四个递进的能力段:

能力段 覆盖范围 回答的问题 输出形态
解析 字符、版面、结构 文档里有什么、在哪、怎么组织 带坐标的结构化元素
理解 语义、字段、关系 这份文档意味着什么 字段、实体、关系
校验 置信度、溯源、规则 抽出来的数据可不可信 置信分、坐标、校验结论
驱动 Schema、集成、编排 该触发什么真实业务动作 系统调用、流程状态

表1 文档智能四段能力链

四段是能力叠加而非替代:只做前两段=看得见但不可信,只做后两段=没有可靠输入。这是后文所有工程结论的前提。
#mermaid-svg-NegYRP11fuUpmUE9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NegYRP11fuUpmUE9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NegYRP11fuUpmUE9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NegYRP11fuUpmUE9 .error-icon{fill:#552222;}#mermaid-svg-NegYRP11fuUpmUE9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NegYRP11fuUpmUE9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NegYRP11fuUpmUE9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NegYRP11fuUpmUE9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NegYRP11fuUpmUE9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NegYRP11fuUpmUE9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NegYRP11fuUpmUE9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NegYRP11fuUpmUE9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NegYRP11fuUpmUE9 .marker.cross{stroke:#333333;}#mermaid-svg-NegYRP11fuUpmUE9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NegYRP11fuUpmUE9 p{margin:0;}#mermaid-svg-NegYRP11fuUpmUE9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NegYRP11fuUpmUE9 .cluster-label text{fill:#333;}#mermaid-svg-NegYRP11fuUpmUE9 .cluster-label span{color:#333;}#mermaid-svg-NegYRP11fuUpmUE9 .cluster-label span p{background-color:transparent;}#mermaid-svg-NegYRP11fuUpmUE9 .label text,#mermaid-svg-NegYRP11fuUpmUE9 span{fill:#333;color:#333;}#mermaid-svg-NegYRP11fuUpmUE9 .node rect,#mermaid-svg-NegYRP11fuUpmUE9 .node circle,#mermaid-svg-NegYRP11fuUpmUE9 .node ellipse,#mermaid-svg-NegYRP11fuUpmUE9 .node polygon,#mermaid-svg-NegYRP11fuUpmUE9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NegYRP11fuUpmUE9 .rough-node .label text,#mermaid-svg-NegYRP11fuUpmUE9 .node .label text,#mermaid-svg-NegYRP11fuUpmUE9 .image-shape .label,#mermaid-svg-NegYRP11fuUpmUE9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-NegYRP11fuUpmUE9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NegYRP11fuUpmUE9 .rough-node .label,#mermaid-svg-NegYRP11fuUpmUE9 .node .label,#mermaid-svg-NegYRP11fuUpmUE9 .image-shape .label,#mermaid-svg-NegYRP11fuUpmUE9 .icon-shape .label{text-align:center;}#mermaid-svg-NegYRP11fuUpmUE9 .node.clickable{cursor:pointer;}#mermaid-svg-NegYRP11fuUpmUE9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NegYRP11fuUpmUE9 .arrowheadPath{fill:#333333;}#mermaid-svg-NegYRP11fuUpmUE9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NegYRP11fuUpmUE9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NegYRP11fuUpmUE9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NegYRP11fuUpmUE9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NegYRP11fuUpmUE9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NegYRP11fuUpmUE9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NegYRP11fuUpmUE9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NegYRP11fuUpmUE9 .cluster text{fill:#333;}#mermaid-svg-NegYRP11fuUpmUE9 .cluster span{color:#333;}#mermaid-svg-NegYRP11fuUpmUE9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NegYRP11fuUpmUE9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NegYRP11fuUpmUE9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-NegYRP11fuUpmUE9 .icon-shape,#mermaid-svg-NegYRP11fuUpmUE9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NegYRP11fuUpmUE9 .icon-shape p,#mermaid-svg-NegYRP11fuUpmUE9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NegYRP11fuUpmUE9 .icon-shape .label rect,#mermaid-svg-NegYRP11fuUpmUE9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NegYRP11fuUpmUE9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NegYRP11fuUpmUE9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NegYRP11fuUpmUE9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 非结构化文档

PDF · 扫描件 · 图片 · 表格
① 解析

字符 · 版面 · 结构

还原有什么、在哪、怎么组织
② 理解

语义 · 字段 · 关系

判断这份文档意味着什么
③ 校验

置信度 · 溯源 · 规则

确认抽出来的数据可不可信
④ 驱动

Schema · 集成 · 编排

触发真实业务动作
结构化数据

ERP · 审批 · 工单

图1 文档智能四段能力链

图中深青填充为最终产物,灰色为输入源。

1.2 五层能力阶梯

把四段能力链按"回答的问题"再切一刀,得到从 OCR 到 IDP 的五层阶梯。每上一层,问题就换一次,输出的信息密度也随之跃升。

层级 名称 技术形态 回答的问题 输出
L0 字符层 OCR 这里有什么字 文本流
L1 版面层 Layout 字在哪、什么层级 区块与坐标
L2 结构层 Structure 表格几行几列、公式是什么 HTML / LaTeX
L3 语义层 Understanding 这份文档讲什么 字段、实体、关系
L4 业务层 IDP 该触发什么动作 校验、路由、回写

表2 从 OCR 到 IDP 的五层能力阶梯

工业级产品已有对应:Google Document AI 的处理器正按此组织------数字化(OCR)、提取(表单/布局/自定义/预训练解析器)、分类(分类器/拆分器),且所有处理器都能提取文本与布局12。

AI 时代的关键变化不是 OCR 被淘汰,而是它从"产品"降级为"组件"------仍是流水线第一阶段,但不再定义能力上限。2023 年起 VLM 对该领域产生颠覆性影响,2024 至 2025 年 Mistral OCR、DeepSeek-OCR、PaddleOCR-VL 等专用模型相继推出,以远小于通用 VLM 的参数量取得领先性能,OCR 的定义正从"字符识别"扩展为"文档理解"2。

1.3 与 OCR、IDP 的边界

三者常被混用,边界却清楚。OCR 解决"页面上有什么文字",输出原始文本或可搜索 PDF;IDP(智能文档处理)解决"这份文档意味着什么、该触发什么动作",输出映射到业务模式的结构化字段2。文档智能覆盖两者之间的完整链路,并额外承担校验与驱动职责。

两者差异集中在五维:输出形式(文本 vs 结构化字段)、上下文感知(无 vs 理解文档类型与字段含义)、数据验证(无 vs 业务规则与外部数据交叉校验)、异常处理(无 vs 低置信度路由人工)、系统集成(需定制 vs 预置 ERP/CRM 连接器)2。


2 输入形态与预处理链路

输入形态直接决定预处理链路,这是工程实现中第一个必须做出的判断。

形态 特征 核心难点 处理路径
PDF 原生电子版 有文本层,可直接抽取 版面还原、阅读顺序 文本层提取 + 版面分析
PDF 扫描版 只有图像层 倾斜、噪点、印章压字 图像增强 + OCR
拍摄图片 手机拍照、透视畸变 光照不均、几何畸变、模糊 几何校正 + 超分 + OCR
表格 Excel、网页表、图片表 二维结构、合并单元格 结构识别

表3 四种输入形态与处理路径

常被误解的一点:原生 PDF 有文本层不代表简单。文本层本身不携带可靠的阅读顺序与结构语义,照样会遇到双栏读串、表格塌成一行。

图像质量有明确量化门槛:低于 300 DPI 准确率明显下降,劣质扫描件可降 20% 以上;150→300 DPI 通常提升约 20%,高精度场景推荐 300 至 600 DPI。倾斜校正需控制在 ±1° 以内;去噪在噪声标准差 25 的高斯噪声上可使准确率从 62% 提升至 89%2。


3 解析层之一 OCR 原理与局限

3.1 四段式流水线

OCR 分四阶段,各自解决一个独立问题。
#mermaid-svg-jAyyiZlBKqyZz1lz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jAyyiZlBKqyZz1lz .error-icon{fill:#552222;}#mermaid-svg-jAyyiZlBKqyZz1lz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jAyyiZlBKqyZz1lz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jAyyiZlBKqyZz1lz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jAyyiZlBKqyZz1lz .marker.cross{stroke:#333333;}#mermaid-svg-jAyyiZlBKqyZz1lz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jAyyiZlBKqyZz1lz p{margin:0;}#mermaid-svg-jAyyiZlBKqyZz1lz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jAyyiZlBKqyZz1lz .cluster-label text{fill:#333;}#mermaid-svg-jAyyiZlBKqyZz1lz .cluster-label span{color:#333;}#mermaid-svg-jAyyiZlBKqyZz1lz .cluster-label span p{background-color:transparent;}#mermaid-svg-jAyyiZlBKqyZz1lz .label text,#mermaid-svg-jAyyiZlBKqyZz1lz span{fill:#333;color:#333;}#mermaid-svg-jAyyiZlBKqyZz1lz .node rect,#mermaid-svg-jAyyiZlBKqyZz1lz .node circle,#mermaid-svg-jAyyiZlBKqyZz1lz .node ellipse,#mermaid-svg-jAyyiZlBKqyZz1lz .node polygon,#mermaid-svg-jAyyiZlBKqyZz1lz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jAyyiZlBKqyZz1lz .rough-node .label text,#mermaid-svg-jAyyiZlBKqyZz1lz .node .label text,#mermaid-svg-jAyyiZlBKqyZz1lz .image-shape .label,#mermaid-svg-jAyyiZlBKqyZz1lz .icon-shape .label{text-anchor:middle;}#mermaid-svg-jAyyiZlBKqyZz1lz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jAyyiZlBKqyZz1lz .rough-node .label,#mermaid-svg-jAyyiZlBKqyZz1lz .node .label,#mermaid-svg-jAyyiZlBKqyZz1lz .image-shape .label,#mermaid-svg-jAyyiZlBKqyZz1lz .icon-shape .label{text-align:center;}#mermaid-svg-jAyyiZlBKqyZz1lz .node.clickable{cursor:pointer;}#mermaid-svg-jAyyiZlBKqyZz1lz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jAyyiZlBKqyZz1lz .arrowheadPath{fill:#333333;}#mermaid-svg-jAyyiZlBKqyZz1lz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jAyyiZlBKqyZz1lz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jAyyiZlBKqyZz1lz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jAyyiZlBKqyZz1lz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jAyyiZlBKqyZz1lz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jAyyiZlBKqyZz1lz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jAyyiZlBKqyZz1lz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jAyyiZlBKqyZz1lz .cluster text{fill:#333;}#mermaid-svg-jAyyiZlBKqyZz1lz .cluster span{color:#333;}#mermaid-svg-jAyyiZlBKqyZz1lz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jAyyiZlBKqyZz1lz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jAyyiZlBKqyZz1lz rect.text{fill:none;stroke-width:0;}#mermaid-svg-jAyyiZlBKqyZz1lz .icon-shape,#mermaid-svg-jAyyiZlBKqyZz1lz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jAyyiZlBKqyZz1lz .icon-shape p,#mermaid-svg-jAyyiZlBKqyZz1lz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jAyyiZlBKqyZz1lz .icon-shape .label rect,#mermaid-svg-jAyyiZlBKqyZz1lz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jAyyiZlBKqyZz1lz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jAyyiZlBKqyZz1lz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jAyyiZlBKqyZz1lz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ① 预处理

二值化 Otsu

去噪 NLM / DnCNN

倾斜校正 · 超分
② 文本检测

CTPN 锚点 · EAST 无锚点

DBNet 可微分二值化

支持任意形状
③ 字符识别

CRNN + CTC 序列对齐

TrOCR 注意力解码

手写 ICR
④ 后处理

N-gram / BERT 纠错

格式标准化 · 版面恢复

置信度过滤

图2 OCR 四段式流水线

四个环节统一用浅青底标出,表示同一处理链上的并列阶段。

预处理 标准化图像:Otsu 自适应二值化消除光照不均,高斯/双边滤波去椒盐噪声并用形态学修复笔画断裂,霍夫变换检测倾角后仿射校正,直方图均衡或 CLAHE 增强对比度2。

文本检测 定位文字。传统用 MSER 连通域分析,深度模型三选:CTPN(CNN+RNN 垂直锚点)、EAST(无锚点、支持多角度)、DBNet(可微分二值化,任意形状)2。

字符识别 把文字区域转成字符序列。主流是 CRNN(CNN 提特征 + RNN 建模序列 + CTC 解决长度不对齐),TrOCR 用自注意力捕捉字符依赖,长文本与复杂字体更强2。

后处理 校正结果:N-gram 或 BERT 纠错、统一日期金额格式、恢复段落与阅读顺序、按 softmax 置信度过滤2。

3.2 精度水位与手写差异

行业基准:清晰印刷体 CER 可低于 1%,手写体 3% 至 5%;工整手写准确率可达 90% 以上,潦草书写仅 70% 至 80%,医生处方等极端场景仍是难点2。

路线差异:印刷体用模板匹配或特征提取即可,深度学习中 CRNN+CTC 满足大部分场景;手写体更依赖上下文与序列建模,Transformer 显著优于传统 CRNN2。

3.3 六条结构性局限

这些不是调参能解决的,而是"文本流"输出形态本身的边界。

局限 本质原因 典型后果
只认字不认结构 输出是文本流,丢失二维空间关系 表格塌成一行、多栏混读
版式敏感 训练分布外的版式泛化能力差 换供应商模板即失效
误差级联 检测错则识别必错,无法回滚 单点错误污染整页
阅读顺序盲区 缺乏全局版面理解 双栏论文读成左栏全文加右栏全文
公式与表格无力 二维结构无法用序列表达 LaTeX 乱码、单元格错位
语义缺失 不知道字段的业务含义 金额与税号抽反也照常输出

表4 OCR 的六条结构性局限

其中最具工程杀伤力的一条是语义缺失:字符准确率可达 99%,但发票总额提取错误仍会直接导致经济损失。字符级指标救不了字段级错误,这一点在第 9 章评估体系中会再次展开。


4 解析层之二 版面分析

版面分析是最容易被低估的一环:阅读顺序错了后面全错,因为它决定所有元素按什么顺序拼接。

4.1 五个核心任务

任务 内容
区域检测 文本块、标题、表格、图片、公式、页眉页脚、页码、印章
阅读顺序还原 单栏、双栏、多栏、竖排、图文混排、跨栏段落
层级构建 章节树、列表嵌套、段落归属、标题与正文关联
元素分类 正文与装饰性元素(页眉页脚等 furniture)的区分
文档切分 多文档合一 PDF 的 Splitter

表5 版面分析的五个核心任务

4.2 传统方案与 VLM 方案的差异

维度 传统方案 VLM 方案
检测模型 LayoutLMv3、YOLO 等专用检测器 提示词直接输出 bbox
阅读顺序 规则加坐标排序 模型预测
优势 快、可控、坐标稳定 语义强、零样本
短板 复杂版式失效 坐标漂移、幻觉

表6 版面分析传统方案与 VLM 方案对比

阅读顺序最难,因为它在视觉上没有显式标注,只能靠模型推断。传统方案靠坐标排序,单栏可靠,但多栏嵌套、侧边栏、脚注穿插时规则迅速失效;VLM 有语义理解能力,却会因坐标漂移导致 bbox 与实际位置对不上,影响溯源。

MinerU 2.5 在此改进两点:保留页眉页脚页码等非正文元素以保证内容完整,并用更精细的标签体系表达列表、参考文献、代码块3。


5 解析层之三 表格结构还原

表格的二维结构无法用序列表达,这是它比线性文本困难的根源。现代表格识别通常分为四个阶段。
#mermaid-svg-4wEJ7LBrZtAN9e47{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4wEJ7LBrZtAN9e47 .error-icon{fill:#552222;}#mermaid-svg-4wEJ7LBrZtAN9e47 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4wEJ7LBrZtAN9e47 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .marker.cross{stroke:#333333;}#mermaid-svg-4wEJ7LBrZtAN9e47 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4wEJ7LBrZtAN9e47 p{margin:0;}#mermaid-svg-4wEJ7LBrZtAN9e47 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .cluster-label text{fill:#333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .cluster-label span{color:#333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .cluster-label span p{background-color:transparent;}#mermaid-svg-4wEJ7LBrZtAN9e47 .label text,#mermaid-svg-4wEJ7LBrZtAN9e47 span{fill:#333;color:#333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .node rect,#mermaid-svg-4wEJ7LBrZtAN9e47 .node circle,#mermaid-svg-4wEJ7LBrZtAN9e47 .node ellipse,#mermaid-svg-4wEJ7LBrZtAN9e47 .node polygon,#mermaid-svg-4wEJ7LBrZtAN9e47 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4wEJ7LBrZtAN9e47 .rough-node .label text,#mermaid-svg-4wEJ7LBrZtAN9e47 .node .label text,#mermaid-svg-4wEJ7LBrZtAN9e47 .image-shape .label,#mermaid-svg-4wEJ7LBrZtAN9e47 .icon-shape .label{text-anchor:middle;}#mermaid-svg-4wEJ7LBrZtAN9e47 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4wEJ7LBrZtAN9e47 .rough-node .label,#mermaid-svg-4wEJ7LBrZtAN9e47 .node .label,#mermaid-svg-4wEJ7LBrZtAN9e47 .image-shape .label,#mermaid-svg-4wEJ7LBrZtAN9e47 .icon-shape .label{text-align:center;}#mermaid-svg-4wEJ7LBrZtAN9e47 .node.clickable{cursor:pointer;}#mermaid-svg-4wEJ7LBrZtAN9e47 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .arrowheadPath{fill:#333333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4wEJ7LBrZtAN9e47 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4wEJ7LBrZtAN9e47 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4wEJ7LBrZtAN9e47 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4wEJ7LBrZtAN9e47 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4wEJ7LBrZtAN9e47 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4wEJ7LBrZtAN9e47 .cluster text{fill:#333;}#mermaid-svg-4wEJ7LBrZtAN9e47 .cluster span{color:#333;}#mermaid-svg-4wEJ7LBrZtAN9e47 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4wEJ7LBrZtAN9e47 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4wEJ7LBrZtAN9e47 rect.text{fill:none;stroke-width:0;}#mermaid-svg-4wEJ7LBrZtAN9e47 .icon-shape,#mermaid-svg-4wEJ7LBrZtAN9e47 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4wEJ7LBrZtAN9e47 .icon-shape p,#mermaid-svg-4wEJ7LBrZtAN9e47 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4wEJ7LBrZtAN9e47 .icon-shape .label rect,#mermaid-svg-4wEJ7LBrZtAN9e47 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4wEJ7LBrZtAN9e47 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4wEJ7LBrZtAN9e47 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4wEJ7LBrZtAN9e47 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ① 区域检测

Faster R-CNN / YOLO

从版面中定位表格
② 结构识别

Transformer 自注意力

GNN 单元格关系推理

解析行列与合并单元格
③ 内容识别

对每个单元格

调用 OCR 识别文本
④ 还原输出

Excel · JSON · HTML

单元格级坐标溯源

图3 表格结构还原四阶段

深青填充为最终输出环节,其余为中间处理阶段。

四阶段各司其职:区域检测用 Faster R-CNN、YOLO 等定位表格;结构识别解析行列与合并单元格坐标,主流用 Transformer 自注意力或 GNN 推理单元格关系;内容识别逐格调用 OCR;还原将结果填回结构,输出 Excel、JSON 或 HTML2。

5.1 难点谱系

表格类型 难点
有线表 表格线断裂、印章干扰
无线表 无边界,靠文本空间分布与语义特征推断单元格边界(最难)
异形表 多级表头、跨行跨列的不规则合并
跨页表 需通过语义与版式双特征判断前后页连续性
旋转表 倾斜或旋转需先校正

表7 表格结构的五类难点

商用服务对无线表、嵌套表等难例的效果已优于早期版本,并能在一定程度上规避印章干扰与表格线断裂2。

5.2 关键技术

TableFormer (CVPR 2022)用 Transformer 直接预测表格结构,不依赖 OCR 结果,是 Docling 的表格引擎4------价值在于切断"OCR 错则结构也错"的级联。

两阶段解耦 先结构后内容,避免结构判断被内容误差污染。Docling 的 do_cell_matching 开关可选"结构映射回 PDF 单元格"或"用结构预测的文本单元格";多列被错误合并为一列时,关闭它可改善5。

自 1.16.0 起 TableFormer 分 FAST(更快、准确率较低)与 ACCURATE(默认,处理复杂表格)两档5。


6 解析层之四 公式识别

公式识别把二维数学结构序列化为 LaTeX 或 MathML,难点随复杂度非线性上升。

形态 特征
行内公式 inline 嵌在正文流中,需与文字正确分离
行间公式 display 独立成块,通常居中并带编号
复杂结构 多行对齐、矩阵、分段函数、上下标嵌套
混排公式 中英文混排、公式内嵌中文

表8 公式的四类形态

方案 定位 特点
UniMERNet 专用模型 面向真实场景数学表达式识别[6](#方案 定位 特点 UniMERNet 专用模型 面向真实场景数学表达式识别[6] 文档 VLM 端到端 公式作为内容块直接输出 LaTeX pix2tex 轻量方案 复杂公式表现弱)
文档 VLM 端到端 公式作为内容块直接输出 LaTeX
pix2tex 轻量方案 复杂公式表现弱

表9 公式识别代表方案

评测用 CDM (Character Detection Matching),比纯编辑距离更贴近"公式是否视觉正确"------编辑距离会把结构正确但符号顺序不同的公式判错,CDM 则通过字符检测匹配衡量渲染一致性。OmniDocBench 同时采用 display_formula_Edit_dist 与 display_formula_CDM7。

MinerU 2.5 把复杂长公式与中英混排公式的准确解析列为其相对 2.0 的核心改进3。


7 解析层之五 文档 VLM 的三大范式

架构选择可归纳为三条路线,并非"新的取代旧的",而是精度、成本、可维护性的不同权衡。
#mermaid-svg-RUX6kYzvbpB3d6U2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RUX6kYzvbpB3d6U2 .error-icon{fill:#552222;}#mermaid-svg-RUX6kYzvbpB3d6U2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RUX6kYzvbpB3d6U2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .marker.cross{stroke:#333333;}#mermaid-svg-RUX6kYzvbpB3d6U2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RUX6kYzvbpB3d6U2 p{margin:0;}#mermaid-svg-RUX6kYzvbpB3d6U2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .cluster-label text{fill:#333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .cluster-label span{color:#333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .cluster-label span p{background-color:transparent;}#mermaid-svg-RUX6kYzvbpB3d6U2 .label text,#mermaid-svg-RUX6kYzvbpB3d6U2 span{fill:#333;color:#333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .node rect,#mermaid-svg-RUX6kYzvbpB3d6U2 .node circle,#mermaid-svg-RUX6kYzvbpB3d6U2 .node ellipse,#mermaid-svg-RUX6kYzvbpB3d6U2 .node polygon,#mermaid-svg-RUX6kYzvbpB3d6U2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RUX6kYzvbpB3d6U2 .rough-node .label text,#mermaid-svg-RUX6kYzvbpB3d6U2 .node .label text,#mermaid-svg-RUX6kYzvbpB3d6U2 .image-shape .label,#mermaid-svg-RUX6kYzvbpB3d6U2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-RUX6kYzvbpB3d6U2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RUX6kYzvbpB3d6U2 .rough-node .label,#mermaid-svg-RUX6kYzvbpB3d6U2 .node .label,#mermaid-svg-RUX6kYzvbpB3d6U2 .image-shape .label,#mermaid-svg-RUX6kYzvbpB3d6U2 .icon-shape .label{text-align:center;}#mermaid-svg-RUX6kYzvbpB3d6U2 .node.clickable{cursor:pointer;}#mermaid-svg-RUX6kYzvbpB3d6U2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .arrowheadPath{fill:#333333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RUX6kYzvbpB3d6U2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RUX6kYzvbpB3d6U2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RUX6kYzvbpB3d6U2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RUX6kYzvbpB3d6U2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RUX6kYzvbpB3d6U2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RUX6kYzvbpB3d6U2 .cluster text{fill:#333;}#mermaid-svg-RUX6kYzvbpB3d6U2 .cluster span{color:#333;}#mermaid-svg-RUX6kYzvbpB3d6U2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RUX6kYzvbpB3d6U2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RUX6kYzvbpB3d6U2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-RUX6kYzvbpB3d6U2 .icon-shape,#mermaid-svg-RUX6kYzvbpB3d6U2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RUX6kYzvbpB3d6U2 .icon-shape p,#mermaid-svg-RUX6kYzvbpB3d6U2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RUX6kYzvbpB3d6U2 .icon-shape .label rect,#mermaid-svg-RUX6kYzvbpB3d6U2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RUX6kYzvbpB3d6U2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RUX6kYzvbpB3d6U2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RUX6kYzvbpB3d6U2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 文档解析架构选型
① 传统流水线

布局检测 → 阅读顺序

→ 各专用模型

+ 可解释 · 坐标稳定

- 误差级联 · 维护复杂
② 端到端 VLM

单模型 图 → Markdown

+ 语义强 · 零样本

- 幻觉 · O(N²) 开销
③ 解耦式多阶段

全局版面 + 局部精细识别

+ 精度效率兼顾 · 抑幻觉

- 工程复杂度中等

图4 文档解析三大范式及其权衡

三条路线并列,各自的 + 为优势、- 为短板,不预设优劣。

范式 机制 优势 短板
传统流水线 布局检测、阅读顺序、文本与公式表格各自专用模型 可解释、模块可替换、坐标稳定 误差级联、维护复杂、复杂版式失效
端到端 VLM 单模型直接由图生成 Markdown 语义强、零样本、架构简单 幻觉、高分辨率 O(N²) 开销
解耦式多阶段 阶段一做全局版面分析,阶段二做局部精细识别 兼顾精度与效率、可解释、抑制幻觉 工程复杂度中等

表10 文档解析三大范式对比

7.1 端到端的三个结构性障碍

据 MinerU2.5 技术报告,端到端在文档场景有三个障碍3。

token 冗余:文档图大量空白/低信息区,原生分辨率编码产生海量视觉 token,O(N²) 复杂度使算力不可承受。

幻觉:文本密集区模型倾向"猜"而非"读",长文档上尤其严重。

分辨率两难 :裁剪降低开销但牺牲语义一致性与版面信息;原生分辨率保留细节却产生数量惊人的 token,工程上不可行3。

解法是解耦:把全局版面分析与局部内容识别拆开,让高分辨率只作用于真正需要精细识别的局部。


8 工程实现的两条路线

8.1 MinerU 从模块化流水线到解耦式 VLM

MinerU 在 2.5 从流水线转向解耦式 VLM。早期方案用 PDF-Extract-Kit 编排版面检测、公式识别、表格抽取等专用模型,便于单组件优化,但误差在阶段间传播、多栏与跨页版面鲁棒性有限、模块依赖使维护繁琐3。

MinerU2.5 是 1.2B 参数的解析 VLM,用由粗到细的两阶段解耦全局版面分析与局部内容识别。
#mermaid-svg-EnCUDk2Ia1uYCuJ1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .error-icon{fill:#552222;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .marker.cross{stroke:#333333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 p{margin:0;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .cluster-label text{fill:#333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .cluster-label span{color:#333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .cluster-label span p{background-color:transparent;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .label text,#mermaid-svg-EnCUDk2Ia1uYCuJ1 span{fill:#333;color:#333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node rect,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node circle,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node ellipse,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node polygon,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .rough-node .label text,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node .label text,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .image-shape .label,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .rough-node .label,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node .label,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .image-shape .label,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .icon-shape .label{text-align:center;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node.clickable{cursor:pointer;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .arrowheadPath{fill:#333333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .cluster text{fill:#333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .cluster span{color:#333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .icon-shape,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .icon-shape p,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .icon-shape .label rect,#mermaid-svg-EnCUDk2Ia1uYCuJ1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EnCUDk2Ia1uYCuJ1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始文档图像
Stage I 版面分析

整页缩放 1036×1036

固定尺寸 → bbox 定位更稳

低成本获得全局结构
按版面裁剪

局部区域
Stage II 内容识别

原生分辨率输入

上限 2048×28×28

保住密集文本与公式细节
文本 · 公式 · 表格

结构化输出

图5 MinerU2.5 两阶段解析策略

浅青为两个解析阶段,深青为结构化输出。

架构三件套 :语言模型 0.5B Qwen2-Instruct(解析任务对 LLM 依赖低),1D-RoPE 换 M-RoPE 适配裁剪块多分辨率;视觉编码器 675M NaViT(Qwen2-VL 初始化),支持动态分辨率与 2D-RoPE;Patch Merger 对 2×2 视觉 token 做 pixel-unshuffle,折中效率与性能3。

两阶段参数 :Stage I 整页缩放至 1036×1036,固定尺寸换取更稳 bbox 与更高训练效率;Stage II 按版面裁原图局部、原生分辨率输入,上限 2048×28×28,兼顾细节与算力3。

训练三阶段 :Stage 0 模态对齐(先只训 Patch Merger 两层 MLP 并冻结其余,再全解冻做视觉指令微调)、Stage 1 解析预训练、Stage 2 解析微调,配数据引擎生成语料3。

收益复合:算力降一个数量级、可解释性提升、幻觉被结构性抑制、两阶段可独立迭代3。

8.2 Docling 统一文档模型与可插拔流水线

Docling 走另一条路:不做单一解析模型,而做可编排的文档转换框架。
#mermaid-svg-aU90VKQ3co2OgsHs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aU90VKQ3co2OgsHs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aU90VKQ3co2OgsHs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aU90VKQ3co2OgsHs .error-icon{fill:#552222;}#mermaid-svg-aU90VKQ3co2OgsHs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aU90VKQ3co2OgsHs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aU90VKQ3co2OgsHs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aU90VKQ3co2OgsHs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aU90VKQ3co2OgsHs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aU90VKQ3co2OgsHs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aU90VKQ3co2OgsHs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aU90VKQ3co2OgsHs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aU90VKQ3co2OgsHs .marker.cross{stroke:#333333;}#mermaid-svg-aU90VKQ3co2OgsHs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aU90VKQ3co2OgsHs p{margin:0;}#mermaid-svg-aU90VKQ3co2OgsHs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aU90VKQ3co2OgsHs .cluster-label text{fill:#333;}#mermaid-svg-aU90VKQ3co2OgsHs .cluster-label span{color:#333;}#mermaid-svg-aU90VKQ3co2OgsHs .cluster-label span p{background-color:transparent;}#mermaid-svg-aU90VKQ3co2OgsHs .label text,#mermaid-svg-aU90VKQ3co2OgsHs span{fill:#333;color:#333;}#mermaid-svg-aU90VKQ3co2OgsHs .node rect,#mermaid-svg-aU90VKQ3co2OgsHs .node circle,#mermaid-svg-aU90VKQ3co2OgsHs .node ellipse,#mermaid-svg-aU90VKQ3co2OgsHs .node polygon,#mermaid-svg-aU90VKQ3co2OgsHs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aU90VKQ3co2OgsHs .rough-node .label text,#mermaid-svg-aU90VKQ3co2OgsHs .node .label text,#mermaid-svg-aU90VKQ3co2OgsHs .image-shape .label,#mermaid-svg-aU90VKQ3co2OgsHs .icon-shape .label{text-anchor:middle;}#mermaid-svg-aU90VKQ3co2OgsHs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aU90VKQ3co2OgsHs .rough-node .label,#mermaid-svg-aU90VKQ3co2OgsHs .node .label,#mermaid-svg-aU90VKQ3co2OgsHs .image-shape .label,#mermaid-svg-aU90VKQ3co2OgsHs .icon-shape .label{text-align:center;}#mermaid-svg-aU90VKQ3co2OgsHs .node.clickable{cursor:pointer;}#mermaid-svg-aU90VKQ3co2OgsHs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aU90VKQ3co2OgsHs .arrowheadPath{fill:#333333;}#mermaid-svg-aU90VKQ3co2OgsHs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aU90VKQ3co2OgsHs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aU90VKQ3co2OgsHs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aU90VKQ3co2OgsHs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aU90VKQ3co2OgsHs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aU90VKQ3co2OgsHs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aU90VKQ3co2OgsHs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aU90VKQ3co2OgsHs .cluster text{fill:#333;}#mermaid-svg-aU90VKQ3co2OgsHs .cluster span{color:#333;}#mermaid-svg-aU90VKQ3co2OgsHs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aU90VKQ3co2OgsHs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aU90VKQ3co2OgsHs rect.text{fill:none;stroke-width:0;}#mermaid-svg-aU90VKQ3co2OgsHs .icon-shape,#mermaid-svg-aU90VKQ3co2OgsHs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aU90VKQ3co2OgsHs .icon-shape p,#mermaid-svg-aU90VKQ3co2OgsHs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aU90VKQ3co2OgsHs .icon-shape .label rect,#mermaid-svg-aU90VKQ3co2OgsHs .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aU90VKQ3co2OgsHs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aU90VKQ3co2OgsHs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aU90VKQ3co2OgsHs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} DocumentConverter

编排层

选后端 · 选流水线 · 传参数
Format Backend

PDF / DOCX / HTML
Pipeline + Options

PDF 模型链与参数
DoclingDocument

统一文档表示
内容项

texts · tables

pictures · key_value_items
内容结构

body · furniture · groups

阅读顺序 = body 树遍历
导出 / 序列化 / 分块

Markdown · dict

HybridChunker

图6 Docling 三层架构与统一文档表示

深青为中枢数据结构 DoclingDocument,其余为输入与输出通道。

Docling 为每种格式维护一个转换器,由它决定用哪个后端解析、哪个流水线协调执行、传哪些选项;转换结果即 DoclingDocument8。

DoclingDocument 是核心价值:一个 pydantic 类型,统一表达文本/表格/图片、章节与分组层级、正文与页眉页脚之分、所有项的 bbox 与来源9。

数据结构分两类。内容项存于 texts(段落、标题、公式,基类 TextItem)、tables、pictures、key_value_items;内容结构封装在 body(正文树根)、furniture(页眉页脚等非正文)、groups(列表、章节容器)。各项以 JSON 指针互引,阅读顺序由 body 树遍历决定9。

流水线组件 离线预取五类模型:版面、TableFormer、图片分类、代码与公式、EasyOCR。均可插拔------OCR 可换 RapidOCR/Tesseract,TableFormer 分 FAST/ACCURATE 两档,可强制整页 OCR 或接远程 VLM5。

RAG 分块 由 HybridChunker 承担,每个 chunk 自带 headings 层级路径与 prov 坐标,可直接入库5。

隐私设计 :默认全本地不共享数据;用远程服务须显式设 enable_remote_services=True,否则抛 OperationNotAllowed()5。"默认不联网"使私有部署天然合规。

8.3 两条路线的定位差异

维度 MinerU Docling
出身 上海人工智能实验室、OpenDataLab IBM Research
核心 高精度解析(自研文档 VLM) 统一文档模型与可插拔流水线
强项 复杂版面、公式、表格精度 文档结构建模、多格式支持、RAG 分块
形态 解析引擎 转换框架与工具箱
输出 Markdown、JSON(带 bbox) DoclingDocument 多格式导出
适合场景 追求最高精度解析结果 需要可编排、可扩展的文档底座

表11 MinerU 与 Docling 定位差异

Docling 技术报告阐述了同一思路:以统一文档表示为中枢,后端、流水线与选项解耦,同一份文档可经不同路径加工后落到同一个可导出对象模型13。

两者共同趋势是从"流水线拼装"走向"统一模型 + 结构化文档表示"------这是当前阶段的架构共识:无论自研模型还是做框架,最终都要落到一个显式、可查询的文档对象模型。


9 校验、部署与评估

9.1 校验三支柱

"可校验"是文档智能区别于普通 OCR 的核心:数据必须能被追问。三支柱缺一不可。

支柱 机制 作用
置信度 字段级 confidence 输出,阈值经离线标注与线上 A/B 标定 低置信度自动路由到人工队列
溯源 page_no 与 bbox 坐标、原文引用可回溯 让答案可核验而非盲信模型
规则校验 业务一致性(价税合计等于金额加税额)、跨单据对齐、Schema 校验 拦截语义层面的错误

表12 校验三支柱

落地走五步法1:

  1. 采集:汇聚单据,统一格式与命名
  2. 分类:判断类型并分流
  3. 提取:多模态抽关键字段,而非整页 OCR
  4. 审核:按业务规则校验,低置信度转人工
  5. 录入:回写 ERP 或财务中台

审核环节不能省。实践中的兜底闭环是"抽取---规则校验---转人工":模型给每个字段打置信度,低于阈值的连同上下文推给业务人员确认,结果再反哺模型1。这才是生产环境跑得稳的组合。

9.2 私有部署

四个驱动力2:

  • 合规:上传云端可能被用于训练,违反数据最小化原则;EDPB 指出大量个人数据训练 OCR 模型可能违反 GDPR
  • 数据主权:合同、财务、医疗、证件类不可出内网
  • 成本:按页计费在高吞吐下累积
  • 可控:需要定制、微调与版本锁定

架构分四层【推导】:

  • 模型层:离线预取解析模型、本地 OCR 与 VLM
  • 服务层:vLLM/SGLang + 任务队列,长文档异步化
  • 存储层:原文档、解析产物、中间态、向量库
  • 治理层:权限继承、审计、脱敏

该分层由前文归纳得出,非某一文献直接主张。

三个部署陷阱:

  • 隐写文本层 :OCR 生成的可搜索 PDF 在图像下方留有不可见文本层,黑色矩形遮盖后仍可恢复,多起脱敏失败均源于此2
  • 资源超限静默死 :被内核杀死(退出码 137)时 Agent 收不到回调,须外置监控兜底10
  • 版本升级缺回归:模型或组件升级后输出变化,无固定回归集则质量下降难被发现

9.3 三层精度评估

三层须同时评估,缺一层结论都不可信。

层 回答 指标
字符层 字对不对 CER、WER、归一化编辑距离
结构层 结构对不对 TEDS、TEDS-S、版面 mAP、阅读顺序编辑距离、公式 CDM
语义层 意思对不对 字段级准确率与 F1、STP 率、DocVQA、InfoVQA、RAGAS 忠实度

表13 精度评估三层指标体系

CER 用 Levenshtein 距离计算(插入+删除+替换 除以真值字符数)2;TEDS 是表格树编辑距离相似度,TEDS-S 只比结构不含文本。字段级准确率衡量特定字段(如发票总额、保单号)是否完全正确,是文档自动化最关键的指标------字符准确率可达 99%,但发票金额抽错仍直接造成损失;金融与证件类要求 99.9%,这是直通式处理的门槛。STP 率指无需人工干预即可通过工作流的比例,2026 年领先系统可达 95%2。

9.4 OmniDocBench v1.6 基准

OmniDocBench 是当前被广泛采用的端到端文档解析基准,发表于 CVPR 2025117。

它评估文本、公式、表格、版面布局与阅读顺序:输入整页图像,输出含四类元素的 Markdown;领域覆盖多语言学术、金融、教科书、报纸、杂志、演示文稿7。

规模 1,651 页 = 1,355 基础 + 100 公式复杂 + 99 版面复杂 + 97 表格复杂;分辨率跨 570×829 至 10142×143427。

官方指标八项,描述与方向如下表。

指标 描述 方向 所属层
text_block_Edit_dist 正文文字准确度,与真值的归一化编辑距离 越低越好 字符
table_Edit_dist 表格内文字准确度,单元格文本的编辑距离 越低越好 字符
display_formula_Edit_dist 行间公式 LaTeX 还原准确度,公式串编辑距离 越低越好 字符
table_TEDS 表格结构加内容整体还原度,HTML 树编辑距离相似度 越高越好 结构
table_TEDS_structure_only 只看表格结构,忽略单元格文本 越高越好 结构
display_formula_CDM 公式渲染视觉一致性,字符检测匹配 越高越好 结构
reading_order_Edit_dist 阅读顺序正确性,与真值顺序的编辑距离 越低越好 结构
normalized_score 综合得分,文本、公式、表格加权归一 越高越好 综合

表14 OmniDocBench v1.6 官方指标集

表14 中有三组容易混淆的指标7:

  • Edit_dist 与 CDM 的差别在度量对象:前者比较字符串序列,对符号顺序敏感;后者先把 LaTeX 渲染成图再比对字符位置,对"写法不同但视觉等价"的公式更宽容
  • TEDS 与 TEDS-S 的差别在是否计入文本:TEDS 同时惩罚结构错误与内容错误,TEDS-S 只惩罚结构错误,两者差距大说明结构对但文字识别差
  • table_Edit_dist 与 text_block_Edit_dist 分属两个对象:前者只统计表格内文字,后者统计正文文本块,分别衡量表格与正文的文字质量

评分用官方 v1.6 评估器在 Docker 沙箱中逐页独立进行;EvalScope 对各页指标取平均,Overall 仅基于文本、公式、表格三组件聚合计算7。

9.5 四个评估陷阱

陷阱 表现 对策
基准不等于业务 受控测试基准 98% 的系统,在真实业务文档上可能降至 85% 用真实语料做 POC,覆盖低质量扫描、复杂表格、多页 PDF
字符指标掩盖字段错误 字符准确率 99% 但发票总额抽错 把字段级准确率作为核心验收指标
单一指标失真 只报 TEDS 不报文本精度 三层同时报
静态基准饱和 公开榜单被持续刷榜,失去区分度 建私有测试集,模型变更必跑回归

表15 四个评估陷阱

第一条尤其值得强调。据腾讯云技术百科的建议,应选取一至两个典型文档类型做概念验证测试,使用真实业务文档(包含低质量扫描件、复杂表格、多页 PDF 等边缘案例)量化异常率与人工校正工作量;重点关注系统在真实文档语料库上的表现,而非理想条件下的基准数据------一个在受控测试中基准达 98% 的系统,在实际业务文档上可能降至 85%2。


10 六条能力边界

综合全文,六条必须记住的边界。

边界 含义
字符准不等于业务对 字段级准确率才是黄金指标,金融与证件类需 99.9%
多模态不是银弹 多模态能同时理解文字、表格线、印章位置与排版逻辑,稳定性明显优于单模态 OCR,但仍需人工兜底闭环[1](#边界 含义 字符准不等于业务对 字段级准确率才是黄金指标,金融与证件类需 99.9% 多模态不是银弹 多模态能同时理解文字、表格线、印章位置与排版逻辑,稳定性明显优于单模态 OCR,但仍需人工兜底闭环[1] 审核环节不能省 低置信度转人工加结果反哺,才能持续保持准确率 绝对准确不可达 应把目标从 100% 准确率改为把出错概率压到可接受范围 模型上限由数据决定 MinerU2.5 的数据引擎在报告中占据与模型架构同等甚至更重的篇幅[3] 文档是 Agent 的感官 解析质量直接决定下游 Agent 的决策质量)
审核环节不能省 低置信度转人工加结果反哺,才能持续保持准确率
绝对准确不可达 应把目标从 100% 准确率改为把出错概率压到可接受范围
模型上限由数据决定 MinerU2.5 的数据引擎在报告中占据与模型架构同等甚至更重的篇幅[3](#边界 含义 字符准不等于业务对 字段级准确率才是黄金指标,金融与证件类需 99.9% 多模态不是银弹 多模态能同时理解文字、表格线、印章位置与排版逻辑,稳定性明显优于单模态 OCR,但仍需人工兜底闭环[1] 审核环节不能省 低置信度转人工加结果反哺,才能持续保持准确率 绝对准确不可达 应把目标从 100% 准确率改为把出错概率压到可接受范围 模型上限由数据决定 MinerU2.5 的数据引擎在报告中占据与模型架构同等甚至更重的篇幅[3] 文档是 Agent 的感官 解析质量直接决定下游 Agent 的决策质量)
文档是 Agent 的感官 解析质量直接决定下游 Agent 的决策质量

表16 六条能力边界

最后一条在 AI 应用语境下尤其关键:当 Agent 读取合同、财报、票据完成任务时,解析质量不再是独立工程指标,而是决策链的第一环。解析错一个数字,后续所有推理都建立在错误前提上。


总结

文档智能不是把 OCR 做得更准,而是把文档变成能算、能查、能校验的数据。四段能力链里,解析负责看清,理解负责看懂,校验负责信得过,驱动负责用得上,少一段业务就跑不通。技术上,端到端 VLM 想一步到位,结果被 token 冗余和幻觉拖住,真正跑通的是解耦式两阶段,先用低分辨率看全局,再按版面切局部、用原分辨率细看。工程上,MinerU 追求解析精度,Docling 提供可编排的文档底座,两者都收敛到同一个共识,就是必须有一个显式的结构化文档表示。评估三层缺一层都不可信,但决定业务跑通的是字段级准确率与 STP 率。最后记住,文档是 Agent 的眼睛,眼睛花了,脑子再好也没用。


参考文献

1 阿里云开发者社区. "非结构化单据自动化:文档智能五步法与版式兜底实践." 阿里云开发者社区 , 2026-09-04.

2 腾讯云开发者社区. "OCR 技术百科." 腾讯云技术百科 , 2026-09-14.

3 J. Niu et al. "MinerU2.5: A Decoupled Vision-Language Model for Efficient High-Resolution Document Parsing." arXiv:2509.22186 , 2025.

4 S. Nassar et al. "TableFormer: Table Structure Understanding with Transformers." CVPR , 2022.

5 Docling Project. "Docling Usage Documentation." Docling 官方文档 , 2026.

6 OpenDataLab. "UniMERNet: A Universal Network for Real-World Mathematical Expression Recognition." GitHub , 2024.

7 ModelScope. "OmniDocBench-v1.6 评测适配文档." EvalScope 官方文档 , 2026.

8 Docling Project. "Docling 架构文档." Docling 官方文档 , 2026.

9 Docling Project. "DoclingDocument 文档结构文档." Docling 官方文档 , 2026.

10 腾讯云开发者社区. "CubeSandbox: 60 毫秒启动的 AI Agent 沙箱." 腾讯云开发者社区 , 2026-09-02.

11 L. Ouyang et al. "OmniDocBench: Benchmarking Diverse PDF Document Parsing with Comprehensive Annotations." CVPR , 2025.

12 Google Cloud. "Document AI 概览." Google Cloud 官方文档 , 2026-10-15.

13 IBM Research. "Docling Technical Report." arXiv:2408.09869, 2024.

相关推荐
隐擎fox1 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
“AI国潮设计-小江”2 小时前
【AIGC实战】Python+SDXL批量生成「潮汕英歌舞冰淇淋蛋糕&红桃粿咖啡」IP,固定角色形象批量出甜品商业效果图
开发语言·人工智能·python·prompt·aigc
Merrill_hh2 小时前
Python环境搭建
python
七牛云行业应用2 小时前
Codex接MCP完整教程:从官方文档服务器到HTTP、STDIO与OAuth配置(2026年10月)
人工智能·ai·agent·ai编程
用户019027581612 小时前
如何用 Python 回测布林带突破策略?
python
4SAPI2 小时前
企业Agent落地选型:大模型API接入方案迁移实践与稳定性评估
人工智能·python·php
用户019027581613 小时前
如何用 Python 计算 CR 能量指标(中间意愿指标)?
python
曲径海盗3 小时前
【Python 学习第 34 天】条件判断 if/else
python·学习笔记·编程入门
用户6602676118793 小时前
重试不重复下单还不够:同一幂等键换了参数,应该返回什么?
python