网页Agent的技能复用,一直在用错误的方式
你有没有想过这样一个场景:一个网页Agent干完一批任务后,攒下了一堆"经验"——比如"怎么在购物站里筛选某个价格区间的商品""怎么在论坛里给某个帖子点赞"。下次遇到新任务,它把这些经验当成技能拿出来复用。
听起来很合理。但问题是,绝大多数做法都是在任务一开始、只看了一眼任务指令之后,就把它认为"可能有用"的技能一股脑塞进上下文里,然后整个任务过程中再也不换了。
这就像你出门前根据"今天要去超市"这一句话,把家里所有可能用得上的工具都塞进一个包,然后整天背着它——哪怕你后来发现自己其实进了一家从没来过的店,货架布局完全不一样,包里那些工具早就对不上眼前的情况了。
这篇编号 arXiv:2606.04391 的论文(SGDR,State-Grounded Dynamic Retrieval)想解决的正是这件事:技能复用不该在任务开始时一锤定音,而该跟着Agent当前所处的页面状态走,每一步都重新检索一次。

上面这张图把矛盾摆得很清楚。上半部分是既有做法(Previous Skill Methods):只根据任务指令,在最开始就注入一组固定技能 \(s_1 \dots s_k\),结果执行到中间,页面状态变了,技能却没变,于是出现了那个刺眼的红字——"skill-state mismatch during execution"(执行过程中技能与状态错配)。下半部分是这篇论文的做法:每一个观察状态 \(o_1\)、\(o_2\)、\(o_t\) 都各自去检索一组当下最相关的技能,正如图底部那句话所说——"retrieve skills as the state evolves"(随着状态演化而检索技能)。图里蓝色圆圈是观察、橙色方块是动作、绿色方块是被检索出来的技能。
一句话核心
SGDR 把网页Agent的技能复用从"任务级一次性注入"改成"步级、按当前页面状态动态检索",并配套了一套从成功轨迹里用滑动窗口提取技能、用"文本描述 + 可执行代码"双表示存储、再用相关性加 MMR 重排来检索的完整流程。在 WebArena 上,它相比此前的技能学习方法拿到了实打实的提升。
论文信息
- 标题:State-Grounded Dynamic Retrieval for Online Skill Learning of Web Agents(面向网页Agent在线技能学习的状态锚定动态检索)
- arXiv 编号:2606.04391
- 提交日期:2026 年 6 月 3 日
- 作者机构:University of Georgia、Tencent America、New York University、The Hong Kong Polytechnic University
问题到底出在哪
先说清楚"在线技能学习"是什么。它指的是:Agent在不断完成任务的过程中,自己从过往的成功轨迹里归纳出可复用的"技能",存进一个技能库,未来遇到新任务时再把相关技能取出来用。整个过程不依赖额外的人工标注,是Agent自己滚雪球。
这里面真正分叉的地方,是"技能怎么取出来用"。论文把既有做法归成两类,并指出它们各自的毛病。
第一类是任务级复用(task-level skill reuse)。代表性工作比如 AWM、ASI,它们在任务刚开始、只拿到任务指令的时候,就决定好这次要用哪些技能,然后整个执行过程里这组技能固定不动。问题在于,网页任务的执行是高度动态的:你点进一个页面,下一步看到什么、能做什么,往往要到了那一步才知道。一开始拍板的技能,很难匹配后面每一步真实遇到的页面状态。这就是前面那张图里"skill-state mismatch"的来源。
第二类是检索的粒度和时机不对。就算有些方法会做检索,它们也往往只检索一次,或者检索的依据是任务目标而不是当前状态。论文的判断是:检索应该发生在每一步,依据应该是Agent此刻真正看到的页面。
把这两点合起来,论文的主张就很明确了——技能复用要"state-grounded"(锚定在状态上)而且"dynamic"(每一步动态做),这正是方法名字 SGDR 的由来。
方法拆解:三个阶段

