
MinerU 是什么
MinerU 是上海人工智能实验室开源的一站式文档解析工具,基于视觉语言模型(VLM)架构,能够将 PDF、图片、Word、PPT、Excel 等任意格式的文档转换为结构化的 Markdown 输出。最新版本 MinerU2.5-Pro 仅用 1.2B 参数 即在 OmniDocBench v1.6 基准上取得 95.69 分,大幅超越 GPT-4o、Qwen2.5-VL-72B 等数十倍参数规模的模型,稳居当前文档解析榜首。
MinerU 的核心能力包括:
- PDF 转 Markdown:保留原始版式、标题层级、段落结构
- 公式识别:复杂 LaTeX 公式准确率高达 98%
- 表格提取:复杂表格识别准确率 92%
- 多语言 OCR:支持 109 种语言的文档识别
- 图片提取:将文档内嵌图片独立导出
- 网页抓取:将任意 URL 网页转换为 Markdown
MinerU 生态包含六大模块:CLI 命令行工具、SDK 多语言开发包、API 云端服务、RAG 知识检索、MCP 协议支持,以及 SKILL 跨语言知识 API。其中 RAG 模块与主流 LLM 框架深度集成,LangChain 正是其核心合作伙伴。
LangChain 是什么
LangChain 是构建 LLM 应用最流行的开源框架之一,全球安装量超过 2500 万次。它提供标准化的接口和组件,让开发者能够灵活组合 LLM、向量存储和数据源,快速搭建 RAG(检索增强生成)系统。
langchain-mineru 是 MinerU 官方维护的 LangChain 文档加载器(Document Loader)。它将 MinerU 的高精度文档解析能力桥接到 LangChain 生态------只需一行代码,即可将 PDF、DOC、PPT、图片等复杂文档转换为 LangChain 的 Document 对象,并无缝衔接后续的 Text Splitter、Embedding 和 Vector Store 流程。
核心优势:
- 一行代码完成文档加载,零门槛接入 LangChain RAG 链路
- 继承 MinerU 的高精度版面分析、公式识别和表格提取能力
- 支持 Flash(免 Token)和 Precision(需 Token)两种解析模式
- PDF 可按页拆分,适配 page-level 粒度检索场景
- 支持本地路径与远程 URL 混合批量加载
- 内置
lazy_load流式加载接口
安装与环境要求
环境要求
- Python >= 3.10
安装
bash
pip install langchain-mineru
验证安装
bash
python -c "from langchain_mineru import MinerULoader; print('OK')"
快速上手
一行代码加载 PDF
python
from langchain_mineru import MinerULoader
loader = MinerULoader(source="demo.pdf")
docs = loader.load()
print(docs[0].page_content[:500])
print(docs[0].metadata)
默认 mode="flash",无需 API Token,直接可用。
两种解析模式对比
| 特性 | Flash(默认) | Precision |
|---|---|---|
| 身份认证 | 免登录 | 需 API Token |
| 速度 | 极速 | 标准 |
| 文件大小上限 | 10 MB | 200 MB |
| 页数上限 | 20 页 | 600 页 |
| 支持格式 | PDF、图片、DOCX、PPTX、XLS、XLSX | PDF、图片、DOC、DOCX、PPT、PPTX、HTML |
注意:当前集成输出格式为 Markdown。如需图片/JSON/DOCX/HTML/LaTeX 等多元输出,请使用 MinerU Python SDK。
Precision 模式 Token 申请
Token 可在 MinerU API 管理平台 免费申请。提供两种 Token 配置方式:
方式一:环境变量(推荐)
bash
export MINERU_TOKEN="your-token"
之后初始化 Loader 时无需传入 token 参数:
python
loader = MinerULoader(source="demo.pdf", mode="precision")
方式二:构造时显式传入
python
loader = MinerULoader(source="demo.pdf", mode="precision", token="your-token")
进阶用法
PDF 按页拆分(split_pages)
当 split_pages=True 时,每页 PDF 解析为一个独立的 Document,适合需要 page-level 检索粒度的 RAG 场景:
python
from langchain_mineru import MinerULoader
loader = MinerULoader(
source="/path/to/demo.pdf",
split_pages=True,
)
docs = loader.load()
for doc in docs:
print(f"第 {doc.metadata['page']} 页: {doc.page_content[:200]}")
指定页码范围
python
from langchain_mineru import MinerULoader
loader = MinerULoader(
source="/path/to/demo.pdf",
mode="precision",
token="your-token",
pages="1-5", # 只解析 1-5 页
split_pages=True,
language="en",
timeout=300,
)
docs = loader.load()
for doc in docs:
print(f"Page {doc.metadata['page']}: {doc.page_content[:200]}")
多文件混合加载
python
from langchain_mineru import MinerULoader
loader = MinerULoader(
source=[
"/path/to/demo_a.pdf",
"/path/to/demo_b.pdf",
"https://cdn-mineru.openxlab.org.cn/demo/example.pdf",
],
)
docs = loader.load()
for doc in docs:
print(doc.metadata["source"], "-", doc.page_content[:100])
完整 RAG Pipeline 示例
Flash 模式 + RAG(免 Token,适合快速原型)
python
from langchain_mineru import MinerULoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
# 1. 加载文档
loader = MinerULoader(source="demo.pdf", mode="flash")
docs = loader.load()
# 2. 文本切分
splitter = RecursiveCharacterTextSplitter(chunk_size=1200, chunk_overlap=200)
chunks = splitter.split_documents(docs)
# 3. 向量存储
vs = FAISS.from_documents(chunks, OpenAIEmbeddings())
# 4. 检索
results = vs.similarity_search("这个文档的核心配置步骤是什么?", k=3)
for r in results:
print(r.page_content[:200])
Precision 模式 + RAG(生产环境推荐)
python
import os
from langchain_mineru import MinerULoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
os.environ["MINERU_TOKEN"] = "your-token" # 或在初始化时传入 token 参数
# 1. 加载文档
loader = MinerULoader(
source="manual.pdf",
mode="precision",
)
docs = loader.load()
# 2. 文本切分
splitter = RecursiveCharacterTextSplitter(chunk_size=1200, chunk_overlap=200)
chunks = splitter.split_documents(docs)
# 3. 向量存储
vs = FAISS.from_documents(chunks, OpenAIEmbeddings())
# 4. 检索
results = vs.similarity_search("这个文档怎么配置 OCR?", k=3)
for r in results:
print(r.page_content[:200])
参数说明
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
source |
`str | list[str]` | 必填 |
mode |
str |
"flash" |
解析模式:"flash"(快速免 Token)或 "precision"(精准需 Token) |
token |
`str | None` | None |
language |
str |
"ch" |
文档语言代码,如 "ch"(中文)、"en"(英文) |
pages |
`str | None` | None |
timeout |
int |
1200 |
单文件最大等待时间(秒) |
split_pages |
bool |
False |
PDF 是否按页拆分为独立 Document |
ocr |
bool |
False |
是否强制启用 OCR |
formula |
bool |
True |
是否启用公式识别 |
table |
bool |
True |
是否启用表格识别 |
Document Metadata 说明
每个返回的 Document 包含以下 metadata 字段:
python
{
"source": "report.pdf", # 原始输入路径或 URL
"loader": "mineru",
"output_format": "markdown",
"mode": "flash", # flash / precision
"language": "ch",
"pages": None,
"split_pages": True,
"filename": "report.pdf", # MinerU 返回的文件名
"page": 1, # 仅 split_pages=True 时存在
"page_source": "report.pdf", # 仅 split_pages=True 时存在
}
支持的文件格式
| 模式 | 支持格式 |
|---|---|
| Precision | PDF、图片、DOC、DOCX、PPT、PPTX、HTML |
| Flash | PDF、图片、DOCX、PPTX、XLS、XLSX |
相关链接
- MinerU 官网:mineru.net
- LangChain 官网:www.langchain.com
- MinerU Python SDK:github.com/opendatalab...
- API 文档:mineru.net/apiManage/d...
- Token 申请:mineru.net/apiManage/t...
- GitHub Stars:56.9K+