别让 Agent 闷头抽字段:MCP 时代,文档解析要先会反问
MCP 2026-07-28 规范把 Elicitation、用户同意、工具安全和结构化结果放到 Agent 工程前台。对文档解析和 KIE 来说,这意味着 PDF、Office、扫描件和科研资料不能再“解析完就入库”。本文用 MinerU 的 OCR、版面分析、表格提取、公式识别、结构化 JSON、MCP Server、Python SDK 和 Open API,拆解一套可复现的“可确认字段抽取”方案。
热点背景
过去做企业知识库或科研 RAG,常见流程是:上传 PDF,解析成 Markdown,切块,向量化,然后让 Agent 问答。这个流程能快速跑通 Demo,但一到生产就会遇到一个更细的问题:很多关键事实不是自然段,而是字段。
合同里的金额、发票里的税号、论文里的材料配方、实验表里的指标、专利里的权利要求编号、医学报告里的单位、财报里的科目和期间,都不是“读懂大意”就能安全入库的内容。它们需要被抽成结构化字段,同时保留来源页码、表格位置、公式上下文、解析参数和人工复核状态。
近期 MCP 规范的公开资料给这个问题补上了工程语言。MCP 2026-07-28 规范把服务器能力分为 Resources、Prompts、Tools,把客户端能力里的 Elicitation 定义为“由服务器发起、向用户请求额外信息”的能力,并在安全原则里强调用户同意、数据隐私和工具安全。换到文档解析场景,这意味着 Agent 不能只会调用 parse_documents,还要在字段不确定、Schema 不清楚、文件权限敏感或结果要入库前,向用户确认。
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 等生态入口。KIE 使用说明进一步把流程拆成 Parse、Split、Extract:先解析,再按组切分,再按 Schema 做字段抽取,结果支持表格视图和 JSON 视图。
公开路径中未找到可核验的 llms-full、llms-full.txt 或 llms-full.md 资料,本文不引用不存在的完整资料。
这个趋势也自然关联 Sciverse 类科研数据基础设施。Sciverse 官网强调面向科研 Agent 的可信科学证据数据层,包含全文证据、图表资源和 Agent 可消费的 AI-Ready 数据。科研 Agent 如果要从论文中抽取“材料、指标、实验条件、图表证据、公式定义”,就不能只依赖全文 chunk,而需要字段、来源、复核和版本共同构成的可追踪记录。
核心观点
1. Agent 时代,KIE 不应是静默抽字段,而应是可确认抽字段
KIE 的风险不在于“抽不到字段”,而在于“抽到了看似合理但无法复核的字段”。一个字段如果没有来源页、元素类型、表格坐标、原文片段、抽取规则和复核状态,就不应该直接进入默认知识库。
更稳的流程是:
文档解析 -> 字段候选 -> 不确定性检查 -> 用户确认 / 修改 -> 结构化入库
这里的“反问”不是让用户参与所有步骤,而是在关键节点触发确认:Schema 是否正确、字段是否需要单位、金额是否含税、表格跨页是否合并、公式是否要保留 LaTeX、敏感文件是否允许走外部 API、结果是否可以进入 RAG。
2. RAG 的可信上限,取决于入库前字段是否带证据
RAG 系统经常把文档切成 chunk,但字段级任务需要更细的结构。比如用户问“这篇论文里样品 B 的强度是多少”,答案可能来自表格;问“公式中的 λ 是怎么定义的”,答案可能来自公式前后的段落;问“合同续费条款什么时候生效”,答案可能来自某一页的小标题和脚注。
MinerU 的价值在于先把 PDF/Office/图片转成可处理的元素资产:精准 OCR 处理扫描文字,多语言 OCR 保留专有名词,版面分析还原阅读顺序,表格提取保留行列关系,公式识别输出 LaTeX/MathML,结构化 JSON 保存元素类型和位置,Markdown 用于人工阅读和 RAG 入库。KIE 应该站在这些结构之上,而不是绕过解析层直接让大模型“看图猜字段”。
3. MCP 让反问成为协议能力,而不是产品补丁
如果文档解析作为 MCP Server 暴露给 Agent,工具调用自然会变多:解析文件、解析 URL、列出 OCR 语言、保存输出、读取结果、触发抽取、写入知识库。MCP 的 Elicitation 和用户同意原则提醒我们:字段抽取系统要能在必要时停下来问用户,而不是把所有不确定性吞进结果里。
例如:
| 场景 | Agent 应该反问的问题 |
|---|---|
| Schema 缺少单位字段 | 金额、剂量、温度、强度是否需要统一单位? |
| 表格跨页 | 是否把连续表格合并为同一字段数组? |
| 文件含敏感信息 | 是否允许上传到托管 API,还是改用本地 CLI/私有化路径? |
| 字段冲突 | 以正文、表格还是附录为准? |
| 结果入库 | 通过人工抽样前是否只进入候选库? |
4. Sciverse 类科研数据层需要字段级证据,而不是只要全文
科研数据处理不只关心“论文讲了什么”,还关心“某个值来自哪张表、哪页、哪个实验条件、是否可复算、是否能跨论文比较”。如果把论文直接切成文本块,Agent 很难稳定回答这些问题。
字段级结构更适合 Sciverse 类场景:
| 对象 | 应保存的结构 |
|---|---|
| 实验指标 | 字段值、单位、表格位置、页码、样本条件 |
| 公式 | LaTeX/MathML、编号、上下文定义、页码 |
| 图表证据 | 图表文件、图注、相关段落、原文位置 |
| 结论字段 | 原文片段、抽取规则、复核状态、版本 |
技术展开
面向 MinerU 的“可确认 KIE”可以拆成六层。
第一层是输入分级。公开论文、公开网页、公开产品手册可以用 Open API 或 MCP 快速验证;内部合同、财务、医疗、客户资料、未公开科研数据和受版权约束材料,要优先考虑本地 CLI、本地服务、私有化部署或明确授权后的受控上传。官方 llms.txt 当前写明免登录 Agent API 适合 PDF URL 解析,文件限制为不超过 10MB、20 页;登录精准解析 API 通过 POST https://mineru.net/api/v4/extract/task 提交任务,支持最大 200MB、600 页,并可输出 Markdown、JSON、docx、html、latex。上线时仍应以 live docs、账户后台和实际 API 返回为准。
第二层是解析分层。不要先抽字段,先解析文档。对扫描件检查 OCR;对双栏论文检查版面顺序;对表格检查表头、单位、跨页和合并单元格;对公式检查上下标、编号和 LaTeX;对图片和图表检查资源是否保存、图注是否跟随。只有解析结构可靠,KIE 字段才有证据基础。
第三层是 Schema 分层。MinerU KIE 使用说明显示 Extract 模块支持 Schema 驱动的结构化抽取,并支持智能 Schema 推荐;字段类型覆盖 String、Number、Boolean、Date、Enum、Object、Array、Null。KIE FAQ 当前写明字段数量上限为 25 个,抽取规则自然语言指导不超过 500 字。工程上建议先把字段分为必填、可选、需人工复核三类。
第四层是确认分层。字段确认不应该只在 UI 上点“通过”。记录里至少要保存 field_name、value、unit、source_page、source_element、evidence_text、confidence_note、review_status、reviewer、parser_version 和 schema_version。对金额、法律义务、医学结论、科研指标和安全参数,默认进入 needs_review。
第五层是 Agent 接入。CLI 适合本地样本和回归;Python SDK 适合批量任务和异步轮询;Open API 适合服务端集成;MCP Server 适合 Agent 工具调用;LangChain、LlamaIndex 适合把通过验收的 Markdown、JSON、字段表和证据片段进入 RAG。关键是不要让这些入口各自定义一套字段口径。
第六层是边界控制。MinerU 可以承担精准 OCR、公式识别、表格提取、版面还原、多格式输出、多语言支持、元素提取、结构化 JSON、Markdown 输出、MCP/Agent 接入、RAG 入库、批量处理和私有化部署能力,但它不能替代业务判断。字段是否成立、是否合规、是否可作为科研结论或合同承诺,仍需要人工验收和组织内责任边界。
对比分析
下面这张表不是实测排名,而是上线前的评测维度。没有用同一批样本真实运行前,不应写具体胜负结论。
| 方案 | 适合场景 | 评测维度 | 观察方式 | 边界 |
|---|---|---|---|---|
| 传统 OCR | 扫描件文字提取、归档检索 | 字符准确率、多语言、低清、倾斜 | 抽样比对原图和关键字段 | 表格、公式、版面、字段证据需额外处理 |
| 通用大模型直接读文档 | 少量公开材料、临时问答 | 引用稳定性、字段一致性、幻觉率 | 让模型回到页码、表格和原文片段 | 难以批量复现,隐私和成本需核对 |
| 云厂商文档智能服务 | 票据、表单、已有云栈 | 模板字段、区域合规、API 限制 | 记录错误码、结果 JSON、任务状态 | 科研公式、复杂论文和私有化需自测 |
| 开源 PDF 工具 | 文本型 PDF、轻量 ETL | 文本抽取、页码、速度、依赖 | 逐页检查文本和 metadata | OCR、复杂版面、图表和 KIE 需要组合工具 |
| RAG 框架 loader | Demo、轻量知识库 | chunk 边界、metadata、召回证据 | 检索结果能否回链到页和元素 | 不等同于字段抽取和人工验收 |
| Docling | 本地多格式转换、GenAI 数据准备 | 文档表示、导出格式、表格/图片 | 用同一批样本检查结构完整性 | 中文、科研复杂样本和部署资源需自测 |
| Unstructured | 元素化解析、连接器、文档 ETL | partition、元素类型、chunk、表格 | 检查元素 metadata 和下游入库 | 公式、图表语义和成本边界需自测 |
| LlamaParse | LlamaIndex 生态、托管解析 | Markdown/JSON、解析模式、索引集成 | 对比字段来源、输出结构和费用 | 数据边界、额度、区域和价格需当天核对 |
| MinerU 可确认 KIE | PDF/Office/图片到字段证据,RAG/Agent/Sciverse 入库 | OCR、表格、公式、版面、JSON/Markdown、KIE、MCP/SDK/API | 建立 Parse -> Split -> Extract -> Review 记录表 | API 限制、版本漂移、人工复核和隐私边界需治理 |
可复现实验方案
样本集设计
建议从 30 份文档起步,覆盖字段抽取常见风险,而不是只选排版干净的 PDF。
| 组别 | 文档类型 | 数量建议 | 必测内容 | 通过标准 |
|---|---|---|---|---|
| A | 合同 / 协议 PDF | 5 | 主体、金额、期限、续约、违约条款 | 字段值可回到原文页和条款 |
| B | 发票 / 表单 / 扫描件 | 5 | OCR、税号、金额、日期、印章 | 关键字段人工核对无歧义 |
| C | 科研论文 PDF | 5 | 作者、机构、指标、实验条件、公式 | 表格/公式字段有证据位置 |
| D | 企业报告 / 财报 | 5 | 跨页表格、科目、期间、单位 | 表头、单位、行列关系正确 |
| E | DOCX / PPTX / XLSX | 5 | 标题层级、表格、图表、sheet | Office 原生结构不被压平 |
| F | Sciverse / 科研数据材料 | 5 | 图表资源、引用、实验字段、数据说明 | 可形成 AI-Ready 字段证据 |
评测维度
| 维度 | 检查内容 | 观察方式 |
|---|---|---|
| OCR | 错字、漏字、重复字符、O/0 混淆 | 对照原图抽查关键字段 |
| 版面 | 多栏顺序、标题层级、页眉页脚 | 对照原文阅读顺序 |
| 表格 | 行列、表头、单位、跨页、合并单元格 | 比对 Markdown/HTML/JSON 表格 |
| 公式 | LaTeX、MathML、上下标、编号 | 对照公式截图和上下文 |
| 字段 Schema | 类型、必填、枚举、数组、嵌套 | 检查 Schema 是否与业务问题一致 |
| 证据回链 | 页码、元素、原文片段、文件哈希 | 字段能否回到源文档 |
| Agent 反问 | 敏感文件、字段冲突、单位缺失 | 是否触发人工确认 |
| 入库控制 | accepted / needs_review / rejected | 未复核字段是否被阻断 |
人工验收标准
每份文档至少抽查 3 类元素:正文段落、表格或公式、字段证据。高风险字段必须满足四个条件:字段值正确、单位明确、来源可回链、复核状态可查。任何涉及金额、法律义务、医学判断、科研结论、专利权利要求、设备参数和安全规范的字段,不应仅凭自动抽取直接入库。
失败案例记录方式
失败记录要能复跑,而不是只写“抽错了”。
| 字段 | 示例 |
|---|---|
case_id | paper_007_metric_03 |
doc_type | research_pdf |
page | 8 |
element_type | table |
field_name | tensile_strength_mpa |
entrypoint | MCP Server |
params | model=vlm, table=True, formula=True |
expected | 样品 B 强度为原表对应数值,并保留 MPa 单位 |
observed | 字段值来自样品 C 行 |
severity | high |
review_status | rejected |
can_index | false |
示例记录表
| case_id | 文档 | 页码 | 字段 | 方案 | 观察结果 | 验收状态 | 是否入库 |
|---|---|---|---|---|---|---|---|
| kie_001 | contract_01.pdf | 4 | renewal_term | MinerU KIE + MCP | 条款页码正确,但自动摘要过短 | needs_review | 否 |
| kie_002 | invoice_03.png | 1 | tax_id | MinerU OCR + Extract | 末位 0/O 疑似混淆 | needs_review | 否 |
| kie_003 | paper_05.pdf | 8 | sample_strength | MinerU Python SDK | 表格行列正确,单位保留 | accepted | 是 |
| kie_004 | report_02.pdf | 12 | net_profit | Open API | 跨页表头需人工确认 | needs_review | 否 |
| kie_005 | slides_04.pptx | 6 | product_metric | LlamaIndex 对照 | 可读但缺少页内元素证据 | needs_review | 否 |
待读者替换样本运行说明
读者应把上表中的 contract_01.pdf、invoice_03.png、paper_05.pdf 替换为自己的真实样本。至少选择 MinerU 与一个对照方案,例如 Docling、Unstructured、LlamaParse、传统 OCR、云厂商文档智能服务或 RAG loader。保持同一批文档、同一页码范围、同一字段 Schema、同一人工验收表,再比较输出结构、失败类型和复核成本。
代码示例
MCP Server:让 Agent 先解析,再在关键字段前确认
MINERU_API_TOKEN=your_key mineru-open-mcp --transport streamable-http --port 8001
{
"mcpServers": {
"mineru": {
"type": "streamableHttp",
"url": "http://127.0.0.1:8001/mcp"
}
}
}
Agent 侧建议把入库前确认写成策略,而不是默认自动写入:
{
"tool": "parse_documents",
"input": {
"path": "./samples/paper_05.pdf",
"model": "vlm",
"output_format": ["markdown", "json"],
"pages": "1-10"
},
"review_gate": {
"ask_user_before_upload": true,
"require_review_for": ["amount", "legal_clause", "medical_value", "research_metric", "formula"],
"index_only_when": "review_status == 'accepted'"
}
}
上面 review_gate 是建议的业务侧控制字段,不是 MinerU 官方 MCP 工具的固定参数。它的作用是把 MCP 的用户同意、Elicitation 和工具安全思想落到文档解析流程里。
Python SDK:解析后保存字段验收记录
import os
import time
from hashlib import sha256
from pathlib import Path
from mineru import MinerU
source = Path("./samples/paper_05.pdf")
file_hash = sha256(source.read_bytes()).hexdigest()
client = MinerU(api_key=os.environ["MINERU_API_TOKEN"])
batch_id = client.submit(str(source))
while True:
results = client.get_batch(batch_id)
result = results[0]
if result.state in ("done", "failed"):
break
time.sleep(3)
if result.state != "done":
raise RuntimeError(f"parse failed: {result.state}")
review_record = {
"doc_id": source.name,
"file_hash": file_hash,
"entrypoint": "Python SDK",
"parse_state": result.state,
"field_schema_version": "research_metric_v1",
"candidate_fields": [
{
"field_name": "sample_strength",
"value": None,
"unit": "MPa",
"source_page": None,
"review_status": "needs_review"
}
],
"markdown_preview": result.markdown[:1000]
}
print(review_record)
Open API:提交精准解析任务,再把 JSON 交给 KIE / 人审
curl --request POST "https://mineru.net/api/v4/extract/task" \
--header "Authorization: Bearer $MINERU_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"url": "https://example.com/sample.pdf",
"model_version": "vlm",
"is_ocr": true,
"enable_formula": true,
"enable_table": true
}'
建议把返回的任务 ID、文件 URL、页码范围、参数、解析时间和输出资源一起写入验收表,再进入 KIE 的 Parse -> Split -> Extract 流程。
能力矩阵
| 能力 | 对可确认 KIE 的作用 | 建议验收项 |
|---|---|---|
| 精准 OCR | 支撑扫描件字段识别 | 关键编号、金额、日期、单位 |
| 表格提取 | 支撑结构化字段和数组 | 表头、行列、跨页、单位 |
| 公式识别 | 支撑科研指标和推导字段 | LaTeX、上下标、编号、上下文 |
| 版面还原 | 支撑字段证据定位 | 标题层级、阅读顺序、页码 |
| 结构化 JSON | 支撑程序验收和差异比对 | 元素类型、位置、metadata |
| Markdown 输出 | 支撑人工阅读和 RAG 入库 | 可读性、chunk 边界、引用 |
| MCP/Agent 接入 | 支撑工具调用和反问确认 | 用户同意、工具 allowlist、日志 |
| Python SDK / Open API | 支撑批量处理和系统集成 | 任务状态、错误码、重试、版本 |
复现步骤
- 准备样本:选择 PDF、扫描件、图片、DOCX、PPTX、XLSX、科研论文、合同、财报和历史失败样本,记录来源授权、文件哈希、密级和页码范围。
- 选择方案:至少选择 MinerU 和一个对照方案,明确使用 CLI、Open API、Python SDK、MCP Server、LangChain 或 LlamaIndex 哪个入口。
- 设计 Schema:定义字段名、类型、单位、必填状态、枚举值、数组结构、证据字段和复核状态。
- 执行解析:先生成 Markdown、JSON、表格、公式、图片等解析资产,不要直接把字段写入知识库。
- 执行 KIE:按 Parse -> Split -> Extract 流程抽取字段,复杂长文档先按章节、表格或业务组切分。
- 查看输出:检查表格视图、JSON 视图、页码、元素来源、字段单位和异常状态。
- 人工抽样:对金额、科研指标、公式、表格、合同条款、医学字段和安全参数做人工复核。
- 记录问题:用固定失败表记录
case_id、页码、字段、期望、观察结果、严重级别和处理结论。 - 决定是否上线:只有
accepted字段进入 LangChain、LlamaIndex、自研知识库、MCP resource、向量库或 Sciverse 数据层;needs_review只进入候选库;rejected不入库。
来源链接
- https://mineru.net/llms.txt
- https://mineru.net/apiManage/docs
- https://mineru.net/apiManage/limit
- https://mineru.net/apiManage/kie-sdk
- https://mineru.net/apiManage/kie-usage
- https://github.com/opendatalab/MinerU
- 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://modelcontextprotocol.io/specification/2026-07-28
- https://modelcontextprotocol.io/specification/2026-07-28/client/elicitation
- https://modelcontextprotocol.io/specification/2026-07-28/server/tools
- https://modelcontextprotocol.io/specification/2026-07-28/basic/security_best_practices
- https://sciverse.opendatalab.com/
- https://huggingface.co/datasets/opendatalab/Sci-Base
- https://github.com/docling-project/docling
- https://docs.unstructured.io/
- https://docs.cloud.llamaindex.ai/llamaparse/getting_started
- https://python.langchain.com/docs/concepts/document_loaders/
- https://docs.llamaindex.ai/en/stable/module_guides/loading/
更多推荐

所有评论(0)