整套方法可以顺着上面这张图分成三个阶段来看。左边是 Stage 1 提取(Extraction),中间是 Stage 2 检索(Retrieval),右边是 Stage 3 激活(Activation),右侧的循环箭头表示这套流程会随着一个个任务持续滚动:完成任务、提取技能、进入下一个任务。
Stage 1:滑动窗口从成功轨迹里抠技能
技能从哪来?从Agent自己跑成功的轨迹里来。
一条完整的轨迹是一串"观察 - 动作"交替的序列。论文用一个滑动窗口在这条序列上滑动,窗口长度取 \(\mathcal{L}=\{2,3,4,5\}\) 这几种,也就是说,连续 2 到 5 步的片段都可能被截取出来当成一个技能候选。
这里有两个关键约束值得注意。其一,只从成功的轨迹里提取——失败轨迹里的片段不要,避免把错误经验固化成技能。其二,提取过程遵循 ASI 的验证流程,也就是说截出来的片段还要经过一道检验,确保它确实是个有意义、可复用的操作单元,而不是随便切出来的碎片。
Stage 2:双表示存储——描述给检索,代码给执行
每个技能 \(s_k\) 都用一对东西来表示:
其中 \(d_k\) 是这个技能的文本描述,\(c_k\) 是它对应的可执行代码。
这个设计很巧妙,因为它把"找技能"和"用技能"两件事的诉求分开了。找的时候,你需要的是语义层面的匹配——当前页面在干什么、哪个技能描述跟它对得上,所以用文本描述 \(d_k\) 去做检索最自然。而真正要执行的时候,Agent需要的是能直接落地的操作,所以把代码 \(c_k\) 注入进去。一个技能,两副面孔,各司其职。
Stage 3:相关性检索 + MMR 重排,每一步都重来一次
这是 SGDR 最核心的一环。在执行的每一步 \(t\),Agent都会基于当前状态重新检索一次技能。
第一步是算相关性分数。对于技能 \(k\),它在第 \(t\) 步的得分由两部分加权组成:
直白地说,一个技能值不值得现在用,既要看它跟当前页面状态像不像,也要看它跟整体任务目标像不像。论文把权重 \(\alpha\) 设成 \(0.5\),等于让"此刻的状态"和"最终的目标"对半开地说话——既不让Agent只盯着眼前而忘了要去哪,也不让它只惦记目标而无视眼前的页面。
第二步是 MMR 重排(Maximal Marginal Relevance,最大边际相关性,源自 Carbonell 和 Goldstein 1998 年的工作)。光按相关性排序有个隐患:排在前面的几个技能可能高度雷同,塞进去等于浪费名额。MMR 在挑选时会同时考虑"和查询的相关性"与"和已选技能的差异性":
\(\lambda\) 取 \(0.7\),偏向相关性但也保留了一定的多样性压力。最终每一步挑出 \(5\) 个技能注入给Agent。
这一整套——算分、重排、注入——在执行的每一步都会重新走一遍。状态变了,检索结果就跟着变,技能和当前页面始终对得上。这就是"state-grounded dynamic"四个字的全部含义。
实验:在 WebArena 上验证
论文的实验平台是 WebArena,一个被广泛使用的网页Agent基准,覆盖五个领域:Shopping(购物)、Admin(后台管理)、Reddit(论坛,这里指其复刻版)、Gitlab(代码托管)、Map(地图),共 764 个单领域任务。
骨干模型用了两个,一个是闭源的 GPT-4.1,一个是开源的 Qwen3-4B,一大一小,用来看方法在不同能力底座上的表现。
对比的基线包括:
- Vanilla:不用任何技能,裸跑。
- AWM(Agent Workflow Memory):把工作流当记忆复用。
- ASI(Agent Skill Induction):归纳技能后复用。
- CER(Contextual Experience Replay):上下文经验回放。
这几个基线基本代表了"任务级技能复用"和"经验回放"这两条主流路线。
主结果

