1. 前言

随着多模态大模型的快速发展,视频分析能力成为各大模型的重要竞争力。以下对当前主流的开源视频分析大模型进行简要梳理。

1.1 主流开源视频分析模型概述

模型名称 开发机构 参数规模 视频理解 开源协议 主要特点
Qwen3-VL 阿里云通义千问 2B/4B/8B/30B-A3B/32B/235B-A22B Apache 2.0 工业级最强多模态模型,支持256K上下文,视频理解能力突出
GLM-4V-9B 智谱AI 9B GPL-3.0 清华系GLM系列的视觉版本,GUI Agent能力突出
CogVLM/CogAgent 清华THUDM 17B/18B ✅ (v2支持) Apache 2.0 视觉专家模型,GUI Agent能力领先,支持1120×1120高分辨率
LLaVA LLaVA团队 7B/13B/34B/72B ✅ (NeXT/Video) Apache 2.0 最流行的开源VLM系列,社区生态丰富
InternVL2 上海AI实验室 2B/8B/26B/40B/76B Apache 2.0 性价比高的多模态模型,76B版本性能接近GPT-4V
Yi-Video 零一万物 34B 定制开源协议 专注视频理解,时序建模能力强

1.2 关键能力对比

能力维度 Qwen3-VL GLM-4V CogVLM LLaVA
图像分辨率 自适应(最高无限分辨率) 自适应 最高1120×1120 最高224×224
视频理解 ✅ 长视频+秒级索引 ✅ (v2)
OCR多语言 32种语言 中文为主 多语言 英语为主
空间理解 ✅ 2D/3D定位
Agent能力 ✅ GUI/手机控制 ✅ GUI Agent ✅ GUI Agent
数学推理 ✅ 强化 ✅ 强化 一般 一般

2. Qwen3-VL

2.1 模型简介

Qwen3-VL是通义千问团队研发的最新版视觉语言模型,是目前开源界最强的多模态模型之一。该系列采用Dense和MoE两种架构,从边缘设备到云端均可部署,并提供Instruct和Thinking两个版本。

2.2 核心能力

2.2.1 视觉能力
  • 视觉Agent:可操作PC/手机GUI界面,识别元素、理解功能、调用工具、完成任务
  • 视觉编码增强:可从图片/视频生成Draw.io/HTML/CSS/JS代码
  • 高级空间感知:判断物体位置、视角、遮挡关系,支持2D和3D定位
  • 长上下文与视频理解:原生支持256K上下文,可扩展至1M;支持书籍和长视频理解,支持秒级时间索引
2.2.2 视觉识别增强
  • 更广泛的高质量预训练数据,能"识别一切":名人、动漫、商品、地标、动植物等
  • 扩展OCR支持32种语言(从10种升级),在弱光、模糊、倾斜场景下鲁棒性强
  • 对罕见/古文字和术语有更好的识别能力,长文档结构解析能力更强
2.2.3 文本理解
  • 文本理解能力与纯LLM持平
  • 文本-视觉无缝融合,实现无损统一理解

2.3 模型架构创新

  1. Interleaved-MRoPE:通过健壮的位置编码在时间、宽度、高度三个维度上实现全频率分配,增强长视界视频推理
  2. DeepStack:融合多级ViT特征,捕捉细粒度细节,增强图文对齐
  3. 文本-时间戳对齐:超越T-RoPE,实现精确的时间戳定位事件,增强视频时序建模

2.4 模型规格

型号 类型 参数规模 序列长度 下载链接
Qwen3-VL-2B Instruct/Thinking 2B 256K+ HuggingFace
Qwen3-VL-4B Instruct/Thinking 4B 256K+ HuggingFace
Qwen3-VL-8B Instruct/Thinking 8B 256K+ HuggingFace
Qwen3-VL-30B-A3B Instruct/Thinking 30B(A3B激活) 256K+ HuggingFace
Qwen3-VL-32B Instruct/Thinking 32B 256K+ HuggingFace
Qwen3-VL-235B-A22B Instruct/Thinking 235B(A22B激活) 256K+ HuggingFace

2.5 最小显存需求(Transformers推理)

精度 2B 4B 8B 32B 235B-A22B
FP32 0.23 GB 0.46 GB 0.92 GB 133.11 GB ~1.3 TB
BF16 0.12 GB 0.23 GB 0.46 GB 66.5 GB ~665 GB
INT8 0.06 GB 0.12 GB 0.23 GB 33.28 GB -
INT4 0.03 GB 0.06 GB 0.12 GB 16.64 GB -

