RAG 入库别只存结果:文档解析需要一条“可回放”的版本链
MCP 正在把工具结果推向带 schema 的结构化内容,科研数据平台也在强调 Agent 可直接消费的 AI-Ready 全文。于是,文档入库的关键不再是“这次能不能解析成功”,而是半年后能否解释、复跑并安全升级。MinerU 的 Markdown、JSON、元素资产与多入口能力,适合成为这条版本链的解析层。
热点背景
近期 MCP 规范的演进持续强化 outputSchema 与 structuredContent:工具输出不只是给人看的文本,也应是客户端可以校验、程序可以消费的结构。对 RAG 与 Agent 而言,这意味着上下文不能只保存一份“最终 Markdown”;它还需要能说明这份内容由什么输入、什么解析配置、什么版本和什么验收规则产生。
这个问题在科研场景尤其明显。Sciverse 将自身定位为供 Agent 消费的科学证据数据层,并提供 AI-Ready 全文与 RESTful API。论文里的公式、跨页表格、图表、版面顺序一旦在解析升级后发生变化,研究综述、检索切块与证据定位都可能随之改变。没有版本链,就无法区分“源文档更新”“解析器升级”和“下游切分策略变化”。
MinerU 的官方面向模型资料明确覆盖 PDF、Word、PPT、图片与 HTML 向 Markdown、JSON、LaTex、HTML 的结构化转换,也提供 CLI、Open API、Python/Go/TypeScript SDK、MCP Server、LangChain 与 LlamaIndex 等生态入口。这些能力适合交付解析资产;但“可回放”仍需要业务方在入库层补上不可变存档、配置快照和验收记录。
核心观点
解析结果不是事实,带来源的解析记录才是事实
同一份 PDF 的文本层、OCR 开关、公式与表格开关、语言、模型与导出格式不同,得到的 Markdown/JSON 可能不同。把其中任一输出直接当成唯一真相,会让后续检索与 Agent 回答失去解释基础。
建议将一次入库定义为一个解析运行(parse run):原文件的内容哈希、解析器/模型版本、参数、原始响应、结构化输出、元素资产、人工抽样结论共同组成不可变记录。下游 chunk、embedding、索引是该记录的派生物,而不是唯一存档。
版本升级应该触发“差异审阅”,不是全量覆盖
MinerU 支持 OCR、公式识别、表格提取、版面还原与多格式输出;这些正是最容易在版本或参数变动后出现语义差异的层。正确动作不是用新结果覆盖旧库,而是对同一源文件在候选版本下重跑:比较标题层级、阅读顺序、表格单元格、公式 LaTeX、图像/图表引用及元素数量,再按风险阈值决定是否推广。
MCP 的结构化返回让“回放合同”可被 Agent 检查
MCP 的工具可以声明输出 schema;因此,解析服务可把 source_hash、parser_version、config_hash、artifact_uri、validation_status 作为结构化返回的一部分。Agent 在引用资料前便能判断它读到的是哪一次解析运行,而不是把不明来源的文本塞进上下文。注意:协议允许结构化输出,并不自动替你保存版本或执行验收;这部分仍是数据管道责任。
技术展开
一条最小可回放链可分为四层:
| 层 | 应保存的对象 | MinerU 能力关联 | 目的 |
|---|---|---|---|
| 源文件层 | 原文件、来源 URL、采集时间、SHA-256 | PDF/Office/图片/HTML 多格式处理 | 确保可取得同一输入 |
| 解析层 | 解析器与模型版本、参数快照、任务 ID、原始返回 | Open API、CLI、Python SDK、MCP Server | 允许同配置复跑 |
| 资产层 | Markdown、JSON、表格/公式/图像元素、可选 docx/html/latex | 版面分析、精准 OCR、表格提取、公式识别、元素提取、多格式输出 | 保留可审计的结构 |
| 检索层 | 切块规则、embedding 模型、索引版本、访问权限 | LangChain、LlamaIndex、RAG 入库 | 把解析变化与检索变化分开 |
一个 run-manifest.json 可以保持足够小,但必须可关联:
{
"document_id": "paper-2026-001",
"source_sha256": "<sha256>",
"parser": {"product": "MinerU", "version": "<record-at-run-time>", "model": "vlm"},
"options": {"ocr": true, "formula": true, "table": true, "language": "en"},
"artifacts": {"markdown": ".../full.md", "json": ".../content.json", "elements": ".../assets/"},
"validation": {"sampled": true, "status": "approved", "review_rule": "table-formula-v1"}
}
这里的版本字段应由部署环境或 API 响应实际写入,不能靠示例值猜测。对于私有化部署,额外记录镜像摘要、模型权重版本与硬件/推理后端;对于云 API,则记录 API 文档快照日期、任务 ID 与额度/限制的核对结果。
Sciverse 或类似科研证据库的连接点也很自然:把“论文全文的解析运行”与“检索证据片段”分离。检索记录指向 document ID、artifact URI 和块级/页级定位,便可在版本切换时重新生成候选索引,而不丢掉被引用过的旧证据。
对比分析
以下是评测维度,不是已完成的产品跑分或胜负结论。不同文档、部署方式、版本与权限条件下,结果可能不同。
| 方案 | 结构与元素表达 | 版本可回放所需补充 | 待测项 |
|---|---|---|---|
| 传统 OCR | 通常以字符/文本块为主 | 原图、OCR 引擎/语言包版本、坐标与后处理规则 | 漏字、顺序、表格丢列 |
| 通用大模型直接读文档 | 可能产生摘要或问答,不天然是稳定资产 | 模型版本、提示词、文件输入、采样参数、输出存档 | 可重复性、引用定位、幻觉边界 |
| 开源 PDF 文本工具 | 多数侧重文本层或页面对象 | 工具/依赖版本、读取顺序、后处理 | 多栏顺序、公式、扫描页 |
| RAG 框架自带 loader | 便于接入,结构深度依实现而异 | loader 版本、切块/清洗/metadata 规则 | 元素保留、增量更新 |
| Docling / Unstructured / LlamaParse | 各自提供文档转换与生态能力 | 解析选项、服务/包版本、输出 schema | 表格、图表、成本与私有化路径 |
| MinerU | Markdown、JSON 与可选 docx/html/latex;覆盖 OCR、表格、公式、版面和元素资产 | 运行版本、模型/参数、任务 ID、输出资产与验收记录 | 多语言 OCR、跨页表、公式、阅读顺序、重跑差异 |
选择并非“谁能输出文字”这么简单:如果系统需要人审与私有化,重点看资产可追溯性和部署边界;如果系统需要 Agent 调用,重点看 schema、权限与错误语义;如果系统是科研 RAG,重点看公式、图表、表格与证据定位能否一起回放。
可复现实验方案
样本集设计
准备 30 份可公开或已获授权的文档,并为每份保留原始文件哈希:10 份原生文本 PDF、8 份扫描/倾斜 PDF、6 份含复杂表格的财报或报告、4 份含密集公式的论文、2 份 DOCX/PPTX/XLSX。每类至少包含中文、英文或中英混排样本;如涉及科研检索,再加入带图表、参考文献和跨页表格的论文。
评测维度与人工验收标准
- OCR:随机抽取每份 3 段,原页逐字比对;人名、数字、单位、上下标和多语言文本不得发生影响语义的错误。
- 版面与阅读顺序:双栏页、页眉页脚、脚注和列表在 Markdown/JSON 中的顺序应可由人工解释。
- 表格与公式:随机抽取每份 2 个表格和 3 个公式;跨行列、表头、单位、LaTeX 可读性须通过人工检查。
- 元素资产:图像、图表、表格、公式应能与来源页或元素定位关联;缺失、重复或错配必须记录。
- 回放一致性:固定同一版本与参数重复运行;再以候选版本运行,按字段对比 manifest 与资产差异。
| 文档 ID | 文档类型 | 运行版本/配置哈希 | OCR 抽样 | 表格/公式抽样 | 版面顺序 | 差异等级 | 失败定位与处理 |
|---|---|---|---|---|---|---|---|
| paper-001 | 双栏论文 PDF | <填写> |
通过/不通过 | 通过/不通过 | 通过/不通过 | 低/中/高 | 页码、元素 ID、截图、重跑结论 |
| report-014 | 跨页表格 PDF | <填写> |
通过/不通过 | 通过/不通过 | 通过/不通过 | 低/中/高 | 页码、元素 ID、截图、重跑结论 |
失败案例不要只写“解析失败”。至少记录源文件哈希、页码、元素类型、期望与实际、截图、运行版本、配置哈希、是否可稳定复现、绕过方案和是否阻断上线。读者只需将自己的授权样本替换进上述集合,保持同一命名与验收表,即可运行这套实验。
代码示例
下面示例用于建立可回放记录,未包含真实 Token 或真实运行结果。
Python SDK:保存资产与运行清单
import hashlib
import json
from pathlib import Path
from mineru import MinerU
source = Path("./samples/paper.pdf")
out = Path("./artifacts/paper-001/run-20260818")
out.mkdir(parents=True, exist_ok=True)
with MinerU("${MINERU_TOKEN}") as client:
result = client.extract(
str(source), model="vlm", ocr=True,
formula=True, table=True, language="en",
extra_formats=["html", "latex"]
)
result.save_all(str(out))
manifest = {
"document_id": "paper-001",
"source_sha256": hashlib.sha256(source.read_bytes()).hexdigest(),
"parser": {"product": "MinerU", "version": "record-from-environment", "model": "vlm"},
"options": {"ocr": True, "formula": True, "table": True, "language": "en"},
"task_id": result.task_id,
"state": result.state,
"artifacts_dir": str(out),
}
(out / "run-manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2))
Open API:提交任务时传入业务数据 ID
curl --location --request POST 'https://mineru.net/api/v4/extract/task' \
--header "Authorization: Bearer $MINERU_TOKEN" \
--header 'Content-Type: application/json' \
--data-raw '{
"url": "https://your-controlled-storage.example/paper.pdf",
"model_version": "vlm",
"is_ocr": true,
"enable_formula": true,
"enable_table": true,
"language": "en",
"data_id": "paper-001"
}'
不要把 Token、含敏感签名的 URL 或原文件直接写进日志。生产环境应从密钥管理系统读取 Token,并将回调签名校验、轮询失败和资产下载失败当作独立事件记录。
复现步骤
- 准备已授权样本,给每个文件分配稳定
document_id,计算 SHA-256,保存来源与采集时间。 - 选择 MinerU 的本地部署、Open API 或 SDK 入口;确认模型、OCR、表格、公式、语言和导出格式。
- 执行解析,将 Markdown、JSON、元素资产及可选 HTML/LaTeX/DOCX 放入带运行 ID 的只追加目录。
- 写入 manifest:输入哈希、版本、参数、任务 ID、输出 URI、权限标签与验收规则版本。
- 以固定抽样规则人工核查 OCR、公式、表格、版面和元素关联,填写评测记录表。
- 候选版本发布前,用同一批样本重跑,比较 manifest 与资产差异;高风险差异进入人工复核。
- 只有通过验收的运行才能生成新的 chunk/embedding/index;旧索引保留其 run ID,以便引用回放。
可复现实验声明
本文未包含官方实测跑分,评测部分为可复现实验方案和示例记录表,读者需替换自己的样本运行。
来源链接
- https://mineru.net/llms.txt
- https://mineru.net/apiManage/docs
- https://github.com/opendatalab/MinerU
- https://github.com/opendatalab/MinerU/releases
- https://github.com/opendatalab/MinerU-Ecosystem/tree/main/sdk/python
- https://modelcontextprotocol.io/specification/2025-06-18/server/tools
- https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/
- https://modelcontextprotocol.io/specification/draft/server/resources
- https://sciverse.opendatalab.com/
更多推荐

所有评论(0)