Smol2Operator:训练 GUI 智能体操作电脑

教程Hugging Face2025年9月23日6 分钟阅读
Smol2Operator:训练 GUI 智能体操作电脑
Hugging Face 团队展示了如何将一个轻量级视觉语言模型训练成能理解并操作图形界面的智能体。他们发布了完整的训练方案、数据处理工具和数据集,旨在推动 GUI 自动化研究。

图形用户界面(GUI)自动化是计算机视觉领域最具挑战性的前沿之一。开发能够观察并与用户界面交互的模型,将使 AI 智能体能够操作移动端、桌面端和网页平台,从而重塑未来的数字交互方式。

在这篇博客中,我们提出了一种通过多阶段训练策略来训练视觉语言模型(VLM)进行 GUI 自动化的综合方法。我们将展示如何将一个毫无基础能力的模型,转变为能够理解并与图形界面交互的智能体编码器。

我们的目标不是打造一个 SOTA 模型,而是展示从数据处理到模型训练的完整流程,并在此过程中揭示如何解锁 VLM 的 GUI 基础能力。

GUI 能力结合了对界面的理解和精确的元素定位。这些能力使模型能够将高级任务转化为点击、输入等低级 GUI 操作。

GUI 能力结合了对界面的理解和精确的元素定位。这些能力使模型能够将高级任务转化为点击、输入等低级 GUI 操作。

我们的方法以 SmolVLM2-2.2B-Instruct 作为基础模型。这是一个小巧但强大的视觉语言模型,最初对 GUI 任务没有任何基础能力,这使其成为展示我们训练方法有效性的理想候选者。通过两阶段训练过程,我们首先在模型中建立基础能力,然后使用监督微调(SFT)增强其智能体推理能力。

我们在一个已建立的感知基准测试 ScreenSpot-v2 上评估了我们的方法,该测试评估模型在截图内理解和定位元素的能力。我们的流程灵感来源于 AGUVIS 论文,并利用他们精心策划的数据集来构建我们的工作基础。

基础模型 SmolVLM2-2.2B-Instruct 训练阶段在 ScreenSpot-v2 上的性能演变。

基础模型 SmolVLM2-2.2B-Instruct 训练阶段在 ScreenSpot-v2 上的性能演变。

1. 数据转换与统一动作空间

本节解释了我们如何将来自多个数据集的异构 GUI 动作格式转换为单一的统一格式。通过标准化函数名称、签名和参数,我们创建了一致、高质量的数据,为有效的模型训练奠定了基础。

不一致动作空间的挑战

处理多个 GUI 自动化数据集时,一个主要挑战是动作表示缺乏标准化。不同的数据集使用不同的函数签名、参数命名约定和动作分类法,这使得跨不同数据源训练统一模型变得困难。

我们的统一方法

我们采用了开源数据集(xlangai/aguvis-stage1, xlangai/aguvis-stage2),它们最初由 AGUVIS 使用,并实现了一个全面的数据转换流程来创建统一动作空间。我们的方法包括:

  1. 函数解析与归一化:我们开发了一个函数解析器(见 utils/function_parser.py),可以从所有数据集的各种格式中提取和解析函数调用。该解析器支持任何函数签名格式,处理复杂的参数结构,并能以正确的参数顺序重建函数调用。
  2. 动作空间统一:我们实现了一个全面的动作转换系统(见 preprocessing/action_conversion.py),将所有原始动作表示转换为标准化的函数命名和参数结构。这个过程凸显了不同数据集间函数签名存在的显著不一致,并允许我们:
    • 移除不需要或冗余的动作
    • 标准化参数命名约定
    • 创建连贯的动作词汇表
  3. (附加)灵活的适配框架:我们的转换流程包含一些实用工具,允许用户:
    • 使用 utils/action_space_converter.py 工具将整个数据集适配到他们自己的动作空间命名约定
    • 提取和分析当前动作空间结构

数据转换示例

以下是我们动作转换系统(preprocessing/action_conversion.py)中的真实示例,展示了我们如何将异构的动作表示转换为统一格式(基础坐标归一化到 [0,1] 范围):

转换前(原始动作数据集格式):

