不论是在 RAG 应用,还是当下时髦的 Deep Research 应用中,多格式文件的解析始终是一大挑战,尤其是 PDF 文件,由于其复杂的结构和多样的排版方式,很多工具在解析时效果参差不齐。虽然市面上有不少 PDF 解析工具,但高质量且统一的解决方案却少之又少。之前我们已通过《破解 PDF 解析难题:RAG 中高效解析复杂 PDF 的最佳选择》和《微软开源的 Markitdown 可将任意文件转换为 Markdown 格式,PDF 解析咋样?》详细评测过现有工具。比如,微软的 markitdown1 很好地解决了各类格式转换为 Markdown 的问题,但在 PDF 解析上仍显不足。
2024 年,一款全新的 PDF 解析工具 MinerU2 闪亮登场,在 GitHub 上已获得 27.7K 关注,迅速成为文档处理领域的明星。MinerU 是一款开源且功能强大的文档数据提取工具,专注于将 PDF 等复杂文档转换为机器可读的格式,非常适用于学术研究、技术写作和大模型训练等场景。然而,其采用的 AGPL v3 授权具有传染性,直接集成会迫使项目整体开源,这在商业项目中往往难以接受。
为了解决这一困局,我正式推出 Markify3 ------ 一款融合了微软 markitdown 和 MinerU 优势的工具。Markify 不仅能将 PDF、Word、PPT、Excel、图片、音频、网页、CSV、JSON、XML 甚至 ZIP 压缩包等多种文件统一转换为 Markdown 格式,还借助 MinerU 实现了高效准确的 PDF 解析,并通过开发 HTTP 服务巧妙绕开 AGPL 传染问题,从而无缝集成于各类项目中。
本文首先介绍 Markify 的功能与转换效果展示,然后详细说明其如何与 LlamaIndex 无缝接入,最后提供快速安装和测试的指导。
1. Markify 简介
Markify 为多种文件格式提供统一解析框架,特别是在 PDF 解析上拥有三种模式以满足不同场景的需求:
- 快速模式(simple) 基于pdfminer(markitdown 内置的 pdf 解析器),专注于高效文本提取,适合对文本要求较低的场景。
- 高级模式(advanced) 结合 MinerU 的深度解析,不仅能精准提取文本,还能识别并转换复杂表格和图像,还将图像自动转换为 Markdown 中的网络引用形式,例如:
less

- 云端模式(cloud) 正在研发中,未来将为用户提供更多云端解析能力。
2. 转换效果展示
2.1 整体转换效果
在对最近热门论文PIKE-RAG4进行转换时,Markify 对文本内容提取精准,整体排版清晰易读。
2.2 表格提取效果
对于文中的复杂表格,Markify 能够准确识别并转换为 Markdown 表格,展示效果极佳。
2.3 图像提取效果
在图像转换方面,Markify 将图像上传至服务器并嵌入 Markdown 中,使得图文混排效果更为直观美观。
这些案例充分展示了 Markify 在 PDF 解析上的卓越表现,无论是文本、表格还是图像,都能高质量地转换为 Markdown 格式,为后续的模型处理提供了坚实基础。
3. 与 LlamaIndex 的无缝集成
为了进一步简化大模型的数据预处理工作,Markify 同时支持与 LlamaIndex 的集成。LlamaIndex 定义了 BaseReader 接口,用户只需实现该接口即可自定义文件解析器。下面的示例展示了如何利用自定义的 MyFileLoader,通过 Markify API 将 PDF 文件加载到 LlamaIndex 中,就像使用 LlamaParse 一样:
ini
class MyFileLoader(BaseReader):
def __init__(self, conversion_service_url, poll_interval=5, timeout=300, mode='advanced'):
...
self.service_url = conversion_service_url.rstrip('/')
self.poll_interval = poll_interval
self.timeout = timeout
self.mode = mode
......
在实际使用时,只需指定.pdf文件由 MyFileLoader 进行处理即可,其他格式的文件也可通过 makify 处理:
ini
pdf_loader = MyFileLoader(
conversion_service_url=settings.markify_api_base,
poll_interval=5,
timeout=settings.markify_api_timeout
)
documents = SimpleDirectoryReader(input_files=[file_path], file_extractor={
".pdf": pdf_loader,
}).load_data()
通过这种方式,Markify实现了与 LlamaIndex的无缝接入,就像LlamaParser一样高效稳定。完整的 MyFileLoader 实现已在我的知识星球AgenticLM中共享,欢迎有兴趣的朋友加入了解更多细节。
4. 安装与使用指南
为了帮助大家更方便地集成 Markify,我们提供了基于 FastAPI 的 HTTP API 服务,客户端通过 HTTP 调用即可绕过 AGPL 传染,内部项目也无需开源。
4. 1 安装
首先克隆源码:
bash
git clone https://github.com/KylinMountain/markify
进入项目目录,并安装依赖:
ini
cd markify
conda create --name markify python=3.10
pip install -r requirements.txt
4.2 启动 API 服务
首次启动时,Markify 会自动从 ModelScope 下载 MinerU 的模型文件(若下载较慢,可设置环境变量 MINERU_USE_MODELSCOPE=false 切换至 HuggingFace 下载):
css
uvicorn main:app --reload --port 20926
启动后,即可通过浏览器访问http://localhost:20926/docs查看 API 文档,支持上传文档、查询任务状态和下载文件。
4.3 启动 Streamlit 客户端
执行以下命令启动 Streamlit 客户端,浏览器访问http://localhost:8501/即可简单快捷开始转换转换文件:
arduino
streamlit run ./client/streamlit_client.p
在 Streamlit 客户端中,选择 PDF 处理模式即可选择上述 3 种模式,右侧显示转换列表,完成即可自行下载转换好的 markdown 文档。
5. 总结
Markify 通过整合 Markitdown 与 MinerU 的优势,提供了一个统一、高质量的文件解析解决方案,尤其在 PDF 解析中表现尤为出色。无论是文本、表格还是图像的提取,Markify 都能满足各种场景的需求。此外,基于 FastAPI 开发的 API 服务设计,使得用户能以 HTTP 调用的方式集成到现有项目中,轻松规避 AGPL 传染问题,并实现与 LlamaIndex 等大模型的无缝对接。
总之,Markify 为 RAG 应用及文档预处理带来了全新的解决思路和更高的解析效率,期待你也来体验和开发这款开源利器,为开源添砖加瓦!
最后,感谢粉丝同学Joshua提交Docker编译和Streamlit。如果对你有用,不烦加星关注哦~
参考资料
1markitdown: github.com/microsoft/m...
2MinerU: github.com/opendatalab...
3Markify : github.com/KylinMounta...
4PIKE-RAG: arxiv.org/pdf/2501.11...