Agent Engineering 课程阅读
首页/课程八 · GUI Agent/全景与基线:GUI Agent 为什么还没收敛

在 GitHub 查看原文

本页目录

Lesson 00 — 全景与基线:GUI Agent 为什么还没收敛

本课目标:建立 GUI Agent 的流派地图,理解「会搜索 ≠ 会上网」,跑出贯穿全课程的裸基线——research-assistant 现状只能拿搜索摘要,翻页/详情/时效证据一概拿不到。

学完你能回答:「让 Agent 上网操作页面这事儿,到底解决没?为什么你敢说自己懂 GUI agent?」——答案是先讲清它没收敛、三大流派取舍在哪,再立一个裸基线让后续每个机制的收益都有对照。


0. 这门课的定位

前七门课(RAG/Agent/框架/工作流/LLMOps/多模态文档智能/前沿)把 research-assistant 养成了一个会思考的深度智能体:有记忆、能反思、会写代码、跨会话进化。但它只有脑子没有——它「研究世界」的唯一渠道是 tools.py:web_search(DuckDuckGo 搜索摘要),拿到的永远是别人咀嚼过的摘要片段,从没自己打开过一个网页、点过一个按钮、翻过一页。

这门课给它长出一双稳、安全、可评估的手。教的是 2025–2026 仍未收敛的前沿:让 Agent 直接操作浏览器完成任务(打开页面、点击、翻页、提取、下载),而不是只调搜索 API。所以课程风格延续第七门课:README 不讲「标准做法」,讲「有哪几种流派、取舍是什么、我们选 X 因为……」;代码是「手写核心机制 + 设计实验验证有没有用」。

🎯 核心认知:会搜索 ≠ 会上网。搜索 API 给的是「摘要」,网页里真正有价值的——详情页的结构化字段、翻页才能看到的第 2、3 页、带访问时间戳的证据——搜索 API 天生拿不到。这个 gap 就是 GUI agent 的价值证明。


1. 两条贯穿全程的主线

这门课每节 README 结尾都要说清本课在两条主线上的位置——这是未收敛领域的纪律,不能断。

主线一:评估主线

真实网站会变,GUI agent 的评测天生不可复现——今天跑通 arXiv 明天改版就挂。所以本课 L00 先立裸基线存档全程对照,L08 自建本地可复现 mini-benchmark(功能性验收),L11 用它出全部机制的收益表。没有可复现的度量,「agent 会上网了」就是玄学。

主线二:观察-行动接口主线

GUI agent 的一切问题都归结为两个设计: - 观察空间(页面怎么表示给模型):原始 HTML / 可访问性树 / 截图,放什么进上下文窗口 - 行动空间(模型能说什么):受限 DSL / 坐标 / 自由代码

这是第七门课「上下文工程」母题在 GUI 场景的延伸——观察空间设计 = 决定上下文窗口里放什么,行动空间设计 = 决定模型能对世界施加什么动作。


2. 流派对比:三大流派

GUI agent 领域最大的流派之争,是页面怎么喂给模型 + 模型怎么表达动作的组合。粗分三派:

流派 观察空间 行动空间 代表 取舍
文本派 DOM/可访问性树(元素编号列表) 受限 DSL click(3) Mind2Web/WebArena 早期 agent ✅ 便宜、稳、token 可控;🚫 canvas/纯视觉信息处理不了,复杂布局漏元素
视觉派 截图喂 VLM 坐标点击 / SoM 编号 SeeAct、通用 VLM+脚手架 ✅ 所见即所得、信息无损;🚫 贵、grounding 难(看得懂说不准点哪)
专用模型派 截图(端到端训练) 端到端输出动作 UI-TARS / CogAgent / AutoGLM ✅ 专训后大幅超过通用 VLM+脚手架;🚫 成本高、泛化存疑、可控性差

这门课的选型:L01–L04 文本派打底(手稳、便宜、可复现),L05 加视觉路线做同任务对照,落地(L09)选混合路线——文本为主、卡住才截图求助。理由:性价比最优,且文本路线的 DSL 天然可校验可白名单(安全主线的压舱石)。

🎯 专用模型派(UI-TARS 等)我们不部署——只读论文 + 在 L12 做判断框架分析。但它是这个领域最大的变量:如果专训模型持续碾压脚手架,我们的「手写脚手架」路线可能被吃掉。L12 专门讨论这个。


3. 奠基论文导读