code
# Mobile Actions
mobile.home()
mobile.open_app(app_name='drupe')
mobile.swipe(from_coord=[0.581, 0.898], to_coord=[0.601, 0.518])
mobile.long_press(x=0.799, y=0.911)
mobile.terminate(status='success')
# Desktop Actions
pyautogui.click(x=0.8102, y=0.9463)
pyautogui.doubleClick(x=0.8102, y=0.9463)
pyautogui.hotkey(keys=['ctrl', 'c'])
pyautogui.scroll(page=-0.1)
pyautogui.write(message='bread buns')
pyautogui.dragTo(from_coord=[0.87, 0.423], to_coord=[0.8102, 0.9463])

转换后(统一动作数据集格式):

code
# Unified Mobile Actions
navigate_home()
open_app(app_name='drupe')
swipe(from_coord=[0.581, 0.898], to_coord=[0.601, 0.518])
long_press(x=0.799, y=0.911)
final_answer('success')
# Unified Desktop Actions
click(x=0.8102, y=0.9463)
double_click(x=0.8102, y=0.9463)
press(keys=['ctrl', 'c'])
scroll(direction='up', amount=10)  # Smart direction detection
type(text='bread buns')
drag(from_coord=[0.87, 0.423], to_coord=[0.8102, 0.9463])

这个统一过程对于创建连贯的训练数据至关重要,它使模型能够学习跨不同 GUI 环境的一致动作模式。

💡 为什么使用归一化坐标?
在文本-动作数据点中使用原始像素坐标(例如 click(x=302, y=63))会将其绑定到单一图像尺寸。视觉语言模型(VLM)通常会调整图像大小,导致像素坐标失效并需要调整。归一化坐标(相对于图像尺寸)在任何分辨率下都保持有效,并保持数据集的一致性。

(附加)使用动作空间转换器进行自定义动作空间适配

为了最大化不同用例的灵活性,我们开发了 动作空间转换器utils/action_space_converter.py),这个工具允许用户轻松地将一个动作空间适配到他们自己的自定义动作词汇和命名约定。

你可以使用这个工具将一种动作签名(函数名称、参数名称和参数值更改等)转换为另一种:

转换前

code
assistant_message: "Action: click(x=0.5, y=0.3)"

转换后

code
assistant_message: "Action: touch(x_coord=200, y_coord=300)"

关键特性

动作空间转换器提供:

  1. 可配置的映射:定义统一动作与你首选动作名称之间的自定义映射
  2. 参数转换:重命名参数、应用值转换和设置默认值
  3. 灵活的架构:支持简单的参数映射和复杂的自定义转换函数
  4. 验证:内置验证以确保映射配置有效

使用示例

code
from utils.action_space_converter import ActionSpaceConverter, ActionMapping, ParameterMapping
from utils.function_parser import parse_function_call

# Create custom mappings
mappings = [
    ActionMapping(
        source_function="click",
        target_function="touch",
        parameter_mappings=[
            ParameterMapping(source_name="x", target_name="x_coord"),
            ParameterMapping(source_name="y", target_name="y_coord")
        ],
        description="Touch screen at coordinates"    ),
    ActionMapping(
        source_function="type", # source_function is the name of the function in the original function call
        target_function="write", # target_function is the name of the function in the target function call        
        parameter_mappings=[
            ParameterMapping(source_name="text", target_name="content")
            # source_name is the name of the parameter in the original function call            
            # target_name is the name of the parameter in the target function call        
        ],
        description="Input text"    
    )
]

assistant_message = "I'll interact at those coordinates for you. click(x=0.5, y=0.3) Now I'll input the text. type(text='hello world')"

# Parse function calls
parsed_function_calls = parse_function_call(text)

# Initialize converter
converter = ActionSpaceConverter(mappings)

# Convert actions
converted_actions = converter.convert_actions(parsed_function_calls)
for new_function_call, old_function_call in zip(converted_actions, parsed_function_calls):
    text = text.replace(old_function_call.to_string(), new_function_call.to_string())

print(text)
# Output: I'll interact at those coordinates for you. touch(x_coord=0.5, y_coord=0.3) Now I'll input the text. write(content='hello world')

这个工具使研究人员和实践者能够:

  • 自定义训练数据:将数据集适配到匹配其特定动作词汇要求
  • 领域适配:为不同平台(移动端 vs. 桌面端 vs. 网页端)转换动作
  • 框架集成:轻松将训练数据与现有自动化框架对齐
  • 快速实验:快速测试不同的动作空间配置
  • 发布准备:使用一致的命名约定为生产部署标准化动作空间

动作空间转换器对于准备训练数据集特别有价值,因为它确保了跨不同部署环境的一致动作词汇,同时保持与现有自动化框架的兼容性。

