阿哲是商场新来的跑腿员,第一天上班,组长递给他一张任务单:“顾客要一份生日惊喜,下午5点前送到服务台。”他连问都没问就冲进商场,转了一圈却不知道自己该买什么、该送到哪里,最后空手而归。组长叹了口气:“任务不是一句话,而是一连串环环相扣的步骤。”在AI评测领域,WebArena就像一座数字商场,里面部署着真实可交互的网页应用;被测试的AI助手则是另一个“阿哲”,它必须理解自然语言目标,在网页里点击、输入、导航,完成一整个多步骤任务。多步骤任务评测的核心,就是看这个AI跑腿员能不能拆解目标、验证进度、遵守依赖顺序,最终把“生日惊喜”真的送到服务台。

岗位关联

理解多步骤任务的设计与评测,是掌握AI Agent能力边界、搭建真实评测体系的关键一步。

目录
  1. 可视化演示
  2. 任务定义
  3. 目标拆解
  4. 状态验证
  5. 依赖处理
  6. 执行策略
  7. 评测指标
  8. 数据集构建
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示WebArena评测中Agent多步骤任务的执行流程:任务分解、网页交互步骤、中间状态验证与步骤间依赖关系。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多步骤任务执行流程 导航:打开目标网页 操作:点击/输入/提交 验证:检查中间状态 完成率 = 成功任务数 / 总任务数 WebArena多步骤任务考验Agent的规划、执行与验证能力

任务定义

阿哲第一天当跑腿员,组长递给他一张任务单:“顾客要一份生日惊喜,下午5点前送到服务台。”他没问清楚就出发,结果在商场转了一圈,不知道要买什么,也不知道送到哪里,最后空手而归。组长告诉他:任务不是一个模糊的念头,而是一条有起点、有终点、有检查点的路线。

在 WebArena 这座“数字商场”里,每个评测任务也是这样一张任务单。它由一句自然语言目标、一个初始网页状态和一个期望的目标网页状态共同定义。WebArena 包含自托管的在线商店、论坛、GitLab、CMS 等真实可交互应用,Agent 需要像跑腿员一样进入真实店铺,通过多次点击、输入、滚动和跳转完成任务。多步骤任务与单轮问答不同,没有“标准答案直接返回”,必须通过一连串状态变化证明自己到达了终点。

在数学上,一个多步骤任务可以记作一个三元组:

T=(g,ω0,ω∗)\displaystyle \mathcal{T} = (g, \omega_0, \omega^{\ast})

1. 任务符号:\mathcal{T} 表示一个多步骤任务整体,相当于一张完整任务单。

T\mathcal{T}

2. 目标描述:g 是自然语言目标,例如“买一件生日礼物并包装好送到服务台”。

gg

3. 初始状态:\omega_0 是任务开始时网页的状态,相当于跑腿员出发时所在的商场门口。

ω0\omega_0

4. 目标状态:\omega^{\ast} 是任务成功时网页应处于的状态,相当于服务台签收后的凭证。

ω∗\omega^{\ast}

任务单上的每一步都是真实世界的缩影:取号、排队、挑货、结账、包装、交单。阿哲终于明白,跑腿员接到的不是一句话,而是一条需要亲自走完的线——起点在门口,终点在服务台,中途的每一步都算数。

目标拆解

阿哲第二次接到任务:“帮顾客准备一份生日惊喜。”这次他没急着跑,而是把任务单摊在桌上,先画出五个方框:买礼物、买贺卡、要包装、约配送、送服务台。大目标像一棵树,主干分出枝杈。组长表扬他:这就是拆解。

在 Agent 评测中,目标拆解指把自然语言目标转化为若干子目标。WebArena 任务往往包含多个约束,比如商品型号、预算、收货时间等。Agent 需要把它们组织成层级任务树:根节点是总目标,子节点是可执行子目标。这些子目标通常要按一定顺序执行,构成一个序列。拆解不是一次性的:当网页变化、商品缺货时,Agent 还要调整顺序。

一个经典的拆解可以写成从总目标到子目标序列的映射:

Decompose(g)=(g1→g2→⋯→gk)\displaystyle \mathrm{Decompose}(g) = (g_1 \rightarrow g_2 \rightarrow \cdots \rightarrow g_k)

