基于Computer-Using Agent(CUA)的自动化计算机操作实现原理与实践

概述

本文介绍了如何通过Computer-Using Agent(CUA)模型实现自动化计算机操作,包括系统架构、实现流程、关键参数配置及安全机制。CUA模型结合了视觉能力与推理能力,可模拟人类对计算机界面的控制,自动执行点击、输入、滚动等操作,广泛应用于自动化任务场景。

系统架构原理

CUA的自动化操作流程采用循环控制结构:
1. 模型发起操作请求(如点击、输入),由开发者代码在目标环境中执行。
2. 执行后,环境状态(如截图)被反馈给模型。
3. 模型根据反馈信息推理下一步操作。
4. 循环以上过程直至任务结束。

该架构允许模型自动化执行如预订航班、产品搜索、表单填写等涉及多步交互的任务。

环境准备

为安全起见,建议在本地沙盒环境或虚拟机进行开发与测试。需确保环境支持截图采集及界面操作代码,以下以本地浏览环境为例说明。

集成CUA循环的关键流程

1. 发送模型请求

首次请求需指定模型、工具、环境参数、初始输入内容及可选截图。以下为Python示例代码:

from openai import OpenAI
import base64

client = OpenAI()

# 初始环境截图(可选)
screenshot_base64 = "..."  # 请替换为实际Base64编码截图

response = client.responses.create(
    model="computer-use-preview",
    tools=[{
        "type": "computer_use_preview",
        "display_width": 1024,
        "display_height": 768,
        "environment": "browser"
    }],
    input=[
        {
            "role": "user",
            "content": [
                {"type": "input_text", "text": "访问 https://zzzzapi.com 并检查首页内容。"},
                # 可选初始截图
                {"type": "input_image", "image_url": f"data:image/png;base64,{screenshot_base64}"}
            ]
        }
    ],
    reasoning={"summary": "concise"},
    truncation="auto"
)
print(response.output)
关键参数说明
  • model: 使用"computer-use-preview"模型。
  • tools: 指定工具类型、显示尺寸和环境(浏览器、操作系统等)。
  • input: 包含用户意图文本及可选截图。
  • truncation: 设置为"auto"以支持大型输入。

2. 接收模型建议操作

模型响应包含computer_call项及推理结果。例如:

{
    "type": "computer_call",
    "action": {
        "type": "click",
        "button": "left",
        "x": 156,
        "y": 50
    },
    "pending_safety_checks": [],
    "status": "completed"
}

在实际循环中需要判断是否存在computer_call并提取下一步操作。

3. 在环境中执行操作

使用自动化工具(如Playwright)将模型建议转化为实际操作。例如:

def handle_model_action(page, action):
    """
    根据模型操作指令在Playwright页面上执行操作。
    支持click、scroll、keypress、type、wait等类型。
    """
    action_type = action["type"]
    try:
        if action_type == "click":
            x, y = action["x"], action["y"]
            button = action.get("button", "left")
            page.mouse.click(x, y, button=button)
        elif action_type == "scroll":
            x, y = action["x"], action["y"]
            scroll_x, scroll_y = action.get("scroll_x", 0), action.get("scroll_y", 0)
            page.mouse.move(x, y)
            page.evaluate(f"window.scrollBy({scroll_x}, {scroll_y})")
        elif action_type == "keypress":
            for key in action["keys"]:
                page.keyboard.press(key)
        elif action_type == "type":
            text = action["text"]
            page.keyboard.type(text)
        elif action_type == "wait":
            import time
            time.sleep(2)
        # 可扩展其他操作类型
    except Exception as e:
        print(f"Error handling action: {e}")

4. 更新环境截图

每次操作后需采集最新环境截图并编码后反馈给模型。

def get_screenshot(page):
    """
    使用Playwright采集当前页面截图。
    """
    return page.screenshot(full_page=True)

5. 循环执行操作

持续循环以上步骤直至模型不再返回computer_call为止。

import time
import base64
from openai import OpenAI

client = OpenAI()

def computer_use_loop(page, response):
    """
    执行CUA循环,直到模型不再返回操作建议。
    """
    while True:
        computer_calls = [item for item in response.output if item.type == "computer_call"]
        if not computer_calls:
            print("无更多操作建议,循环结束。")
            break
        action = computer_calls[0].action
        handle_model_action(page, action)
        time.sleep(1)
        screenshot_bytes = get_screenshot(page)
        screenshot_base64 = base64.b64encode(screenshot_bytes).decode('utf-8')
        response = client.responses.create(
            model="computer-use-preview",
            previous_response_id=response.id,
            tools=[{
                "type": "computer_use_preview",
                "display_width": 1024,
                "display_height": 768,
                "environment": "browser"
            }],
            input=[{
                "call_id": computer_calls[0].call_id,
                "type": "computer_call_output",
                "output": {
                    "type": "input_image",
                    "image_url": f"data:image/png;base64,{screenshot_base64}"
                }
            }],
            truncation="auto"
        )
    return response

对话历史管理

可通过previous_response_id参数链接对话状态,简化会话管理。若不使用此参数,则需手动维护模型输入与输出数据。

安全机制说明

CUA模型集成多重安全检查,包括:
- 恶意指令检测:识别截图中的潜在恶意内容。
- 域名相关性检测:确认当前域是否与任务意图相关。
- 敏感域名检测:警告访问敏感站点。

当收到pending_safety_checks时,需在后续请求中通过acknowledged_safety_checks显式确认。例如:

response = client.responses.create(
    model="computer-use-preview",
    previous_response_id=...,  # 上次响应ID
    tools=[...],
    input=[{
        "type": "computer_call_output",
        "call_id": ...,
        "acknowledged_safety_checks": [
            {
                "id": ...,
                "code": "malicious_instructions",
                "message": "检测到潜在恶意操作。请确认后继续。"
            }
        ],
        "output": {
            "type": "computer_screenshot",
            "image_url": ...
        }
    }],
    truncation="auto"
)

对于高风险或敏感操作,建议引入人工确认机制,确保操作安全可靠。

关键参数与配置建议

  • 环境类型:建议优先在浏览器环境下使用,模型推理准确性更高。
  • 安全配置:可根据业务需要设置网站或用户的白名单与黑名单。
  • current_url:在每步操作中反馈当前访问URL,有助于提升安全检测效果。

模型局限性与风险

  • CUA模型在浏览器外环境(如操作系统)下误操作风险较高。
  • 任务执行准确性随环境复杂度提升而降低,应避免用于高风险任务。
  • 建议人机协作,防止模型自动执行不可逆操作。

总结

CUA模型通过图像感知与自动推理能力,能够实现高度自动化的计算机界面操作。结合安全机制与循环控制,可应用于多种自动化任务场景。开发者应合理配置环境参数,引入安全管控措施,确保自动化系统的可靠性与安全性。

Logo

更多推荐