转换后并发布的数据集

通过这个流程,我们将开源数据集 xlangai/aguvis-stage1, xlangai/aguvis-stage2 转换到我们的统一动作空间(见此处)。这个过程的输出被发布为两个全新格式化的数据集:smolagents/aguvis-stage-1smolagents/aguvis-stage-2

2. 第一阶段:从零到感知

训练数据

第一阶段训练使用了 smolagents/aguvis-stage-1 数据集,它通过将低层级指令与多样化的可执行操作(以代码形式表达)配对,引入了 GUI 对齐(GUI Grounding)。例如,smolagents/aguvis-stage-1 中的一个用户/助手对话回合结构如下:

code
{
  "user": "click on more button",
  "assistant": "click(x=0.8875, y=0.2281)",
}

每个样本将截图与多轮用户/助手交互关联起来,让模型能在对话回合中学习细粒度的动作对齐。在微调过程中,数据整理器在计算损失时会屏蔽除助手回答外的所有内容。

优化实验

在进行大规模第一阶段训练之前,我们进行了全面的消融研究,以确定最佳的训练配置。

图像分辨率与坐标系分析

我们测试了不同的图像尺寸和坐标表示系统,以找出 SmolVLM2 的最佳配置:

  • 测试的图像尺寸:384px、768px、1152px
  • 坐标系:像素坐标 vs. 归一化坐标(0-1 范围)
  • 训练数据:来自 Aguvis 数据集的 40 万样本

一些 SOTA 的 GUI VLM(例如 Qwen-VL)似乎也使用了不同的归一化范围(0–1000),但本次实验未测试该范围。

配置(坐标 / 图像尺寸)ScreenSpot-v2(%)
归一化坐标
基线 / –0.47
38431.28
76832.32
115233.72
像素坐标
基线 / –0.55
3841.17
7682.67
11524.32

表 1: HuggingFaceTB/SmolVLM2-2.2B-Instruct 的基线结果(40 万样本,aguvis-stage-1)。数值越高越好。

如我们的基准测试结果所示,SmolVLM2-2.2B-Instruct 基线模型最初在 ScreenSpot-v2 等感知基准测试中性能为 0%。这种完全缺乏对齐能力的情况为我们评估训练方法的有效性提供了一个干净的起点。

关键发现

从实验中我们确定:

  • 图像尺寸:1152px
  • 坐标系:归一化坐标(0-1 范围)对 SmolVLM2 最有效
  • 注意:像素坐标和归一化坐标之间的最佳选择可能取决于基础模型的预训练方法

第一阶段结果

使用最佳配置(1152px 分辨率 + 归一化坐标),我们在 smolagents/aguvis-stage-1 数据集上训练了 2 个轮次。结果显著,在 ScreenSpot-v2 上相比基线提升了 41%

这一巨大提升表明,我们的第一阶段训练成功地为模型注入了基本的对齐能力,使其能够理解并定位截图中的视觉元素。

配置(坐标 / 图像尺寸)ScreenSpot-v2(%)
归一化坐标 / 115241.27

表 2: HuggingFaceTB/SmolVLM2-2.2B-Instruct 的基线结果(2 个轮次,aguvis-stage-1)。

3. 第二阶段:从感知到认知

第一阶段提供了对齐能力,而第二阶段则针对 智能体推理(Agentic Reasoning),即在行动前进行思考和规划的能力。这一阶段将模型从一个识别 GUI 元素的反应式系统,转变为一个能够执行复杂、多步骤交互的主动智能体。

训练数据

第二阶段使用了 smolagents/aguvis-stage-2 数据集,它引入了智能体场景:

  • 对即将执行的动作进行 显式推理
  • 跨多个交互步骤保持 上下文一致性
  • 高层级指令需要多步、低层级的动作来执行

例如,smolagents/aguvis-stage-2 中的聊天消息如下:

code
{
  "system": "You are a helpful GUI agent. ...",
  "user": "Please generate the next move according to the UI screenshot, instruction and previous actions.\n\nInstruction: What information does the site provide about Judith Lauand's career, works and exhibitions?\n\nPrevious actions:\nNone",
  "assistant": "<think>\nClick on the link labeled 'Judith Lauand: Brazilian 1922-2022' to explore more about her career and exhibitions.\n</think>\n<code>\nclick(x=0.41, y=0.178)\n</code>",
}

