MinerU LangChain 集成深度指南:一行代码搞定 PDF 到 RAG

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

相关链接

相关推荐
Bug终结者_1 天前
别只会写 Java 了!LangChain4J 带你弯道超车 AI 赛道
后端·langchain·ai编程
GISer_Jing1 天前
LangChain.js + LangGraph.js 前端AI开发实战指南
前端·javascript·langchain
凌奕1 天前
LangChain + RAG 实战
langchain
Csvn1 天前
🌟 LangChain 30 天保姆级教程 · Day 21|Memory 机制实战!让 AI 记住你说过的话,实现多轮连贯对话!
langchain
正在走向自律1 天前
从0到1构建企业级RAG系统:基于LangChain+向量数据库的完整实战
langchain·向量数据库·rag·企业级架构
creator_Li1 天前
LangChain学习笔记
langchain
GISer_Jing1 天前
LangChain浏览器Agent开发全攻略
前端·ai·langchain
XS0301061 天前
agent笔记(二)Langchain关键对象
人工智能·笔记·langchain
qq_364371721 天前
NestJS + LangChain SSE 流式输出 + 前端实时渲染打字机效果
前端·langchain
Zfox_1 天前
【LangChain】快速上手
langchain·ai编程