1. 拆解函数:\mathrm{Decompose} 是把总目标切成子目标的操作,相当于把任务单画成一棵方框树。

Decompose(g)\mathrm{Decompose}(g)

2. 总目标:g 是原始自然语言目标,也就是“生日惊喜”。

gg

3. 子目标序列:g_i 表示第 i 个可执行子目标,例如“选购礼物”“购买贺卡”。

gig_i

4. 顺序箭头:\rightarrow 表示子目标之间按顺序执行,前面完成后再做后面。

g1→g2g_1 \rightarrow g_2

跑腿员的“好记性不如烂笔头”就是任务树。每个方框都像商场里的一个区域:先在 3 楼买礼物,再到 1 楼买贺卡,最后到服务台集合。拆得好,脚步才不会乱。

状态验证

阿哲在一次任务里,兴冲冲买完礼物赶到服务台,却被柜员提醒“这是给 6 岁小女孩的礼物,你买了男士钱包”。他愣住了:原来挑完商品后没核对购物车,以为点进店铺就是买好了。组长说:每完成一步,都要低头看一下清单。

这在 Agent 评测里叫“中间状态验证”。Agent 每执行若干动作,就读取当前网页的 DOM 快照,对照子目标要求的条件,判断这一步是否真的达成。光看 URL 变化不够,因为很多状态只体现在页面元素的文本、属性或可见性上。验证函数以当前观测和子目标为输入,输出“达成/未达成”。

状态验证函数可以写成:

V(si,ωt)=1[Match(obst,targeti)]\displaystyle V(s_i, \omega_t) = \mathbb{1}\left[\mathrm{Match}\left(\mathrm{obs}_t, \mathrm{target}_i\right)\right]

1. 验证函数:V 判断第 i 个子目标是否在当前状态达成,像跑腿员核对购物清单。

V(si,ωt)V(s_i, \omega_t)

2. 子目标:s_i 是待验证的子目标,例如“购物车里已有礼物”。

sis_i

3. 当前状态:\omega_t 是 t 时刻的网页状态。

ωt\omega_t

4. 观测与目标:\mathrm{obs}_t 是从 DOM 读到的页面观测,\mathrm{target}_i 是子目标要求。

obst,targeti\mathrm{obs}_t, \quad \mathrm{target}_i

5. 指示函数:\mathbb{1}[\cdot] 当方括号内成立时取 1,否则取 0,对应“打勾/没打勾”。

1[Match(obst,targeti)]\mathbb{1}\left[\mathrm{Match}\left(\mathrm{obs}_t, \mathrm{target}_i\right)\right]

就像跑腿员每买完一样东西就掏出购物清单打一个勾,Agent 也要在每个子目标完成后“打勾”。打勾的意义不是自我安慰,而是防止把“走到柜台”误当成“完成交付”。

依赖处理

有一次阿哲想先到服务台排队,结果被要求“请先取号”;想结账,却被告知“请先挑选商品”。他发现任务单上其实藏着箭头:有些步骤必须发生在另一些步骤之后。

在 WebArena 中,子目标之间存在前置条件、数据传递和资源占用等依赖。例如“登录”必须发生在“下单”之前,购物车中的商品数据要传递给结算页。Agent 需要判断前置条件是否满足;如果依赖的步骤尚未完成,就不能贸然执行。评测中还会出现循环重试——某个依赖暂时失败,以及死锁——两个步骤互相等待,Agent 需要通过放弃、重规划等手段避免。

执行某个子目标前,我们可以用一个包含关系来刻画依赖:

Prereq(sj)⊆Donet\displaystyle \mathrm{Prereq}(s_j) \subseteq \mathrm{Done}_t

1. 前置条件:\mathrm{Prereq}(s_j) 是执行子目标 s_j 前必须完成的子目标集合。

Prereq(sj)\mathrm{Prereq}(s_j)

2. 子目标:s_j 是当前想执行的一步,比如“结账”。

sjs_j

3. 已完成集合:\mathrm{Done}_t 表示 t 时刻已经完成的所有子目标。

Donet\mathrm{Done}_t