2.6 优势

  • 视频理解能力最强:支持长视频理解,秒级时间索引,视频OCR能力强
  • 多分辨率自适应:支持任意分辨率输入,无需固定尺寸
  • 丰富的Cookbook:提供10+官方教程,涵盖识别、定位、文档解析、视频理解、Agent等
  • API友好:支持阿里云API,一键调用
  • 多模态编码:支持图片、视频、多模态混合输入

2.7 不足

  • 大模型资源需求高:235B-A22B版本需要大量GPU资源
  • 部分Cookbook还在更新中:并非所有能力都有完整教程
  • 中文文档较少:主要文档为英文

3. GLM-4V / GLM-4.1V

3.1 模型简介

GLM-4V是智谱AI基于GLM-4系列开发的视觉语言模型。2025年7月,智谱发布了GLM-4.1V-9B-Thinking系列VLM,增强了推理能力。

3.2 核心能力

3.2.1 视觉理解
  • 支持图像理解和多轮对话
  • 支持文档、图表、数学公式的识别和理解
  • 支持高分辨率图像输入
3.2.2 Agent能力
  • GUI Agent:支持桌面操作自动化
  • 搜索能力:支持联网搜索和信息检索
  • 函数调用:支持工具调用和API交互
3.2.3 推理能力
  • GLM-Z1系列强化数学推理
  • 支持深度思考(Thinking)模式
  • Rumination模式支持更长的推理链

3.3 模型规格

型号 类型 参数规模 序列长度 下载链接
GLM-4-9B-0414 Chat 9B 32K-128K HuggingFace
GLM-4V-9B Chat 9B 8K HuggingFace
GLM-4.1V-9B-Thinking Reasoning 9B 128K HuggingFace
GLM-4-32B-0414 Chat 32B 32K-128K HuggingFace
GLM-Z1-32B-0414 Reasoning 32B 128K HuggingFace
GLM-Z1-Rumination-32B-0414 Reasoning 32B 128K HuggingFace

3.4 优势

  • 国内生态完善:智谱AI提供完整的国内部署方案
  • GLM-4.1V-Thinking:新增推理增强版本,数学和逻辑推理能力显著提升
  • 中文优化好:对中文文档、表格、公式的支持较好
  • Agent能力强:GUI Agent功能成熟

3.5 不足

  • 视频理解相对弱:相比Qwen3-VL,视频时序建模能力较弱
  • 上下文长度有限:原生32K,需YaRN扩展
  • 社区生态:相比Qwen和LLaVA,社区资源和预训练模型较少

4. CogVLM/CogAgent

4.1 模型简介

CogVLM是清华大学THUDM团队开发的视觉语言模型,后续进化出CogAgent(专注GUI Agent)。目前最新版本为CogVLM2,基于LLaMA-3-8B构建,在多数场景下性能媲美GPT-4V。

4.2 核心能力

4.2.1 CogVLM
  • 17B参数(10B视觉+7B语言)
  • 支持490×490分辨率图像理解
  • 多轮对话
4.2.2 CogAgent
  • 18B参数(11B视觉+7B语言)
  • 支持1120×1120高分辨率
  • GUI Agent能力,支持桌面操作
  • 支持定位(Grounding)功能

4.3 优势

  • GUI Agent领先:在AITW、Mind2Web等GUI数据集上表现优异
  • 高分辨率支持:1120×1120输入,适合文档/图表分析
  • 4-bit量化:仅需11GB显存即可推理
  • 社区活跃:清华维护,文档完善

4.4 不足

  • 参数规模较小:相比Qwen3-VL-235B,能力差距明显
  • 视频支持有限:主要在图像理解上优化
  • 中文生态:虽然模型支持中文,但主要社区在英文

5. 常见部署方案

5.1 vLLM部署方案

vLLM是目前最高效的LLM/VLM推理框架,支持PagedAttention、Continuous Batching等核心技术。

5.1.1 安装
pip install vllm
# 或使用conda
conda install -c conda-forge vllm
5.1.2 Qwen3-VL部署示例
from vllm import LLM, SamplingParams
from transformers import AutoProcessor

# 加载模型
llm = LLM(
    model="Qwen/Qwen3-VL-8B-Instruct",
    tensor_parallel_size=1,  # 多GPU并行
    max_model_len=4096,
    dtype="bfloat16"
)

# 处理器
processor = AutoProcessor.from_pretrained("Qwen/Qwen3-VL-8B-Instruct")

# 采样参数
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.8,
    max_tokens=512
)

# 构建消息
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "https://example.com/image.jpg"},
            {"type": "text", "text": "描述这张图片"}
        ]
    }
]

# 推理
inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_dict=True,
    return_tensors="pt"
)

outputs = llm.generate(inputs)

for output in outputs:
    print(output.outputs[0].text)
