魔法测试:用本地多模态大模型(Qwen2.5-VL)将PDF转为Markdown文档

发布于:2025-03-26 ⋅ 阅读:(28) ⋅ 点赞:(0)

安装咒语清单 📜

pip install -U vllm qwen-vl-utils pdf2image
pip install git+https://github.com/huggingface/transformers accelerate

(温馨提示:念咒前请检查你的魔法棒(Python环境)是否兼容~)在这里插入图片描述
在这里插入图片描述

第一阶段:PDF变形术 🎩→🖼️

import os
import shutil
from pdf2image import convert_from_path

class PdfToImg:
    """PDF转图像工具类 - 让枯燥的PDF在像素的海洋里畅游"""
    
    def __init__(
        self,
        dpi: int = 200,  # 分辨率越高,文件越大,你的内存哭得越惨
        fmt: str = "jpeg",  # 就像选择把PDF变成照片还是油画
        size: tuple = (700, None),  # 宽度700,高度随缘
        output_folder: str = "./out",  # 输出目录,会自动清空,小心别放重要文件!
    ):
        self.fmt = fmt  
        self.output_folder = output_folder
        self.paths_only = True  # 只返回路径不返回图片对象,省内存小技巧
        self.size = size  
        self.dpi = dpi  
        
        # 清空输出目录(危险动作,请勿模仿到生产环境)
        if os.path.exists(self.output_folder):
            shutil.rmtree(self.output_folder)
        os.makedirs(self.output_folder, exist_ok=True)

    def convert(self, file_path: str) -> list[str]:
        """执行转换 - 见证奇迹的时刻"""
        img_paths = convert_from_path(
            file_path,
            fmt=self.fmt,
            output_folder=self.output_folder,
            paths_only=self.paths_only,
            size=self.size,
            dpi=self.dpi,
        )
        if not img_paths:
            raise ValueError("转换失败!可能:1.PDF是空的 2.你的PDF在抗议 3.玄学问题")
        return img_paths

使用示例:

pdf2img = PdfToImg()  # 默认参数适合大多数凡人
pdf2img.convert("example.pdf")  # 请确保这个PDF不是你的毕业论文终稿

第二阶段:AI视觉魔法 🔮→📝

from transformers import AutoProcessor
from vllm import LLM, SamplingParams
from qwen_vl_utils import process_vision_info

class Qwen25VLModel:
    """Markdown生成器 - 让AI帮你写文档,卷死同事"""
    
    def __init__(self, model: str = "Qwen/Qwen2.5-VL-7B-Instruct-AWQ", **kwargs):
        self.model = model
        self.llm = LLM(model=self.model, **kwargs)  # 加载模型,祈祷你的显卡不会冒烟

    def generate(
        self, file_path: str, prompt: str = None, sampling_params: SamplingParams = None
    ) -> str:
        """核心生成方法 - AI开始它的表演"""
        if not prompt:
            prompt = "请将PDF文件中的图像内容准确提取并转换为标准Markdown格式,确保转换结果严格遵循Markdown语法规范,同时尽可能保留原始内容的结构和细节。"
            # 默认prompt写得这么详细,是怕AI偷懒吗?
        
        # 构建多模态输入(让AI既看图又看提示)
        message = [
            {"role": "system", "content": "你是文档解析专家"},
            {"role": "user", "content": [
                {"type": "image", "image": f"file://{file_path}"},
                {"type": "text", "text": prompt},
            ]}
        ]
        
        processor = AutoProcessor.from_pretrained(self.model)
        prompt = processor.apply_chat_template(message, tokenize=False, add_generation_prompt=True)
        image_input, _ = process_vision_info(message)

        outputs = self.llm.generate([{
            "prompt": prompt,
            "multi_modal_data": {"image": image_input} if image_input else {}
        }], sampling_params=sampling_params or SamplingParams(
            temperature=0.1,  # 低温让AI少说胡话
            min_p=0.1,  # 概率阈值
            max_tokens=8192,  # 最大长度,写小说都够了
            stop_token_ids=[],  # 不设停止符,让AI尽情发挥
        ))
        
        return outputs[0].outputs[0].text  # 从层层嵌套中取出生成的文本

# 初始化模型(显卡风扇开始狂转)
llm = Qwen25VLModel(
    model="Qwen/Qwen2.5-VL-7B-Instruct-AWQ",#用哪个模型在于你的实力
    dtype="half",  # float16量化,牺牲精度换速度
    max_model_len=7000,  # 上下文长度限制,防止OOM
)

# 施放魔法!
markdown_text = llm.generate(img_files[0]) 

效果如何?🤔
本AI只能说:效果介于"哇塞太神奇了"和"这什么鬼"之间,
取决于你的PDF内容、图片质量、星座运势和AI当天的心情~
(建议亲自试试,反正烧的是你的显卡)🔥