抛弃代码:Anthropic Computer Use 纯视觉像素转换阵列
What(本文讲什么)
Computer Use 的本质是“把 GUI 当作一个可观测环境”:模型看截图,提出动作(点击/输入/滚动/等待),宿主机执行动作并再次截图,形成感知-行动闭环。
这篇文章不追求炫技,而是把工程难点讲透:
- 视觉输入的缩放与分辨率约束。
- 坐标映射与误差放大(为什么会点偏)。
- 动作验证与防死循环(超时、重试、降级)。
- 安全边界:Computer Use 是高权限通道,必须接入零信任与 kill switch(权限、隔离、审计)。
官方文档强调了截图处理、动作延迟与动作验证等建议,这是你实现可靠 Computer Use 的底线。
参考: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/computer-use-tool
Problem(要解决的工程问题)
Computer Use 的失败模式非常“物理”:
- 误点:坐标映射误差导致点到“取消”而不是“确定”。
- 焦点错位:输入文本进入了错误窗口/错误输入框(权限风险)。
- 遮挡与滚动:按钮被遮住、页面滚动导致目标移动。
- 加载态死循环:点击后界面没变化,模型重复点击(重试风暴)。
- 非确定性 UI:弹窗、提示、动画导致截图差分难以判断。
这些问题不解决,Computer Use 会变成一个“随机点击器”,事故半径会非常大。
Principle(感知-行动闭环:每一步都必须可验证)
Computer Use 的最小闭环是:
- capture:截屏(输入)。
- decide:模型输出动作候选(意图)。
- enforce:宿主机做权限检查与安全门禁(权限、隔离)。
- act:执行动作(副作用)。
- verify:验证动作是否生效(视觉差分/DOM 状态/窗口焦点)。
- loop:继续/降级/停止(降级)。
注意这里的边界:模型提出动作,宿主机决定是否允许执行。你不能把动作执行权直接交给模型。
Usage(怎么做:四个关键模块)
1) 截图与缩放:把“输入”做成可控数据面
你要控制三件事:
- 分辨率:过大导致成本与延迟上升,过小导致目标不可辨。
- 压缩策略:压缩会引入模糊与误差。
- 一致性:同一环境尽量保持一致分辨率与缩放策略,便于回放评测(观测)。
官方文档建议选择合适分辨率,并做好 screenshot handling,这是工程边界条件。
参考: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/computer-use-tool
2) 坐标映射:误差为什么会被放大
常见实现是“模型输出归一化坐标”,宿主机把它映射到真实像素。这类映射有两个风险:
- 纵横比:截图缩放会改变像素密度,简单线性映射会偏。
- UI 动态:按钮位置在不同状态会移动,旧坐标会失效。
一个朴素但有效的策略是“两段式定位”:
- 广角定位:全屏截图,得到粗略区域。
- 局部放大:对粗略区域 crop,给模型更清晰的局部,再得到精确坐标。
3) 动作验证:避免“无效点击”导致死循环
动作验证是 Computer Use 的生命线。你至少要做:
- 帧差分:点击前后截图差异是否超过阈值。
- 超时:点击后等待最多 T 毫秒,如果无变化则进入降级(超时、降级)。
- 重试上限:同一动作不可无限重试(重试)。
- 状态探测:若可用,结合窗口焦点、控件树、DOM 等信号增加确定性(观测)。
官方文档明确建议“validate actions before execution / add action delays”,其工程含义就是“不要无脑连点”。
参考: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/computer-use-tool
4) 安全边界:Computer Use 必须接入零信任
Computer Use 是高权限通道,因为它可以:
- 操作任意 GUI。
- 输入敏感信息。
- 触发不可逆动作(删除、支付、发布)。
因此你必须把它接入零信任:
- 默认拒绝:写操作、支付、删除、发布必须明确批准(权限)。
- 工具分级:read-only / low-risk / high-risk,并绑定审批链(审计)。
- kill switch:任何时刻可一键停止并清理子进程(资源释放)。
这一点不仅是安全要求,也是“防止模型失控”的工程底线。
一个最小坐标投射器(伪代码)
下面示例强调“映射 + 边界钳制 + 动作延迟”,并为后续动作验证留接口。
class VisualTargeting:
"""
坐标投射器:
将模型坐标映射到真实像素,并做边界钳制。
"""
def __init__(self, *, screen_w: int, screen_h: int, ref: int = 1000):
self._w = screen_w
self._h = screen_h
self._ref = ref
def denormalize(self, x: int, y: int) -> tuple[int, int]:
rx = int(x * (self._w / self._ref))
ry = int(y * (self._h / self._ref))
rx = max(0, min(rx, self._w - 1))
ry = max(0, min(ry, self._h - 1))
return rx, ry
可观测性(没有 trace,你无法调 Computer Use)
每个动作至少要记录:
trace_id/task_idaction_type(click/type/scroll/wait)before_frame_hash/after_frame_hash(或差分指标)attempt/timeout_ms/retry_reasonresult/error_code
OpenTelemetry 的 GenAI events 语义约定提供了“如何把 tool 行为做成可聚合字段”的参考入口。
参考: https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/
Pitfall(常见坑与防错)
- 不做动作验证:很快进入无效点击循环(重试风暴)。
- 不做超时:等待永远不结束(超时)。
- 没有 kill switch:一旦误操作,事故半径不可控(权限、隔离)。
- 不记录截图证据:无法复盘“为什么点偏”(审计、观测)。
Debug(排查 Computer Use 不稳定)
排查顺序建议:
- 分辨率/缩放:是否一致?是否过度压缩?
- 坐标映射:是否考虑纵横比?是否做了局部放大?
- 验证策略:差分阈值是否合理?超时是否生效?重试上限是否存在?
- 权限门禁:是否有高风险动作被错误放行?
回放与回归(Computer Use 必须可测)
Computer Use 的调试如果只靠“现场看它点”,会非常痛苦。建议把每次执行变成可回放资产:
- 保存关键帧:before/after 截图(做脱敏/裁剪)。
- 保存动作序列:action_type + 坐标 + 目标窗口信息(如果有)。
- 保存验证指标:差分值、等待时长、是否超时、重试次数。
- 保存失败原因标签:误点/遮挡/焦点丢失/加载态/权限拒绝。
然后你就可以构建一个黄金回放集(golden replay set):
- 每次改坐标映射、差分阈值、动作延迟,都回放一批历史任务。
- 只要误点率上升、超时率上升,就拒绝发布(降级/阻断)。
失败原因标签(建议统一)
miss_clickfocus_lostelement_occludedloading_no_changescroll_driftpermission_deniedtimeoutretry_exhausted
标签的意义是把“它点偏了”变成可以统计的故障类型(观测),并对不同类型触发不同的恢复策略(降级)。
恢复策略(让系统能自己止损)
当验证失败时,你不应该让模型继续盲点。建议的恢复分层:
- 第一次失败:局部放大 + 重新定位(更强视觉证据)。
- 第二次失败:降低动作强度(只读观察/等待),并要求模型解释下一步为什么合理(审计)。
- 多次失败:触发人工介入或终止任务(降级、资源释放)。
这套策略的核心是“有限重试 + 明确退出”,否则你会得到一个会烧 token 和 CPU 的重复点击器(重试、超时)。
高风险动作的强制门禁(建议默认开启)
Computer Use 场景中,有一类动作即使“点对了”也可能造成事故。建议把这些动作作为硬门禁:
- 删除/清空/覆盖:任何可能破坏数据的按钮或菜单。
- 支付/购买/发布:任何不可逆对外动作。
- 权限变更:修改账号、密钥、IAM 配置。
门禁策略建议:
- 默认拒绝(Default deny)。
- 必须 HITL:展示截图证据 + 动作预览 + 资源目标,然后人工批准(权限、审计)。
- 执行后必须验证:强制截图差分与状态确认(观测)。
这不是“谨慎”,这是对高权限通道的最基本职业素养(权限、隔离)。
Source(资料来源)
- Anthropic computer use tool docs: https://docs.anthropic.com/en/docs/agents-and-tools/tool-use/computer-use-tool
- 工程实验与实现线索(分辨率/坐标映射): https://simonwillison.net/2024/Oct/22/computer-use/
- Anthropic quickstarts: https://github.com/anthropics/anthropic-quickstarts
- OTel GenAI events semconv: https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-events/