WebXSkill — 给 Web agent 的可执行 skill 是参数化代码 + URL 图索引
待复核WebXSkill 是一套专给 Web agent 的 skill 学习方法:把成功完成网页任务的轨迹抽成 executable skill = 参数化代码 + 步骤级自然语言注释;用 URL 作 key 建图索引,遇到新页面直接查图找最相关的 skill。日常类比:以前 web agent 像盲人走迷宫——每个网页都从头摸;WebXSkill 把已经走通的路画成地图,每条路标着”从这里点哪个按钮、填哪个表单”,下次再走从地图上查。
旧 Web agent 路线(react / WebVoyager)通常让 LLM 每次现场看页面结构(DOM:网页的标签树,像房子的房间平面图)、思考、生成 click。问题:(a)同站反复推理浪费 token;(b)DOM 易跑偏;(c)跨任务不积累。
WebXSkill 三件:(1)skill = def task(params) 可执行代码 + 步骤注释;(2)按 URL 域与 path pattern(路径模板,如 /s?*)建图索引;(3)参数化运行。部署有两种:grounded 直接跑代码,guided 按注释逐步走。论文报告相对基线 WebArena 最高约 +9.8、WebVoyager 最高约 +12.9 个百分点。
不理解 WebXSkill,下面这些事都没法解释:
- 为什么 2026 年 Web agent 开始更多走”积累式”——纯 reactive 已摸到天花板
- 为什么 URL 是天然的 skill key——它比 DOM 指纹稳定多
- 为什么”参数化代码 + 自然语言注释”两层表示更好——改写靠注释、执行靠代码
- 为什么 WebArena / WebVoyager 上仍有约 10pp 提升空间——skill 复用是大坑
WebXSkill 的关键拆成 三步:
-
可执行 skill 表示:每条 skill 是带参数的函数 + 步骤注释。类比:菜谱既有可照做的步骤编号,又有”这一步是在调味”的说明。代码可直接调浏览器自动化(如 Playwright)跑;注释让 LLM 出错时改写。
-
URL 图索引:skill 挂在 URL pattern 上(如
*.amazon.com/s?*)。类比:图书馆按书架号找书,不按书名模糊搜。新任务取目标 URL,查图最近邻拿 top-K 候选——比向量检索任务描述更准。 -
参数化 + 双模式部署:skill 接受
(query, filters)等参数。类比:同一张空白表格,每次填不同内容。grounded 模式一口气执行;挂了可切 guided,按注释一步步跟。
三步咬合:可执行让 skill 直接 run、URL 索引让查询准、参数化让一条 skill 复用多次。
案例 1:URL 图比向量检索准
Section titled “案例 1:URL 图比向量检索准”task = "在 amazon 搜耳机"target_url = "https://www.amazon.com/s"# 向量检索:"搜耳机" → amazon/ebay/taobao/google/bing 五条难分# URL 图:匹配 *.amazon.com/s → 只剩 amazon-search逐部分解释:
- 任务描述太泛,文本相似度会命中多个购物站 skill
- 目标 URL 把意图钉在 amazon 域
- path pattern
/s再收窄到搜索页 skill,省一次 LLM 排序
案例 2:参数化让一条 skill 当多条用
Section titled “案例 2:参数化让一条 skill 当多条用”# goto/fill/click = Playwright 风格封装(教学伪代码)def search_and_filter(site, query, filt=None): goto(f"https://{site}/s") fill('input[name="q"]', query) # selector:页面上定位输入框的地址 if filt: click(f'[data-filter="{filt}"]') click('button[type=submit]')
search_and_filter("amazon.com", "lamp", "price-asc")search_and_filter("ebay.com", "watch", None)逐部分解释:
site/query/filt是可变槽位,不是录死的点击序列- 任务 A/B 只换参数,不新建 skill
- 库规模随参数组合增长,不随任务条数爆炸
案例 3:执行错了改注释不改意图
Section titled “案例 3:执行错了改注释不改意图”# 旧:fill('input[name="q"]', query) # 步骤 2:填查询框# 网站改版后选择器失效 → LLM 读注释知意图,换新 selectorfill('input[id="search-query"]', query) # 步骤 2:填查询框(保留)逐部分解释:
- 注释是意图层(“填查询框”),代码是实现层
- 改版只换 selector,不重写整条 skill
- 更新回库后,下次 grounded 可直接跑新版
- URL pattern 太严或太宽:精确路径匹配率低,仅域名易拿错 skill;用 path 前缀 + query 模板平衡。
- 参数化深度有 trade-off:参数太多 LLM 易填错;太少则近似 skill 重复。
- DOM 选择器易脆:改版会让大批 skill 失效;靠注释兜底改写,skill 整体仍存活。
- 登录 / cookies / captcha 破复用:依赖登录态的 skill 标
stateful: true(有状态,像要先刷门禁卡)隔离;grounded 挂了应切 guided 按注释逐步走。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 同站反复任务(建议 ≥3 次才值得抽 skill)——URL pattern 收敛
- 可参数化任务(搜索 / 填表 / 提交)——结构化输入
- 有 Playwright/Selenium 等可执行后端
- 站点改版周期较长(约 ≥1 月)——selector 寿命够
不适用:
- 一次性陌生站——建 skill 不划算
- 高度动态 SPA(DOM 周级大改)——selector 失效率高
- 反爬强(Cloudflare / captcha)——skill 跑不起来
- 高度自由文本、难参数化的任务
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 2017:Selenium IDE 录制可重放脚本——“web skill” 雏形,全人写
- 2022–2023:WebGPT / WebVoyager 等 all-in 现场看 DOM 推理
- 2024:CodeAct 把”代码作为 action”推主流,给 skill 表示提供模板
- 2025–2026:URL 索引从 RAG 工程迁到 agent skill;WebXSkill 把代码 skill + URL 图 + 参数化合在一起
- 同期:mind-skill / skill-as-pseudocode / effiskill 做通用 skill 工作
- 可执行代码 > 纯自然语言描述:能 run 的 skill 直接用,描述还要二次解读
- URL 是 web 上的天然 skill key:跨任务稳定且有结构
- 参数化 + 意图/实现两层表示:一条 skill 顶 N 条脚本;注释帮重写、代码帮执行
- stateful 要隔离,失败可切 guided:登录态破坏复用;双模式是容错开关
- 论文原文:arXiv 2604.13318
- WebArena:webarena.dev
- WebVoyager:arXiv 2401.13919
- voyager —— skill 库奠基(minecraft)
- mind-skill —— 同期 skill 质量保证
- voyager —— skill 库奠基;WebXSkill 搬到 web
- mind-skill —— 同期通用 skill 质量保证
- skill-as-pseudocode —— 同期 skill 表示;垂直补充
- effiskill —— 同期代码效率 skill
- skill-pro-nonparametric-ppo —— 同期 skill 选择优化
- react —— agent 标准循环;WebXSkill 在检索阶段加 URL 图
- effiskill —— EffiSkill — 把代码效率优化经验抽成两层 skill 库
- mind-skill —— MIND-Skill — 用归纳和演绎双 agent 抽 skill 并保证质量
- mmskills-multimodal —— MMSkills — 把视觉 agent 的”操作经验”做成多模态卡片
- skill-as-pseudocode —— Skill-as-Pseudocode — 把 agent 笔记本写成可校验的伪代码
- skill-sd-self-distillation —— Skill-SD — 用 agent 自己抽出的 skill 当 dynamic teacher 自蒸馏