2025-01-26 17:55 浙江
字节跳动开源UI-TARS模型,具备增强感知、统一动作建模和深度推理能力,在多种GUI交互任务中表现优异,支持端到端智能体系统。


论文标题:
UI-TARS: Pioneering Automated GUI Interaction with Native Agents
论文地址:
https://arxiv.org/pdf/2501.12326
开源地址:
https://github.com/bytedance/UI-TARS
模型地址:
https://modelscope.cn/collections/UI-TARS-bccb56fa1ef640
UI-TARS 具有以下几项创新点:
System 2 推理(System-2 Reasoning):将深思熟虑的推理纳入多步决策,并涵盖任务分解、反思思维等多种推理模式。
迭代式反思训练(Iterative Training with Reflective Online Traces):通过在数百台虚拟机上自动收集、过滤和反射细化新的交互轨迹来解决数据瓶颈问题。同时基于迭代训练和反思训练,UI-TARS 持续从错误中学习,并在最少的人为干预下适应不可预见的情况。
字节豆包大模型团队认为,如果想要 AI 智能体真正实现类人的自主任务执行能力,就必须解决当前通用大模型直接应用在 GUI(图形用户界面)智能体上存在的一些技术缺陷与不足。
首先,用户指令的执行需要提取特定元素的坐标信息,而通用大模型通常缺乏所需要的精确数值理解能力。其次,通用大模型在处理目标驱动场景时往往理解不到位,这就需要开发者提供详细的自然语言说明操作步骤,增加了开发者的负担。最后,同时发送图片信息与元素描述不可避免地造成模型调用过程中消耗大量的token,会导致性能损耗,成本升高。
在 Operator 中,OpenAI 通过 GPT-4o 的视觉能力和强化学习实现的高级推理相结合,让智能体可以像人类一样与图形界面进行交互,灵活地执行任务。
UI-TARS 也很好地解决了上述瓶颈,它依托强大的通用多模态语言模型进行视觉识别,并面向智能UI交互进行了定向训练。这样做的结果便是:UI-TARS 在GUI智能体领域能够发挥出远胜于其他通用模型或GUI模型的表现,与此同时可以兼容各种形式的操作系统。
效果好不好,用权威基准测试结果来说话。在线动态环境可以模拟真实世界场景的交互,而 GUI智能体通过实时执行操作来改变环境状态,从而可以满足用户需求。
其中在 OSWorld 上,当限定的最大步数为 15 时,UI-TARS 的任务成功率可达 22.7%,超过了 Claude 的 14.9%,也超过了 Operator 的 19.7%。而当限定步数提升到 50 步时,UI-TARS 的成功率达到了 24.6%,同样也超过 Claude,但根据 OpenAI 公布的数据,Operator 在50步时的表现达到了 32.6%,相对 UI-TARS 有明显优势。这意味着 test-time scaling 是 UI-TARS 下一步需要升级的方向。
不仅如此,在基于 Andriod 操作系统的 AndroidWorld 基准上,UI-TARS 获得了 46.6%的任务成功率,大幅超过了GPT-4o的 34.5%。

除了在线动态环境中实现能力新SOTA之外,UI-TARS 同样在Multimodal Mind2Web(用于创建和评估执行语言指令的 web智能体)以及 Android Control(评估移动端环境中的规划和动作执行能力)、GUI Odyssey(专注于移动端环境中跨应用导航任务)等三个离线静态、预定义环境相关的基准测试中表现领先。

更进一步,UI-TAR 的智能体系统是端到端的,这被认为是智能体AI的下一个方向。
自GPT-4出现后,智能体成为了AI领域研究的热门领域,最近又经历了一次范式革新。首先是智能体框架(Agent Framework),其主要利用高性能基础模型(如GPT-4o)的理解和推理能力来增强任务的灵活性。他们实现了自动化和灵活的交互,也可以借助更多模块不断增强,或完成多智能体协作,但它仍然依赖人为定义的工作流来构建其操作。因此,智能体框架会面临适应性较差、模块不兼容等问题,维护开销较大。
在当前阶段,一些研究团队已经提出了智能体模型(Agent Model)新范式,其中任务以端到端的方式学习和执行,将感知、推理、记忆和动作统一在一个不断发展的模型中。

