返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

使用RAG技术构建企业级文档问答系统:解析(1)使用MinerU将PDF转换为Markdown

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 11:59 |阅读模式 打印 上一主题 下一主题

概述

在RAG应用中,一个稍微有点规模的知识库可能包含来自PDF、Word、PPT、网页等各种不同来源的内容,每种内容都有各自的解析器,但想把每种类型的解析都做到比较好是比较繁琐的,直观的例子比如Word中,可能存在页眉、页脚,页面版式可能是左右两栏,PDF中有可能会包含水印等干扰内容,网页就更明显了,这些如果处理不好,都会不同程度地影响后续流程,对每种文档类型分别解析并进行处理的模型,流程如下:

为什么需要这么多的解析器呢?直接把各种文件读取成字节流丢给大语言模型(以下简称LLM)不行吗,以当前的技术发展来说还不行,目前的LLM,无论是什么内容,都得组织成文本,它才能处理,(顺便提一句,现在的多模态大模型,也不能直接处理PDF、Word这种文件),而PDF、Word、网页等其实都是富文本,里面除了文字,通常还包含公式、图片、表格、统计图,排版方式也各不相同,甚至其中的格式也是很重要的内容(标题一般会比正文重要性高),而解析的作用,其实是把各种富文本,转换成纯文本的过程。

Markdown因为其简单明了的语法等特性,得到了广泛的应用,它可以通过纯文本来表达标题、列表、代码块、引用、表格、图片、公式、链接等,因为它本身是纯文本,大语言模型是可以直接处理的。如果大家用过扣子的提示词自动优化就会发现,优化后的提示词,变成了Markdown格式的,而且不少AI助手,它的输出其实也是Markdown格式的。其实使用YAML、JSON、XML来表达也是可以的,但因为使用这些标记语言设计的初衷是为了解决文件传输、保存配置信息等,LLM在训练的时候也没见过多少使用这些格式来表达图文、表格内容的,所以它也不擅长,只能通过Schema的方式来告诉LLM,而这样又会增加许多额外工作,没必要。所以,对于文档格式丰富的知识库,还有一种借助Markdown中转的处理模式,流程如下:

乍一看还比上面的流程复杂了,但其实不然,原因有以下两点:

  • PDF转Markdown、Word转Markdown等有很多成熟的工作可以借鉴,像页眉页脚处理、水印处理这种事情,这些工作都是通用的方式处理,而自己写解析器处理的话,要考虑很多事情,未必比别人做得更好

  • 统一转成Markdown之后,只需要将注意力专注在Markdown解析和处理上就可以了,这样可以大幅降低整个系统的开发、维护成本

使用方法

下面就来介绍一下可借鉴的成熟的工作——MinerU,这个是上海人工智能实验室开源的项目,项目地址如下:

https://github.com/opendatalab/MinerU

安装配置

第一步,安装包:

condacreate-nMinerU=.10
condaactivateMinerU
pipinstall-Umagic-pdf[full]--extra-index-urlhttps://wheels.myhloli.com

第二步,下载模型:

pipinstallhuggingface_hub
wgethttps://github.com/opendatalab/MinerU/raw/master/scripts/download_models_hf.py-Odownload_models_hf.py
pythondownload_models_hf.py

第三步,修改配置文件:

配置文件,对于Windows系统,在C:\Users\username\magic-pdf.json下,Linux系统在/home/username/magic-pdf.json下,macOS系统在/Users/username/magic-pdf.json下,把username换成自己的,如果有GPU,可以将device-mode改为cuda,官方建议需要至少8G显存,本人实测下面的文档处理时,显存消耗不超过6G。

使用

下面的的样例代码,假设处理data目录下的2024全球经济金融展望报告.pdf文件


logger
UNIPipe
DiskReaderWriter

pdf_name=

pdf_path=os.path.join(,)
output_dir=os.path.join(,pdf_name)
os.path.exists(output_dir):
os.makedirs(output_dir,exist_ok=)
local_image_dir=os.path.join(output_dir,)
output_filename=os.path.join(output_dir,pdf_name)

os.path.exists(output_filename+):
logger.info()

:
pdf_bytes=(pdf_path,).read()
jso_useful_key={:,:[]}
image_dir=(os.path.basename(local_image_dir))
image_writer=DiskReaderWriter(local_image_dir)
pipe=UNIPipe(pdf_bytes,jso_useful_key,image_writer)
pipe.pipe_classify()
pipe.pipe_analyze()
pipe.pipe_parse()
md_content=pipe.pipe_mk_markdown(image_dir,drop_mode=)
(,,encoding=)f:
f.write(md_content)
e:
logger.error(e)

处理后,会在data目录下的2024全球经济金融展望报告目录下,有一个2024全球经济金融展望报告.md的文件,处理结果如下:

原始文档如下:


可以看到,页眉页脚统一都去掉了,图片也都正确提取出来了。

处理时间使用NVIDIA GTX 1080Ti处理时间1分43秒,使用Intel i7 9700K大约花费14分钟,供大家参考。






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