数据截至 (上游 commit 4fe4bde114a2)
hybrid 混合后端与 Office 直解
30 秒导读: MinerU 有两条"非主流"的解析支线。hybrid 让传统 pipeline 的小模型 (layout/公式/OCR)和 vlm 的大模型同台协作,再用一个
effort旋钮在"更快"和"更准" 之间挑;Office 直解对.docx/.pptx/.xlsx根本不渲染成图,直接读 OOXML 结构解出内容。 两条支线走法迥异,但终点相同——都产出和主线一样的middle_json,后面的 Markdown 渲染 完全复用。
本章讲这两条支线为什么存在、各自怎么走、又如何殊途同归。读前建议先看 02-pipeline-backend.md(小模型流水线)、03-vlm-backend.md (VLM 端到端)和 04-middle-json-and-markdown.md(统一中间表示)。
1. 先建立直觉:为什么要有这两条支线
前两章给了两种极端:
- pipeline —— 一堆专用小模型串成流水线(layout 检测 → 公式识别 → OCR),快、可控,但每个 环节都可能出错,拼装规则复杂。
- vlm —— 一个视觉大模型端到端吐出结构化块,省心、鲁棒,但推理慢、成本高。
这留下两个没被覆盖的现实需求:
| 现实需求 | 主线为什么不够 | 这条支线怎么补 |
|---|---|---|
| 想要 VLM 的语义理解,又不想全靠它扛精度和速度 | 纯 vlm 慢;纯 pipeline 拼装脆 | hybrid:小模型做它擅长的(layout/公式/OCR det),VLM 做它擅长的(读内容),各取所长 |
| 输入本来就是 Office 文件(Word/PPT/Excel) | 把 .docx 先转成 PDF 再渲染成图片再识别,是"把已经结构化的东西打碎再拼回来" | Office 直解:直接读 OOXML(Office 的 XML 骨架),文字/表格/公式本就在那儿,原样取出 |
一句话记住两条支线的"性格":
- hybrid = 让两代模型合作,并给你一个精度/速度旋钮(
effort)。 - Office 直解 = 有结构就别打碎;绕开"渲染成图 + 视觉识别"这一整套。
2. 顶层全景:两条支线如何汇入同一条河
先看大盘。三条后端最终都灌进同一个 middle_json,再由统一的 mkcontent 出 Markdown/JSON。
怎么读这张图:从左边的输入类型出发,看它走哪条支线、经过谁,箭头汇 聚处就是"收敛点"。
输入 解析支线(本章两条加粗) 收敛
─────── ───────────────────────── ──────
PDF ──┬─► pipeline ──► 小模型流水线 ───────────────┐
│ (第2章) │
│ │
├─► vlm ─────► 视觉大模型端到端 ──────────────┤
│ (第3章) │
│ ├─► middle_json ─► mkcontent ─► .md / .json
└─► 【hybrid】► 小模型(layout/公式/OCR det) │ (第4章统一中间表示) (第4章)
+ VLM(读内容) ──────────────┤
│
DOCX ─┐ │
PPTX ─┼─► 【Office 直解】► 读 OOXML → 结构化块 ───────┘
XLSX ─┘ (不渲染成图、不过视觉模型)
部件一句话职责:
| 部件 | 干什么 | 在哪个文件 |
|---|---|---|
_process_office_doc | 按后缀把 Office 文件分派到 docx/pptx/xlsx 直解 | mineru/cli/common.py:618 |
office_{docx,pptx,xlsx}_analyze | 读文件字节 → OOXML 转换器 → result_to_middle_json | mineru/backend/office/*_analyze.py |
hybrid doc_analyze | 分窗口跑 layout 小模型 + VLM,按 effort 分支 | mineru/backend/hybrid/hybrid_analyze.py:889 |
HybridModelSingleton | 复用 pipeline 的 layout/mfr/ocr 小模型实例 | mineru/backend/pipeline/model_init.py |
MinerUClient(predictor) | vlm 的视觉大模型客户端 | mineru_vl_utils(外部库) |
两个 MagicModel | 各自把本支线的原始结果整理成 middle_json 的块 | hybrid / office *_magic_model.py |
主线走一遍(高层):
- 入口分派(
do_parse)先看输入是不是 Office 后缀——是就走直解、并从 PDF 列表里剔除; 剩下的 PDF 再按backend走 pipeline / vlm / hybrid。 - hybrid:按页窗口,先用小模型出 layout,再交给 VLM 读内容,按
effort决定谁主导。 - Office:直接把 OOXML 转成"块列表",不碰任何视觉模型。
- 收敛:两者都调各自的
result_to_middle_json/finalize_middle_json,产出同构middle_json。
3. hybrid 支线:让两代模型合作
3.1 它要解决的小问题
VLM 强在"读懂一块内容是什么",但让它自己也去做版面切分、精确定位、逐行文本框检测既慢又 未必更准——这些恰恰是 pipeline 小模型的强项。hybrid 的思路是:分工。
- 小模型(来自 pipeline):出 layout 版面框、行内公式框(mfr)、OCR 文本行检测(det)。
- 大模型(来自 vlm):读每块的实际内容(文字、表格 HTML、图表) 。
3.2 复用 pipeline 小模型 + vlm 客户端
hybrid 不重新实现小模型,而是直接 import pipeline 的那几个:
真实实现见 mineru/backend/hybrid/hybrid_analyze.py:21-27:
from mineru.backend.pipeline.model_init import (
HybridModelSingleton, # 复用 pipeline 的小模型单例
run_layout_inference, # 版面检测
run_mfr_inference, # 行内公式识别
run_ocr_inference, # OCR(此支线只用 det,不做 rec)
)
VLM 侧则复用 vlm 后端的客户端与执行守卫(hybrid_analyze.py:30-36),核心是
MinerUClient 类型的 predictor(见 doc_analyze 签名 hybrid_analyze.py:889)。
小模型的取用走 _predict_layout_for_window(hybrid_analyze.py:663):它 HybridModelSingleton().get_model(...)
拿到复用实例,只跑 layout(OCR 模式下文本交给 VLM,连公式模型都不开——见 :671 注释),
然后 _filter_inline_formulas_inside_containers 把落在表格/图/图表里的行内公式先滤掉。