安装咒语清单 📜
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当天的心情~
(建议亲自试试,反正烧的是你的显卡)🔥