这种方法从根本上实现了数据驱动,让智能体可以无缝适应新任务、界面或用户需求,无需依赖手动制作的提示或预定义规则,拥有强大泛化能力,也可以进行自我改进。
向人类看齐:充分利用 System 2 推理能力
在技术报告中,UI-TARS 的定位是「一个原生 GUI 智能体模型,其设计目标是在不依赖繁琐的人工设计规则或级联模块的情况下进行运作。」
从功能上看,UI-TARS 可直接感知屏幕截图、应用推理过程并自主生成有效操作。此外,UI-TARS 还可以学习之前的经验,通过利用环境反馈来迭代改进其性能。下图展示了其整体架构。

整体来说,UI-TARS 的能力都是围绕感知、推理、动作以及经验学习进行的。
具体来说,给定一个初始任务指令,为了完成任务,UI-TARS 会迭代式地接收来自设备的观察结果并执行相应的操作。在每个时间步骤,UI-TARS 会以任务指令、先前交互的历史和当前观察为输入,基于预定义的动作空间输出动作。执行完动作之后,设备会提供后续观察,持续迭代。
为了进一步增强智能体的推理能力,并让决策更加深思熟虑,字节豆包大模型团队还集成了一个以「思维(thoughts)」形式出现的推理组件,该组件会在每个动作之前生成。
这些「思维」能反映System 2思维的反思性质。它们是至关重要的中间步骤,可引导智能体在继续之前重新考虑以前的动作和观察,与环境细致互动,构成反思性交互,从而确保每个决定都是意图明确的并且都是经过仔细思考的。
数据集、推理与长期记忆,UI-TARS 集成了一系列创新
了解了 UI-TARS 的技术框架,我们再继续深入其各个层面的细节,看看这个 Computer Use 智能体的优良表现究竟来自何处。同时,这也或许能让我们洞见一二 Operator 等其它同类智能体的设计思路。
要训练GUI智能体,还需要过数据这一关。字节豆包大模型团队采用原生智能体方法,直接处理GUI截图输入,利用大规模统一数据集来提升性能。
具体实施包括:收集大规模数据集;为界面元素创建结构化描述(类型、视觉、位置、功能);提供密集描述包括空间关系和整体布局;标注状态转换数据;合成多样化问答数据集;增加Set-of-Mark提示,在界面上添加不同属性的标记,帮助模型定位识别元素。
通过这些步骤,UI-TARS 能更好地理解和处理GUI任务。

(图注)感知与 grounding 数据样本
研究团队还进行了统一的动作空间建模与 grounding,在增强模型准确理解和定位视觉元素的能力的同时,让模型学会一些连续的多步轨迹,在完成一些任务时可以不假思索地完成,类似于System 1 思维。下表 1 给出了不同平台的统一动作空间,而表 2 则展示了 grounding 与多步动作轨迹数据的基本统计信息。

那么,UI-TARS 是如何将System 2 推理能力整合进来的呢?
具体来说,该团队采用的做法是首先使用 GUI 教程来增强模型的推理能力——他们为此编排了一个 6M 规模的高质量 GUI 教程,平均每个教程包含 510 个文本 token 与 3.3 张图像。
然后,再使用思维增强来进行推理模拟,也就是通过标注「思维」来填补感知与动作之间的空白,从而增强前面提到的动作轨迹数据。这些思维使模型能够显式地表示其决策过程,从而更好地与任务目标对齐。