主实验(对应论文 Table 1)的结论很干脆:SGDR 在多数领域和总体成功率上都超过了这些基线。它的优势在那些执行过程动态、页面状态变化大的领域尤其明显——这恰好印证了方法的出发点。任务级方法在这些场景里吃亏,正是因为它们一开始锁定的技能跟不上后面页面的变化;而 SGDR 每一步重新检索,自然更贴合。
值得一提的是,这个提升在 GPT-4.1 和 Qwen3-4B 两个底座上都成立。也就是说,方法的收益不是靠某个特别强的大模型撑起来的,小模型同样吃得到这套动态检索的红利。
消融:每个设计都拆下来验证一遍

论文用了好几张消融表(对应 Table 2、3、4)来拆解各个组件的贡献,核心结论可以归纳成三条:
其一,动态检索本身是关键。 把"每一步检索"换回"任务开始时检索一次",成功率明显下滑。这直接坐实了论文的主张——错配的代价是真实的。
其二,状态信号不能丢。 当相关性打分里去掉"当前状态"那一项、只靠任务目标去检索时,效果变差。这说明 \(\text{score}_t\) 公式里那个 \(\alpha\) 权重对应的状态项不是摆设。
其三,MMR 重排带来的多样性有用。 去掉 MMR、纯按相关性取 top-5,效果不如有 MMR。原因前面说过:纯相关性容易选出一堆近似重复的技能,浪费了注入名额,而 MMR 保证了这 5 个技能各有侧重。
几个关键超参(\(\alpha=0.5\)、\(\lambda=0.7\)、每步取 5 个技能)也在实验里给出了选择依据,不是拍脑袋定的。
我的几点判断
读完之后,我觉得这篇论文最值得记住的,其实是它对问题的重新框定,而不是某个具体的公式。
把技能复用从"决策"变成"持续匹配",这个视角转换是对的。 过去大家默认技能是任务开始时要做的一个选择题,选完就执行。SGDR 说不对,技能复用是一个贯穿执行全程、需要不断和当前状态对齐的过程。这个认识一旦接受,"每一步重新检索"就成了顺理成章的结论。对任何做Agent的人来说,这个思路可以迁移到技能之外——记忆、工具、上下文,是不是也都该跟着状态动态调整,而不是开局定死?
双表示是个朴素但实用的工程选择。 描述管检索、代码管执行,把语义匹配和实际落地解耦开。这种"一个对象、两套表示、各自服务不同环节"的做法,在很多检索增强的系统里都能复用。
当然也有需要留神的地方。 每一步都重新检索一次,意味着额外的检索开销和上下文占用。在长任务、长轨迹上,这个成本怎么控制,论文里我没看到特别深入的讨论。另外,技能库是从成功轨迹滚雪球攒出来的,那么冷启动阶段(库里几乎没东西的时候)方法的收益从何而来、会不会一开始反而拖累,也是值得继续追问的点。
它能给行业带来什么。 如果你在做网页Agent、RPA 类自动化、或者任何需要在动态界面上长程操作的系统,SGDR 提供了一个很清晰的改造方向:别再在任务开头一次性配好技能,把检索做成每一步的常规动作,并且让当前页面状态在检索里占足够的分量。这套思路的迁移成本不高,但对那些"执行过程页面变化大"的场景,收益可能很直接。
写在最后
SGDR 这篇论文的好,不在于它发明了多复杂的机制——滑动窗口、双表示、相关性加 MMR,每一个拆开看都不算新。它的价值在于把"技能复用要锚定在当前状态上、要每一步动态做"这件事讲清楚、做扎实,并在 WebArena 上用 arXiv:2606.04391 这套完整实验证明了它确实管用。
有时候推动一个领域往前走的,不是更花哨的方法,而是有人把一个被忽略的常识重新摆到台面上:眼前的页面已经变了,你手里的技能也该跟着变。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我