训练数据存储在JSONL文件中,每行是一个JSON对象,包含以下关键字段:
json展开代码{
"image": {
"<image_00>": "/path/to/step_0.png",
"<image_01>": "/path/to/step_1.png"
},
"conversations": [
{
"role": "system",
"content": "系统提示词..."
},
{
"role": "user",
"content": "<Question>用户问题</Question>\n当前屏幕截图:<image_00>"
},
{
"role": "assistant",
"content": "{\"POINT\":[723,536],\"to\":\"up\"}"
}
],
"bbox": [[x1,y1,x2,y2], ...], // 可选:边界框信息
"bbox2": [...], // 可选:第二个边界框
"id": 0
}
GUIRFTDataset
和 GUIMTRFTDataset
类在 __getitem__
方法中返回的数据结构:
python展开代码{
"id": index, # 数据索引
"step_id": step_index, # 多轮对话中的步骤ID
"resolution": (原始尺寸, 缩放后尺寸), # 图像分辨率信息
"bboxs": [bbox1, bbox2], # 边界框信息
"solution": action, # JSON格式的动作解决方案
"prompt": conv, # 对话历史列表
"next_id": next_id # 下一步的ID(多轮训练时使用)
}
在 _process_inputs
函数中,强化学习训练需要的核心数据字段:
python展开代码{
"id": task_id, # 任务ID
"prompt": prompt, # 输入提示(对话历史)
"completion_ids": tensor, # 生成的completion的token IDs
"advantage": float, # 优势值(用于策略梯度)
"reward": float, # 奖励值
"step_id": int # 步骤ID
}
所有生成的动作必须符合预定义的JSON Schema:
python展开代码{
"thought": "智能体的思维过程", # 可选
"POINT": [x, y], # 点击坐标(0-1000相对坐标)
"to": "up/down/left/right" 或 [x,y], # 滑动方向或目标位置
"duration": 200, # 动作持续时间(毫秒)
"PRESS": "HOME/BACK/ENTER", # 特殊按键
"TYPE": "输入的文本", # 文本输入
"STATUS": "continue/finish/..." # 任务状态
}
通过ZMQ进行异步数据处理,包含:
python展开代码@dataclass
class TaskStatus:
task_id: int
completion_id: UUID
score: float # 奖励得分
created_time: datetime
advantage: Optional[float] # 优势值
@dataclass
class TaskAndContent:
data: dict # 原始数据
status: TaskStatus # 任务状态信息
系统使用多个奖励函数来计算最终奖励:
react_check
: 检查思考和动作格式action_schema_check
: 验证动作是否符合Schemaaction_type_check
: 检查动作类型action_args_check
: 验证动作参数对于多轮强化学习(GUIMTRFTDataset
),数据格式支持:
next_id
链接多个步骤这种数据格式设计充分考虑了GUI自动化任务的特点,既支持单轮也支持多轮交互,并通过异步机制实现了高效的强化学习训练。
让我继续搜索项目中关于训练数据的具体信息,了解数据集的来源和内容。 Search files...
Ran tool
Ran tool
Ran tool
Search files...
基于对项目代码的深入分析,我来为你说明这个项目强化学习所使用的训练数据:
该项目主要使用以下几个开源数据集:
CAGUI 数据集(中文应用)
Android Control 数据集
AITZ (Android in the Zoo) 数据集
GUI-Odyssey 数据集
强化学习训练需要特殊的数据格式,包含以下关键要素:
json展开代码{
"id": "任务ID",
"image": {
"<image_00>": "/path/to/screenshot_step0.png",
"<image_01>": "/path/to/screenshot_step1.png"
},
"conversations": [
{"role": "system", "content": "系统提示词"},
{"role": "user", "content": "<Question>用户任务</Question>\n当前屏幕截图:<image_00>"},
{"role": "assistant", "content": "{\"POINT\":[x,y],\"to\":\"up\"}"}
],
"bbox": [[x1,y1,x2,y2]], // 可选:用于 grounding 任务
"bbox2": [[x1,y1,x2,y2]] // 可选:第二个边界框
}
python展开代码{
"prompt": 对话历史, # 输入提示
"completion_ids": token_ids, # 生成的动作序列
"advantage": float, # 优势值(用于策略梯度)
"reward": float, # 奖励值
"step_id": int # 多步骤任务中的步骤ID
}
强化学习使用多个奖励函数来评估生成的动作质量:
react_check
: 检查思考过程和动作格式的正确性action_schema_check
: 验证动作是否符合预定义的 JSON Schemaaction_type_check
: 检查动作类型的合理性action_args_check
: 验证动作参数的有效性通过强化学习微调(RFT),模型获得了:
<think>
标签)<plan>
标签)<reflection>
标签)这些开源数据集和强化学习训练方法,使得 AgentCPM-GUI 成为首个支持中文应用操作的开源 GUI 智能体模型,在多个评测基准上达到了 SOTA 水平。
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!