Agentcpm GUI
AgentCPM-GUI是一款具備RFT增強推理能力的設備端圖形界面代理,可操作中英文應用,基於80億參數的MiniCPM-V構建。
下載量 541
發布時間 : 5/8/2025
模型概述
由清華自然語言處理實驗室、中國人民大學和ModelBest聯合開發的開源設備端大語言代理模型,以手機屏幕截圖作為輸入,自主執行用戶指定任務。
模型特點
高質量GUI定位
通過大規模雙語安卓數據集預訓練,顯著提升對常見GUI組件的定位與理解能力。
中文應用操作
首個針對中文應用精細調優的開源GUI代理,覆蓋30+熱門中文應用。
增強規劃推理
強化微調技術(RFT)使模型在輸出動作前進行思考,大幅提升複雜任務成功率。
緊湊動作空間設計
優化的動作空間與簡潔JSON格式使平均動作長度降至9.7個token,提升設備端推理效率。
模型能力
圖形界面理解
屏幕元素定位
多模態交互
任務規劃
自動化操作
使用案例
移動應用自動化
中文應用導航
在高德地圖、大眾點評等中文應用中執行導航、搜索等任務
在定位基準測試中達到71.3的平均分
跨語言界面操作
在中英文混合界面中準確識別並操作目標元素
在文本轉座標任務中達到76.5分
無障礙輔助
視覺輔助操作
幫助視障用戶通過語音指令操作移動設備界面
🚀 AgentCPM-GUI
AgentCPM-GUI是一個開源的設備端大語言模型(LLM)代理模型,它能夠操作中英文應用程序,並具備強化推理能力。該模型以智能手機截圖為輸入,可自主執行用戶指定的任務。
🚀 快速開始
安裝依賴
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" 來啟用/禁用 thought
ACTION_SCHEMA = dict(items)
SYSTEM_PROMPT = f'''# Role
你是一名熟悉安卓系统触屏GUI操作的智能体,将根据用户的问题,分析当前界面的GUI元素和布局,生成相应的操作。
# Task
针对用户问题,根据输入的当前屏幕截图,输出下一步的操作。
# Rule
- 以紧凑JSON格式输出
- 输出操作必须遵循Schema约束
# 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" 來啟用/禁用 thought
ACTION_SCHEMA = dict(items)
SYSTEM_PROMPT = f'''# Role
你是一名熟悉安卓系统触屏GUI操作的智能体,将根据用户的问题,分析当前界面的GUI元素和布局,生成相应的操作。
# Task
针对用户问题,根据输入的当前屏幕截图,输出下一步的操作。
# Rule
- 以紧凑JSON格式输出
- 输出操作必须遵循Schema约束
# 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:"<text>" |
duration ,thought ,STATUS |
在當前輸入焦點處插入給定的文本。 | {"TYPE":"Hello, world!"} |
等待 | duration |
thought ,STATUS |
在指定的時間內不執行任何其他操作。 | {"duration":500} |
任務級狀態 | STATUS:"start" | "continue" | "finish" | "satisfied" | "impossible" | "interrupt" | "need_feedback" |
duration ,thought |
報告任務進度;可以單獨出現或與原始動作一起出現。 | {"STATUS":"finish"} |
✨ 主要特性
- 高質量的GUI基礎:在大規模雙語Android數據集上進行預訓練,顯著提升了對常見GUI小部件(按鈕、輸入框、標籤、圖標等)的定位和理解能力。
- 中文應用操作:首個針對中文應用進行微調的開源GUI代理,涵蓋了30多個熱門應用,如高德地圖、大眾點評、嗶哩嗶哩和小紅書等。
- 增強的規劃與推理能力:強化微調(RFT)使模型在輸出動作之前能夠“思考”,大大提高了複雜任務的成功率。
- 緊湊的動作空間設計:優化的動作空間和簡潔的JSON格式將平均動作長度減少到9.7個標記,提高了設備端的推理效率。
演示案例(1倍速)
📚 詳細文檔
微調
SFT和RFT訓練的源代碼已提供,請參閱 GitHub。
性能評估
基礎基準測試
模型 | fun2point | text2point | bbox2text | 平均值 |
---|---|---|---|---|
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 with Grounding | 44.3 | 44.0 | 14.3 | 44.2 |
代理基準測試
數據集 | Android Control-Low TM | Android Control-Low EM | Android Control-High TM | Android Control-High EM | GUI-Odyssey TM | GUI-Odyssey EM | AITZ TM | AITZ EM | Chinese APP TM | Chinese APP EM |
---|---|---|---|---|---|---|---|---|---|---|
AgentCPM-GUI-8B | 94.39 | 90.20 | 77.70 | 69.17 | 90.85 | 74.96 | 85.71 | 76.38 | 96.86 | 91.28 |
Qwen2.5-VL-7B | 92.11 | 82.12 | 69.65 | 57.36 | 55.33 | 40.90 | 73.16 | 57.58 | 68.53 | 48.80 |
UI-TARS-7B | 93.52 | 88.89 | 68.53 | 60.81 | 78.79 | 57.33 | 71.74 | 55.31 | 71.01 | 53.92 |
OS-Genesis-7B | 90.74 | 74.22 | 65.92 | 44.43 | 11.67 | 3.63 | 19.98 | 8.45 | 38.10 | 14.50 |
OS-Atlas-7B | 73.03 | 67.25 | 70.36 | 56.53 | 91.83* | 76.76* | 74.13 | 58.45 | 81.53 | 55.89 |
Aguvis-7B | 93.85 | 89.40 | 65.56 | 54.18 | 26.71 | 13.54 | 35.71 | 18.99 | 67.43 | 38.20 |
OdysseyAgent-7B | 65.10 | 39.16 | 58.80 | 32.74 | 90.83 | 73.67 | 59.17 | 31.60 | 67.56 | 25.44 |
GPT-4o | - | 19.49 | - | 20.80 | - | 20.39 | 70.00 | 35.30 | 3.67 | 3.67 |
Gemini 2.0 | - | 28.50 | - | 60.20 | - | 3.27 | - | - | - | - |
Claude | - | 19.40 | - | 12.50 | 60.90 | - | - | - | - | - |
*不同的訓練/測試分割
TM和EM分別代表類型匹配和精確匹配。所有評估數據和代碼均已開源,詳情請參閱 此處。
評估數據
我們提供了 CAGUI,這是一個用於中文應用的評估基準,涵蓋了基礎和代理任務。請在 Hugging Face 上查看該數據集。
📄 許可證
本倉庫中的代碼遵循 Apache-2.0 許可證發佈。
🔖 引用
如果 AgentCPM-GUI 對你的研究有幫助,請引用:
@misc{2025,
author = {THUNLP},
title = {AgentCPM-GUI},
year = {2025},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/OpenBMB/AgentCPM-GUI}}
}
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