整体来看,UI-TARS 在推理方面采用的方法不同于 Operator 使用思维链的方式。从实验结果看,UI-TARS 的推理方法在可用步数较少时可能更胜一筹,但当可用步数较多时,后者会有更加明显的优势。
有了推理能力后,该团队还让 UI-TARS 具备了可从长期记忆学习之前的经验的能力。这样一来,这个智能体就能在使用之中不断迭代进步了。这主要涉及三个过程,即在线轨迹 bootstrapping、反思微调、Agent DPO。
在线轨迹 bootstrapping 的过程如下图所示,简单来说先让智能体在目标 GUI 环境内基于指令生成一些原始轨迹,再对其进行过滤,得到高质量数据。然后利用结果轨迹来实现自我提升。

反思微调则是让模型看到自己犯下的真实世界错误与其纠正方案,从而让模型学会从次优决策中恢复。
Agent DPO 可通过直接编码对正确动作的偏好(而非错误动作)来优化 UI-TARS,从而更好地利用可用数据。
总之,通过这些技术创新,UI-TARS 拥有了强大的完成复杂任务的能力。
01
模型体验
调整浏览器字体设置
修改PPT颜色
手机端Agent
02
魔搭最佳实践
模型部署
进入访问入口
以UI-TARS-7B-SFT为例,在页面上点击部署-阿里云PAI Model Gallery部署:

按照页面提示登录阿里云
选择对应的GPU资源,点击部署
根据模型的大小,推荐的GPU型号
模型大小 | GPU型号 | GPU个数 |
2B | T4 | 1 |
7B | A10 | 1 |
72B | GPU H | 2 |

查看API信息
点击查看调用信息,得到对应接口的endpoint url和token
如果使用OpenAI API,对应的url参数值为<EAS API Endpoint>/v1

接口调用示例代码
示例代码为单图里面,后续每一步可以按照操作步骤,截图再次运行推理代码。
推荐使用开源项目UI-TARS-desktop调用接口操作本地桌面应用,以及通过 Midscene.js 用代码实现浏览器自动化操作。
UI-TARS-desktop客户端:https://github.com/bytedance/UI-TARS-desktop
Midscene.js 浏览器控制:https://github.com/web-infra-dev/midscene
import base64
import requests
from openai import OpenAI
openai_api_base = "<EAS API Endpoint>/v1"
openai_api_key = "<EAS API Token>"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
models = client.models.list()
model = models.data[0].id
stream = True
instruction = "search for today's weather"
prompt = r"""You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task.
## Output Format
```\nThought: ...
Action: ...\n```
## Action Space
click(start_box='<|box_start|>(x1,y1)<|box_end|>')
left_double(start_box='<|box_start|>(x1,y1)<|box_end|>')
right_single(start_box='<|box_start|>(x1,y1)<|box_end|>')
drag(start_box='<|box_start|>(x1,y1)<|box_end|>', end_box='<|box_start|>(x3,y3)<|box_end|>')
hotkey(key='')
type(content='') #If you want to submit your input, use \"\
\" at the end of `content`.
scroll(start_box='<|box_start|>(x1,y1)<|box_end|>', direction='down or up or right or left')
wait() #Sleep for 5s and take a screenshot to check for any changes.
finished()
call_user() # Submit the task and call the user when the task is unsolvable, or when you need the user's help.
## Note
- Use Chinese in `Thought` part.
- Summarize your next action (with its target element) in one sentence in `Thought` part.
## User Instruction
"""
def encode_base64_content_from_url(content_url: str) -> str:
"""Encode a content retrieved from a remote url to base64 format."""
with requests.get(content_url) as response:
response.raise_for_status()
result = base64.b64encode(response.content).decode("utf-8")
return result
img_url = "https://pai-quickstart-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/modelscope/eas/macos_desktop.jpg"
image_base64 = encode_base64_content_from_url(img_url)
chat_completion_from_base64 = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": f"data:image/jpg;base64,{image_base64}"},
},
{"type": "text", "text": prompt + instruction},
],
},
],
frequency_penalty=1,
max_tokens=128,
stream=stream,
)
if stream:
for chunk in chat_completion_from_base64:
print(chunk.choices[0].delta.content, end="")
else:
result = chat_completion_from_base64.choices[0].message.content
print(result)
模型微调
这里我们介绍使用ms-swift对bytedance-research/UI-TARS-2B-SFT进行微调。更多RLHF训练方法可以查看:https://github.com/modelscope/ms-swift/tree/main/examples/train/multimodal/rlhf
在开始微调之前,请确保您的环境已正确安装:
git clone https://github.com/modelscope/ms-swift.git
cd ms-swift
pip install -e .
我们给出可运行的微调demo和自定义数据集的样式,微调脚本如下:
CUDA_VISIBLE_DEVICES=0 \
MAX_PIXELS=1003520 \
swift sft \
--model bytedance-research/UI-TARS-2B-SFT \
--dataset 'modelscope/coco_2014_caption:validation#20000' \
--train_type lora \
--torch_dtype bfloat16 \
--num_train_epochs 1 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--learning_rate 1e-4 \
--lora_rank 8 \
--lora_alpha 32 \
--target_modules all-linear \
--freeze_vit true \
--gradient_accumulation_steps 16 \
--eval_steps 50 \
--save_steps 50 \
--save_total_limit 5 \
--logging_steps 5 \
--max_length 2048 \
--output_dir output \
--warmup_ratio 0.05 \
--dataloader_num_workers 4
训练显存占用:

