11月29日,智谱正式提出 GLM-OS 概念,并发布 AutoGLM 和 GLM-PC 两款 Agent 产品。近期GLM-PC 的基座模型—— CogAgent-9B 开源,供社区进一步开发。
CogAgent-9B-20241220 是基于 GLM-4V-9B 训练而成的专用Agent任务模型。该模型仅需屏幕截图作为输入(无需HTML等文本表征),便能根据用户指定的任意任务,结合历史操作,预测下一步的GUI操作。得益于屏幕截图和GUI操作的普适性,CogAgent 可广泛应用于各类基于GUI交互的场景,如个人电脑、手机、车机设备等。
相较于2023年12月开源的第一版 CogAgent 模型,CogAgent-9B-20241220 在 GUI 感知、推理预测准确性、动作空间完善性、任务普适性和泛化性等方面均实现了显著提升,并支持中英文双语的屏幕截图和语言交互。
论文:
https://arxiv.org/abs/2312.08914
代码:
https://github.com/THUDM/CogAgent
模型:
https://modelscope.cn/models/ZhipuAI/cogagent-9b-20241220(方便下载)
体验链接:
https://modelscope.cn/studios/ZhipuAI/CogAgent-Demo
技术文档:
https://cogagent.aminer.cn/blog#/articles/cogagent-9b-20241220-technical-report
执行过程
CogAgent 以 GUI 截图为唯一环境输入,结合已完成的动作历史,计算当前 GUI 截图中最合适的动作。该动作通过 CogAgent 端侧应用(如 GLM-PC 和 CogAgent Demo App)注入 GUI,GUI 响应并更新图像内容;同时,该动作被添加至动作历史。CogAgent 根据更新后的历史动作和截图,计算后续操作。此过程循环往复,直至 CogAgent 判定指令执行完毕。
CogAgent 的输入仅包含三部分:用户的自然语言指令、已执行历史动作记录和 GUI 截图,无需任何文本形式表征的布局信息或附加元素标签(set of marks)信息。
其输出涵盖以下四个方面:
- 思考过程(Status & Plan): CogAgent 显式输出理解 GUI 截图和决定下一步操作的思考过程,包括状态(Status)和计划(Plan)两部分,输出内容可通过参数控制。
- 下一步动作的自然语言描述(Action): 自然语言形式的动作描述将被加入历史操作记录,便于模型理解已执行的动作步骤。
- 下一步动作的结构化描述(Grounded Operation): CogAgent 以类似函数调用的形式,结构化地描述下一步操作及其参数,便于端侧应用解析并执行模型输出。其动作空间包含 GUI 操作(基础动作,如左键单击、文本输入等)和拟人行为(高级动作,如应用启动、调用语言模型等)两类。
- 下一步动作的敏感性判断: 动作分为“一般操作”和“敏感操作”两类,后者指可能带来难以挽回后果的动作,例如在“发送邮件”任务中点击“发送”按钮。
模型升级
模型基座与结构升级:CogAgent 采用了更强大的视觉语言模型GLM-4V-9B作为基座,显著提升了模型的图像理解性能。
视觉处理模块优化: 实现了更高效、统一的视觉处理模块,支持1120*1120原生高分辨率图像输入。通过带参数的下采样方法,在几乎不损失模型能力的前提下,提高了模型效率。CogAgent在结构上支持任意比例或大小的图像输入,但在训练和推理中,统一将输入图像缩放到1120*1120。尽管输入图像尺寸固定,测试结果显示,即使在2K或更高分辨率的屏幕上,模型仍能保持准确的理解能力。为获得更佳表现,建议用户适当增加图标和文字的相对大小,确保缩放后截图中的内容清晰可辨。
数据集丰富与完善: 广泛收集并整合了多种数据集,包括无监督数据和GUI指令微调数据集。无监督数据涵盖开源GUI布局数据集、自采集的应用和网页数据集;GUI指令微调数据集则包含更长链路、更多应用、跨应用的GUI agent任务数据集等。此外,利用CogAgent自我生成数据,进一步扩充和完善了数据集。
预训练策略优化: VLM和GUI预训练旨在提升模型对视觉输入和GUI界面的基础理解能力。研究团队首次提出了GUI Grounding预训练,利用屏幕截图和布局对,构建界面子区域与布局表征(如DOM元素)的对应关系,从而构造GUI的REG和REC任务:
- GUI Referring Expression Generation (REG):预测截图上某一区域对应的布局表征。
- GUI Referring Expression Comprehension (REC):预测截图中某一元素对应的位置。此方法已应用于多个GUI理解数据构造和GUI agent工作中。在原论文中,我们使用40万网页数据,构造了1.4亿的REC & REG训练样本。在此基础上,进一步扩充和优化了训练数据,加入了桌面应用和移动应用的布局数据,使模型更适应实际应用场景。
后训练策略改进: 后训练在提升模型GUI agent分析、推理、预测能力方面至关重要。我们采用了更科学的后训练策略,分为两个难度递进的阶段:
- GUI instruction tuning:融合GUI相关多任务数据,深化模型对GUI内容和功能的理解,具备初步问答能力。使用了广泛的开源数据和私有收集数据。
- GUI agent SFT:使模型具备完善的GUI agent推理能力,训练数据包括开源数据集(如Mind2Web)和额外收集的多平台跨应用数据。
模型推理及思维链优化: 将思维链分解为Status(当前屏幕状态)、Plan(全局计划)、Action(下一步自然语言描述)、Operation(下一步形式语言描述)。通过随机采样混合多种模式训练数据(如Action-Operation、Status-Action-Operation等),可根据交互情景、计算资源和准确率需求灵活调整和控制推理过程中的实际输出。
动作空间完善:明确了基础动作空间,并新增了LLM、QUOTE_TEXT、LAUNCH等高级动作,增强了模型的使用工具和交互能力。
评测结果
CogAgent 在以下四个数据集中测试了CogAgent-9B-20241220和类似模型的性能。
最佳实践
模型推理
代码下载
git clone https://github.com/THUDM/CogAgent.git cd CogAgent
模型下载
modelscope download --model ZhipuAI/cogagent-9b-20241220 --local_dir ./cogagent
CLI模型推理
python inference/cli_demo.py --model_dir ./cogagent --platform "Mac" --max_length 4096 --top_k 1 --output_image_path ./results --format_key status_action_op_sensitive
推理结果:
显存占用:
搭建WebUI可直接clone魔搭社区创空间并运行:
git clone https://www.modelscope.cn/studios/ZhipuAI/CogAgent-Demo.git cd CogAgent-Demo pip install -r requirements.txt python app.py
模型微调
我们使用ms-swift对cogagent-9b-20241220进行微调。ms-swift是魔搭社区官方提供的大模型与多模态大模型训练和部署框架。ms-swift开源地址:https://github.com/modelscope/ms-swift
在这里,我们将展示可直接运行的demo,并给出自定义数据集的格式。
在开始微调之前,请确保您的环境已准备妥当。
git clone https://github.com/modelscope/ms-swift.git cd ms-swift pip install -e .[llm]
微调脚本如下:
CUDA_VISIBLE_DEVICES=0 \ swift sft \ --model ZhipuAI/cogagent-9b-20241220 \ --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 100 \ --save_steps 100 \ --save_total_limit 5 \ --logging_steps 5 \ --max_length 2048 \ --output_dir output \ --warmup_ratio 0.05 \ --dataloader_num_workers 4
训练显存资源:
添加图片注释,不超过 140 字(可选)
自定义数据集格式如下,只需要指定`--dataset <dataset_path>`即可:
[ { "messages": [ { "role": "user", "content": "Task: 在系统设置的桌面与程序坞部分,开启调度中心板块中“显示器具有单独空间”的选项\n(Platform: Mac)\n(Answer in Action-Operation-Sensitive format.)\nHistory steps: \n0. CLICK(box=[[588,946,616,985]], element_info='系统设置')\t点击屏幕下方的“系统设置”菜单,从而打开系统设置\n1. CLICK(box=[[227,561,297,585]], element_info='桌面与程序坞')\t点击左侧菜单中的“桌面与程序坞”选项,进入桌面与程序坞的设置界面。\n2. SCROLL_DOWN(box=[[367,39,691,929]], step_count=75, element_info='滚动')\t在当前屏幕的右侧滚动区域中,向下滚动以查看更多选项。\n" }, { "role": "assistant", "content": "Action: 点击“调度中心”板块中的“显示器具有单独空间”选项,从而开启该功能。\nGrounded Operation:CLICK(box=[[655,842,671,857]], element_info='“显示器具有单独空间”的开关按钮')\n<<一般操作>>" } ], "images": ["images/0000000000336.png"] }, { "messages": [ { "role": "user", "content": "Task: 通过启动台打开系统设置,导航到“网络”部分,将DNS设置手动IP地址为8.8.4.4。\n(Platform: Mac)\n(Answer in Action-Operation-Sensitive format.)\nHistory steps: \n0. CLICK(box=[[7,6,27,31]], element_info='苹果标志')\t点击屏幕左上角的“苹果”图标,以便打开系统设置。\n1. CLICK(box=[[3,77,161,99]], element_info='系统设置…')\t点击屏幕左上角菜单栏中的“系统设置…”选项,以打开系统设置界面。\n2. CLICK(box=[[7,478,125,512]], element_info='网络')\t点击左侧菜单中的“网络”选项,进入网络设置界面。\n3. CLICK(box=[[155,217,459,270]], element_info='Wi-Fi, 已连接')\t点击屏幕中间偏上的“Wi-Fi”选项,进入Wi-Fi设置界面。\n4. CLICK(box=[[405,280,447,296]], element_info='详细信息…')\t点击Wi-Fi名称旁边的“详细信息…”按钮,以查看当前Wi-Fi的详细信息。\n5. CLICK(box=[[27,344,45,362]], element_info='DNS')\t点击左侧菜单中的“DNS”选项,进入DNS设置界面。\n6. CLICK(box=[[166,308,442,399]], element_info='8.8.8.8')\t点击DNS服务器地址输入框,准备输入新的DNS服务器地址。\n7. TYPE(box=[[163,308,443,322]], text='8.8.4.4', element_info='ip地址输入框')\t在DNS服务器地址输入框中输入8.8.4.4,以设置手动IP地址。\n8. CLICK(box=[[410,636,440,651]], element_info='好')\t点击界面右下角的“好”按钮,以确认并保存DNS设置的更改。\n" }, { "role": "assistant", "content": "Action: 已经完成了“通过启动台打开系统设置,导航到‘网络’部分,将DNS设置手动IP地址为8.8.4.4”这一任务,执行结束。\nGrounded Operation:END()\n<<END>>" } ], "images": ["images/0000000000482.png"] } ]
训练完成后,使用以下命令对训练时的验证集进行推理:
这里`--adapters`需要替换成训练生成的last checkpoint文件夹. 由于adapters文件夹中包含了训练的参数文件,因此不需要额外指定`--model`。
CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters output/vx-xxx/checkpoint-xxx \ --stream true \ --load_data_args true \ --max_new_tokens 2048
点击链接阅读原文,即可跳转模型链接:cogagent-9b-20241220