RAG处理PDF图片:步骤顺序与完整流程

文章目录

1.核心结论

图片提取、OCR文字抽取、多模态描述生成,全都放在 MarkdownHeaderTextSplitter 之前。

补充关键误区纠正:PDF本身不带Markdown标记,#、##、Markdown表格这些格式,全是后期人工加上去的,不是PDF原生自带的。

所有非文本内容转文本、全文结构化规整,是语义切分的前置工作,先完成所有内容的文本化,再手动添加Markdown标记,最后进行切分,保证流程顺畅、内容完整。

图片提取、OCR文字抽取、多模态描述生成,全都放在 MarkdownHeaderTextSplitter 之前。

所有非文本内容转文本、全文结构化规整,是语义切分的前置工作,先完成所有内容的文本化,再进行切分,保证流程顺畅、内容完整。


2.详细步骤顺序(标准合规流程)

第一步:PDF全文解析,拆分各类元素

这一步依旧使用 Unstructured实现,它支持高精度PDF解析,能自动分离文本、表格、图片三类元素,不用手动拆分,是工业界最省事的成熟方案。

具体实现(核心代码)

python 复制代码
from langchain_community.document_loaders import UnstructuredPDFLoader

第二部: 开启元素模式,分离文本、表格、图片,启用高精度解析
loader = UnstructuredPDFLoader(
    "带图片的文档.pdf",
    # elements模式:拆分出每一种独立元素
    mode="elements",
    # 高精度模式,必须开启,才能识别图片、表格、定位位置
    strategy="hi_res",
    # 允许提取图片(必须设为True)
    extract_images=True,
    # 可选:指定图片临时存放路径
    image_output_dir="./pdf_extracted_images"
)

第三步: 执行解析,得到所有元素列表
elements = loader.load()

# 遍历元素,分类筛选
for elem in elements:
    elem_type = elem.metadata["category"]
    # 正文文本
    if elem_type == "Title":
        pass
    elif elem_type == "Paragraph":
        pass
    # 表格
    elif elem_type == "Table":
        pass
    # 图片(抠出的图片会被识别为Image类型)
    elif elem_type == "Image":
        # 自带图片位置、页码、本地路径信息
        print("图片所在页码:", elem.metadata["page_number"])
        print("图片本地保存路径:", elem.metadata["image_path"])
        print("图片坐标位置:", elem.metadata["coordinates"])

第二步:图片处理,转为文本内容

  1. 用OCR模型,提取图片里的可识别文字

  2. 用多模态模型(GPT-4o、Qwen-VL、Llama-OCR等),生成图片内容描述

  3. 拼接OCR文字+图片描述,形成一段完整文本,放回PDF原文对应的位置

  4. 注意:图片本身不入库、不进入后续流程

第三步:全文结构化,手动添加Markdown标记

  1. 规整全文格式,手动给标题添加#、##、###标记(对应一级、二级、三级标题)

  2. 把刚才生成的图片文本、描述,放回原文对应位置,并入正文

  3. 最终整理出一篇完整的、带标准Markdown格式的文本

  4. 规整全文格式,把标题转为#、##、###格式

  5. 将PDF内嵌表格,转换为标准Markdown表格格式

  6. 把刚才生成的图片文本、描述,并入正文,形成完整的结构化Markdown文本

第四步:语义切分(核心切分器登场)

  1. 使用 MarkdownHeaderTextSplitter,按标题层级切分

  2. 对超长文本块,用递归字符切分器做微调,控制块长度

第五步:后续流程

  1. 给文本块补充元数据(来源、页码、标题层级等)

  2. 向量化处理,存入向量库


3. 关键原因(为什么必须放在前面)

  1. 保证语义完整:先把图片转为文本,再切分,能让图片相关信息和上下文贴合,不割裂内容,检索更精准

  2. 符合切分器逻辑:MarkdownHeaderTextSplitter只处理纯文本,不处理图片、二进制文件,必须提前把所有内容转为纯文本

  3. 避免流程混乱:先补齐所有文本内容、规整格式,再统一切分,不用拆分处理、重复操作,效率更高,出错更少


4.一句话速记

先把所有内容变成纯文本、做成标准Markdown,再用 MarkdownHeaderTextSplitter 切分。

图片转文字、表格转格式,统统是前置准备工作,全都在切分之前完成。

相关推荐
KaMeidebaby3 分钟前
卡梅德生物技术快报|原核表达系统工艺优化:包涵体重折叠 + 分子筛纯化实现功能 RBD 高效制备,附全参数配置
前端·人工智能·算法·数据挖掘·数据分析
数据库小学妹14 分钟前
MySQL ORDER BY 深度解析:Using temporary 与 Using filesort 的底层机制及索引优化实战
数据库·经验分享·mysql·性能优化·dba
最爱睡觉睡觉睡觉15 分钟前
代碼案例:CSS 屬性對照
前端·app
VitoChang26 分钟前
开发体验超赞的SolidJS2.0来了
前端
CoCo的编程之路30 分钟前
2026全栈演进:使用前端开发助手进行项目重构的最佳工具
大数据·前端·人工智能·ai编程·comate
AI人工智能+电脑小能手32 分钟前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
WPF工业上位机1 小时前
YXGK.FakeVM数据库示例
jvm·数据库·oracle
牛奔1 小时前
如何让 GORM 打印 SQL 语句?三种方式全解析
数据库·sql
XWalnut1 小时前
Redis从入门到精通
数据库·redis·缓存
@PHARAOH1 小时前
WHAT - NextAuth 权限认证机制
前端·微服务·服务端