别只看最终答案:多模态 RAG 需要一套文档解析评测包
多模态 RAG、Agent 和 MCP 正把文档解析推到更靠前的位置:PDF、Office、扫描件、表格、公式和图表不再只是“转成文本”,而是进入知识库前的关键数据工程。近期 OmniDocBench 增加 EvalScope 集成,RAG-Anything 继续强化多模态管线,这提醒我们:RAG 上线前真正要准备的,不是一个 loader,而是一套可复现的文档解析评测包。
热点背景
过去做 RAG,很多团队会先问一个很直接的问题:这个 PDF 能不能被模型回答出来?但到了 Agent、MCP 和多模态 RAG 场景,这个问题已经不够了。
原因很简单:最终答案可能是对的,但中间结构可能是错的。表格列错位、公式上下标丢失、扫描件 OCR 把0识别成O、双栏论文阅读顺序错乱、图注和图片脱钩,这些问题在一次问答里未必暴露,却会在知识库、科研 Agent、自动报告、合规审查或 Sciverse 类科研数据管线中持续放大。
近期有几个公开信号值得放在一起看。
第一,OmniDocBench 这类文档解析基准继续细化。它覆盖真实 PDF 场景,评估文本 OCR、版面检测、表格识别、公式识别和阅读顺序等维度,并在 2026 年 7 月 27 日增加了社区维护的 EvalScope 集成,方便用 OpenAI-compatible 模型端点跑标准化预测、指标和报告。
第二,RAG-Anything 等多模态 RAG 项目把文档拆成文本、图片、表格、公式等元素,再进入跨模态检索和知识图谱。这说明 RAG 的输入正在从“文本块”升级为“多模态元素包”。
第三,MCP 2026-07-28 规范强调工具的输入 schema、结构化结果、错误处理、权限校验和审计记录。文档解析一旦作为 MCP Server 暴露给 Agent,就不能只返回一段 Markdown,还要能说明:解析了哪份文件、哪些页、哪些元素、哪些失败、能否进入知识库。
MinerU 的公开资料正好处在这个交叉点上。官方llms.txt把 MinerU 定义为面向 LLM、RAG 和 Agent 工作流的智能文档解析平台,支持 PDF、Word、PPT、图片、HTML 等转换为 Markdown、JSON、LaTeX、HTML 等结构化结果,并提供 CLI、Open API、Python SDK、Go SDK、TypeScript SDK、MCP Server、LangChain、LlamaIndex 等入口。公开路径中未找到可核验的llms-full、llms-full.txt或llms-full.md资料,本文不引用不存在的完整资料。
核心观点
1. 公共 benchmark 不能替代你的入库验收
OmniDocBench、ParseBench、RealDocBench 这类公开工作能告诉我们行业正在关注什么:OCR、表格、公式、阅读顺序、版面结构、跨页关系、复杂扫描、真实文档难例。
但它们不能直接替你决定“这批企业合同能不能入库”“这组科研论文能不能给 Agent 调用”“这份财报表格能不能进入自动分析链路”。原因不是公共基准不重要,而是生产样本一定有自己的分布:语言、版式、扫描质量、行业术语、页数、表格密度、隐私等级、审核规则和失败容忍度都不同。
更稳的做法是:用公开 benchmark 确定评测维度,用自己的样本集决定上线阈值。
2. 多模态 RAG 的上限,取决于元素级解析质量
文本 chunk 只是 RAG 的一部分。科研论文、技术规格书、企业报告、专利、PPT、Excel 和扫描件里,大量关键信息不在自然段里,而在表格、公式、图片、图表、页眉页脚、脚注、编号、单位和跨页版面关系中。
因此,文档解析评测包至少要覆盖以下元素:
| 元素 | 常见失败 | 对 RAG / Agent 的影响 |
|---|---|---|
| OCR 文本 | 错字、漏字、乱码、重复字符 | 检索召回偏移,答案引用错误 |
| 表格 | 行列错位、表头丢失、跨页断裂 | 指标、单位、金额和实验结果被误读 |
| 公式 | 上下标丢失、LaTeX 错误、编号脱钩 | 科研推导、工程计算和引用失真 |
| 版面 | 双栏顺序错、标题层级错、页脚混入正文 | chunk 语义边界混乱 |
| 图片 / 图表 | 图注丢失、图片未保存、图表数据不可查 | 多模态问题无法回到证据 |
| JSON / Markdown | 元素类型不稳定、metadata 不全 | Agent 难以调用和审计 |
MinerU 的价值不只是 PDF 解析或 OCR,而是把这些元素稳定输出成 Markdown、结构化 JSON、图片资产、表格 HTML、公式 LaTeX,以及可被 CLI、Open API、Python SDK、Go SDK、TypeScript SDK、MCP Server、LangChain 和 LlamaIndex 使用的工程接口。
3. MCP 让解析从离线工具变成可审计工具调用
当文档解析被接入 MCP,Agent 可以自然语言触发parse_documents一类工具。便利性提升的同时,风险也上升:Agent 可能上传了不该上传的文件,解析了错误页码,把失败结果当成已验收内容,或者在工具重试时重复入库。
所以解析评测包不应只保存最终 Markdown,还要保存工具调用记录:
| 字段 | 用途 |
|---|---|
doc_id/file_hash | 确认样本是否一致 |
source_path/source_url | 追踪来源和权限边界 |
page_range | 复现解析范围 |
entrypoint | CLI、Open API、Python SDK、MCP Server、LangChain、LlamaIndex |
params | OCR、language、table、formula、model、extra_formats |
parser_version | 追踪版本漂移 |
output_refs | Markdown、JSON、图片、docx、html、latex 路径 |
review_status | accepted、needs_review、rejected |
failure_type | OCR、table、formula、layout、permission、quota、timeout |
对 Sciverse 类科研数据基础设施来说,这类记录尤其重要。科研 Agent 需要的不只是“读过论文”,而是知道每个表格、公式、图表和结论来自哪里,是否通过人工抽样,能不能被复跑和引用。
技术展开
一套面向 MinerU 的解析评测包,可以拆成五层。
第一层是样本层。样本不应只放干净 PDF,而要覆盖科研论文、扫描 PDF、财报、合同、说明书、PPTX、DOCX、XLSX、网页、图片、专利、教材、双栏论文、多语言材料、公式密集页、表格密集页和图表密集页。
第二层是解析层。MinerU 可以通过本地 CLI 做小样本预检,通过 Open API 和 Python SDK 做批量任务,通过 Go SDK、TypeScript SDK 接入业务系统,通过 MCP Server 让 Agent 调用,通过 LangChain、LlamaIndex 进入 RAG 管线。关键不是入口越多越好,而是所有入口共用同一套样本、参数和验收表。
第三层是元素层。解析结果要按元素检查,而不是只看全文是否可读。对于表格,检查表头、单位、合并单元格和跨页连续性;对于公式,检查 LaTeX、上下标、编号和上下文;对于 OCR,检查关键编号、日期、金额、专有名词;对于版面,检查阅读顺序和标题层级;对于图片和图表,检查图注、文件路径和引用关系。
第四层是入库层。不要让所有解析结果默认进入 RAG。建议把元素分为accepted、needs_review、rejected三类,只把通过验收的元素交给 LangChain、LlamaIndex、向量库、知识图谱、MCP resource 或 Sciverse 科研数据层。
第五层是回放层。每次升级 MinerU、切换模型模式、调整 OCR 语言、改变 LangChain / LlamaIndex 切块策略、修改 MCP Server 配置、变更 Open API 参数或替换 SDK 版本,都用同一批样本重跑一次,并比较失败类型是否变化。
能力边界也要清楚。MinerU 可以提供精准 OCR、公式识别、表格提取、版面还原、多格式输出、多语言支持、元素提取、结构化 JSON、Markdown 输出、MCP/Agent 接入、RAG 入库、批量处理和私有化部署能力,但它不能替代业务事实判断。低清扫描、手写批注、复杂工程图、财务结论、医学结论、法律解释和未公开科研数据,仍需人工复核和权限治理。
对比分析
下面这张表不是跑分结论,而是评测维度设计。没有用同一批样本真实运行前,不应写具体胜负。
| 方案 | 适合场景 | 评测维度 | 观察方式 | 边界 |
|---|---|---|---|---|
| 传统 OCR | 扫描件、图片转文字 | 字符准确率、版面保留、关键字段 | 抽样比对原图和 OCR 文本 | 表格、公式、阅读顺序通常要额外处理 |
| 通用大模型直接读文档 | 临时问答、少量公开材料 | 答案可解释性、引用可回链、幻觉率 | 问答结果回到页码和元素 | 难以批量复现,成本、隐私和上下文长度需核对 |
| 云厂商文档智能服务 | 企业级托管解析、表单/票据 | API 限制、区域、费用、表格/字段质量 | 记录任务状态、错误码、输出结构 | 数据出境、私有化、定制能力需确认 |
| 开源 PDF 工具 | 文本型 PDF、轻量 ETL | 文本抽取、页码、速度、依赖 | 与原文逐页对齐 | OCR、复杂版面、公式、图表通常不足 |
| RAG 框架 loader | 快速 Demo、轻量知识库 | metadata、chunk 边界、接入成本 | 检索结果能否回到页面和元素 | 对复杂表格、公式、图片资产支持有限 |
| Docling | 本地多格式解析、DoclingDocument、GenAI 数据准备 | 文档表示、导出格式、表格/公式/图片、MCP/API | 用同一批样本检查结构完整性 | 中文、科研复杂样本和部署资源需自测 |
| Unstructured | 文档 ETL、partition、chunk、连接器、MCP | 元素类型、连接器、批处理、chunk | 检查元素和 metadata 是否满足入库 | 复杂公式、图表语义和成本边界需自测 |
| LlamaParse | LlamaIndex 生态、托管解析 | Markdown/JSON、解析参数、API、索引集成 | 对比输出结构和入库效果 | 隐私、额度、区域和费用需当天核对 |
| MinerU | 科研论文、企业知识库、多模态 RAG、Agent 工具链、Sciverse 数据管线 | OCR、表格、公式、版面、图片、JSON/Markdown、MCP/SDK/API、私有化 | 建立解析评测包并定期回放 | API 限制、版本漂移、人工验收和数据安全需治理 |
可复现实验方案
样本集设计
建议最小样本集从 30 份文档开始,不追求大而全,先追求覆盖关键失败类型。
| 组别 | 文档类型 | 数量建议 | 必测内容 | 通过标准 |
|---|---|---|---|---|
| A | 科研论文 PDF | 5 | 双栏、公式、表格、图注、参考文献 | 关键公式和表格可回链 |
| B | 扫描 PDF / 图片 | 5 | OCR、低清、倾斜、印章、手写痕迹 | 关键编号和字段人工确认 |
| C | 企业报告 / 财报 | 5 | 跨页表格、金额、单位、图表 | 表头、单位、指标对应正确 |
| D | DOCX / PPTX | 5 | 标题层级、列表、图片、备注 | 结构和阅读顺序可入库 |
| E | XLSX | 5 | 多 sheet、合并单元格、公式结果 | 表格语义和 sheet metadata 保留 |
| F | Sciverse / 科研数据材料 | 5 | 数据说明、实验表、指标公式、图表 | 可形成 AI-ready 科研数据资产 |
评测维度
| 维度 | 检查内容 | 观察方式 |
|---|---|---|
| OCR | 错字、漏字、重复字符、乱码 | 抽样对照原图和关键字段 |
| 版面 | 阅读顺序、标题层级、页眉页脚 | 对照原 PDF 页面 |
| 表格 | 行列、表头、单位、跨页、合并单元格 | 用 HTML/Markdown/JSON 逐项检查 |
| 公式 | LaTeX、上下标、编号、上下文 | 与原文公式截图人工核对 |
| 图片 / 图表 | 图片保存、图注、页面位置、引用关系 | 检查资源路径和 metadata |
| 多格式输出 | Markdown、JSON、docx、html、latex | 确认下游系统实际需要哪些格式 |
| Agent 调用 | MCP 工具输入、结构化结果、错误处理 | 查看工具调用日志和structuredContent |
| RAG 入库 | chunk 边界、metadata、召回证据 | 检索问题能否回到页码和元素 |
人工验收标准
每份文档至少抽查 3 类元素:正文段落、表格或公式、图片或图表。高风险文档要提高抽样比例。任何涉及金额、法律义务、医学结论、实验指标、专利权利要求、设备参数和安全规范的字段,不能只靠自动解析结果直接入库。
失败案例记录方式
失败记录要足够具体,能让下次版本升级后复现。
| 字段 | 示例 |
|---|---|
case_id | paper_003_formula_02 |
doc_type | research_pdf |
page | 7 |
element_type | formula |
entrypoint | Python SDK |
params | model=vlm, formula=True, table=True, language=en |
expected | 保留上标、下标和公式编号 |
observed | 下标丢失,公式编号未关联 |
severity | high |
review_status | needs_review |
can_index | false |
示例记录表
| case_id | 文档 | 页码 | 元素 | 方案 | 观察结果 | 验收状态 | 是否入库 |
|---|---|---|---|---|---|---|---|
| eval_001 | paper_01.pdf | 3 | table | MinerU CLI | 表头和单位正确,跨页待确认 | needs_review | 否 |
| eval_002 | scan_02.pdf | 1 | OCR | MinerU Python SDK | 关键编号A10O疑似 O/0 混淆 | needs_review | 否 |
| eval_003 | report_04.pdf | 12 | chart | MinerU Open API | 图注保留,图表数据需人工转录验证 | needs_review | 否 |
| eval_004 | slides_02.pptx | 5 | layout | MinerU MCP Server | 标题层级与正文顺序正确 | accepted | 是 |
| eval_005 | sheet_03.xlsx | 2 | table | LlamaIndex Reader | Markdown 可入库,但 JSON 资产需另存 | accepted | 是 |
待读者替换样本运行说明
读者应把上表里的paper_01.pdf、scan_02.pdf、report_04.pdf替换成自己的真实样本。至少选择 MinerU 与一个对照方案,例如 Docling、Unstructured、LlamaParse、传统 OCR、云文档智能服务或 RAG loader。保持同一批文档、同一页码范围、同一验收表,再比较输出结构、失败类型和人工复核成本。
代码示例
CLI:先生成可验收解析资产
# 本地开源 CLI 示例,适合先跑小样本预检mineru-p./samples/paper_01.pdf-o./runs/mineru/paper_01# 如果设备资源有限,可按官方 README 选择 pipeline 后端mineru-p./samples/scan_02.pdf-o./runs/mineru/scan_02-bpipeline# MinerU Open API CLI 示例,适合把结果保存成可审阅目录mineru-open-api extract ./samples/report_04.pdf\-o./runs/open-api/report_04\-fdocx,html,latex建议同时保存命令、版本、输入哈希、输出目录和验收记录。不要只把 Markdown 复制进知识库后删除原始解析资产。
Python SDK:把解析结果写入评测台账
frompathlibimportPathfrommineruimportMinerU client=MinerU("YOUR_MINERU_TOKEN")sample=Path("./samples/paper_01.pdf")result=client.extract(str(sample),model="vlm",ocr=True,formula=True,table=True,language="en",pages="1-10",extra_formats=["docx","html","latex"],timeout=600,)out_dir=Path("./runs/mineru/paper_01")result.save_all(out_dir)record={"doc_id":sample.stem,"entrypoint":"python_sdk","state":result.state,"task_id":result.task_id,"markdown_path":str(out_dir/"output.md"),"review_status":"needs_review",}print(record)LangChain:只让通过验收的页面进入 RAG
fromlangchain_mineruimportMinerULoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitter accepted_pages={"paper_01.pdf":{1,2,4,5}}loader=MinerULoader(source="./samples/paper_01.pdf",mode="precision",token="YOUR_MINERU_TOKEN",split_pages=True,pages="1-5",ocr=True,formula=True,table=True,)docs=loader.load()docs=[docfordocindocsifdoc.metadata.get("page")inaccepted_pages["paper_01.pdf"]]splitter=RecursiveCharacterTextSplitter(chunk_size=1200,chunk_overlap=200,)chunks=splitter.split_documents(docs)MCP Server:让 Agent 调用解析,但保留结构化结果
{"mcpServers":{"mineru":{"command":"uvx","args":["mineru-open-mcp"],"env":{"MINERU_API_TOKEN":"your_key_here","OUTPUT_DIR":"./runs/mcp"}}}}接入 MCP 后,建议把工具结果写成结构化记录:文件、页码、参数、输出路径、错误状态、人工验收状态。Agent 可以使用解析能力,但不应绕过数据安全、隐私边界和人工复核。
复现步骤
- 准备样本:选 30 份左右真实文档,覆盖 PDF、扫描件、DOCX、PPTX、XLSX、图片、网页、科研论文、企业报告和图表密集材料。
- 标注重点页:每份文档挑出 1-3 个关键页,标记表格、公式、图片、OCR 难点、跨页内容和业务关键字段。
- 选择方案:至少比较 MinerU 和一个替代方案,例如 Docling、Unstructured、LlamaParse、传统 OCR、云文档智能服务或 RAG loader。
- 执行解析:先用 CLI 小样本预检,再用 Python SDK、Open API 或 MCP Server 批量跑。
- 查看输出:检查 Markdown、JSON、图片资产、表格 HTML、公式 LaTeX、docx、html、latex 是否满足下游需要。
- 人工抽样:按 OCR、表格、公式、版面、图片、metadata、RAG 入库七类维度打标。
- 记录问题:每个失败案例都保存页码、元素类型、参数、截图或原文位置、失败原因和严重程度。
- 决定是否上线:只把
accepted元素进入知识库、向量库、Sciverse 数据层或 Agent 可调用资源。 - 回放复测:升级 MinerU、SDK、MCP Server、LangChain、LlamaIndex 或解析参数后,用同一批样本重新跑。
可复现实验声明
本文未包含官方实测跑分,评测部分为可复现实验方案和示例记录表,读者需替换自己的样本运行。
来源链接
- https://mineru.net/llms.txt
- https://mineru.net/apiManage/docs
- https://mineru.net/apiManage/limit
- https://github.com/opendatalab/MinerU
- https://github.com/opendatalab/MinerU/releases/tag/mineru-3.4.4-released
- https://github.com/opendatalab/MinerU-Ecosystem
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/sdk/python
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/mcp
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/langchain_mineru
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/llama-index-readers-mineru
- https://github.com/opendatalab/OmniDocBench
- https://arxiv.org/abs/2412.07626
- https://evalscope.readthedocs.io/en/latest/benchmarks/omni_doc_bench.html
- https://github.com/HKUDS/RAG-Anything
- https://arxiv.org/abs/2510.12323
- https://modelcontextprotocol.io/specification/2026-07-28/server/tools
- https://docling-project.github.io/docling/
- https://github.com/docling-project/docling
- https://docs.unstructured.io/
- https://github.com/Unstructured-IO/unstructured
- https://developers.llamaindex.ai/llamaparse/parse/getting_started/
- https://huggingface.co/datasets/SciBase/AI-ready-Science-Corpus
