AgentCPM-GUI是一款具备RFT增强推理能力的设备端图形界面代理,可操作中英文应用,基于80亿参数的MiniCPM-V构建。
下载量 541
发布时间 : 5/8/2025
模型介绍
内容详情
替代品
模型简介
由清华自然语言处理实验室、中国人民大学和ModelBest联合开发的开源设备端大语言代理模型,以手机屏幕截图作为输入,自主执行用户指定任务。
模型特点
高质量GUI定位
通过大规模双语安卓数据集预训练,显著提升对常见GUI组件的定位与理解能力。
中文应用操作
首个针对中文应用精细调优的开源GUI代理,覆盖30+热门中文应用。
增强规划推理
强化微调技术(RFT)使模型在输出动作前进行思考,大幅提升复杂任务成功率。
紧凑动作空间设计
优化的动作空间与简洁JSON格式使平均动作长度降至9.7个token,提升设备端推理效率。
模型能力
图形界面理解
屏幕元素定位
多模态交互
任务规划
自动化操作
使用案例
移动应用自动化
中文应用导航
在高德地图、大众点评等中文应用中执行导航、搜索等任务
在定位基准测试中达到71.3的平均分
跨语言界面操作
在中英文混合界面中准确识别并操作目标元素
在文本转坐标任务中达到76.5分
无障碍辅助
视觉辅助操作
帮助视障用户通过语音指令操作移动设备界面
license: apache-2.0 language:
- 中文
- 英语 tags:
- AgentCPM-GUI
- 图形界面代理
- 安卓代理
- 多模态 base_model:
- openbmb/MiniCPM-V-2_6 pipeline_tag: 图文生成文本
AgentCPM-GUI
GitHub | 技术博客
最新动态
- [2025-05-13] üöÄüöÄüöÄ 我们开源了AgentCPM-GUI,这是一款具备RFT增强推理能力的设备端图形界面代理,可操作中英文应用。
概述
AgentCPM-GUI是由清华自然语言处理实验室、中国人民大学和ModelBest联合开发的开源设备端大语言代理模型。基于80亿参数的MiniCPM-V构建,该模型以手机屏幕截图作为输入,自主执行用户指定任务。
核心特性包括:
- 高质量GUI定位——通过大规模双语安卓数据集预训练,显著提升对常见GUI组件(按钮、输入框、标签、图标等)的定位与理解能力。
- 中文应用操作——首个针对中文应用精细调优的开源GUI代理,覆盖高德地图、大众点评、哔哩哔哩、小红书等30+热门应用。
- 增强规划推理——强化微调技术(RFT)使模型在输出动作前进行"思考",大幅提升复杂任务成功率。
- 紧凑动作空间设计——优化的动作空间与简洁JSON格式使平均动作长度降至9.7个token,提升设备端推理效率。
演示案例(1倍速):
https://github.com/user-attachments/assets/5472a659-cd71-4bce-a181-0981129c6a81
快速开始
安装依赖
git clone https://github.com/OpenBMB/AgentCPM-GUI
cd AgentCPM-GUI
conda create -n gui_agent python=3.11
conda activate gui_agent
pip install -r requirements.txt
下载模型
从Hugging Face下载AgentCPM-GUI并放置于model/AgentCPM-GUI
目录。
Huggingface推理
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from PIL import Image
import json
# 1. 加载模型与分词器
model_path = "model/AgentCPM-GUI" # 模型路径
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True, torch_dtype=torch.bfloat16)
model = model.to("cuda:0")
# 2. 构建输入
instruction = "点击屏幕左上角的'返回'按钮"
image_path = "assets/test.jpeg"
image = Image.open(image_path).convert("RGB")
# 3. 将长边缩放至1120像素以节省计算资源
def __resize__(origin_img):
resolution = origin_img.size
w,h = resolution
max_line_res = 1120
if max_line_res is not None:
max_line = max_line_res
if h > max_line:
w = int(w * max_line / h)
h = max_line
if w > max_line:
h = int(h * max_line / w)
w = max_line
img = origin_img.resize((w,h),resample=Image.Resampling.LANCZOS)
return img
image = __resize__(image)
# 4. 构建消息格式
messages = [{
"role": "user",
"content": [
f"<Question>{instruction}</Question>\n请给出操作步骤:",
image
]
}]
# 5. 推理
ACTION_SCHEMA = json.load(open('eval/utils/schema/schema.json', encoding="utf-8"))
items = list(ACTION_SCHEMA.items())
insert_index = 3
items.insert(insert_index, ("required", ["thought"])) # 通过设置为"required"/"optional"启用/禁用思考过程
ACTION_SCHEMA = dict(items)
SYSTEM_PROMPT = f'''# 角色
你是一个精通移动端GUI交互的智能代理,将通过触控操作完成用户指定的任务,准确理解用户需求的GUI元素并执行精准操作。
# 任务
根据用户指令生成操作步骤,给出下一步的交互动作。
# 规则
- 必须使用JSON格式输出
- 输出操作必须符合Schema规范
# 规范
{json.dumps(ACTION_SCHEMA, indent=None, ensure_ascii=False, separators=(',', ':'))}'''
outputs = model.chat(
image=None,
msgs=messages,
system_prompt=SYSTEM_PROMPT,
tokenizer=tokenizer,
temperature=0.1,
top_p=0.3,
n=1,
)
# 6. 输出
print(outputs)
预期输出:
{"thought":"当前需要点击屏幕左上角的'返回'按钮。操作界面已显示可用的返回图标,建议点击左上角区域。点击'返回'按钮将触发应用的返回功能。","POINT":[729,69]}
vLLM推理
# 启动vLLM服务
vllm serve model/AgentCPM-GUI --served-model-name AgentCPM-GUI --tensor_parallel_size 1 --trust-remote-code
import base64
import io
import json
import requests
from PIL import Image
END_POINT = "http://localhost:8000/v1/chat/completions" # 替换为实际端点
# 系统提示
ACTION_SCHEMA = json.load(open('eval/utils/schema/schema.json', encoding="utf-8"))
items = list(ACTION_SCHEMA.items())
insert_index = 3
items.insert(insert_index, ("required", ["thought"])) # 通过设置为"required"/"optional"启用/禁用思考过程
ACTION_SCHEMA = dict(items)
SYSTEM_PROMPT = f'''# 角色
你是一个精通移动端GUI交互的智能代理,将通过触控操作完成用户指定的任务,准确理解用户需求的GUI元素并执行精准操作。
# 任务
根据用户指令生成操作步骤,给出下一步的交互动作。
# 规则
- 必须使用JSON格式输出
- 输出操作必须符合Schema规范
# 规范
{json.dumps(ACTION_SCHEMA, indent=None, ensure_ascii=False, separators=(',', ':'))}'''
def encode_image(image: Image.Image) -> str:
"""将PIL图像转为base64编码字符串"""
with io.BytesIO() as in_mem_file:
image.save(in_mem_file, format="JPEG")
in_mem_file.seek(0)
return base64.b64encode(in_mem_file.read()).decode("utf-8")
def __resize__(origin_img):
resolution = origin_img.size
w,h = resolution
max_line_res = 1120
if max_line_res is not None:
max_line = max_line_res
if h > max_line:
w = int(w * max_line / h)
h = max_line
if w > max_line:
h = int(h * max_line / w)
w = max_line
img = origin_img.resize((w,h),resample=Image.Resampling.LANCZOS)
return img
def predict(text_prompt: str, image: Image.Image):
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": [
{"type": "text", "text": f"<Question>{text_prompt}</Question>\n请给出操作步骤:"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{encode_image(image)}"}}
]}
]
payload = {
"model": "AgentCPM-GUI", # 模型名称
"temperature": 0.1,
"messages": messages,
"max_tokens": 2048,
}
headers = {
"Content-Type": "application/json",
}
response = requests.post(END_POINT, headers=headers, json=payload)
assistant_msg = response.json()["choices"][0]["message"]["content"]
return assistant_msg
image = __resize__(Image.open("assets/test.jpeg"))
instruction = "点击屏幕左上角的'返回'按钮"
response = predict(instruction, image)
print(response)
动作空间
每一步代理输出为单个JSON对象,包含:
- 一个(且仅一个)基础动作,从下表选择;
- 可选修饰符(
duration
、thought
)和/或任务级标志(STATUS
)。
注意所有关键字区分大小写,且使用紧凑JSON(无额外空格),这会影响分词器行为。
动作类型 | 必填字段 | 可选字段 | 用途 | 示例 |
---|---|---|---|---|
点击 | POINT:[x,y] |
duration ,thought ,STATUS |
在标准化屏幕坐标(0–1000, 原点为左上角)单次点击。 | {"POINT":[480,320]} |
长按 | POINT:[x,y] duration:1000 |
duration ,thought ,STATUS |
在坐标位置长按(设置较长持续时间,如>200毫秒)。 | {"POINT":[480,320],"duration":1000} |
滑动 | POINT:[x,y] to:"up" | "down" | "left" | "right" 或 to:[x,y] |
duration ,thought ,STATUS |
从起点向某方向或另一坐标滑动。 | {"POINT":[500,200],"to":"down"} |
按键 | PRESS:"HOME" | "BACK" | "ENTER" |
duration ,thought ,STATUS |
触发硬件/导航按钮。 | {"PRESS":"HOME"} |
输入文本 | TYPE:"<文本>" |
duration ,thought ,STATUS |
在当前输入焦点插入指定文本。 | {"TYPE":"你好,世界!"} |
等待 | duration |
thought ,STATUS |
无动作空闲指定时间。 | {"duration":500} |
任务状态 | STATUS:"start" | "continue" | "finish" | "satisfied" | "impossible" | "interrupt" | "need_feedback" |
duration ,thought |
报告任务进度;可单独出现或与基础动作组合。 | {"STATUS":"finish"} |
微调训练
提供SFT和RFT训练源代码——详见GitHub。
性能评估
定位基准
模型 | 功能转坐标 | 文本转坐标 | 框转文本 | 平均分 |
---|---|---|---|---|
AgentCPM-GUI-8B | 79.1 | 76.5 | 58.2 | 71.3 |
Qwen2.5-VL-7B | 36.8 | 52.0 | 44.1 | 44.3 |
Intern2.5-VL-8B | 17.2 | 24.2 | 45.9 | 29.1 |
Intern2.5-VL-26B | 14.8 | 16.6 | 36.3 | 22.6 |
OS-Genesis-7B | 8.3 | 5.8 | 4.0 | 6.0 |
UI-TARS-7B | 56.8 | 66.7 | 1.4 | 41.6 |
OS-Altas-7B | 53.6 | 60.7 | 0.4 | 38.2 |
Aguvis-7B | 60.8 | 76.5 | 0.2 | 45.8 |
GPT-4o | 22.1 | 19.9 | 14.3 | 18.8 |
GPT-4o带定位 | 44.3 | 44.0 | 14.3 | 44.2 |
代理基准
Clip Vit Large Patch14
CLIP是由OpenAI开发的视觉-语言模型,通过对比学习将图像和文本映射到共享的嵌入空间,支持零样本图像分类
图像生成文本
C
openai
44.7M
1,710
Clip Vit Base Patch32
CLIP是由OpenAI开发的多模态模型,能够理解图像和文本之间的关系,支持零样本图像分类任务。
图像生成文本
C
openai
14.0M
666
Siglip So400m Patch14 384
Apache-2.0
SigLIP是基于WebLi数据集预训练的视觉语言模型,采用改进的sigmoid损失函数,优化了图像-文本匹配任务。
图像生成文本
Transformers