关于自定义数据集,你可以组织成jsonl格式,下面给出了一条数据样本样例,训练时使用`--dataset <dataset_path>`指定即可:
{"messages": [{"role": "user", "content": [{"type": "text", "text": "You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task.\n\n## Output Format\n```\\nThought: ...\nAction: ...\\n```\n\n## Action Space\n\nclick(start_box='<|box_start|>(x1,y1)<|box_end|>')\nleft_double(start_box='<|box_start|>(x1,y1)<|box_end|>')\nright_single(start_box='<|box_start|>(x1,y1)<|box_end|>')\ndrag(start_box='<|box_start|>(x1,y1)<|box_end|>', end_box='<|box_start|>(x3,y3)<|box_end|>')\nhotkey(key='')\ntype(content='') #If you want to submit your input, use \\\"\\\n\\\" at the end of `content`.\nscroll(start_box='<|box_start|>(x1,y1)<|box_end|>', direction='down or up or right or left')\nwait() #Sleep for 5s and take a screenshot to check for any changes.\nfinished()\ncall_user() # Submit the task and call the user when the task is unsolvable, or when you need the user's help.\n\n\n## Note\n- Use Chinese in `Thought` part.\n- Summarize your next action (with its target element) in one sentence in `Thought` part.\n\n## User Instruction\nI'm looking for a software to \"edit my photo with grounding\""}]}, {"role": "assistant", "content": "Thought: 左键单击桌面上的“Google Chrome”图标以打开浏览器,其位于桌面的中间偏左位置,第二列的第一个。图标是圆形的,外圈是红色、黄色、绿色组成的圆环,内圈是一个蓝色的圆形。\nAction: click(start_box='<|box_start|>(246,113)<|box_end|>')"}], "images": ["https://modelscope-open.oss-cn-hangzhou.aliyuncs.com/images/agent.png"]}
推理脚本:
CUDA_VISIBLE_DEVICES=0 \
MAX_PIXELS=1003520 \
swift infer \
--adapters output/vx-xxx/checkpoint-xxx \
--stream true \
--max_new_tokens 2048
推送模型到ModelScope:
CUDA_VISIBLE_DEVICES=0 \
swift export \
--adapters output/vx-xxx/checkpoint-xxx \
--push_to_hub true \
--hub_model_id '<your-model-id>' \
--hub_token '<your-sdk-token>'
点击阅读原文,即可跳转体验~
?点击关注ModelScope公众号获取
更多技术信息~
阅读原文
跳转微信打开