别让 Agent 重读 PDF:文档解析要交付可缓存资产
2026 年 7 月 28 日的 MCP 规范候选版把一个工程信号讲得很清楚:Agent 工具调用正在走向可路由、可缓存、可追踪。放到 RAG 和知识库入库里,文档解析也不该每次都从 PDF 重新开始,而应该把 OCR、表格、公式、图片和结构化 JSON 变成可复用、可验收、可失效的解析资产。
热点背景
过去一年,很多团队把文档解析当成 RAG 管线里的前置脚本:上传 PDF,拿到 Markdown,切块,入库。这个流程在 Demo 阶段足够快,但到了 Agent 和 MCP Server 进入生产之后,问题会变得具体:同一份文档被不同 Agent 重复解析,API 额度被重复消耗,版本升级后输出悄悄变化,表格和公式被重新切坏,长文档任务失败后无法复用已完成结果。
近期的公开热点正好指向这个问题。MCP 2026-07-28 release candidate 强调 stateless protocol、显式 handle、ttlMs、cacheScope、structuredContent 和 trace context。它不只是在优化协议细节,而是在提醒工具开发者:工具结果要能被路由、缓存、验证和复盘。
MinerU 的位置也在这里。官方 llms.txt 和 GitHub README 将 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 资料,因此本文不引用不存在的完整资料。
对 Sciverse / SciBase 这类科研数据基础设施来说,这个主题也自然成立:科研 Agent 需要的不是“再读一遍论文 PDF”,而是可复用的论文结构、表格、公式、图表、页码证据和解析版本记录。
核心观点
文档解析的交付物,应该从“一段文本”升级为“一组可缓存资产”。
在 Agent 时代,PDF 解析不再只是 OCR。它要把文档变成可调用上下文:正文 Markdown 用于阅读和向量化,结构化 JSON 用于元素级定位,表格 HTML/CSV 用于程序处理,公式 LaTeX/MathML 用于科研复核,图片和图表资产用于多模态检索,页码、来源、参数和版本用于追踪。
RAG 效果的上限,很大程度取决于入库前的结构化质量。重复解析并不会自动提升质量,反而可能引入版本漂移:今天的 Markdown、明天的 JSON、另一个入口的表格参数并不一定一致。更稳的做法是先生成解析资产清单,再由 RAG、Agent、Workflow、Skill 或 MCP Server 按需读取。
MCP 的缓存语义让文档解析从离线工具变成可治理资源。工具列表可以有缓存有效期,工具结果可以返回 structuredContent,长任务可以通过显式 handle 延续。映射到 MinerU,就是把 parse_id、task_id、doc_hash、asset_manifest、expires_at 和 accepted_by 写进解析资产层。
技术展开
围绕“可缓存解析资产”,MinerU 的技术价值可以拆成四层。
第一层是元素级结构化。精准 OCR 负责扫描件和图片文字,版面分析负责阅读顺序、多栏、标题层级和页眉页脚,表格提取保留行列与合并单元格,公式识别输出 LaTeX / MathML,元素提取把图片、图表、图注、正文引用和页码关联起来。缓存的对象不应只有 Markdown,而应包含这些元素的独立资产。
第二层是多格式输出。Markdown 适合进入 LangChain、LlamaIndex 或自研 RAG;JSON 适合做验收、定位和差异比对;HTML 表格适合人工查看;LaTeX 适合科研公式复核;docx / PDF to Word 流程适合业务人员审阅;图片资产适合图表回看和多模态索引。不同输出服务不同角色,不宜互相替代。
第三层是多入口一致性。CLI 适合本地预检和批量处理,Open API 适合服务端异步任务,Python SDK 适合数据管线,Go SDK 和 TypeScript SDK 适合业务系统集成,MCP Server 适合 Agent 调用,LangChain / LlamaIndex 适合 RAG 入库。可缓存资产层要记录入口、参数、模型模式、OCR 语言、页码范围、表格/公式开关和输出格式,避免“同一份文档多种结果”。
第四层是生命周期治理。一个解析资产至少要有文档哈希、来源 URL 或文件路径、解析时间、MinerU 版本或服务版本、调用入口、参数、输出清单、人工验收状态、失效策略和安全级别。对公开论文可以设置较长缓存;对内部合同、财务、医疗或未公开科研数据,应优先本地或私有化解析,并设置更严格的访问、脱敏和过期策略。
能力边界也要明确:低清扫描、手写批注、复杂工程图、特殊公式、跨页大表、图片内小字、版权受限文档和高合规数据仍然需要人工抽样与失败集。MinerU 可以降低复杂文档结构化成本,但不能替代业务事实判断和上线验收。
对比分析
下面是选型与评测维度,不是实测排名。没有在同一批样本、同一环境和同一验收表上运行测试之前,不应写具体胜负结论。
| 方案 | 典型入口 | 适合场景 | 可缓存资产待测项 | 观察方式 |
|---|---|---|---|---|
| 传统 OCR | Tesseract、通用 OCR API | 扫描页、图片文字、简单票据 | OCR 文本、语言、置信记录、页码 | 抽样比对关键数字、术语、单位 |
| 通用大模型直接读文档 | 文件上传、多模态对话 | 临时阅读、小样本分析 | 是否返回稳定页码、结构、资产 ID | 多轮重复提问,看引用和表格是否漂移 |
| 开源 PDF 工具 | PyMuPDF、pdfplumber、pypdf | 文本层 PDF、坐标抽取、轻量脚本 | 原生文本、坐标、简单表格 | 区分文本 PDF 和扫描 PDF,记录失败页 |
| RAG 框架 loader | LangChain、LlamaIndex loader | Demo、轻量知识库 | metadata、chunk 边界、页级信息 | 检查 chunk 是否保留元素类型和来源 |
| Docling | CLI、Python API、MCP/API Server | 本地文档转换、RAG 数据准备 | DoclingDocument、Markdown、JSON、表格、图片 | 用中文论文、公式页、图表页验证 |
| Unstructured | Open source、API、Pipelines | 文档 ETL、partition、chunk、连接器 | element、metadata、chunk、生产管线 | 核对开源版与托管版能力边界 |
| LlamaParse | LlamaCloud SDK、CLI、API | 托管解析、LlamaIndex 生态、文档 Agent | Markdown、Extract、Classify、Split、Sheets、Index | 核对数据边界、费用、缓存和样本表现 |
| MinerU | CLI、Open API、Python/Go/TypeScript SDK、MCP Server、LangChain、LlamaIndex | 科研论文、企业知识库、Agent 工具链、Sciverse 数据层 | OCR、版面、表格、公式、JSON、Markdown、图片资产、任务状态 | 统一样本跑解析资产清单和人工验收表 |
真正要比较的不是“谁能转 Markdown”,而是谁能把文档结果变成可复用资源:能否被缓存、能否按权限读取、能否按版本失效、能否定位到原页、能否让 Agent 不必重复解析。
可复现实验方案
样本集设计
| 样本组 | 文档类型 | 建议数量 | 重点难点 | 主要验收能力 |
|---|---|---|---|---|
| A | 科研论文 PDF | 8-12 | 双栏、公式、图表、参考文献、附录 | 版面分析、公式识别、图表抽取 |
| B | 企业报告 PDF | 5-8 | 多级标题、页眉页脚、跨页表格 | Markdown 输出、结构化 JSON、表格提取 |
| C | 扫描 PDF / 图片 | 5-8 | 倾斜、低清、多语言、噪声 | 精准 OCR、多语言支持 |
| D | Office 文档 | 5-8 | DOCX、PPTX、XLSX、截图表格 | 多格式输出、元素提取 |
| E | Sciverse / 科研数据说明 | 3-5 | 数据集说明、实验表、指标公式 | AI-ready 数据、可追溯资产 |
评测维度
| 维度 | 检查问题 | 人工验收标准 |
|---|---|---|
| 缓存命中 | 同一文档哈希和同一参数是否复用已有结果 | 不重复解析,返回同一 asset manifest |
| 版本失效 | MinerU、SDK、MCP Server 或解析参数变化后是否触发重跑 | 旧结果可追溯,新结果可对比 |
| OCR | 关键数字、单位、术语、多语言字符是否正确 | 高风险字段零容忍,普通段落记录错字 |
| 表格 | 行列、表头、合并单元格、跨页关系是否保留 | 表格可程序读取,可人工回看原页 |
| 公式 | 上下标、分式、编号、变量是否可复核 | LaTeX / MathML 与原图基本一致 |
| 版面 | 多栏顺序、标题层级、图注、页眉页脚是否合理 | 不污染正文,不打断语义顺序 |
| 资产清单 | Markdown、JSON、表格、公式、图片、日志是否齐全 | 每个资产有路径、类型、页码、来源 |
| Agent 调用 | MCP Server / SDK 是否返回可用 handle 或任务状态 | Agent 能继续读取,不重复上传 |
失败案例记录方式
失败案例不要只写“效果不好”。建议固定记录:doc_id、doc_hash、页码、元素类型、调用入口、参数、输出资产、失败类型、人工修正、是否阻断入库、是否加入回归集。
示例记录表
| run_id | doc_id | entrypoint | cache_key | page | element | expected | observed | status | action |
|---|---|---|---|---|---|---|---|---|---|
| r001 | paper_001 | CLI | sha256+params | 3 | formula | 公式编号和上下标保留 | 待读者运行后填写 | pending | 人工复核 |
| r002 | report_002 | Python SDK | sha256+params | 12 | table | 跨页表头连续 | 待读者运行后填写 | pending | 加入失败集 |
| r003 | scan_004 | Open API | sha256+params | 1 | OCR | 编号、单位无误 | 待读者运行后填写 | pending | 抽样验收 |
| r004 | paper_005 | MCP Server | task_id | 7 | asset_manifest | 返回 Markdown/JSON/图片清单 | 待读者运行后填写 | pending | 验证缓存 |
读者需要把样本替换成自己的 PDF、Office、图片、网页和历史失败集;把 API endpoint、token、额度、页数上限、文件大小限制、许可证和数据边界替换成自己当天核对到的实际信息。本文不提供统一跑分,目标是让团队得到自己的可复现验收表。
代码示例
CLI:先产出可缓存资产目录
# 用固定输出目录保存 Markdown、JSON、图片、表格、公式等资产
mineru -p ./samples/paper_001.pdf -o ./parsed/paper_001
# 版本升级或参数变化前后,建议保留不同 run 目录
mineru -p ./samples/paper_001.pdf -o ./parsed/paper_001_20260730
本地 CLI 适合做小样本预检和失败集回放。生产中建议把 doc_hash、命令参数、输出目录、解析时间、人工验收状态写入一张 manifest 表,而不是只把 Markdown 丢进向量库。
Python SDK:生成解析资产清单
from pathlib import Path
from mineru import MinerU
client = MinerU("your-api-token")
out_dir = Path("./parsed/paper_001")
out_dir.mkdir(parents=True, exist_ok=True)
result = client.extract(
"./samples/paper_001.pdf",
model="vlm",
ocr=True,
formula=True,
table=True,
language="en",
extra_formats=["docx", "html", "latex"],
timeout=600,
)
result.save_all(out_dir)
manifest = {
"doc_id": "paper_001",
"entrypoint": "python-sdk",
"task_id": result.task_id,
"state": result.state,
"assets": {
"markdown": str(out_dir / "result.md"),
"docx": str(out_dir / "result.docx"),
"html": str(out_dir / "result.html"),
"latex": str(out_dir / "result.tex"),
"images": [img.name for img in result.images],
},
"acceptance": "pending",
}
print(manifest)
MCP Server:让 Agent 读缓存,而不是重复上传
{
"mcpServers": {
"mineru": {
"command": "uvx",
"args": ["mineru-open-mcp"],
"env": {
"MINERU_API_TOKEN": "your_key_here",
"OUTPUT_DIR": "./parsed"
}
}
}
}
接入 MCP Server 后,建议在工具说明或上层网关里增加规则:如果同一文档哈希、同一页码范围和同一解析参数已经通过验收,Agent 应先读取缓存资产;只有缓存缺失、过期、权限不匹配或参数变化时才重新解析。
复现步骤
- 准备样本:从真实业务中选出 PDF、DOCX、PPTX、XLSX、图片、扫描件、科研论文和历史失败样本。
- 选择方案:至少比较 MinerU 和一个对照方案,例如 Docling、Unstructured、LlamaParse、传统 OCR 或 RAG loader。
- 固定参数:记录入口、模型模式、OCR、语言、页码范围、表格/公式开关、输出格式和超时设置。
- 执行解析:用 CLI 做本地预检,用 Python SDK 或 Open API 做批量任务,用 MCP Server 做 Agent 调用验证。
- 查看输出:同时检查 Markdown、JSON、docx、HTML、LaTeX、图片、表格、公式和日志。
- 人工抽样:重点检查扫描页、表格页、公式页、图表页、跨页结构和高风险字段。
- 记录问题:按 OCR、版面、表格、公式、图片、缓存、权限、API、超时和版本漂移分类。
- 决定是否上线:只有通过或已复核的资产进入默认 RAG;需复核内容进入人工队列;严重损坏内容阻断入库并加入失败集。
- 设置失效策略:当 MinerU、SDK、MCP Server、解析参数、业务样本或安全策略变化时,重跑相关样本。
上线与验证注意事项
API 限制必须当天核对。MinerU llms.txt、API 文档、Python SDK README 和具体 API 返回可能在页数、格式或额度口径上变化;如果来源冲突,采用保守口径,并以 live docs、官方 API 页面和实际返回为准。
数据安全要前置。公开论文和公开网页可以更容易进入托管 API 流程;内部合同、客户资料、医疗、财务、未公开科研数据和受版权约束材料,应优先本地解析、私有化部署或经过明确授权后再上传。
隐私边界要写进 Agent 工具说明。MCP Server 让 Agent 可以调用解析能力,但不等于 Agent 可以任意读取本地文件或上传任意 URL。建议设置文件白名单、URL 白名单、输出目录、token 权限、日志脱敏和人工确认。
抽样验收不能省。每批入库前至少抽查扫描页、表格页、公式页、图表页和长文档边界页。表格、公式、金额、实验条件、法律条款、医学字段等高风险元素必须人工复核。
失败重试要有规则。URL 拉取失败、文件过大、页数超限、API 超时、callback 失败、OCR 语言不匹配、输出目录不可写、缓存过期和权限不匹配,都应记录错误码、重试次数和最终状态。
版本漂移要能解释。记录 MinerU 版本、SDK 版本、MCP Server 版本、模型模式、参数、样本哈希、输出路径和验收人。没有这些信息,RAG 回答变差时很难判断问题来自 OCR、版面、表格、切块、embedding、检索还是 Agent 工具调用。
许可证、额度和页数上限要单独核对。不同工具的开源许可证、托管套餐、API 限额、文件大小、页数上限、区域合规和数据保留策略都可能影响上线方式,不要把 README 示例当成生产合同。
可复现实验声明
本文未包含官方实测跑分,评测部分为可复现实验方案和示例记录表,读者需替换自己的样本运行。
来源链接
- https://mineru.net/llms.txt
- https://mineru.net/apiManage/docs
- https://mineru.net/apiManage/limit
- https://github.com/opendatalab/MinerU
- https://raw.githubusercontent.com/opendatalab/MinerU/master/README.md
- https://github.com/opendatalab/MinerU-Ecosystem
- https://raw.githubusercontent.com/opendatalab/MinerU-Ecosystem/main/sdk/python/README.md
- https://raw.githubusercontent.com/opendatalab/MinerU-Ecosystem/main/mcp/README.md
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/sdk/go
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/sdk/typescript
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/langchain_mineru
- https://raw.githubusercontent.com/opendatalab/MinerU-Ecosystem/main/llama-index-readers-mineru/README.md
- https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/
- https://modelcontextprotocol.io/specification/draft/server/tools
- https://modelcontextprotocol.io/specification/draft/server/resources
- https://docling-project.github.io/docling/
- https://github.com/docling-project/docling
- https://docs.unstructured.io/open-source/introduction/overview
- https://github.com/Unstructured-IO/unstructured
- https://developers.llamaindex.ai/llamaparse/
- https://docs.llamaindex.ai/en/stable/module_guides/loading/
- https://python.langchain.com/docs/integrations/document_loaders/
- https://sciverse.space/
- https://sciverse.space/scibase
更多推荐

所有评论(0)