4. 包含关系:\subseteq 要求前置集合里的每一项都在已完成集合中,就像取号必须在排队前完成。

Prereq(sj)⊆Donet\mathrm{Prereq}(s_j) \subseteq \mathrm{Done}_t

这些依赖就像商场的动线:先取号才能排队,先排队才能到柜台。跑腿员的任务单上箭头画得越清楚,越不会在服务台和专卖店之间来回折返。

执行策略

阿哲渐渐明白,光有计划还不够。商场里会临时封路、店铺会缺货,他得随时看指示牌、问咨询台,甚至兜圈子也要找到路。好的跑腿员不是背下地图,而是在地图失效时仍能转弯。

Agent 的执行策略决定“下一步做什么动作”。它不仅要看当前网页,还要结合之前的动作轨迹。多步骤任务中表现优秀的 Agent 会记录完整轨迹,包括访问过的 URL、点击过的元素、输入过的文本;当某一步失败时,能够回溯到上一个验证通过的状态再尝试替代路径。探索与利用也需要平衡:既要尝试新路线,也要避免在一个死胡同里反复点击。

这种决策过程可以用条件策略表示:

π(at∣ωt,τ<t)\displaystyle \pi(a_t \mid \omega_t, \tau_{<t})

1. 策略函数:\pi 决定 Agent 在当前情形下选择什么动作,相当于跑腿员的临场决策。

π\pi

2. 动作:a_t 是 t 时刻要执行的动作,如 click、type、navigate。

ata_t

3. 当前网页:\omega_t 是当前观测到的网页状态,相当于跑腿员此刻看到的楼层指示牌。

ωt\omega_t

4. 历史轨迹:\tau_{<t} 是 t 时刻之前的交互记录,决定“之前走过哪、失败过哪”。

τ<t\tau_{<t}

5. 条件关系:竖线表示在所有已知信息条件下输出动作分布。

π(at∣ωt,τ<t)\pi(a_t \mid \omega_t, \tau_{<t})

阿哲的临场应变就像这个策略公式:看到“此路不通”就换电梯,看到“缺货”就换店铺。每一步行动都不是拍脑袋,而是根据“我在哪、之前走过哪、接下来要去哪”决定的。

评测指标

到了月底,组长拿出一张打分表。阿哲问:“我不是都把任务完成了吗?”组长摇头:“你有一单忘交贺卡,还有一单在商场里多绕了三圈。完成不等于完美。”

评测多步骤任务不能只看一个数字。WebArena 及类似基准通常关注三类指标:任务成功率——最终状态是否完全匹配目标;部分完成度——子目标完成的比例;步骤效率——实际动作步数与理想步数的比值。这些指标会加权成综合得分,兼顾“做没做成”与“做得好不好”。

任务成功率是最基础的指标:

SR=1N∑i=1N1[succi]\displaystyle \mathrm{SR} = \frac{1}{N}\sum_{i=1}^{N}\mathbb{1}[\mathrm{succ}_i]

1. 成功率:\mathrm{SR} 是任务成功率,表示所有任务中完全成功的比例。

SR\mathrm{SR}

2. 任务总数:N 是评测集中的任务数量,相当于一沓任务单。

NN

3. 求和:\sum_{i=1}^{N} 把所有任务的成功标记加起来。

∑i=1N\sum_{i=1}^{N}

4. 成功标记:\mathbb{1}[\mathrm{succ}_i] 第 i 个任务完全成功时为 1,否则为 0。

1[succi]\mathbb{1}[\mathrm{succ}_i]

5. 平均:乘以 \frac{1}{N} 得到最终比率。

1N∑i=1N\frac{1}{N}\sum_{i=1}^{N}

打分表上的每一栏都对应跑腿员的一天:成功率是“有没有把货送到”,部分完成度是“有几样忘在车上”,步骤效率是“有没有来回绕路”。阿哲终于明白,金牌跑腿员不是靠一次完美,而是靠每单都稳、每步都准。

数据集构建

阿哲成为组长后,开始给新跑腿员编写任务单。他先写清楚“出发地点、目标地点、注意事项”,然后自己跑一遍确认任务现实可完成,最后做一个检查表,看看新跑腿员执行得对不对。这就是在构建一个多步骤任务的评测数据集。

