QVQ-72B 视觉推理大模型开源评测与代码实现
引言
通义千问团队继开源代码推理模型 QWQ 之后,再次推出视觉推理大模型 QVQ-72B。该模型基于 Qwen2-VL-72B 进一步训练而来,旨在提升多模态场景下的复杂推理能力。本文将对 QVQ-72B 的性能表现、潜在问题及代码实践进行详细解析。
模型背景与架构
参数规模的重要性
QVQ 选择了 72B 参数量级,而非更小的 7B 版本。这主要考虑到 o1 式推理(Chain of Thought)对模型容量的要求。较小的参数量往往难以支撑复杂的思维链生成,导致推理效果不佳。QWQ 系列同样从 32B 起步,验证了大参数在逻辑推理任务中的关键作用。
技术基础
QVQ-72B 并非从零训练,而是建立在成熟的 Qwen2-VL-72B 视觉语言模型基础上。通过引入专门的推理指令微调(Instruction Tuning),模型被赋予了更强的逐步思考能力,使其在处理需要多步逻辑推导的视觉问题时表现更佳。
性能评估
基准测试表现
在 MMMU(Massive Multi-discipline Multimodal Understanding)等权威榜单上,QVQ-72B 取得了突破性成绩,分数突破 70 分。相较于基座模型 Qwen2-VL-72B,其在复杂视觉推理任务上的整体效果有显著提升。同时,该模型在多项指标上能够对标部分闭源商业模型,展现了开源模型的竞争力。
适用场景
- 复杂图表分析:能够理解包含数据趋势、逻辑关系的图表。
- 数学几何推理:结合图像信息进行几何证明或计算。
- 科学实验解读:分析实验装置图并推导结论。
局限性与风险
尽管 QVQ-72B 表现优异,但在当前 Preview 版本中仍存在以下需要注意的问题:
- 语言混乱:模型可能在中英文之间出现无意识的切换,影响输出的一致性。
- 循环推理:模型容易陷入自我重复的思维循环,导致回复内容冗长,甚至无法给出最终答案。
- 安全性考量:作为预览版,安全对齐可能尚未完善,需警惕潜在的有害输出。
- 幻觉风险:随着推理步骤的增加,模型可能逐渐偏离图像实际内容,产生幻觉。因此,它不能完全替代 Qwen2-VL-72B 用于简单的视觉问答任务。
快速开始指南
环境依赖
使用前请确保安装以下核心库:
pip install transformers torch qwen-vl-utils accelerate
代码实现
以下是使用 Hugging Face Transformers 加载和运行 QVQ-72B 的标准示例。请注意系统提示词(System Prompt)的特殊设置,这是触发推理模式的关键。
from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch
# 1. 加载模型
# 使用 device_map="auto" 可自动分配 GPU 资源,适合单卡或多卡环境
model = Qwen2VLForConditionalGeneration.from_pretrained(
"Qwen/QVQ-72B-Preview",
torch_dtype="auto",
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)


