视觉语言模型 (更好、更快、更强)
动机
视觉语言模型(VLM)是当前的热门话题。在我们之前的博客文章(2024 年 4 月)中,我们详细讨论了 VLM。其中很大一部分是关于 LLaVA,这是第一个成功且易于复现的开源视觉语言模型,以及如何发现、评估和微调开源模型的提示。
自那以来,变化巨大。模型变得更小巧但更强大。我们看到了新架构和能力的兴起(推理、代理、长视频理解等)。同时,多模态检索增强生成(RAG)和多模态代理等全新范式也已成形。
在这篇博客文章中,我们将回顾过去一年视觉语言模型领域发生的一切。您将发现关键变化、新兴趋势和显著发展。
如果您想很好地了解视觉语言模型的工作原理,我们强烈建议您阅读第一篇博客文章。
目录
新模型趋势
在本节中,我们将介绍新型 VLM。有些是全新的,另一些则是先前研究的改进版本。
任意到任意模型
任意到任意模型,顾名思义,就是可以接收任何模态输入并输出任何模态(图像、文本、音频)的模型。它们通过对模态进行对齐来实现这一点,即一种模态的输入可以转换为另一种模态(例如,“狗”这个词可以与狗的图像或单词的发音相关联)。
这些模型具有多个编码器(每个模态一个),然后将嵌入融合在一起,创建共享表示空间。解码器(多个或单个)使用共享潜在空间作为输入,并解码为所选模态。最早构建任意到任意模型的尝试是 Meta 的 Chameleon,它可以接收图像和文本并输出图像和文本。Meta 没有在此模型中发布图像生成能力,因此 Alpha-VLLM 发布了 Lumina-mGPT,它在 Chameleon 的基础上构建了图像生成。
最新且最强大的任意到任意模型 Qwen 2.5 Omni(如下图所示)是理解任意到任意模型架构的一个很好的例子。
Qwen2.5-Omni 采用了一种新颖的“思考者-说话者”架构,其中“思考者”处理文本生成,“说话者”以流式方式生成自然语音响应。MiniCPM-o 2.6,一个 8B 参数的多模态模型,能够理解和生成视觉、语音和语言模态的内容。DeepSeek AI 推出的 Janus-Pro-7B 是一个统一的多模态模型,擅长跨模态理解和生成内容。它具有解耦的视觉编码架构,将理解和生成过程分开。
我们预计未来几年这类模型的数量将增加。众所周知,多模态学习是我们更好地学习深度表示的唯一途径。我们已将一些任意到任意模型和演示整理到此合集中。
推理模型
推理模型是能够解决复杂问题的模型。我们首先在大语言模型中看到了它们,现在在视觉语言模型中也看到了它们。直到 2025 年,只有一个开源多模态推理模型,即 Qwen 的 QVQ-72B-preview。这是一个由阿里巴巴 Qwen 团队开发的实验性模型,附带许多免责声明。
今年又出现了一个新的参与者,即月之暗面团队的 Kimi-VL-A3B-Thinking。它由 MoonViT (SigLIP-so-400M) 作为图像编码器和具有 16B 总参数、仅 2.8B 活跃参数的专家混合 (MoE) 解码器组成。该模型是 Kimi-VL 基础视觉语言模型的长链思考微调版本,并进一步对齐(强化学习)。您可以在此处试用该模型。
作者还发布了一个指令微调版本,名为 Kimi-VL-A3B-Instruct。
该模型可以接收长视频、PDF、屏幕截图等。它还具有代理能力。
小巧而强大的模型
社区过去通过参数数量和高质量合成数据来扩展智能。达到一定程度后,基准测试趋于饱和,扩展模型的收益递减。社区通过蒸馏等各种方法来缩小大型模型。这样做是合理的,因为它降低了计算成本,简化了部署,并解锁了本地执行等用例,增强了数据隐私。
当我们谈论小型视觉语言模型时,我们通常指的是参数少于 2B 且可以在消费级 GPU 上运行的模型。SmolVLM 是小型视觉语言模型的一个很好的示例模型家族。作者没有缩小大型模型,而是全力以赴,尝试将模型拟合到 256M、500M 和 2.2B 等微小参数数量中。例如,SmolVLM2 试图以这些大小解决视频理解问题,发现 500M 是一个很好的权衡。在 Hugging Face,我们构建了一个 iPhone 应用程序 HuggingSnap,以演示这些模型大小可以在消费设备上实现视频理解。
另一个引人注目的模型是 Google DeepMind 的 gemma3-4b-it。它特别令人兴奋,因为它是最小的多模态模型之一,拥有 128k 令牌上下文窗口,并支持 140 多种语言。该模型属于 Gemma 3 系列模型,其最大的模型当时在 Chatbot Arena 上排名第一。然后最大的模型被蒸馏成 1B 变体。
最后,尽管不是最小的,但 Qwen2.5-VL-3B-Instruct 值得注意。该模型可以执行各种任务,从定位(物体检测和指向)到文档理解,再到代理任务;上下文长度可达 32k 令牌。
您可以通过 MLX 和 Llama.cpp 集成使用小型模型。对于 MLX,假设您已安装,您可以使用以下一行代码开始使用 SmolVLM-500M-Instruct
python3 -m mlx_vlm.generate --model HuggingfaceTB/SmolVLM-500M-Instruct --max-tokens 400 --temp 0.0 --image https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/vlm_example.jpg --prompt "What is in this image?"
您可以通过 CLI 使用 llama.cpp 的 GGUF 格式的 gemma-3-4b-it 模型,只需一行代码
llama-mtmd-cli -hf ggml-org/gemma-3-4b-it-GGUF
您也可以如下服务相同的模型。
llama-server -hf ggml-org/gemma-3-4b-it-GGUF
我们要特别感谢 moondream2 和 Florence-2,因为它们是最小视觉语言模型的最早尝试。在本博客中,我们主要介绍较新的模型(大多是 2024 年 4 月之后推出的模型)。
专家混合作为解码器
专家混合 (MoE) 模型通过动态选择并仅激活最相关的子模型(称为“专家”)来处理给定输入数据段,从而提供了一种替代密集架构的方法。这种选择性激活(由路由器完成)机制已证明能够显著提高模型性能和操作效率,同时利用更少的计算资源。
MoE 模型在推理速度上比同等参数密度的模型更快,因为它们只选择性地激活网络的一小部分。它们在训练过程中也能快速收敛。每件好事都有代价,MoE 模型需要更多的内存成本,因为整个模型都在 GPU 上,即使只使用了一小部分。
在广泛采用的 Transformer 架构中,MoE 层最常见的集成方式是替换每个 Transformer 块中的标准前馈网络 (FFN) 层。密集网络使用整个模型进行推理,而尺寸相似的 MoE 网络则选择性地激活一些专家。这有助于更好地利用计算资源并加速推理。
具有专家混合解码器的视觉语言模型似乎具有增强的性能。例如,Kimi-VL 是目前最先进的开放推理模型,具有专家混合解码器。专家混合在 MoE-LLaVA 专注于效率和幻觉减少方面以及 DeepSeek-VL2 的广泛多模态能力方面也显示出有希望的结果。最新版本的 Llama(Llama 4)是一个具有视觉能力的 MoE。MoE 作为解码器是一个有前途的研究领域,我们预计这类模型会增加。
为了更好地理解 MoE,我们建议阅读这篇精彩的文章。
视觉-语言-动作模型
VLM 甚至在机器人领域留下了自己的印记!在那里,它们被称为视觉-语言-动作模型(VLA)。但不要被愚弄,它们主要是戴着小胡子和帽子的 VLM。VLA 接收图像和文本指令,并返回指示机器人直接采取行动的文本。VLA 通过添加动作和状态令牌来扩展视觉语言模型,以与物理环境交互并控制物理环境。这些额外令牌代表系统内部状态(它如何感知环境)、动作(它根据命令做什么)和时间相关信息(例如任务中的步骤顺序)。这些令牌附加到视觉语言输入中以生成动作或策略。
VLA 通常在基础 VLM 之上进行微调。有些人进一步扩展了这一定义,将 VLA 定义为任何与真实或数字世界进行视觉交互的模型。在此定义中,VLA 可以进行 UI 导航或用于代理工作流。但许多人认为这些应用属于 VLM 领域。
VLA 的出色例子是 π0 和 π0-FAST,它们是 Physical Intelligence 的首批机器人基础模型,已移植到 Hugging Face 的 LeRobot 库。这些模型在 7 个机器人平台和 68 个独特任务上进行训练。它们在洗衣折叠、收拾餐桌、购物袋装箱、盒子组装和物体检索等复杂的现实世界活动中表现出强大的零样本和微调性能。
GR00T N1 是 NVIDIA 面向通用人形机器人的开源 VLA 基础模型。它理解图像和语言,并将其转化为动作,例如移动手臂或遵循指令,这得益于将智能推理与实时运动控制相结合的系统。GR00T N1 还基于 LeRobot 数据集格式构建,LeRobot 数据集格式是为简化机器人演示共享和训练而创建的开放标准。
摘自论文
现在我们已经了解了最新的 VLM 模型创新,接下来让我们探讨更成熟的功能是如何演进的。
专业能力
使用视觉语言模型进行物体检测、分割、计数
正如我们在前面章节中看到的,VLM 能够实现传统计算机视觉任务的泛化。模型现在可以接收图像和各种提示,例如开放式文本,并输出带有定位标记的结构化文本(用于检测、分割等)。
去年,PaliGemma 是第一个尝试解决这些任务的模型。该模型接收图像和文本,其中文本是感兴趣对象的描述以及任务前缀。文本提示看起来像“分割带条纹的猫”或“检测屋顶上的鸟”。
对于检测,模型输出边界框坐标作为标记。另一方面,对于分割,模型输出检测标记和分割标记。这些分割标记不是所有分割后的像素坐标,而是由变分自编码器解码的代码簿索引,该自编码器经过训练,可将这些标记解码为有效的分割掩模(如下图所示)。
PaliGemma 之后,许多模型被引入以执行定位任务。去年晚些时候,PaliGemma 的升级版本 PaliGemma 2 出现,具有相同的功能和更好的性能。另一个后来出现的模型是 Allen AI 的 Molmo,它可以指示实例并计数对象实例。
Qwen2.5-VL 还可以检测、指向和计数对象,其中也包括 UI 元素作为对象!
多模态安全模型
生产环境中的视觉语言模型需要过滤输入和输出,以防止越狱和有害输出,从而实现合规性。有害内容包括暴力和露骨色情内容。这就是多模态安全模型的作用:它们在视觉语言模型之前和之后用于过滤其输入和输出。它们就像 LLM 安全模型一样,但增加了图像输入。
2025 年初,Google 推出了第一个开放式多模态安全模型 ShieldGemma 2。它基于 ShieldGemma(仅文本安全模型)构建。该模型接收图像和内容策略,并返回图像是否符合给定策略的安全标准。策略指图像不适当的标准。ShieldGemma 2 也可用于过滤图像生成模型的输出。
Meta 的 Llama Guard 4 是一款密集的、多模态、多语言安全模型。它是从 Llama 4 Scout (一个多模态专家混合模型) 中密集剪枝得到的,并进行了安全微调。
该模型可用于纯文本和多模态推理。该模型还可以接收视觉语言模型输出,完成对话,并在发送给用户之前对其进行过滤。
多模态 RAG:检索器、重排序器
现在让我们看看检索增强生成在多模态领域是如何演进的。对于复杂文档(通常是 PDF 格式)的 RAG,处理分为三个步骤:
- 将文档完全解析为文本
- 将纯文本和查询传递给检索器和重排序器,以获取最相关的文档
- 将相关上下文和查询传递给 LLM
传统的 PDF 解析器包含多个元素,以保留文档中的结构和视觉元素,例如布局、表格、图像、图表,所有这些都渲染成 markdown 格式。但这种设置可能难以维护。
随着视觉语言模型的兴起,这个问题得到了解决:现在有了多模态检索器和重排序器。
多模态检索器接收一堆 PDF 和一个查询作为输入,并返回最相关的页码及其置信度分数。这些分数表示该页面包含查询答案的可能性,或者查询与该页面的相关程度。这绕过了脆弱的解析步骤。
然后,最相关的页面连同查询一起输入到视觉语言模型中,VLM 生成答案。
主要有两种多模态检索器架构
- 文档截图嵌入 (DSE, MCDSE)
- ColBERT 类模型 (ColPali, ColQwen2, ColSmolVLM)
DSE 模型由一个文本编码器和一个图像编码器组成,每个查询返回一个单一向量。返回的分数是点积嵌入的 softmax。它们为每个段落返回一个单一向量。
摘自论文
ColBERT-like 模型,如 ColPali,也是双编码器模型,但有一个变化:ColPali 使用视觉语言模型作为图像编码器,大型语言模型作为文本编码器。这些模型本质上不是编码器,但模型输出嵌入,然后将其传递给“MaxSim”。输出是多个向量,每个令牌一个,这与 DSE 不同。在 MaxSim 中,计算每个文本令牌嵌入和每个图像块嵌入之间的相似性,这种方法能更好地捕捉细微差别。因此,ColBERT-like 模型的成本效率较低,但性能更好。
您可以在下面看到 ColPali 的索引延迟。由于它只是一个模型,因此也更容易维护。
摘自论文
在 Hugging Face Hub 上,您可以在“视觉文档检索”任务下找到这些模型。
此任务最受欢迎的基准测试是 ViDoRe,它包含英语和法语文档,文档类型从财务报告、科学图表到行政文件不等。ViDoRe 的每个示例都包含图像文档、查询和可能的答案。与查询匹配的文档有助于对比预训练,因此 ViDoRe 训练集用于训练新模型。
多模态智能体
视觉语言模型解锁了从文档聊天到计算机使用等多种代理工作流。在这里,我们将重点介绍后者,因为它需要更高级的代理能力。最近,发布了许多能够理解和操作 UI 的视觉语言模型。最新的是字节跳动的 UI-TARS-1.5,它在浏览器、计算机和手机使用方面表现出色。它还可以进行推理游戏,并在开放世界游戏中操作。今年另一个有影响力的发布是 MAGMA-8B,它是一个用于 UI 导航和与真实世界物理交互的基础模型。此外,Qwen2.5-VL(特别是其 32B 变体,因为它在代理任务上进行了进一步训练)和 Kimi-VL 推理模型在 GUI 代理任务中表现良好。
2025 年初,我们推出了 smolagents,一个实现了 ReAct 框架的全新轻量级代理库。不久之后,我们为该库实现了视觉语言支持。此集成在两个用例中进行:
- 在运行开始时,一次性提供图像。这对于使用工具的文档 AI 很有用。
- 动态检索图像。这对于 VLM 代理控制 GUI 等情况很有用,其中代理会重复截取屏幕截图。
该库为用户提供了构建其带有图像理解功能的代理工作流的构建块。我们提供了不同的脚本和单行 CLI 命令,以方便用户快速入门。
对于第一种情况,假设我们希望一个代理描述文档(这不是很有代理性,但对于最小用例来说很好)。您可以像下面这样初始化 CodeAgent(一个编写自己代码的代理!):
agent = CodeAgent(tools=[], model=model) # no need for tools
agent.run("Describe these documents:", images=[document_1, document_2, document_3])
对于我们需要的代理获取屏幕截图的后一种用例,我们可以定义一个回调,在每个 `ActionStep` 结束时执行。对于您自己的需要动态获取图像的用例,可以根据需要修改回调。为了简单起见,这里不再详细定义。您可以选择阅读博客文章和此博客文章末尾的脚本本身。现在,让我们看看如何使用回调和浏览器控制步骤初始化代理。
def save_screenshot(memory_step: ActionStep, agent: CodeAgent) -> None:
"""
Takes screenshots and writes to observations.
"""
png_bytes = driver.get_screenshot_as_png()
memory_step.observations_images = [image.copy()] # persist images to memory_step
url_info = f"Current url: {driver.current_url}"
memory_step.observations = (
url_info if memory_step.observations is None else memory_step.observations + "\n" + url_info
)
return
agent = CodeAgent(
tools=[go_back, close_popups, search_item_ctrl_f], # pass navigation tools
model=model,
additional_authorized_imports=["helium"],
step_callbacks=[save_screenshot], # pass callback
)
您只需运行以下 CLI 命令即可尝试整个示例。它启动一个代理,可以控制网页浏览器,并由视觉语言模型驱动以完成网页自动化任务(请替换为您希望导航到的网站)。
webagent "go to xyz.com/men, get to sale section, click the first clothing item you see. Get the product details, and the price, return them. note that I'm shopping from France"
smolagents 提供不同类型的模型,例如本地 Transformer 模型、使用推理提供商服务的开源模型或闭源模型提供商的端点。我们鼓励使用开源模型,因为许多代理工作流目前需要推理,这受益于参数数量庞大的模型。截至 2025 年 4 月,Qwen 2.5 VL 是代理工作流的不错选择,因为该模型在代理任务上进行了进一步训练。
视频语言模型
如今,大多数视觉语言模型都能处理视频,因为视频可以表示为一系列帧。然而,视频理解很棘手,因为帧之间存在时间关系,而且帧数量庞大,因此需要采用不同的技术来选择具有代表性的视频帧集。
自去年以来,社区一直在权衡不同的方法和技巧来解决这个问题。
一个很好的例子是 Meta 的 LongVU 模型。它通过将视频帧传递给 DINOv2 来下采样,以选择最相似的帧并将其移除,然后模型根据文本查询进一步细化帧,其中文本和帧都投影到相同的空间并计算相似性。Qwen2.5VL 可以处理长上下文并适应动态 FPS 速率,因为它使用不同帧速率的视频进行训练。通过扩展多模态 RoPE,它理解帧的绝对时间位置,并且可以处理不同的速率并仍然理解现实生活中事件的速度。另一个模型是 Gemma 3,它可以接受文本提示中交错的时间戳视频帧,例如“帧 00.00:<图像>..”,并且在视频理解任务中表现非常出色。
摘自论文
视觉语言模型的新对齐技术
偏好优化是一种替代的语言模型微调方法,也可以扩展到视觉语言模型。该方法不依赖于固定的标签,而是侧重于根据偏好比较和排名候选响应。trl 库支持直接偏好优化 (DPO),包括对 VLM 的支持。
下面是 VLM 微调 DPO 的偏好数据集的结构示例。每个条目包含一个图像 + 问题对和两个相应的答案:一个选定的和一个被拒绝的。VLM 经过微调,以生成与偏好(选定)答案对齐的响应。
此过程的一个示例数据集是 RLAIF-V,它包含超过 83000 个根据上述结构格式化的带注释样本。每个条目都包含一个图像列表(通常是一个)、一个提示、一个选定的答案和一个被拒绝的答案,正如 DPOTrainer 所期望的那样。
有一个RLAIF-V 格式化数据集,它已经相应地格式化。下面是一个单个样本的示例
{'images': [<PIL.JpegImagePlugin.JpegImageFile image mode=L size=980x812 at 0x154505570>],
'prompt': [ { "content": [ { "text": null, "type": "image" }, { "text": "What should this catcher be using?", "type": "text" } ], "role": "user" } ],
'rejected': [ { "content": [ { "text": "The catcher, identified by the number...", "type": "text" } ], "role": "assistant" } ],
'chosen': [ { "content": [ { "text": "The catcher in the image should be using a baseball glove...", "type": "text" } ], "role": "assistant" } ]}
数据集准备好后,您可以使用 trl 库中的 DPOConfig 和 DPOTrainer 类来配置和启动微调过程。
下面是使用 DPOConfig 的示例配置
from trl import DPOConfig
training_args = DPOConfig(
output_dir="smolvlm-instruct-trl-dpo-rlaif-v",
bf16=True,
gradient_checkpointing=True,
per_device_train_batch_size=1,
per_device_eval_batch_size=1,
gradient_accumulation_steps=32,
num_train_epochs=5,
dataset_num_proc=8, # tokenization will use 8 processes
dataloader_num_workers=8, # data loading will use 8 workers
logging_steps=10,
report_to="tensorboard",
push_to_hub=True,
save_strategy="steps",
save_steps=10,
save_total_limit=1,
eval_steps=10, # Steps interval for evaluation
eval_strategy="steps",
)
要使用 DPOTrainer 训练您的模型,您可以选择提供一个参考模型来计算奖励差。如果您正在使用参数高效微调 (PEFT),您可以将 ref_model=None 以省略参考模型。
from trl import DPOTrainer
trainer = DPOTrainer(
model=model,
ref_model=None,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset,
peft_config=peft_config,
tokenizer=processor
)
trainer.train()
新基准
在过去一年中,基准也发生了显著变化。在之前的博客中,我们将 MMMU 和 MMBench 描述为评估视觉语言模型的两个新兴基准。随着该领域的快速进展,模型在这些基准上已经趋于饱和,我们需要更好的评估工具。为此,除了通用基准之外,我们还需要评估特定能力的工具。
现在,我们重点介绍两个突出的通用基准:MMT-Bench 和 MMMU-Pro。
MMT-Bench
MMT-Bench 旨在评估 VLM 在广泛的多模态任务中的表现,这些任务需要专业知识、精确的视觉识别、定位、推理和规划。该基准包括来自各种多模态场景的 31325 个多项选择题,涵盖图像、文本、视频和点云模态。它包含 32 种不同的元任务和 162 种子任务,涵盖了 OCR、视觉识别或视觉语言检索等多种任务。
MMMU-Pro
MMMU-Pro 是原始 MMMU 基准的更好版本。它还评估了高级人工智能模型在多种模态下的真实理解能力。
它比 MMMU 更复杂,例如,它具有仅视觉输入设置,并且候选选项的数量从 4 增加到 10。该基准还结合了真实世界模拟,其仅视觉问题来源于模拟显示器中捕获的屏幕截图或照片,具有不同的背景、字体样式和大小,以模拟真实世界条件。
额外:我们的模型选择
以下是我们对一些重点模型的选择。我们喜欢的模型有很多,下面列出的是最新的。
模型名称 | 模型大小 | 我们为什么喜欢它 |
---|---|---|
Qwen2.5-VL | 从 3B 到 72B | 功能强大的多功能模型,具有代理能力、数学等 |
RolmOCR | 7B | 性能卓越的 OCR 模型 |
Kimi-VL-Thinking | 16B MoE,活跃参数 3B | 最佳推理模型 |
SmolVLM2 | 256M, 500M (我们的最爱!), 2.2B | 最小的视频语言模型 |
Llama 4 Scout & Maverick | 109B/400B MoE,活跃参数 17B | 超长上下文 |
Molmo | 1B, 7B, 72B,以及活跃参数 1B 的 MoE | 完全开放的模型,并增加了本地化能力 |
就是这样!我们希望这篇博客文章对您了解过去一年发生的所有事情有所帮助。我们期待看到您将用这篇博客中的模型构建出什么。🤗 下面我们提供了一些链接,对本博客文章中的每个主题进行更深入的解释。
感谢 Vaibhav Srivastav 和 Pablo Montalvo Leroux 对本博客的审阅。
有用资源
以下是本博客中深入探讨的博客文章合集。
- 本博客中提到的模型、数据集等
- 多模态安全:Llama Guard 4 博客
- VLM 中的 DPO:使用 TRL 对视觉语言模型进行偏好优化
- 支持 VLM 的 Smolagents:我们刚刚赋予了 smolagents 视觉能力
- 使用 smolagents 的视觉代理的代理课程部分:使用 smolagents 的视觉代理
- Gemma 3 模型发布:欢迎 Gemma 3:Google 全新的多模态、多语言、长上下文开源 LLM
- PaliGemma 2 模型发布:欢迎 PaliGemma 2 – Google 全新的视觉语言模型
- Hugging Face 发布的 Pi0
- 多模态检索:视觉多语言:介绍 mcdse-2b
- 多模态检索:ColPali:使用视觉语言模型高效进行文档检索
- 视频语言建模:SmolVLM2:将视频理解带到每个设备
- 使用纯 PyTorch 最小训练 VLM:GitHub - huggingface/nanoVLM:训练/微调小型 VLM 的最简单、最快存储库。