S
google
6.1M
526
Clip Vit Base Patch16
CLIP是由OpenAI开发的多模态模型,通过对比学习将图像和文本映射到共享的嵌入空间,实现零样本图像分类能力。
图像生成文本
C
openai
4.6M
119
Blip Image Captioning Base
Bsd-3-clause
BLIP是一个先进的视觉-语言预训练模型,擅长图像描述生成任务,支持条件式和非条件式文本生成。
图像生成文本
Transformers

B
Salesforce
2.8M
688
Blip Image Captioning Large
Bsd-3-clause
BLIP是一个统一的视觉-语言预训练框架,擅长图像描述生成任务,支持条件式和无条件式图像描述生成。
图像生成文本
Transformers

B
Salesforce
2.5M
1,312
Openvla 7b
MIT
OpenVLA 7B是一个基于Open X-Embodiment数据集训练的开源视觉-语言-动作模型,能够根据语言指令和摄像头图像生成机器人动作。
图像生成文本
Transformers

英语
O
openvla
1.7M
108
Llava V1.5 7b
LLaVA 是一款开源多模态聊天机器人,基于 LLaMA/Vicuna 微调,支持图文交互。
图像生成文本
Transformers

L
liuhaotian
1.4M
448
Vit Gpt2 Image Captioning
Apache-2.0
这是一个基于ViT和GPT2架构的图像描述生成模型,能够为输入图像生成自然语言描述。
图像生成文本
Transformers

V
nlpconnect
939.88k
887
Blip2 Opt 2.7b
MIT
BLIP-2是一个视觉语言模型,结合了图像编码器和大型语言模型,用于图像到文本的生成任务。
图像生成文本
Transformers

英语
B
Salesforce
867.78k
359
精选推荐AI模型
Llama 3 Typhoon V1.5x 8b Instruct
专为泰语设计的80亿参数指令模型,性能媲美GPT-3.5-turbo,优化了应用场景、检索增强生成、受限生成和推理任务
大型语言模型
Transformers

支持多种语言
L
scb10x
3,269
16
Cadet Tiny
Openrail
Cadet-Tiny是一个基于SODA数据集训练的超小型对话模型,专为边缘设备推理设计,体积仅为Cosmo-3B模型的2%左右。
对话系统
Transformers

英语
C
ToddGoldfarb
2,691
6
Roberta Base Chinese Extractive Qa
基于RoBERTa架构的中文抽取式问答模型,适用于从给定文本中提取答案的任务。
问答系统
中文
R
uer
2,694
98
AIbase是一个专注于MCP服务的平台,为AI开发者提供高质量的模型上下文协议服务,助力AI应用开发。
简体中文