GUI agent 这个领域的「地基」论文,用三遍读法(第七门课 L00 的方法)各取一句话:

WebArena(Zhou et al. 2023)

论文:WebArena: A Realistic Benchmark for Evaluating Autonomous Agents on the Web(Zhou et al. 2023, arXiv:2307.13854

一句话说它证明了什么:自托管一组真实网站(论坛/电商/gitlab)做可复现基准,证明当时 SOTA agent 成功率约 14% vs 人类 78%——领域远未解决。

  • 为什么重要:它给出了「GUI agent 该怎么评」的范式——自托管环境 + 功能性验收(不评 agent 说了什么,检查环境终态:到达目标页了吗/字段提对了吗)。这正是 L08 mini-benchmark 的设计来源。真实网站评测不可复现,自托管是唯一出路。

SeeAct(Zheng et al. 2024)

论文:GPT-4V(ision) is a Generalist Web Agent, if Grounded(Zheng et al. 2024, arXiv:2401.01614

一句话说它证明了什么:GPT-4V 级 VLM 当 web agent 的瓶颈在 grounding——它「看得懂」页面说的是什么,但「说不准」该点哪个坐标。

  • 为什么重要:这是视觉派的命门。通用 VLM 看截图能复述页面内容,但要它输出「点击 (x=347, y=512)」就飘了。SoM(Set-of-Mark,Yang et al. 2023, arXiv:2310.11441)给截图上每个可点元素画框编号、让模型答编号不答坐标,是通用 VLM 的救星——L05 我们手写。

OSWorld(Xie et al. 2024)

论文:OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments(Xie et al. 2024, arXiv:2404.07972

一句话说它证明了什么:把 benchmark 从浏览器扩展到 OS 级(跨多 App、文件系统),同样证明 agent 成功率远低于人类。

  • 为什么重要:它是「Computer Use」版图的边界——浏览器只是开始,OS 级 agent 还要操作文件、切窗口、跨 App。L12 讲前沿版图会用到它。

💡 三篇的共同信号:在所有真实基准上,最强的 agent 都离人类很远。这正是「未收敛」的硬证据——任何号称「解决了」的方案都拿不出全绿数字。


4. 硬任务定义:贯穿全程的试金石

前沿能力只有在足够难的任务上才显出差别。这门课的试金石是「翻页取证」——搜索 API 天生做不到的事:

「翻页取证」任务(默认主题可配置):给定研究问题,要求 agent: 1. 打开真实详情页(如 GitHub releases)而非只看搜索摘要 2. 翻页/点击进入具体条目 3. 提取结构化证据(版本号/日期/变更要点),每条附 URL + 访问时间 4. 遇到 cookie 提示/弹窗能处理

双轨制:本地镜像版 + 真实版

同一任务做两个版本:

版本 用途 可复现性
本地镜像版test_pages/ 仿造的 releases 页) 单测、mini-benchmark、消融实验 ✅ 完全可复现(离线、CI 安全)
真实版(arXiv/GitHub 公开只读页) 演示、诚实标注访问日期 ⚠️ 可能随网站改版失效

🎯 核心认知:搜索 API 拿不到「第 2 页第 3 条发布的版本号和日期」——这是摘要没有、需翻页点击才能到的信息。这就是 browser agent 不是搜索增强的根本价值。


5. 跑裸基线:搜索摘要到底拿不到什么

现在跑一次硬任务的裸基线:用现状 research-assistant 的 web_search(只拿 DuckDuckGo 摘要),看它能把硬任务做到哪一步。

code.py 做两件事

  1. 用 mock 搜索结果模拟 web_search 跑硬任务(不烧 API、不依赖网络),记录「拿到了什么 / 拿不到什么」存 baseline_gui.jsonl——这是全程对照基线。
  2. 用一段写死的 Playwright 脚本手工完成本地镜像版任务(搜索→点结果→翻页→进详情→提取版本号/日期),展示 gap。这段脚本就是 L01 要泛化成 BrowserSession 的东西。

预期结果:裸基线的病

裸基线(web_search 摘要)              写死脚本(真开浏览器)
─────────────────────────             ─────────────────────────
拿到:标题 + 摘要片段 + 来源链接        拿到:版本号 / 发布日期 / 变更要点
拿不到:详情页结构化字段                拿到:翻页后的第 2、3 页
拿不到:翻页后的内容                    拿到:URL + 访问时间戳
拿不到:访问时间(只有搜索时间)        能处理:弹窗/cookie(脚本里写死处理)
无法交互(只是字符串)                  能交互(点击改变环境状态)

这个 baseline_gui.jsonl 是全程对照——L09 落地后看「browse 工具多拿到了什么」,L11 收益表对照它算增量。

⚠️ 诚实标注:本课基线用 mock 搜索结果跑(不烧真实 API、不依赖网络稳定),目的是演示「搜索摘要拿不到翻页/详情证据」这个结构性 gap。真实 API 跑出的摘要内容会变,但「拿不到详情页字段」这个结论不变——因为这是搜索 API 的能力边界,不是内容问题。


6. 流派对比:本课的方法选型

方法 做法 取舍
① 直接上真实网站 每课都在 arXiv/GitHub 上跑 demo ✅ 接地气;🚫 不可复现(改版即挂)、CI 不安全、频率难控
② 纯 mock(不碰浏览器) 全程模拟,只演示概念 ✅ 零依赖;🚫 演示不出真实交互脆性,自欺欺人
③ 本地镜像为主 + 真实只读为辅(本课选它) 随课 test_pages/ 仿造真实站,单测/基准/攻防全打本地;真实网站只演示且标注日期 ✅ 可复现、CI 安全、能复刻真实交互模式;🚫 仿造页不能 100% 还原真实复杂度

选 ③ 的理由:GUI agent 的脆性来自动态渲染/弹窗/时序竞争,这些本地页能造出来;而评测的可复现性是本课命根子(评估主线)。真实网站留给「演示 + 诚实标注」,不进 CI。


7. 落地清单

本课是方法/基线课,无 research-assistant 代码改动。产出:

文件 说明
README.md(本文件) 流派地图 + 奠基论文 + 硬任务定义 + 方法选型
code.py 跑裸基线(mock 搜索)+ 写死 Playwright 脚本完成本地镜像版,产出 baseline_gui.jsonl
test_pages/ 本地镜像站初版(index/search/detail),全程复用,后续课扩展
exercise.md 练习

起本地测试页服务

cd gui-agent-lessons/00_overview/test_pages
python -m http.server 8765
# 然后浏览器打开 http://127.0.0.1:8765/index.html

验收

cd gui-agent-lessons/00_overview

# 1. 跑基线(生成轨迹文件 + 演示写死脚本完成本地镜像任务)
#    需先装 playwright 并 chromium(见仓库根 requirements.txt 注释)
python code.py

# 预期输出:
#  - 打印「web_search 摘要拿到了什么 / 拿不到什么」对照
#  - 写死 Playwright 脚本:搜索→点结果→翻页→进详情→提取版本号/日期 全绿
#  - 生成 baseline_gui.jsonl(裸基线轨迹,全程对照)

# 2. 验证基线文件存在且有内容
ls -la baseline_gui.jsonl   # 应看到非空文件

# 3. 验证能读出基线轨迹
python -c "import json; lines=open('baseline_gui.jsonl',encoding='utf-8').readlines(); print(f'{len(lines)} 条基线记录'); print('gap 字段:', json.loads(lines[0]).get('gap'))"

⚠️ 写死脚本部分需要 Playwright + chromium。若环境未装,code.py 会跳过该段并打印提示,mock 基线部分仍产出 baseline_gui.jsonl——不会阻塞后续课。


8. 本课在两条主线上的位置

  • 评估主线:本课立了裸基线——baseline_gui.jsonl 存档「搜索摘要拿不到什么」。L08 mini-benchmark 建好后,L11 收益表对照它算「browse 工具多拿到了什么证据种类 / 引用可回访率」。没有基线,「agent 会上网了」就是感觉,不是数据。
  • 观察-行动接口主线:本课只开篇点题——硬任务里「拿不到详情页字段」的根因是 web_search 没有观察空间(只有字符串摘要),也谈不上行动空间(不能点击)。L02 正式设计观察空间,L03 设计行动空间,那时回看本课的 gap 表,每一行都对应一个设计要补的点。

🎯 面试话术

「GUI agent 我先讲清楚它没收敛——WebArena 上 SOTA 离人类还远(14% vs 78%)。三大流派取舍我都能讲:文本派便宜但处理不了视觉信息,视觉派所见即所得但 grounding 难,专用模型派强但泛化存疑。我落地选混合——文本为主卡住才截图。而且我每个改进都有基线对照:先跑一次裸基线证明搜索摘要拿不到翻页/详情证据,之后每加一个机制都拿它做对照。」