视觉驱动的 Operator Agent 模式
视觉驱动的 Operator Agent 模式
前置知识
本章涉及 Agent 核心循环与工具调用的通用原理,建议先阅读:
下文假设你已理解上述概念,直接聚焦视觉驱动的 Operator Agent 这一特殊模式。
什么是 Operator Agent
Operator Agent 是一类通过视觉感知与环境直接交互的 Agent。与传统的 API 调用型 Agent 不同,Operator Agent 不依赖结构化的接口,而是通过截屏 → 视觉模型理解 → 生成动作指令 → 执行 → 再截屏的迭代循环,像人类用户一样操作浏览器或计算机桌面。
这种模式的核心优势是通用性:任何人类能用鼠标键盘完成的操作,Operator Agent 都能完成,无需为每个应用编写专用集成代码。代价是成本高(每次迭代需要视觉模型调用)和可靠性低(视觉理解可能出错,动作执行可能偏离预期)。
架构概览
核心设计模式
1. Agent-Environment 分离
Operator Agent 遵循控制面与数据面分离的原则:
| 组件 | 职责 | 接口 |
|---|---|---|
| OperatorAgent(控制面) | 决策:理解环境状态 → 生成动作序列 | act(env_state) → AgentActResult |
| Environment(数据面) | 执行:接收动作 → 操作实际环境 → 返回结果 | step(action) → EnvStepResultget_state() → EnvState |
这种分离使得:
- 同一个 Agent 可以驱动不同类型的环境(浏览器、计算机桌面、甚至移动端)
- 同一种环境可以被不同的 Agent 驱动(Anthropic、OpenAI、专用视觉模型)
- 测试时可以独立 mock Agent 或 Environment
2. 环境状态抽象
环境状态被抽象为三个核心字段:
EnvState: - screenshot: 当前屏幕截图(base64 编码) - url: 当前页面 URL(浏览器环境) - width / height: 屏幕分辨率这个抽象足够简单——视觉模型只需要截屏就能理解整个环境状态,同时保留了 URL 等结构化信息用于辅助决策。
3. 动作指令体系
动作指令分为三类:
鼠标操作:点击(左/右/中/双/三击)、拖拽、移动、悬停、滚动 键盘操作:按键、长按、文本输入 环境操作:页面导航、截图、等待、返回上一页
每个动作指令是一个独立的数据类(如 ClickAction(x, y, button, modifier)),Agent 输出的是结构化指令而非自然语言描述。
4. 迭代循环的终止条件
Operator Agent 的循环有三个终止条件:
- 任务完成:Agent 不再输出动作(
not agent_result.actions) - 达到迭代上限:默认 100 次,防止无限循环
- 用户中断:通过 WebSocket 发送新指令或取消信号
终止后进入总结阶段:Agent 使用专用 summarize_prompt 将所有交互历史压缩为一段自包含的回答。
5. 上下文压缩策略
Operator 会话生成大量消息(每次迭代 = 截屏 + 动作 + 结果),容易超出上下文窗口。压缩策略:
触发条件:消息数 > message_limit(基于 max_context / 2000 计算)压缩方式:将连续的多条消息压缩为一条摘要压缩比例:保留 1/5 不压缩,压缩前 4/5这种策略保证最近的交互(最相关的部分)保持完整,而历史交互被压缩为摘要。
环境实现模式
BrowserEnvironment
浏览器环境通常基于 Playwright 或类似的浏览器自动化库实现:
start(): 启动浏览器实例,设置窗口尺寸get_state(): 截取当前页面 + 获取当前 URLstep(action): 将动作映射为 Playwright 操作(如ClickAction→page.click())close(): 关闭浏览器实例
ComputerEnvironment
计算机环境通常基于 Docker 容器运行一个完整的桌面环境:
start(): 启动 Docker 容器,配置 VNC/X11 服务器,设置分辨率get_state(): 通过 VNC 截屏step(action): 将动作映射为 xdotool 命令(如ClickAction→xdotool mousemove x y click 1)close(): 停止并清理 Docker 容器
环境选择权衡
| 维度 | 浏览器环境 | 计算机环境 |
|---|---|---|
| 能力范围 | 仅限 Web 应用 | 完整桌面操作 |
| 部署复杂度 | 低(只需浏览器) | 高(需要 Docker + 桌面环境) |
| 延迟 | 较低(直接 DOM 操作) | 较高(VNC 截屏 + xdotool) |
| 安全性 | 浏览器沙箱隔离 | 需要 Docker 隔离 |
| 成本 | 较低 | 较高(容器资源开销) |
模型选择策略
Operator Agent 必须使用视觉模型。常见的模型选择:
| 模型提供商 | 适用模型 | 特点 |
|---|---|---|
| Anthropic | Claude 3.5/3.7 Sonnet, Sonnet 4, Opus 4 | 原生 computer use tool 支持 |
| OpenAI | GPT-4o | 通用视觉能力 |
| 开源 | UI-TARS 系列 | 专用 GUI grounding 模型 |
关键要求是模型支持工具调用 + 视觉输入的组合能力。
潜在陷阱与对策
陷阱 1:无限循环
Agent 可能陷入重复操作循环(如反复点击同一个按钮)。
对策:
- 硬性迭代上限(默认 100)
- 在达到上限时返回当前结果 + 警告消息
- 建议用户拆分任务或换一种方法
陷阱 2:上下文爆炸
每次迭代产生大量 token(截屏 + 动作描述 + 结果)。
对策:
- 上下文压缩策略(保留最近交互,压缩历史)
- 限制截屏分辨率(如 1024×768)
- 使用 prompt caching 降低重复截屏的成本
陷阱 3:环境状态不一致
Agent 执行动作后,环境状态可能未按预期变化(如页面加载慢、动画未完成)。
对策:
- 在动作之间插入
WaitAction - 截屏作为动作后的反馈,Agent 可以自己判断是否需要等待
- 对于浏览器环境,可以跟踪访问过的 URL 用于调试
陷阱 4:用户输入阻塞
某些操作需要用户输入(如填写表单中的个人信息、验证码)。
对策:
RequestUserAction机制:Agent 可以请求用户输入- 收到用户输入请求后暂停循环,不关闭环境
- 用户输入后作为新的 user 消息加入对话
陷阱 5:成本失控
视觉模型调用成本高昂,一次完整的 Operator 任务可能需要数十次调用。
对策:
- 使用快速模型(如 Haiku)做简单决策
- 对推理密集任务切换到 reasoning 模型
- 提供成本估算给用户,设置预算上限
与其他 Agent 模式的对比
- API 调用型:精确、低成本、但需要为每个应用编写集成代码
- Operator Agent:通用、零集成成本、但成本高且可靠性低
- 混合模式:优先尝试 API,失败时降级到 Operator——这是未来最实用的方向