5.1.3 vLLM部署优化参数
llm = LLM(
    model="Qwen/Qwen3-VL-8B-Instruct",
    tensor_parallel_size=4,      # 4卡并行
    pipeline_parallel_size=1,    # 流水线并行
    max_num_seqs=256,            # 最大序列数
    gpu_memory_utilization=0.9,  # GPU显存利用率
    dtype="float16",             # 使用FP16节省显存
    quantization="awq",          # 量化(可选)
    max_model_len=8192,          # 最大上下文长度
)
5.1.4 vLLM API服务
from vllm import AsyncEngineArgs, AsyncLLMEngine

engine_args = AsyncEngineArgs(
    model="Qwen/Qwen3-VL-8B-Instruct",
    tensor_parallel_size=1,
    max_model_len=4096,
    dtype="bfloat16"
)

llm = AsyncLLMEngine.from_engine_args(engine_args)

# 可通过OpenAI兼容接口访问
# curl http://localhost:8000/v1/chat/completions

5.2 其他部署方案

5.2.1 Transformers原生部署
from transformers import AutoModelForImageTextToText, AutoProcessor

model = AutoModelForImageTextToText.from_pretrained(
    "Qwen/Qwen3-VL-8B-Instruct",
    dtype="auto",
    device_map="auto"
)

processor = AutoProcessor.from_pretrained("Qwen/Qwen3-VL-8B-Instruct")
5.2.2 Ollama部署
# 安装Ollama
curl -fsSL https://ollama.com/install.sh | sh

# 拉取Qwen3-VL模型
ollama pull qwen3-vl:8b

# 运行
ollama run qwen3-vl:8b
5.2.3 阿里云API部署
import dashscope
from dashscope import MultiModalConversation

response = MultiModalConversation.call(
    model="qwen-vl-max-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {"image": "https://example.com/image.jpg"},
                {"text": "描述这张图片"}
            ]
        }
    ]
)
print(response.output.choices[0].message.content)

5.3 部署方案对比

方案 易用性 性能 显存需求 适用场景
vLLM ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 优化 生产环境
Transformers ⭐⭐⭐⭐⭐ ⭐⭐⭐ 开发/测试
Ollama ⭐⭐⭐⭐⭐ ⭐⭐⭐ 中等 本地快速体验
阿里云API ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 无需 快速集成

6. 客户端测试工具

以下是一个Python客户端测试工具,用于测试Qwen3-VL和GLM-4V等模型的图像理解能力:

6.1 安装依赖

pip install requests pillow transformers qwen-vl-utils

6.2 测试代码

"""
视频分析大模型客户端测试工具
支持Qwen3-VL、GLM-4V、阿里云API等多种模型
"""

import requests
import base64
from PIL import Image
from io import BytesIO
import time
import argparse
from typing import List, Dict, Optional


class VisionModelTester:
    """视觉模型测试器"""
    
    def __init__(self, base_url: str = "http://localhost:8000", api_key: str = ""):
        self.base_url = base_url
        self.api_key = api_key
        self.headers = {
            "Content-Type": "application/json"
        }
        if api_key:
            self.headers["Authorization"] = f"Bearer {api_key}"
    
    def encode_image(self, image_path: str) -> str:
        """将图片编码为base64"""
        with open(image_path, "rb") as image_file:
            return base64.b64encode(image_file.read()).decode('utf-8')
    
    def test_qwen3_vl(self, image_path: str, prompt: str = "描述这张图片") -> Dict:
        """测试Qwen3-VL模型"""
        image_b64 = self.encode_image(image_path)
        
        payload = {
            "model": "Qwen/Qwen3-VL-8B-Instruct",
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image",
                            "image": f"data:image/jpeg;base64,{image_b64}"
                        },
                        {
                            "type": "text",
                            "text": prompt
                        }
                    ]
                }
            ],
            "max_tokens": 512,
            "temperature": 0.7
        }
        
        return self._send_request(payload)
    
    def test_glm4_v(self, image_path: str, prompt: str = "描述这张图片") -> Dict:
        """测试GLM-4V模型"""
        image_b64 = self.encode_image(image_path)
        
        payload = {
            "model": "THUDM/glm-4v-9b",
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image",
                            "image": f"data:image/jpeg;base64,{image_b64}"
                        },
                        {
                            "type": "text",
                            "text": prompt
                        }
                    ]
                }
            ],
            "max_tokens": 512,
            "temperature": 0.7
        }
        
        return self._send_request(payload)
    
    def test_alibaba_api(self, image_path: str, prompt: str = "描述这张图片") -> Dict:
        """测试阿里云API"""
        image_b64 = self.encode_image(image_path)
        
        payload = {
            "model": "qwen-vl-max-latest",
            "input": {
                "messages": [
                    {
                        "role": "user",
                        "content": [
                            {
                                "image": f"data:image/jpeg;base64,{image_b64}"
                            },
                            {
                                "text": prompt
                            }
                        ]
                    }
                ]
            },
            "parameters": {
                "max_tokens": 512,
                "temperature": 0.7
            }
        }
        
        return self._send_request(payload)
    
    def _send_request(self, payload: Dict) -> Dict:
        """发送请求到模型服务"""
        try:
            start_time = time.time()
            response = requests.post(
                f"{self.base_url}/v1/chat/completions",
                headers=self.headers,
                json=payload,
                timeout=60
            )
            elapsed = time.time() - start_time
            
            if response.status_code == 200:
                result = response.json()
                return {
                    "success": True,
                    "response_time": f"{elapsed:.2f}s",
                    "content": result["choices"][0]["message"]["content"],
                    "usage": result.get("usage", {})
                }
            else:
                return {
                    "success": False,
                    "error": response.text,
                    "status_code": response.status_code
                }
        except Exception as e:
            return {
                "success": False,
                "error": str(e)
            }
    
    def benchmark(self, image_path: str, prompt: str = "描述这张图片", num_runs: int = 5) -> Dict:
        """基准测试"""
        results = []
        for i in range(num_runs):
            result = self.test_qwen3_vl(image_path, prompt)
            if result["success"]:
                results.append(result)
        
        if results:
            times = [float(r["response_time"].replace("s", "")) for r in results]
            return {
                "num_runs": num_runs,
                "successful_runs": len(results),
                "avg_time": f"{sum(times)/len(times):.2f}s",
                "min_time": f"{min(times):.2f}s",
                "max_time": f"{max(times):.2f}s",
                "sample_responses": [r["content"] for r in results[:3]]
            }
        return {"error": "All runs failed"}


