Qwen-VL 家族与动态 FPS 视频 本节摘要:Qwen-VL 家族——Qwen-VL(2023)、Qwen2-VL(2024)、Qwen2.5-VL(2025)、Qwen3-VL(2025)——是 2026 年最有影响力的开源视觉-语言模型谱系。每一代都做了一个决定性的架构押注,开源生态在十二个月内就会跟上:用 M-RoPE 做原生动态分辨率、配绝对时间对齐的动态 FPS 采样、ViT 里的窗口注意力、结构化 agent 输出格式。到 Qwen3-VL,配方已稳定:原生宽高比输入的 2D-RoPE-ViT 编码器、进大型 Qwen3 语言基座的 MLP 投影器,以及把 OCR、定位、agent 行为当作一等目标的训练阶段。本节按时间顺序读这个家族,让你明白每个旋钮为何在此。
本节摘要:Qwen-VL 家族——Qwen-VL(2023)、Qwen2-VL(2024)、Qwen2.5-VL(2025)、Qwen3-VL(2025)——是 2026 年最有影响力的开源视觉-语言模型谱系。每一代都做了一个决定性的架构押注,开源生态在十二个月内就会跟上:用 M-RoPE 做原生动态分辨率、配绝对时间对齐的动态 FPS 采样、ViT 里的窗口注意力、结构化 agent 输出格式。到 Qwen3-VL,配方已稳定:原生宽高比输入的 2D-RoPE-ViT 编码器、进大型 Qwen3 语言基座的 MLP 投影器,以及把 OCR、定位、agent 行为当作一等目标的训练阶段。本节按时间顺序读这个家族,让你明白每个旋钮为何在此。
阅读完本节,你应当能够:
Qwen-VL 在 2023 年 8 月发布,是对 LLaVA-1.5 与 BLIP-2 的直接回应。Qwen 团队瞄准的差距有三:分辨率、视频、结构化输出。
Qwen-VL 的每一代都延伸这三轴之一。
第一代:OpenCLIP ViT-bigG/14 作编码器(25 亿参数)、与 LLaMA 兼容的 Q-Former(256 query 的一步式)、Qwen-7B 基座。贡献:
<box>(112, 204), (280, 344)</box>」。当时的基准:英文上与 GPT-4V 竞争,中文上统治。定位监督才是真正的头条。
Qwen2-VL 用一个原生动态分辨率的 ViT 编码器,取代了固定分辨率 + Q-Former 的栈。关键改动:
结果:Qwen2-VL-7B 在多个多模态基准上追平 GPT-4o,并在 DocVQA 上胜过它(94.5 vs 88.4)。架构改动是决定性一步。
Qwen2.5-VL 的大转向在视频。动态 FPS 不只是「需要时多采几帧」,论文把它形式化了:
<time>0.04</time> token。{"tool": "click", "coords": [380, 220]}。开箱即 agent 就绪。基准:Qwen2.5-VL-72B 在大多数视频基准上胜过 GPT-4o,文档上追平 Gemini 2.0,并创下开源模型 GUI 定位的 SOTA(ScreenSpot:84% 准确率 vs GPT-4o 的 38%)。
Qwen3-VL 是增量升级,是巩固而非重造:更大的 LLM 主干(Qwen3-72B)、扩张的训练数据、改进的 OCR、通过 Qwen3「思考模式」更强的推理。ViT 与 M-RoPE 不变。论文聚焦数据与训练改进,而非架构。
谱系启示:到 2025 年,Qwen-VL 架构已稳定,后续代际扩算力与数据,而非原语。
经典 RoPE 用配对坐标,按位置 m 旋转维度 d 的 query q:
q_rot[2i] = q[2i] * cos(m * theta_i) - q[2i+1] * sin(m * theta_i) q_rot[2i+1] = q[2i] * sin(m * theta_i) + q[2i+1] * cos(m * theta_i) theta_i = 10000^(-2i/d)
M-RoPE 把隐藏维分成三段。设 d = 96,给时间 32 维、高 32 维、宽 32 维。每段按自己轴的位置旋转。(t=5, h=10, w=20) 的 patch 在三段上分别施加 R_t(5)、R_h(10)、R_w(20)。
文本 token 用 t = 文本索引, h = 0, w = 0(或归一化选择)以保兼容。视频帧用 t = 帧时间, h = 行, w = 列。单图用 t = 0。
好处:一个位置编码同时处理文本、图像、视频,无需分支代码或不同的位置表。
给定时长 T 秒的视频与目标 token 预算 B:
fps_max = B / (T * tokens_per_frame)。{1, 2, 4, 8} 里挑满足 fps <= fps_max 的目标 FPS。<time>t</time> token。Qwen2.5-VL 在训练中隐式学了这套逻辑;推理时用户用 fps 参数控制。60 秒动作序列、4 FPS、每帧 81 token = 19440 token,32k 上下文里可处理。
Qwen2.5-VL 的 agent 训练显式以结构化工具调用为目标:
{ "tool": "mouse_click", "coords": [1024, 512], "button": "left", "modifier": null }
解析是确定性的:对模型输出跑 JSON.parse。对比自由形式的「click at (1024, 512)」——那需要正则与歧义处理。这个转变正是 Qwen2.5-VL 的 ScreenSpot 分数从 Qwen2-VL 的 55% 跳到 84% 的原因。
code/main.py 实现:
def mrope_rotate(q, t, h, w, d=96, base=10000): # 三段: 时间 d/3, 高 d/3, 宽 d/3 band = d // 3 out = q.copy() for i in range(band // 2): theta = base ** (-2*i / band) # 时间段 out[2*i], out[2*i+1] = rotate_pair(q[2*i], q[2*i+1], t*theta) # 高段 out[band+2*i], out[band+2*i+1] = rotate_pair(q[band+2*i], q[band+2*i+1], h*theta) # 宽段 out[2*band+2*i], out[2*band+2*i+1] = rotate_pair(q[2*band+2*i], q[2*band+2*i+1], w*theta) return out def rotate_pair(a, b, angle): return (a*cos(angle) - b*sin(angle), a*sin(angle) + b*cos(angle))
def dynamic_fps(duration, budget, tokens_per_frame, motion_level): fps_max = budget / (duration * tokens_per_frame) candidates = [1, 2, 4, 8] fps = max([f for f in candidates if f <= fps_max], default=1) if motion_level == "high": # 动作镜头尽量挑高 fps = min(8, fps_max) n_frames = int(duration * fps) timestamps = [round(i / fps, 2) for i in range(n_frames)] return fps, timestamps # 帧间插 <time>t</time>
💡 关键设计:绝对时间 token 让模型看到真实秒数而非帧索引,因此「在 0:04 跳跃」与采样率无关——无论 1 FPS 还是 4 FPS,同一个事件的时间戳一致,模型的时间推理才稳定。
def parse_tool_call(response_text): # Qwen2.5-VL 输出可确定性 JSON.parse start = response_text.index("{") end = response_text.rindex("}") + 1 return json.loads(response_text[start:end]) # {"tool":"mouse_click","coords":[1024,512],...}
Qwen2_5_VLProcessor 暴露 min_pixels/max_pixels/fps,M-RoPE 与窗口注意力内置,JSON agent 输出是默认训练目标。工程取舍:要原生动态分辨率 + 时间对齐视频用 Qwen2.5/3-VL;要可预测预算用 OneVision;要 GUI agent 直接用 Qwen2.5-VL 的 ScreenSpot 84%;长视频用 Qwen 的动态 FPS + 绝对时间 token。
本节产出 outputs/skill-qwen-vl-pipeline-designer.md。给定一个视频任务(监控、agent、动作识别、无障碍),它输出 Qwen2.5-VL 配置(帧预算、FPS 策略、窗口注意力开关、agent 输出模式)与延迟估算。每当你为视频产品部署 Qwen-VL 系模型时都用它。
手算 M-RoPE:为 (t=3, h=5, w=7)、隐藏维 48(每段 16、base theta 10000)的 patch 算 M-RoPE 旋转,给出每段前三对的旋转角。
监控视频:10 分钟的安防录像,1 FPS 产多少帧?384 分辨率配 3× 池化共多少 token?Qwen2.5-VL 默认 32k 上下文能扛吗?
挑 FPS:为 30 秒网球回合、30 秒菜谱演示、30 秒 UI agent 录屏分别挑 FPS,用动态 FPS 逻辑论证。
为何 MLP 行了:Qwen2.5-VL 彻底丢掉 Q-Former。为什么 2025 年简单 MLP 能行,2023 年却不行?(提示:数据规模与编码器质量。)
解析 JSON:把三条 Qwen2.5-VL JSON 工具调用输出解析成 Python dict。畸形 JSON 会怎样失败?Qwen cookbook 推荐什么恢复策略?
<time>t</time> 让模型看真实秒数,与采样率无关,时间推理才稳。下一节,我们将进入 InternVL3——它走「原生多模态」路线,从一开始就在多模态数据上联合预训练视觉与语言,而非事后用投影器连接两个冻结塔。