训练数据存储在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 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!