摘要开宗明义(翻译):「现有基准既不考察 agent 与人类用户交互的能力,也不测试它遵守特定领域规则的能力,而这两者对于把 agent 部署到真实应用中都至关重要。」
拆开说,2024 年中的 agent 基准(WebArena、AgentBench、SWE-bench 等)有三个共同盲区:
τ-bench 的回答:把 agent 放进一个「模拟用户(LLM 扮演)+ 领域 API 工具 + 策略文档」的动态对话环境,用数据库终态比对自动判分,并用 pass^k 度量一致性。
每个领域(domain)由三部分构成:
每个领域有一套 mock 数据库(JSON 文件,如零售域的 users.json(用户/地址/支付方式)、products.json(商品,每个商品有多种变体如尺寸颜色)、orders.json(订单)),由 GPT 生成种子数据 + 程序化组合而成,规模达数百用户、上千级条目。agent 通过读写两类 API 工具访问它——数据库状态对 agent 和用户都不直接可见,agent 必须先调查询工具搞清事实,再调写工具执行操作。
一份几千词的自然语言规章,作为系统提示喂给 agent,规定什么能做、什么不能做、做之前要满足什么条件(如「代客修改订单前必须向用户复述并获得明确确认」「pending 状态订单才可取消」「基础经济舱机票不可修改」)。策略是「临时约定的(ad-hoc)」——刻意与模型预训练里的常识不完全一致,逼 agent 真的去读文档而不是靠直觉。
每个任务包含:一个用户画像、一条给模拟用户的自然语言指令(scenario,如「你是 Yusuf,想把送到的机械键盘换成另一种轴体,但你说话简短、不主动透露信息」)、一组标注好的金标动作序列(golden actions,含工具名与参数)和对应的目标数据库终态。模拟用户由 LLM(默认 gpt-4o)扮演,基于该指令和完整对话历史生成回复,可以表现出含糊、分次透露信息、提出越权要求等真实行为。任务都经过精心人工雕琢,保证在策略约束下只有唯一正确结局——这是终态比对能成立的前提。
对话结束后,把数据库的最终状态与标注的目标状态做比对(哈希比较)——因为唯一正确结局对应唯一正确终态,所以无论 agent 走了哪条对话路径、工具调用顺序如何,只要终态一致就算成功。此外,若任务要求 agent 向用户告知某些信息(如退款金额),还会检查 agent 的回复中是否包含这些必需输出。两者都满足才算任务成功。
这个设计的妙处:评测高效且可靠(fast and faithful)——不需要 LLM 判卷,不需要比对动作轨迹(合法轨迹可能有多条),一次状态哈希比较就搞定;金标动作序列只用于构造终态和辅助分析,不作为唯一路径强制。
| τ-retail(零售客服) | τ-airline(航空客服) | |
|---|---|---|
| 任务数 | 115 | 50 |
| 工具数(官方仓库实数) | 16 个(含 think、transfer_to_human_agents) | 14 个(含 think、transfer_to_human_agents) |
| 典型读工具 | 查用户(按邮箱/姓名+邮编)、查订单、查商品详情、列商品类目 | 查用户、查预订详情、搜直飞/中转航班、列机场 |
| 典型写工具 | 取消/修改 pending 订单(地址、商品、支付方式)、已送达订单退货/换货、改用户地址 | 订票、取消预订、改签航班、改乘客、改行李、发代金券 |
| 典型策略约束 | 换货/退货需确认、一单一次操作限制、支付方式规则 | 舱位改签规则、行李额、退改签费、会员等级权益 |
值得注意的两个「非业务」工具:think(让 agent 显式写推理草稿,不改变环境——CoT 工具化的早期实践)和 transfer_to_human_agents(策略不允许或超出能力时应转人工——「知道自己不该做」也是被测能力)。airline 域整体比 retail 难:策略更复杂(舱位/退改/行李规则的组合)、任务常含复合请求。
论文附录给了完整轨迹,这里走读一个 retail 域的真实片段,感受任务的「肌理」。模拟用户被指派的场景是:用户 yusuf_rossi_9620 想对已送达的订单 #W2378156 换货(机械键盘换成另一种规格,顺带问智能恒温器)。对话以 |user| / |assistant| / |tool| 三种角色交替推进:
get_user_details / get_order_details 核实身份与订单状态(数据库对双方都不可见,一切事实必须靠查询工具确立);get_product_details 查目标商品变体是否存在、价格差多少;exchange_delivered_order_items;non-delivered order cannot be exchanged,策略不允许的路径被工具层挡住,agent 只能改道或调 transfer_to_human_agents 转人工。对话结束后,评测器不看这几十轮谁说了什么,只把 orders.json 等数据库文件的终态和标注终态做哈希比对——换货是否落到了正确的变体、差价用哪种支付方式补、其余数据分毫未动,一次比较全部覆盖。这个例子也解释了为什么任务要人工雕琢到「唯一正确结局」:但凡场景里差价支付方式有两种合法选择,终态就不唯一,判分器就废了。
论文提出的新指标 pass^k(读作 pass hat k)定义为:对同一任务独立试跑 k 次,k 次全部成功的概率,再对所有任务取平均。给定某任务 n 次试验中成功 c 次,其无偏估计量为组合数之比:
pass^k = Etask [ C(c, k) / C(n, k) ]
它与广泛使用的 pass@k 恰好是镜像:pass@k 问「k 次里至少成一次」(采样越多越沾光,度量能力上限),pass^k 问「k 次全部成功」(随 k 增大指数衰减,度量最差情况下的可靠性)。若单次成功率为 p 且各次独立,pass^k ≈ pk:一个 pass^1 = 90% 的 agent,pass^8 只剩约 43%。企业视角下这才是要命的指标——「1000 个客户里 900 个被服务好」和「同一个客户来 8 次每次都被服务好」是两种完全不同的承诺。
设置:被测 agent 用三种策略——原生函数调用(function calling / tool-calling)、ReAct(推理+动作交替)、Act(只动作不推理);模拟用户默认用 gpt-4o、策略为 llm(官方实现还提供 react / verify / reflection 三种增强模拟策略,后两者用额外 LLM 步骤校验用户回复是否贴合场景、不满意则重新生成,用于压低模拟器自身的噪声)。每任务多次独立试跑以估计 pass^k。
论文头条结果(2024-06):最先进的函数调用 agent(gpt-4o)整体任务成功率(pass^1)不足 50%(retail 约 61%,airline 约 35%);而且极不稳定——retail 域 pass^8 < 25%,即连做 8 次全对的任务不到四分之一。官方仓库后续更新的 leaderboard(节选,策略均为 tool-calling):
| 模型 | retail pass^1 | retail pass^4 | airline pass^1 | airline pass^4 |
|---|---|---|---|---|
| claude-3-5-sonnet-20241022 | 0.692 | 0.462 | 0.460 | 0.225 |
| gpt-4o | 0.604 | 0.383 | 0.420 | 0.200 |
| claude-3-5-sonnet-20240620 | 0.626 | 0.387 | 0.360 | 0.139 |
| gpt-4o-mini | — | — | 0.225 | 0.100 |
| ReAct (gpt-4o) | — | — | 0.325 | 0.160 |
| Act (gpt-4o) | — | — | 0.365 | 0.140 |
可读出的规律:① 原生函数调用稳定优于 ReAct/Act 文本式 agent;② 从 pass^1 到 pass^4,所有模型都近乎腰斩,可靠性坍塌是普遍现象而非个别模型缺陷;③ airline 全面难于 retail。
作者对失败轨迹的归因指向三类核心短板:
官方仓库还提供 auto_error_identification.py 做自动错误归因:先判定责任方(user / agent / environment),再分类错误类型(目标部分完成、用错工具、工具参数错误、执行了非预期操作)。
think 和 transfer_to_human:显式思考工具和「转人工」出口都是廉价但有效的设计;「知道何时不做、把球交还给人」应被视为能力而非失败。