def main():
    parser = argparse.ArgumentParser(description="视觉模型测试工具")
    parser.add_argument("--image", required=True, help="测试图片路径")
    parser.add_argument("--prompt", default="描述这张图片", help="测试提示词")
    parser.add_argument("--url", default="http://localhost:8000", help="API地址")
    parser.add_argument("--model", choices=["qwen3-vl", "glm4-v", "alibaba"], default="qwen3-vl", help="模型类型")
    parser.add_argument("--benchmark", type=int, default=0, help="基准测试次数")
    parser.add_argument("--key", default="", help="API密钥")
    
    args = parser.parse_args()
    
    tester = VisionModelTester(args.url, args.key)
    
    if args.benchmark > 0:
        print(f"开始{args.benchmark}轮基准测试...")
        result = tester.benchmark(args.image, args.prompt, args.benchmark)
        print(f"测试结果: {result}")
    else:
        print(f"使用模型: {args.model}")
        print(f"图片: {args.image}")
        print(f"提示词: {args.prompt}")
        print("-" * 50)
        
        if args.model == "qwen3-vl":
            result = tester.test_qwen3_vl(args.image, args.prompt)
        elif args.model == "glm4-v":
            result = tester.test_glm4_v(args.image, args.prompt)
        else:
            result = tester.test_alibaba_api(args.image, args.prompt)
        
        if result["success"]:
            print(f"响应时间: {result['response_time']}")
            print(f"内容: {result['content']}")
        else:
            print(f"错误: {result.get('error', 'Unknown error')}")


if __name__ == "__main__":
    main()

6.3 使用说明

# 基本测试
python test_vision_model.py --image test.jpg --prompt "描述这张图片"

# 指定模型
python test_vision_model.py --image test.jpg --model qwen3-vl

# 基准测试
python test_vision_model.py --image test.jpg --benchmark 5

# 使用自定义API地址
python test_vision_model.py --image test.jpg --url http://your-server:8000

# 阿里云API
python test_vision_model.py --image test.jpg --model alibaba --key YOUR_API_KEY

7. 结束语

7.1 模型选择建议

场景 推荐模型 理由
生产环境视频分析 Qwen3-VL-235B/32B 能力最强,社区支持好
边缘设备部署 Qwen3-VL-2B/4B 参数小,性能尚可
GUI自动化 CogAgent/GLM-4.1V GUI Agent能力突出
中文场景 GLM-4V 中文优化好,国内生态完善
快速原型 阿里云API 无需部署,开箱即用
学术研究 Qwen3-VL/GLM-4V 论文完善,开源协议友好

7.2 未来展望

  • 更长视频理解:当前模型对长视频的理解仍然有限,未来将支持更长时序建模
  • 更精细时空定位:从2D定位到3D定位,从秒级到帧级定位
  • 多模态Agent:视频理解+行动决策的闭环
  • 端侧部署:模型压缩和量化技术将使手机/平板等设备运行大模型
  • 多语言OCR:支持更多语言和手写体

7.3 参考资料

更多推荐