每个样本将截图与一个系统/用户/助手回合关联起来。在微调过程中,数据整理器在计算损失时会屏蔽除助手回答外的所有内容。

第二阶段结果

从第一阶段的检查点(1152px 分辨率,归一化坐标)开始,我们在 smolagents/aguvis-stage-2 上对模型进行了两个轮次的微调。ScreenSpot-v2 的准确率从 41% 提升到了 61%,这表明显式推理提高了 GUI 对齐性能。

配置(坐标 / 图像尺寸)ScreenSpot-v2(%)
归一化坐标 / 115261.71

表 2: HuggingFaceTB/SmolVLM2-2.2B-Instruct 在第一阶段微调后的基线结果(2 个轮次,aguvis-stage-1)。

💡 我们还在一个更小的 VLM(nanoVLM-460M)上复现了这两个阶段的训练。尽管其容量减小,该模型在 ScreenSpot-v2 上仍达到了 约 58% 的准确率,证明该训练策略能有效向下扩展,使其在该模型规模(4.6 亿参数)下成为 ScreenSpot-v2 的 SOTA。此外,aguvis-stage-1 已包含在 FineVision 数据集 中!

4. 开源即所需

所有训练代码、数据处理流水线、数据集和模型都已开源!

  1. 训练配方(recipe.ipynb:包含第一阶段和第二阶段的完整训练流水线,包括数据集混合配置和训练编排。我们利用 TRL 库来训练模型。
  2. 数据集(smolagents/aguvis-stage-1smolagents/aguvis-stage-2:所有使用的数据集都是开源的。
  3. 模型(smolagents/SmolVLM2-2.2B-Instruct-Agentic-GUI:应用上述训练配方得到的模型。
  4. 预处理工具:
    • 函数解析器(utils/function_parser.py:用于从不同数据集格式中解析、归一化和重构函数调用的工具。支持复杂的参数结构、位置参数和多函数调用提取。
    • 动作转换系统(preprocessing/action_conversion.py:将移动端和 PyAutoGUI 桌面端动作转换为标准化 API 格式的核心统一引擎。具有智能坐标处理、滚动动作方向检测和全面的参数归一化功能。
    • 动作空间转换器(utils/action_space_converter.py:用于将统一动作空间适配到自定义词汇表和命名约定的灵活工具。通过可配置的参数映射实现特定领域的定制。

💡 我们还发布了一个 Space 来试用模型的智能体对齐能力:A-Mahla/Smol2Operator

5. 结论

我们的实验表明,高质量、面向推理的数据可以显著提升 GUI 对齐能力,即使对于小型 VLM,也仅需使用监督微调(SFT)。除了原始性能提升,这些结果还表明 GUI 对齐能力很大程度上取决于数据质量。精心策划的数据集教会了模型用户界面的结构和语义,为准确的动作预测提供了所需的对齐基础。

为了支持 GUI 智能体的开发,我们开源了所有内容:完整的流水线、数据集和训练好的模型。你可以复现我们的结果,尝试不同的模型和架构,或将我们的方法适配到新领域。智能体 AI 的未来取决于像你这样的研究者进一步推动这些边界!

下一步是什么?

虽然 SFT 在监督任务上表现出色,但强化学习(RL)或直接偏好优化(DPO)等新兴方法有助于发展更强的推理能力,并实现实时适应。这些进展指向新一代 GUI 智能体,它们通过交互学习和改进,而不仅仅依赖静态数据集。

让我们一起构建 GUI 智能体的未来 🤗

本文编译自 Smol2Operator: Post-Training GUI Agents for Computer Use,版权归原作者所有。

觉得有用?分享给更多人

获取每周 AI 工具精选

工具推荐、实战教程和生态洞察,每周更新。

相关文章

本文分享了如何将 GitHub Copilot SDK 集成到 React Native 应用中,构建一个名为 IssueCrush 的 Issue 智能分类工具。核心方案是服务端集成模式,解决了 SDK 依赖 Node.js 环境的问题,并详细介绍了生命周期管理、提示工程、响应处理和优雅降级等关键实现模式。

教程GitHub·3月24日·8 分钟

Starlette 1.0 发布,最大的变化是引入了基于异步上下文管理器的 lifespan 机制。作者利用 Claude 的 Skill 功能,让 AI 克隆代码库并学习新版本特性,然后成功生成了一个包含项目、任务、评论和标签的完整任务管理应用。

教程Simon Willison·3月22日·5 分钟

评论