RAG项目实战:基于图文PDF的多模态问答RAG项目(二)之文档解析和分块

按照一中的调研思路,这一部分记录关于建立文档库的相关操作和反思:这里主要做的工作包括:pdf解析、pdf数据清洗、chunk以及入库。

I. 进行pdf文件解析,注意:为了符合比赛规则,先基于页码进行分割然后再进行chunk。

这部分由于比赛方推荐了MinerU,我计划先使用这个工具进行尝试。

一、MinerU学习及使用:

1. MinerU概述:

1)介绍:

MinerU 是由上海人工智能实验室下属的 OpenDataLab 团队于2024年7月推出的开源文档智能提取工具,旨在高效地将复杂的多模态PDF文档(包含文本、公式、表格、图像、页眉页脚、脚注等)转换为结构清晰、机器可读的 Markdown 或 JSON 格式,从而为大模型训练和AI应用提供高质量的数据语料支持。

2)配置要求:

要使用mineru的全部功能对硬件的配置要求比较高,之前我用ragflow跑文件解析也确实消耗了大量的时间,这里应该需要做一些并行优化。

2. 安装:参考:https://opendatalab.github.io/MinerU/zh/quick_start/

minerU存在不同性能的:

image

安装[core]版本:
mineru[core]包含除vllm加速外的所有核心功能,兼容Windows / Linux / macOS系统,适合绝大多数用户。 如果您有使用vllm加速VLM模型推理,或是在边缘设备安装轻量版client端等需求,可以参考文档扩展模块安装指南

使用uv安装需要先安装uv:

pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple
pip install uv -i https://mirrors.aliyun.com/pypi/simple
uv pip install -U "mineru[core]" -i https://mirrors.aliyun.com/pypi/simple

需要先使用uv init生成一个pyproject.toml文件,记得加入:

[tool.setuptools]
py-modules = []

然后安装mineru[core]:

uv pip install -U "mineru[core]" -i https://mirrors.aliyun.com/pypi/simple

vllm的安装:这一步比较麻烦,后续有时间的话再花费时间来做这一块。(可以提速,目前我的知识库数据量是120+个pdfs)

补充知识:

1)uv:是一种新的python包管理工具和项目工作流工具,比pip要快10-100倍

3. 调用:⭐

MinerU 技术文档-CSDN博客

这里参考了https://www.cnblogs.com/mgtpez/p/19030149/datawhale-learn-rag里的文档解析代码,发现minerU可以通过sdk的方法进行调用,具体函数逻辑mineru的官方文档并没有写,所以需要开发人员自己去看代码研究。我这里总结一下参考代码里使用的主要函数:

 (待补充完善)

过程中的问题:

1)需要更换模型源:huggingface需要FQ。

在脚本中加入:

import os
os.environ["MINERU_MODEL_SOURCE"] = "modelscope"

4. 实现逻辑思考:

代码结合mineru的pdfs处理思路是识别文档、图片和表格,并识别pdfs的布局,在布局的基础上进行了分块:json文件的内容是这样的:

实际上是对整个pdf的布局进行了内容识别:对应可视化的pdfs layout如下:

# json文件:
[
    {
        "type": "text",
        "text": "商业化成绩显著,产品矩阵持续拓宽艾力斯(688578.SH)深度报告",
        "text_level": 1,
        "bbox": [
            97,
            87,
            616,
            136
        ],
        "page_idx": 0
    },....
]

上述参数bbox的意味是在layout里的一个边界箱的坐标信息。

image

最终把每一页的内容转换成了html格式的文件,这里是按照上述的布局分析结果进行的拼接。(这里应该也有优化空间)

注意:文字解析,图片解析成了图片标题、图片地址(图片内容理解如何做?),表格解析做成的是按照每一行进行读取的markdown格式。

思考1:mineru自动进行了chunk吗?这里如果后续要调整的话,如何调整?-> 没有进行chunk,mineru是基于布局的分块,就是上图显示的。

思考2:原理上mineru实现了文档不同块之间的关联性分析了吗?需要对mineru的原理进行学习,or 具体学习它分析页面布局之后的结果。

思考3:文档解析和入库后续可以做工程上的并行优化。

思考4:markdown对于大模型来说就好理解了?

 

II. 分块操作

1. 不同的分块策略:https://mp.weixin.qq.com/s/xR9Bjczplqtcl0IIBiu1jA

1)有简单的分块就是直接对文本进行token数目指定,overlap指定。

2)语义分块:

3)递归分块:

4)段落分块、页面分块、智能体分块等等。

2. 实验操作

按照调研的经验和baseline提供的做法先仅按照页面分块。

分成的块的最后格式是字典形式(包含metadata等)。

 

posted @ 2025-11-25 21:53  不要踏入静谧的良夜  阅读(71)  评论(0)    收藏  举报