RAG系列(七):解析优化 - 不同文件类型统一转换成Markdown

引言

在 RAG 系统中,文件解析是构建知识库和实现高效信息检索的关键环节。随着系统需要处理的文件类型日益增多(如PDF、Word、Excel、PPT、HTML等),如何高效解析并利用这些异构数据成为核心挑战。

由于每种文件类型的数据结构和内容(如PDF的复杂排版、Excel的表格结构、PPT的多媒体元素)都不一致,在实际的应用场景中,我们需要对不同文件类型实现不同的解析器,解析之后还需要根据不同文件的结构实现对应的文档分块方法。整体来说,这样的系统实现和维护成本都是比较高的,要把每种文件类型的解析都做到比较好是比较繁琐的,但是文件解析如果做的不好,就会不同程度地影响后续 RAG 系统流程,该种方案流程如下:

可能你会问,为什么需要这么多的解析器呢?不能把各种文件直接读取成字节流后丢给 LLM 吗?以当前 LLM 的能力,无论是什么内容都需要得组织成文本,它才能处理。而 PDF、Word、网页等其实都是富文本,里面除了文字,通常还包含公式、图片、表格、统计图,排版方式也各不相同,甚至其中的格式也是很重要的内容,而这也是文件解析的作用,把各种富文本转换成 LLM 好理解的纯文本的过程。

