VLM 架构演进

视觉语言模型(Vision-Language Model, VLM)的发展经历了三个主要阶段:

第一代:对齐架构(CLIP/BLIP)

图像 → 视觉编码器(ViT) ──┐
                          ├── 对比学习/交叉注意力 → 相似度/描述
文本 → 文本编码器(BERT) ──┘

CLIP 和 BLIP 采用双编码器架构,主要用于图文检索和零样本分类,不具备生成能力。

第二代:桥接架构(LLaVA/MiniGPT-4)

图像 → ViT → 投影层(MLP/Q-Former) → 视觉Token → 拼接到文本Token → LLM → 生成

LLaVA 开创了"视觉编码器 + 投影层 + LLM"的范式,成为开源 VLM 的事实标准。

第三代:原生多模态(GPT-4V/Gemini/Qwen2-VL)

图像 → 自适应分辨率编码 → 视觉Token(动态数量) → 与文本统一处理 → LLM → 生成
                                              训练时即融合多模态

原生多模态模型从训练初期就同时处理文本和图像,而非后期拼接。

主流 VLM 对比

模型参数量视觉编码器上下文分辨率视频开源
GPT-4o~200B内置128K2048×2048
Claude 4 Opus~200B内置200K2048×2048
Gemini 2.5~300B内置1M4096×4096
Qwen2.5-VL-72B72BViT(675M)128K原生4K
InternVL2.5-78B78BInternViT(6B)128K4K
LLaVA-OneVision-72B72BSigLIP(0.4B)32K768px
GLM-4V-Plus~130BViT-H128K1344px
Pixtral 12B12BPixtral-ViT128K1024px
Gemma-3-27B27BSigLIP-L128K896px

架构深度解析

LLaVA 架构(开源标杆)

class LLaVA(nn.Module):
    def __init__(self, llm, vision_tower, mm_projector):
        self.llm = llm                    # 任意 LLM (Llama/Qwen/Mistral)
        self.vision_tower = vision_tower  # 通常是 CLIP-ViT-L/14
        self.mm_projector = mm_projector  # MLP 投影层

    def forward(self, images, input_ids):
        # 1. 视觉编码
        image_features = self.vision_tower(images)  # [batch, n_patches, 1024]
        # 2. 投影到 LLM 空间
        image_embeds = self.mm_projector(image_features)  # [batch, n_patches, 4096]
        # 3. 替换 <image> 占位符
        text_embeds = self.llm.embed_tokens(input_ids)
        # 找到 <image> token 位置,替换为 image_embeds
        merge_indices = (input_ids == IMAGE_TOKEN_ID).nonzero()
        final_embeds = scatter_replace(text_embeds, image_embeds, merge_indices)
        # 4. LLM 处理
        return self.llm(inputs_embeds=final_embeds)

Qwen2.5-VL 的动态分辨率

Qwen2.5-VL 引入了原生动态分辨率(NaViD),这是相比 LLaVA 固定分辨率的重要改进:

# 传统 LLaVA:固定 336×336,高分辨率信息丢失
# Qwen2.5-VL:动态调整 patch 数量

def dynamic_resolution(image, max_tokens=16384):
    h, w = image.size
    # 根据图像尺寸动态计算 patch 数
    # 保持长宽比,限制总 token 数
    ratio = min(max_tokens / (h * w / (28*28)), 1.0)
    new_h = int(h * ratio ** 0.5) // 28 * 28
    new_w = int(w * ratio ** 0.5) // 28 * 28
    return image.resize((new_w, new_h))

# 一张 4K 图片可能产生 ~2000 个视觉 token
# 一张小图标可能只产生 ~50 个 token
# 按需分配,避免浪费

InternVL2 的像素洗牌

InternVL2 使用 Pixel Shuffle 技术减少视觉 token 数量:

def pixel_shuffle(image_features, scale=0.5):
    # 将 4 个相邻 patch 合并为 1 个
    # [batch, h, w, dim] → [batch, h/2, w/2, dim*4]
    # 然后用线性层降维回 dim
    # 效果:视觉 token 减少 75%
    pass

性能基准

MMMU(大学级多学科视觉理解)

模型MMMU(val)MMMU(test)备注
Gemini 2.5 Pro82.278.5闭源最强
GPT-4o69.166.3
Claude 4 Opus73.570.2
Qwen2.5-VL-72B70.267.8开源最强
InternVL2.5-78B68.165.3
LLaVA-OV-72B56.854.1
GLM-4V-Plus63.560.7

