Qwen-VL:通义千问多模态视觉语言模型

FreeGuideOnline 最新 2026-06-22

bash pip install transformers>=4.37.0 accelerate tiktoken pillow torchvision


建议同时安装 `modelscope` 或通过 Hugging Face 下载模型,这里以 ModelScope 为例:

```bash
pip install modelscope

加载模型与处理器

from modelscope import snapshot_download, AutoModelForCausalLM, AutoTokenizer
from transformers import AutoProcessor
import torch

model_dir = snapshot_download("Qwen/Qwen-VL-Chat")
# 如果下载 Qwen2-VL,将路径替换为 Qwen/Qwen2-VL-7B-Instruct 等

model = AutoModelForCausalLM.from_pretrained(
    model_dir, 
    device_map="auto", 
    trust_remote_code=True, 
    torch_dtype=torch.float16
).eval()

tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)

单图对话示例

下面代码演示上传一张本地图片,并询问图片内容。

from PIL import Image
import requests

# 准备图片(可以是本地路径或 URL)
image_path = "demo.jpg"  # 请替换为实际图片路径
image = Image.open(image_path)

# 构造对话(Qwen-VL 使用特殊 tokens 标记图片)
messages = [
    {
        "role": "user",
        "content": [
            {"image": image_path},  # 也可传入 PIL 对象
            {"text": "描述这张图片的内容,并提取图中所有文字。"},
        ],
    }
]

# 准备输入
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=[text], images=[image], padding=True, return_tensors="pt")
inputs = inputs.to(model.device)

# 生成回复
with torch.no_grad():
    generated_ids = model.generate(**inputs, max_new_tokens=512)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

如果使用 Qwen2-VL,图像输入支持直接传入 PIL.Image 对象列表,且模板略有不同,建议查阅对应模型的 README 文档。

多轮多图对话

只需在 messages 列表中追加新的用户消息,并传入不同图片即可:

messages = [
    {
        "role": "user",
        "content": [
            {"image": "photo1.jpg"},
            {"text": "第一张图里有什么动物?"}
        ]
    },
    {
        "role": "assistant",
        "content": [
            {"text": "第一张图是一只橘猫在窗台上。"}
        ]
    },
    {
        "role": "user",
        "content": [
            {"image": "photo2.jpg"},
            {"text": "第二张图和第一张是同一只猫吗?"}
        ]
    }
]