本页目录
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 做两件事
- 用 mock 搜索结果模拟 web_search 跑硬任务(不烧 API、不依赖网络),记录「拿到了什么 / 拿不到什么」存
baseline_gui.jsonl——这是全程对照基线。 - 用一段写死的 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 难,专用模型派强但泛化存疑。我落地选混合——文本为主卡住才截图。而且我每个改进都有基线对照:先跑一次裸基线证明搜索摘要拿不到翻页/详情证据,之后每加一个机制都拿它做对照。」