RAG 准确率上不去?先查文档解析这一关

张开发
2026/4/21 19:49:50 15 分钟阅读

分享文章

RAG 准确率上不去?先查文档解析这一关
文章定位深度长文面向有 RAG 系统经验、想提升文档处理质量的工程师关键词MinerU、文档解析、RAG、LangChain、VLM、PDF 处理一、调了半年参数问题出在最上游搭了半年 RAG 系统检索准确率一直上不去。调了 embedding 模型试了各种 chunking 策略改了 reranker……最后发现问题出在最上游文档解析根本就是错的。把一篇双栏学术论文喂给PyPDFLoader输出是这样的Introduction1. Methodology The proposed framework utilizes... Results Our approach achieves94.2% accuracy... Discussion左栏和右栏的文字混在一起段落顺序乱了表格变成一堆数字碎片。向量化这种内容检索出来的东西对 LLM 来说也是废的。这不是孤例。财务报告、技术手册、扫描件……这些场景里传统工具的输出质量都很不稳定。二、传统工具的根本问题提文字但不懂结构传统 PDF 解析工具PyMuPDF、PDFMiner、pdfplumber的工作方式本质上是提取文字流再按坐标拼接。文字是对的但结构关系丢了。这类工具无法回答这些问题这段文字是正文还是页脚这些数字是表格里的单元格还是正文里的数据这个符号是普通文本还是公式的一部分这一页是双栏还是单栏对 LLM 来说结构信息和文字内容同样重要。一个完整的表格和一堆散乱的数字字符语义完全不同。这个问题靠调 chunking 策略解决不了——垃圾进垃圾出。三、MinerU用视觉模型读懂文档MinerU 是上海人工智能实验室 OpenDataLab 团队开发的开源文档解析工具诞生于 InternLM 大模型的预训练数据构建过程中。GitHubgithub.com/opendatalab/MinerU当前 60k star。和传统工具不同MinerU 的核心解析后端使用视觉语言模型直接在视觉层面理解文档——哪里是标题哪里是表格哪里是公式哪个区域是图注。这和人类阅读文档的方式更接近。两种解析模式pipeline 模式传统多模型流水线速度快。适合结构相对简单的文档、需要批量处理、对速度敏感的场景。**vlm 模式推荐**使用 MinerU2.5 视觉语言模型1.2B 参数专为文档解析场景训练。适合学术论文、财报、复杂混排文档。在 OmniDocBench 基准上1.2B 的 MinerU2.5 超过了多个 72B 级别的通用大模型——因为它只需要理解文档版面不需要通用推理能力。输出格式内容类型输出普通文本Markdown保留标题层级、阅读顺序表格HTML结构完整支持跨页合并数学公式LaTeX行内 块级图片提取文件 文字描述扫描件 / 图片 PDF自动 OCR109 种语言四、横向评测6 款主流工具谁在 RAG 场景真正能打知道了 MinerU 是什么来看它在实际评测中和其他工具差距有多大。RAG 场景里文档解析的四个核心指标阅读顺序双栏有没有乱、表格还原结构能不能保住、公式识别LaTeX 还原准不准、扫描件 OCR图片 PDF 能不能识别。PyMuPDF / pdfplumber / PDFMiner传统文字流提取速度极快无需模型适合文字简单的原生 PDF。Unstructured开源文档处理框架支持多种格式规则 模型混合方案。LlamaParseLlamaIndex 出品的云端解析服务针对 RAG 优化收费。Marker基于深度学习的开源 PDF→Markdown 工具本地运行。DoclingIBM 开源支持 PDF、DOCX、PPTX 多格式专注结构理解。MinerU上海 AI Labvlm 模式 1.2B 专项训练模型开源 免费 API。评测数据OmniDocBenchCVPR 2025工具综合准确率文字提取公式LaTeX表格HTML阅读顺序MinerU 2.590.7%93.2%87.4%85.6%94.1%LlamaParse~76%82%65%74%78%PyMuPDF原生 PDF~82%*91%❌60%67%UnstructuredAPI~68%75%22%61%70%Marker~74%80%71%68%77%Docling~72%79%58%72%75%\PyMuPDF 在纯文字原生 PDF 上文字提取很强但不处理公式遇到复杂文档表格和阅读顺序都掉得厉害。各工具的真实软肋PyMuPDF / pdfplumber遇到双栏就乱表格变成数字碎片公式完全不处理。简单原生 PDF 够用稍微复杂一点就不行。Unstructured格式支持广但准确率偏低公式识别只有 22%。LlamaParse准确率不错接入简单但收费闭源云服务数据要出去。Marker开源可本地跑公式比传统工具强但跨页内容容易断。Docling多格式支持是亮点但公式58%和复杂混排的阅读顺序弱于 MinerU。MinerU四个维度全面领先。主要劣势是首次加载慢模型加载约 30-60 秒。怎么选简单报告原生 PDF无公式表格→ PyMuPDF 够用速度快需要本地运行 不想付费→ MinerU 或 Marker多格式DOCX、PPTX、PDF 混合→ Docling 或 Unstructured学术论文、财报、技术手册→ MinerU目前没有更好的开源选项不想自己搭、愿意付费→ LlamaParse五、解析质量怎么直接影响检索结果横评数据说明了准确率但准确率高一点对 RAG 到底有多大实际影响拿同一份 arXiv 论文对比。MinerU 输出的 Markdown 有完整标题层级#、##、###用MarkdownHeaderTextSplitter按标题切块每块对应一个完整的逻辑章节。PyPDFLoader 的输出只能按字符数切块1500字符Abstract The proposed method... 1 Introduction In this paper we...摘要和引言混在一块 块2500字符ables when ε is small. Table 1 shows results on MNIST...一个单词被切断表格只有标题MinerU MarkdownHeaderSplitter块1sectionAbstract完整摘要段落 块2section1 Introduction完整引言段落 块3section4 Results完整结果段落含 HTML 格式表格检索实验结果准确率是多少PyPDFLoader检索到含数字的片段但上下文破碎LLM 无法判断这个数字属于哪个实验MinerU检索到完整 Results 章节表格结构完整LLM 能直接引用表格的差距更明显——PyPDFLoader 输出散乱数字字符串向量化后几乎无法正确检索MinerU 输出 HTMLLLM 能正确理解每行每列的语义。六、5 分钟接入MinerU 提供云端 API不需要本地部署或下载模型。Token 申请免费在mineru.net/apiManage/token注册后直接获取没有审核等待。单文件上限 200MB / 200 页批量最多 200 个文件/次。exportMINERU_TOKENyour-token-here安装pipinstalllangchain-mineru langchain-openai langchain-community chromadb验证python-cfrom langchain_mineru import MinerULoader; print(langchain-mineru 安装正常)完整代码importos from langchain_mineruimportMinerULoader from langchain.text_splitterimportMarkdownHeaderTextSplitter from langchain_community.vectorstoresimportChroma from langchain_openaiimportOpenAIEmbeddings, ChatOpenAI from langchain.chainsimportRetrievalQA from langchain.schemaimportDocument# Step 1: 解析文档loaderMinerULoader(sourcepaper.pdf,modeprecision)docsloader.load()# Step 2: 按标题层级分块splitterMarkdownHeaderTextSplitter(headers_to_split_on[(#,section),(##,subsection),(###,subsubsection),])chunks[]fordocindocs:forsinsplitter.split_text(doc.page_content): chunks.append(Document(page_contents.page_content,metadata{**doc.metadata, **s.metadata}))# Step 3: 向量化vectorstoreChroma.from_documents(documentschunks,embeddingOpenAIEmbeddings(),persist_directory./chroma_db)# Step 4: 问答qa_chainRetrievalQA.from_chain_type(llmChatOpenAI(modelgpt-4o,temperature0),retrievervectorstore.as_retriever(search_typemmr,search_kwargs{k:6,fetch_k:20}),return_source_documentsTrue)resultqa_chain({query:这篇论文的主要贡献是什么})print(result[result])七、生态现状不只是一个 Python 包MinerU 的接入方式比很多人想象的要多。直接用不写代码在线 Demomineru.net/OpenSourceTools/Extractor桌面客户端mineru.net/client — Windows / macOS / Linux免费Hugging Facehuggingface.co/spaces/opendatalab/MinerUSDK多语言pipinstallmineru-open-sdk# Pythongo get github.com/opendatalab/MinerU-Ecosystem/sdk/golatest# Gonpminstallmineru-open-sdk# TypeScript / Node.jsAI 框架集成LangChainpip install langchain-mineruLlamaIndexpip install llama-index-readers-mineruMCP Servernpm install mineru-mcpClaude / Cursor 里直接调用n8nnpm install n8n-nodes-mineru低代码平台Dify、Coze、FastGPT、RagFlow、Cherry Studio 都有官方插件不需要自己写对接代码。详见github.com/opendatalab/MinerU-Ecosystem八、小结文档解析是 RAG 的地基。地基不稳调什么参数都是治标。传统工具解决的是提文字MinerU 解决的是理解文档结构——两个层次不同的问题。对需要处理复杂文档的场景在解析这一步换成 MinerU后续分块和检索准确率都会有明显改善其他代码不用动。Token 免费申请mineru.net/apiManage/tokenGitHubgithub.com/opendatalab/MinerU本文基于 MinerU v3.x、langchain-mineru 最新版本代码已验证可运行。OmniDocBench 评测数据来源github.com/opendatalab/OmniDocBenchCVPR 2025。

更多文章