Qwen2.5-VL 系列模型正式开源
通义千问团队正式开源了 Qwen2.5-VL 系列视觉语言模型。该系列包含三种尺寸:3B(适合端侧部署)、7B(速度与效果平衡)以及 72B(最强效果)。在多个榜单上,7B 版本已达到开源模型 Top1,72B 版本性能可与 GPT-4o、Claude 3.5 等闭源模型抗衡。
模型架构与特性
Qwen2.5-VL 在视觉编码器部分采用了原生训练的支持动态分辨率的 ViT(Vision Transformer)。
空间维度增强
在空间维度引入大量检测框和点等坐标信息,使模型能够理解空间的尺寸和相对位置关系,这对于表格解析、图表理解等任务至关重要。
时间维度编码
在时间维度引入动态 FPS 和绝对时间编码,使 mRoPE(multi-dimensional Rotary Positional Embedding)的 ids 与时间快慢进行对齐,让模型能够理解视频的时序流速。这使得模型支持长达 1 小时的视频理解,并具备更细粒度的时间感知能力。
核心能力提升
除了基础的对话、指令跟随、数学计算和代码生成能力外,Qwen2.5-VL 还具备以下显著特性:
- 结构化输出:支持坐标、JSON 等返回格式,便于程序化调用。
- Agent 能力:具备更强的智能体能力,可操作手机和电脑界面。
- 知识解析:具备更全面的知识解析能力,能处理复杂的多模态信息。
实测表现
本次测试主要基于官方提供的在线演示链接进行验证,重点考察表格解析、数学推理及信息抽取能力。
表格解析能力
表格识别是多模态大模型的难点之一。测试涵盖了简单、中等及复杂三种难度的表格。
- 简单表格:模型解析结果完全正确。
- 中等表格:包含较多文字及合并单元格交错情况(如第 6、7 行的 2、4 列),此前多数多模态模型在此类场景下表现不佳,但 Qwen2.5-VL-72B 依然完全正确。
- 复杂表格:结构更为复杂,模型依旧保持高精度解析。
相比 GPT-4o、Claude 及 Gemini 等竞品,Qwen2.5-VL 在表格解析任务上展现了显著优势。
数学推理能力
测试选取了 2024 年高考全国甲卷数学试题(文科及理科)。
- 文科试题:模型给出的结果正确。
- 理科试题:模型不仅得出正确答案,还能准确推导出方程 C 的具体形式。
信息抽取与 OCR
- 单图片信息抽取 + 计算:输入包含中英文数据的统计图,要求分析占比并计算总和,模型回答正确。
- 单图片理解:针对图片内容提问(如'这张图片里是有两只狗,对吗'),模型判断完全正确。
- 手写 OCR:针对手写文字提取,模型基本准确,仅个别连笔字存在误差,符合当前技术边界。
- 多图片信息抽取:输入两张账单图片,询问总花费,模型计算完全正确。
色盲测试
通过红绿色盲测试图验证颜色识别能力。图 1 结果正确,图 2 结果错误,整体通过率约 50%,表明在特定颜色区分任务上仍有优化空间。
快速使用指南
目前相关代码位于 Hugging Face Transformers 主分支,使用前需安装最新版依赖。
环境准备
pip install git+https://github.com/huggingface/transformers accelerate
代码示例
以下是基于 Python 的调用示例:
from transformers Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
qwen_vl_utils process_vision_info
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
, torch_dtype=, device_map=
)
processor = AutoProcessor.from_pretrained()
messages = [
{
: ,
: [
{: , : },
{: , : }
],
}
]
text = processor.apply_chat_template(
messages, tokenize=, add_generation_prompt=
)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=[text],
images=image_inputs,
videos=video_inputs,
padding=,
return_tensors=,
)
inputs = inputs.to()
generated_ids = model.generate(**inputs, max_new_tokens=)
generated_ids_trimmed = [
out_ids[(in_ids):] in_ids, out_ids (inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=, clean_up_tokenization_spaces=
)
(output_text)