构建 WebArena 多步骤任务数据集需要四件事:任务模板设计——把同一类目标换成不同商品、账号、主题生成多样本;人工验证流程——确认任务有可行解法且初始状态无歧义;自动评分脚本——用网页状态断言判断是否达成目标;可复现基线——固定环境和起始条件,保证不同 Agent 结果可比。每一步都是为了给“任务单”打上质量标签。

一个人工验证过的数据集可以表示为:

D={(gi,ω0i,ω∗i,ri)}i=1M\displaystyle \mathcal{D} = \{(g_i, \omega_0^i, \omega_{\ast}^i, r_i)\}_{i=1}^{M}

1. 数据集:\mathcal{D} 是构建出的多步骤任务评测集,相当于跑腿员训练营的题库。

D\mathcal{D}

2. 任务项:每个元素 (g_i, \omega_0^i, \omega_{\ast}^i, r_i) 是一张完整任务单。

(gi,ω0i,ω∗i,ri)(g_i, \omega_0^i, \omega_{\ast}^i, r_i)

3. 描述与状态:g_i 是目标描述,\omega_0^i 是初始网页状态,\omega_{\ast}^i 是目标状态。

gi,ω0i,ω∗ig_i, \quad \omega_0^i, \quad \omega_{\ast}^i

4. 质量标记:r_i 是参考评分或可执行性标签,表示人工验证结论。

rir_i

5. 下标范围:i=1,\ldots,M 表示共有 M 条经过筛选的任务。

i=1,…,Mi=1,\ldots,M

跑腿员训练营的题库,就是一本本任务单。好任务单让新人有据可依,烂任务单会让两个人都白跑一趟。数据集的质量,决定了评测这杆秤到底准不准。

AI 应用场景

电商客服智能体评测

阶段:模型评测与能力验收

解决的问题:客服 Agent 上线前,传统人工测试只能覆盖零散问答,无法验证“退货→退款→优惠券补发”这类串联流程。用 WebArena 式多步骤任务设计,把每个客服工单变成带依赖和状态验证的任务单,自动测出 Agent 在哪一步掉链子。

具体案例:某电商平台把“用户申请退货并领取替换券”拆成 7 步,Agent 需依次完成登录、查看订单、发起退货、上传凭证、确认退款、领取优惠券。跑完 100 个变体任务后,平台发现 Agent 在“上传凭证”后经常漏掉“确认退款”,从而针对性增加了状态验证逻辑。

浏览器自动化回归测试

阶段:自动化测试与质量保障

解决的问题:传统 UI 自动化脚本一旦页面改版就失效;用多步骤任务框架,把“用户注册→填写资料→提交审核→收到通知”写成目标,让 Agent 自己规划步骤并自我验证,测试用例更抗界面变化。

具体案例:企业内部用 WebArena 思路搭建“数字办公商场”,让 Agent 测试“新员工入职系统”流程,包括建账号、分配权限、发送欢迎邮件。每次前端改版后自动重跑,用成功率与部分完成度定位回归问题。

智能助理持续评估

阶段:上线后监控与迭代

解决的问题:浏览器助手上线后,用户行为变化会使旧评测失效。需要一套可扩展的多步骤任务库,持续补充新任务单并自动化评分,跟踪 Agent 各版本表现。

具体案例:SaaS 公司每个月从任务模板生成 200 条新任务,覆盖“创建项目→邀请成员→设置权限→生成报告”等流程;自动评分脚本检查最终页面状态,结果进入看板供团队决策。

Python 演示