OCR 能力

模型OCRBench中文 OCR表格识别手写体
Qwen2.5-VL-72B88.392.185.478.6
InternVL2.5-78B85.786.382.174.3
GLM-4V-Plus85.790.580.272.1
GPT-4o87.285.488.181.2
Gemma-3-27B85.778.375.668.5

中文 OCR 场景下 Qwen2.5-VL 和 GLM-4V-Plus 明显优于 GPT-4o。

视频理解(Video-MME)

模型短视频(<2min)中视频(4-15min)长视频(30-60min)
Gemini 2.5 Pro85.278.372.1
GPT-4o80.373.565.4
Qwen2.5-VL-72B76.870.162.3
InternVL2.5-78B74.367.858.6

实战:构建文档分析系统

from openai import OpenAI
import base64

client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")

def analyze_document(image_path, task="提取所有文字内容"):
    with open(image_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode()

    response = client.chat.completions.create(
        model="Qwen/Qwen2.5-VL-72B-Instruct",
        messages=[{
            "role": "user",
            "content": [
                {"type": "image_url", "image_url": {
                    "url": f"data:image/png;base64,{img_b64}"
                }},
                {"type": "text", "text": f"""请执行以下任务:{task}

要求:
1. 保持原文结构
2. 表格用 Markdown 格式输出
3. 标注不确定的内容
"""}
            ]
        }],
        temperature=0.1,
        max_tokens=4096
    )
    return response.choices[0].message.content

# 复杂图表分析
chart_result = analyze_document(
    "revenue_chart.png",
    "分析这张营收图表,提取各季度数据,计算增长率,预测下季度趋势"
)

部署成本分析

开源模型部署

模型显存(FP16)显存(INT4)推荐硬件吞吐(img/s)
LLaVA-OV-7B~14 GB~5 GBRTX 4090~8
Gemma-3-4B~8 GB~3 GBRTX 3060~12
Qwen2.5-VL-7B~16 GB~6 GBRTX 4090~7
InternVL2-8B~18 GB~6 GBRTX 4090~6
Qwen2.5-VL-72B~150 GB~42 GB2×A100 80GB~2
InternVL2.5-78B~165 GB~45 GB4×A100 80GB~1.5

API 调用成本

服务商模型图像价格输入输出
OpenAIGPT-4o1500 token/图2.75$/M11$/M
GoogleGemini 2.5 Flash按分辨率0.3$/M2.4$/M
阿里Qwen-VL-Plus0.8分/张8元/M8元/M
智谱GLM-4V-Plus按 token50元/M50元/M

Gemini 2.5 Flash 在 API 调用成本上具有压倒性优势。

选型决策树

需要视频理解?
├── 是 → 预算充足?
│        ├── 是 → Gemini 2.5 Pro API(最强视频)
│        └── 否 → Qwen2.5-VL-72B(开源最强视频)
└── 否 → 主要语言?
         ├── 中文为主 → Qwen2.5-VL-72B 或 GLM-4V-Plus
         ├── 英文为主 → GPT-4o API 或 InternVL2.5-78B
         └── 多语言 → Gemini 2.5 或 GPT-4o
              └── 需要本地部署?
                   ├── 消费级 GPU → Gemma-3-4B 或 Qwen2.5-VL-7B
                   ├── 工作站 → Qwen2.5-VL-72B (INT4)
                   └── 服务器 → InternVL2.5-78B

场景推荐

场景最佳选择次选
OCR/文档数字化Qwen2.5-VL-72BGLM-4V-Plus
医疗影像分析GPT-4oQwen2.5-VL-72B
安防监控/视频分析Gemini 2.5 ProQwen2.5-VL-72B
图表数据提取GPT-4oQwen2.5-VL-72B
UI 自动化Qwen2.5-VL-72BGPT-4o
低成本部署Gemma-3-4BQwen2.5-VL-7B

总结

VLM 领域在 2025 年已趋于成熟。开源模型中,Qwen2.5-VL-72B 凭借原生动态分辨率和强中文 OCR 能力占据综合最优位置;InternVL2.5-78B 在英文场景表现更强;Gemma-3-4B 是轻量级部署的最佳选择。闭源模型中,Gemini 2.5 Pro 在视频理解和长文档处理上领先,GPT-4o 在通用视觉推理上依然强劲。选型的核心在于:中文场景优先选国产模型,成本敏感场景优先考虑 Gemini Flash API 或本地部署 Gemma-3。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。