技术 · 熟练

让 AI 操作电脑,别让它找图

读控件表 · 不猜坐标
用截图喂 agent 去点按钮,是所有电脑操作方案里最贵也最脆的一种。贵在每一轮都要传一张图、再让模型在图上找位置;脆在像素会变 —— 换分辨率、字体、深色模式、窗口宽度,昨天对的坐标今天就偏了,而模型不会报错,它只是点到了旁边。换一条路:让 agent 读操作系统的无障碍树(可访问性接口),那里本来就有「这是一个叫『提交』的按钮、它会按下、它现在不可用」这样的语义信息。做法是先把界面渲染成一份带编号的控件表(编号 + 名称 + 类型 + 状态 + 可用动作),让模型只做一件事:选编号。文字输入才由小模型单独生成。⇒ 定位稳、可解释、且不必把截图塞进上下文。
方法 · 一图看懂
1
先问界面有没有语义接口 — 要操作的软件先看它暴露不暴露无障碍(可访问性)接口;有 ⇒ 走这条路,⛔ 不要一上来就截图 —
2
把界面渲染成控件表 — 抽取「编号 / 名称 / 类型 / 状态 / 可用动作」五列,⛔ 不带像素坐标,也⛔ 不带截图 —
3
让模型只选编号 — 一次调用同时给出「点哪个编号」与「要不要输入文字」;不需要它在图上找位置 —
4
文字单独生成 — 只有需要填字段时才调用一次小模型写文本;⛔ 不让大模型既选控件又写长文本 —
5
动作前后都对一遍 — 每个动作执行后重抽一次控件表,用「目标控件的状态是否变化」确认这步真的生效;⛔ 不靠「应该点到了」往下走 —
6
拿不到语义接口才退回图像 — 只有确实无接口的软件(自绘界面 / 远程画面)才用截图定位,并把该条标成降级路径 —
原理 · 为什么有效
让模型做它擅长的(选语义项),别逼它做人类也做不稳的(在像素里找位置)。 三条:① 优先语义接口(无障碍树本来就带着「这是什么控件、能不能按」)② 控件表代替截图(编号 + 名称 + 状态;省 token、可解释)③ 动作后重抽验证(用状态变化确认,⛔ 不用「应该点到了」)。退回图像只作降级路径,并显式标记。
适用场景
适合:需要 agent 替你操作桌面软件或网页(填表 / 走流程 / 批量录入 / 跨系统搬运);也适合「同一套动作要在多台机器、不同分辨率上跑」的场景。
⛔ 不适合:目标软件完全不暴露无障碍接口且无法替代(那就只能图像方案)· 纯 API 可达的场景(有接口就别操作界面)。
自测 · 5 问
我要操作的那个软件,暴露无障碍 / 可访问性接口吗?(先查,再决定方案)
我的方案里,模型是在选编号,还是在找坐标?
换一个分辨率 / 深色模式重跑一次,动作还对吗?
每个动作之后,我有没有一次「状态变了没有」的确认?
我有没有把「只能靠图像」那条路径标成降级、并知道什么时候会用到它?
怎么上手 · 验证步骤
最小可行版本:先做一个只读脚本 —— 抽取当前界面的控件表(编号 / 名称 / 类型 / 状态 / 可用动作)并打印出来。这一步先不接模型,先确认表里含有你真正要点的那些控件;缺的控件就是这套方案的真实边界。表能拿全之后,再让模型只做一件事:从表里选一个编号。文字输入、点击执行都放到下一步再接,一次只加一层。
验证只看两问:① 把窗口宽度改掉一半,同一个任务还能不能完成?② 随便挑一步,能不能说出「它点了什么、为什么」?第一问答「不能」⇒ 你仍依赖像素;第二问答「说不清」⇒ 传的仍是图像而不是控件表。
[C级]GitHub Trending 2026-09-24 · lahfir/agent-desktop(+107 · Rust:读操作系统无障碍树而不是像素猜测 · 当日 Browser Automation 簇) [C级]Startup Corners · GitHub Trending: Agentic AI Tools Recap 2026-09-24(同一簇里的对照项:browserbase/stagehand 与 vercel-labs/agent-browser 均以「可编排动作」收敛网页自动化) [C级]HackerNoon · The Hard Part of AI Isn't Reasoning. It's Everything That Happens After.(上下文需要 freshness / provenance 等属性;模型提案、软件强制的分离) 同类:借用登录态:让 agent 驱动你已经登录的浏览器 · agent 权限分级
继续往下读
同级:借用登录态:让 agent 驱动你已经登录的浏览器 下一级:图工程真正的代价:先算上下文和成本 随机一篇