python37 行
class MultiStepRunner:    def __init__(self, steps):        self.steps = steps        self.results = {}     def run(self, execute, verify):        for step in self.steps:            if not all(self.results.get(dep, False) for dep in step["deps"]):                self.results[step["id"]] = False                continue            execute(step)            self.results[step["id"]] = verify(step)        total = len(self.steps)        done = sum(1 for v in self.results.values() if v)        return {"success_rate": done / total, "partial_completion": done / total}  if __name__ == "__main__":    steps = [        {"id": "get_ticket", "deps": [], "desc": "取号"},        {"id": "queue", "deps": ["get_ticket"], "desc": "排队"},        {"id": "pick", "deps": [], "desc": "挑货"},        {"id": "checkout", "deps": ["queue", "pick"], "desc": "结账"},        {"id": "wrap", "deps": ["checkout"], "desc": "包装"},        {"id": "deliver", "deps": ["wrap"], "desc": "交单"},    ]     def execute(step):        print("执行:", step["desc"])     def verify(step):        return step["id"] != "wrap"     runner = MultiStepRunner(steps)    summary = runner.run(execute, verify)    print("成功率:", summary["success_rate"])    print("部分完成度:", summary["partial_completion"])
目的:模拟一个带有依赖关系的多步骤任务执行过程,展示前置条件缺失时步骤如何被跳过,以及如何计算任务成功率与部分完成度。
  1. self.results = {}用一个字典记录每个步骤是否完成,相当于跑腿员的购物清单打勾表。
  2. for step in self.steps:依次遍历任务单上的所有步骤。
  3. if not all(self.results.get(dep, False) for dep in step["deps"]):检查当前步骤的依赖是否全部完成,缺一个就跳过。
  4. execute(step)执行当前步骤,相当于跑腿员真的跑到对应店铺做动作。
  5. verify(step)对执行后的状态做验证,模拟读取 DOM 快照判断目标是否达成。
  6. done = sum(1 for v in self.results.values() if v)统计已经打勾的步骤数,算出部分完成度。
  7. return {"success_rate": done / total, "partial_completion": done / total}返回评测指标,供上层看板展示。

常见误区

误区小白初学以为只要把每个独立步骤的前后顺序排好,Agent 就能完成多步骤任务,就像背答案一样。

正解多步骤任务最大的坑是状态依赖和中间验证。比如“加入购物车→去结算”并不是两个孤立动作,结算页需要读取购物车数据;如果购物车为空,点结算也白点。真正评测要看每步状态是否改变,还要防止死锁与循环重试。

为何常见:日常生活中的“洗菜→切菜→炒菜”往往每步独立,容易让人忽略网页状态间的数据耦合。

误区评测 WebArena 任务,只要看 Agent 最终是否完成,不必计算部分完成度。

正解许多多步骤任务很难完全成功,一个 Agent 可能前 80% 步骤都正确、最后一步卡住。只统计成功率会把模型能力差异抹平。部分完成度和步骤效率能区分“差不多做到”和“完全没做到”,帮助定位 Agent 在哪类步骤崩溃。

为何常见:因为直觉上“成/败”最简单,类似考试只看及格与否,却忽略了分数段信息。

误区以为页面跳转到了新 URL 就说明上一步成功,比如登录后进入个人中心就是登录成功。

正解URL 只能说明路由变了,页面里可能仍显示“未登录”或缺少关键数据。WebArena 中需要读取 DOM 快照,检查具体元素文本、属性、可见性等,就像跑腿员要确认购物袋里真的是礼物,不能只看袋子外观。

为何常见:浏览器地址栏变化直观可见,而 DOM 里的条件需要写验证逻辑,初学者容易偷懒。

误区只要按逻辑“先登录再下单”,Agent 自然会执行,不会出现依赖漏配。

正解Agent 是用预测选择动作的,它可能点击了登录却因验证码弹窗没真正登录,紧接着就尝试下单。评测任务需要明确的前置条件判断和已完成集合,保证步骤间数据依赖真正成立;否则 Agent 会像跑腿员没取号就冲去柜台,被保安拦下。

为何常见:人脑有常识判断,比如“登录成功会出现用户名”,但 Agent 只看页面特征,缺少跨步骤约束。

误区评价 Agent 时,认为用最少步数完成任务就一定是最优模型。

正解步骤数少可能是走捷径,但可能漏掉必要中间状态验证;步骤多可能是探索充分。评测应看步骤效率、成功率与部分完成度的组合,而不是单看步数。

为何常见:日常做任务常以“快”为唯一直觉,忽略了质量和可复现性。

面试题

Q1. WebArena 中多步骤任务的“目标”通常用什么形式给出?

单选题 · easy

  • A.自然语言指令← 正确答案
  • B.布尔表达式
  • C.HTML 源码
  • D.SQL 查询语句