为什么是 Markdown

  • 统一数据格式,降低解析复杂度:Markdown 以纯文本形式保留了基本结构(标题、列表、代码块、表格),同时去除了冗余的格式信息(如字体、颜色);所有文件统一转换为 Markdown 后,RAG 系统只需针对一种格式进行后续处理(如分段、分句、实体提取),显著降低代码复杂度。
  • 提升信息提取与语义理解能力: Markdown 的标题语法(###)可直接映射为文档结构,便于模型快速定位关键信息;Markdown 的表格和代码块标记(如`````)能保留原始数据的排版逻辑,帮助模型理解数据关系;通过->等符号标记的列表和引用内容,可辅助模型识别要点和上下文关联。去除原始文件中的样式、脚注、页眉页脚等非核心内容,使文本更聚焦于语义信息。
  • 优化存储与检索效率:Markdown 文件体积小,适合大规模知识库的存储和快速加载;基于 Markdown 的结构化文本可直接生成倒排索引,提升检索速度和准确性。
  • 增强可维护性与可解释性:开发者可直接通过文本编辑器查看 Markdown 内容,便于调试和验证解析结果;Markdown 文件易于进行版本管理(如Git),支持团队协作和历史追溯。

统一转换成 Markdown 之后,可优化成如下流程:

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

而将 PDF 转 Markdown、Word 转 Markdown 等有很多成熟的工具可以使用这样就没必要自己写解析器来处理了,比如 MinerU[1] - 上海人工智能实验室开源的项目、MarkItDown - Microsoft AutoGen 团队开源的项目等等,这些项目都是专门用于将各种文件格式转换为 Markdown,可以参考借鉴和使用。

本文完整代码地址[2]

MinerU 使用方法

今天就以 CPU 运行的方式来简单介绍下 MinerU 的使用方法(没有找到类似 Nodejs 的工具,只能使用 Python 来介绍了…),更多内容到 Github 上使用cpu快速体验[3]查看。

安装 magic-pdf

conda create -n .venv 'python=3.12' -y
conda activate .venv
pip install -U "magic-pdf[full]" -i https://mirrors.aliyun.com/pypi/simple

以上是官方示例。如果你没有安装 conda(不建议使用 uv,有兼容性问题),可以直接使用 Python 的命令创建虚拟空间安装:

python3.12 -m venv .venv
source .venv/bin/activate
pip install -U "magic-pdf[full]" -i https://mirrors.aliyun.com/pypi/simple

(截止到发文时)这里需要注意,Python 的版本需要在 3.10 ~ 3.12 之间,不然 magic-pdf 会被自动降级到 0.6.1。

下载模型文件

模型文件可以从 Hugging Face 或 Model Scope 下载,由于网络原因,国内用户访问 HF 可能会失败,请使用 ModelScope。

pip install modelscope
wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/scripts/download_models.py -O download_models.py
python download_models.py

修改配置文件【可选】

完成第二个步骤后,脚本会自动生成用户目录下的 magic-pdf.json 文件,并自动配置默认模型路径。 您可在【用户目录】下找到 magic-pdf.json 文件。

windows的用户目录为 “C:\Users\用户名”,

linux用户目录为 “/home/用户名”,

macOS用户目录为 “/Users/用户名”。

您可修改该文件中的部分配置实现功能的开关,如表格识别功能:

{
// other config
"layout-config":{
"model":"doclayout_yolo"
},
"formula-config":{
"mfd_model":"yolo_v8_mfd",
"mfr_model":"unimernet_small",
"enable":true// 公式识别功能默认是开启的,如果需要关闭请修改此处的值为"false"
},
"table-config":{
"model":"rapid_table",
"sub_model":"slanet_plus",
"enable":true,// 表格识别功能默认是开启的,如果需要关闭请修改此处的值为"false"
"max_time":400
}
}

代码示例

import os
from magic_pdf.data.data_reader_writer import FileBasedDataWriter, FileBasedDataReader
from magic_pdf.data.dataset import PymuDocDataset
from magic_pdf.model.doc_analyze_by_custom_model import doc_analyze
from magic_pdf.config.enums import SupportedPdfParseMethod

defmain():
# args
    pdf_file_name = "2024少儿编程教育行业发展趋势报告.pdf"# replace with the real pdf path
    name_without_suff = pdf_file_name.split(".")[0]

# prepare env
    local_image_dir, local_md_dir = "output/images", "output"
    image_dir = str(os.path.basename(local_image_dir))

    os.makedirs(local_image_dir, exist_ok=True)

    image_writer, md_writer = FileBasedDataWriter(local_image_dir), FileBasedDataWriter(
        local_md_dir
    )

# read bytes
    reader1 = FileBasedDataReader("")
    pdf_bytes = reader1.read(pdf_file_name)  # read the pdf content

# proc
# Create Dataset Instance
    ds = PymuDocDataset(pdf_bytes)

# inference
if ds.classify() == SupportedPdfParseMethod.OCR:
        infer_result = ds.apply(doc_analyze, ocr=True)

# pipeline
        pipe_result = infer_result.pipe_ocr_mode(image_writer)

else:
        infer_result = ds.apply(doc_analyze, ocr=False)

# pipeline
        pipe_result = infer_result.pipe_txt_mode(image_writer)

# draw model result on each page
    infer_result.draw_model(os.path.join(
        local_md_dir, f"{name_without_suff}_model.pdf"))

# get model inference result
    model_inference_result = infer_result.get_infer_res()

# draw layout result on each page
    pipe_result.draw_layout(os.path.join(
        local_md_dir, f"{name_without_suff}_layout.pdf"))

# draw spans result on each page
    pipe_result.draw_span(os.path.join(
        local_md_dir, f"{name_without_suff}_spans.pdf"))

# get markdown content
    md_content = pipe_result.get_markdown(image_dir)

# dump markdown
    pipe_result.dump_md(md_writer, f"{name_without_suff}.md", image_dir)

# get content list content
    content_list_content = pipe_result.get_content_list(image_dir)

# dump content list
    pipe_result.dump_content_list(
        md_writer, f"{name_without_suff}_content_list.json", image_dir)

# get middle json
    middle_json_content = pipe_result.get_middle_json()

# dump middle json
    pipe_result.dump_middle_json(md_writer, f'{name_without_suff}_middle.json')

if __name__ == "__main__":
    main()

运行之后,会在本地生成提取到的图片、中间过程文件以及最终生成的 Markdown 文件。

生成的 Markdown 文档:

原始文档:

可以看到,提取的结果还是比较符合预期的,图片也都正确提取出来了。

结语

今天通过简单介绍 MinerU 的使用方法的同时,来给大家带来一种文件解析优化的思路,希望能对大家有所启发。

大模型算是目前当之无愧最火的一个方向了,算是新时代的风口!有小伙伴觉得,作为新领域、新方向人才需求必然相当大,与之相应的人才缺乏、人才竞争自然也会更少,那转行去做大模型是不是一个更好的选择呢?是不是更好就业呢?是不是就暂时能抵抗35岁中年危机呢?

答案当然是这样,大模型必然是新风口!

那如何学习大模型 ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。但是具体到个人,只能说是:

最先掌握AI的人,将会比较晚掌握AI的人有竞争优势。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

但现在很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习路线完善出来!

在这里插入图片描述

在这个版本当中:

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型路线+学习教程已经给大家整理并打包分享出来, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉优快云大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全咨料,放心领取)👈

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源

在这里插入图片描述

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、大模型系列视频教程(免费分享)

在这里插入图片描述

四、2025最新大模型学习路线(免费分享)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

img

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

img

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

img

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

img

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

img

L5阶段:专题集丨特训篇 【录播课】

img

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码免费领取

👉优快云大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全资料,放心领取)👈

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值