答案:A。WebArena 的任务目标来自现实场景,通常用自然语言描述,就像组长递给跑腿员的文字任务单。HTML 源码和 SQL 查询都不是用户层面的目标表达。

Q2. 中间状态验证最可靠的依据是?

单选题 · mid

  • A.URL 地址是否变化
  • B.DOM 快照中的关键元素← 正确答案
  • C.页面加载耗时时长
  • D.鼠标悬停位置坐标

答案:B。URL 变化只能说明路由变了,页面内容可能仍未达成目标;DOM 快照中的关键元素文本、属性、可见性才能反映真实状态。这就像跑腿员要确认购物袋里是礼物,而不是只看袋子的外观。

Q3. 在公式 Prereq(s_j) ⊆ Done_t 中,Done_t 表示?

单选题 · mid

  • A.当前任务总目标
  • B.已完成子目标集合← 正确答案
  • C.待执行子目标集合
  • D.所有网页状态集合

答案:B。Done_t 是已完成子目标集合,前置条件必须全部包含在其中才能执行下一步。这就像跑腿员只有取完号后才能排队,前面的动作没完成就会卡住。

Q4. Agent 在“购物车为空”时直接点击结账,说明缺少什么?

单选题 · mid

  • A.动作空间规划
  • B.前置条件判断← 正确答案
  • C.自然语言理解
  • D.浏览器缓存管理

答案:B。购物车为空时结账会失败,Agent 应先检查“已加入商品”这一前置条件。缺少前置判断就像跑腿员没取号就冲去柜台,必然被拦下。

Q5. 评测集构建时,为什么要人工验证每个任务?

单选题 · hard

  • A.提高数据集容量
  • B.保证任务可行且无歧义← 正确答案
  • C.自动化生成更多任务
  • D.降低评测硬件门槛

答案:B。人工验证能确认任务有可行解法、初始状态清晰、目标状态可判断,避免任务单本身出错。否则 Agent 再强也会因任务定义不清而无法公平评测。

Q6. 下列哪个属于步骤间依赖关系的特征?

单选题 · mid

  • A.子目标可任意交换顺序
  • B.后置步骤依赖前置数据← 正确答案
  • C.步骤数与任务数相同
  • D.每个步骤只能执行一次

答案:B。多步骤任务中,后置步骤往往需要前置步骤产出的数据,例如结算页需要购物车数据。依赖关系决定了子目标不能任意交换顺序。

Q7. 任务成功率公式中,任务成功时指示函数 1[succ_i] 的取值是?

单选题 · easy

  • A.0
  • B.1← 正确答案
  • C.N
  • D.无穷大

答案:B。指示函数在条件成立时取 1,不成立时取 0。任务成功记 1,失败记 0,求和后再除以任务总数就是成功率。

Q8. 多步骤任务的评测指标包括以下哪些?

多选题 · mid

  • A.任务成功率← 正确答案
  • B.部分完成度← 正确答案
  • C.步骤效率← 正确答案
  • D.浏览器版本号

答案:ABC。任务成功率看最终状态,部分完成度看子目标达成比例,步骤效率看实际步数与理想步数的差距。浏览器版本号与模型能力无关,不是评测指标。

Q9. 一个多步骤任务可能包含哪些依赖类型?

多选题 · hard

  • A.前置条件限制← 正确答案
  • B.子目标数据传递← 正确答案
  • C.互相等待死锁← 正确答案
  • D.DNS 解析延迟

答案:ABC。前置条件限制决定执行顺序,数据传递依赖让后继步骤获得必要信息,互相等待会造成死锁,Agent 需要主动规避。网络延迟属于环境问题,不是任务内部依赖。

Q10. 关于目标拆解,下列说法正确的有?

多选题 · extreme

  • A.层级任务树帮助分解总目标← 正确答案
  • B.子目标通常需要按序执行← 正确答案
  • C.遇到缺货时应自适应调整顺序← 正确答案
  • D.拆解结果必须一次固定不变

答案:ABC。层级任务树把大目标拆成小目标;大部分子目标有先后关系,所以按序执行;遇到商品缺货等意外,Agent 要调整子目标顺序。拆解不是一次性的,僵化不变会导致任务失败。