τ²客服可靠评测2026.09.23
一个客服 Agent demo 跑通了,不等于它能上线。
你敢说"它在真实用户手里,连续 4 次都不会改错数据库 / 违规退款 / 引导失败"吗?
为什么同样一个 Agent,把"用户"从被动答话换成"也会动手改状态"之后,分数直接崩了三成?
读完你能做到:用 τ²-bench 在部署前量化一个工具型客服 Agent 的可靠性——不是"平均能做对几题",而是"连续 k 次都做对的概率"(pass^k),并把"推理算对了但没引导好用户"的协调失败单独揪出来。
四要素卡(先拿结论)
- 场景:客服 / 技术支持团队上线"工具调用型 Agent"(退改签、账单、套餐变更)之前,要在真实多轮、带工具、且用户也参与改状态的交互里,量化它的可靠性,避免上线后改错数据库、违反业务策略或被一个不配合的用户带偏。
- 条件:① 模型已具备基础工具调用能力;② 有可被 LiteLLM 路由的 agent / user 两个模型端点;③ 任务域的"工具集 + 策略文档 + 程序化 DB 状态 oracle"可复现(τ²-bench 内置 airline / retail / telecom / banking 四域);④ 要测可靠性必须跑多次 trial(pass^k 需 k≥2)。
- 方法:用"LLM 用户模拟器 + 程序化环境状态 oracle"构造可验证的多轮交互评测——agent 与模拟用户在同一共享状态上对话、各自调工具;跑完后用 eval 谓词检查最终环境状态是否匹配目标。核心是 dual-control(双控)域:用户也持有工具去改共享状态,专门暴露"协调失败"。
- 效果:业务收益 = 上线前用 pass^k 直接当作 SLA 依据("k 次尝试全成功的概率"),免去真人回归、跨 scaffold 横向对比;技术指标 = GPT-4.1 在 τ²-bench 官方设定下 pass^1 约为 retail≈74% / airline≈56% / telecom(双控)≈34%,且从 no-user 切到 dual-control 性能显著下降,可把错误拆成"推理错" vs "沟通/协调错"。代价 = 需 agent+user 两个端点、按 trial×任务×轮数计费、用户模拟器本身也是测量仪器需披露。
1. 技术背景与问题定义
1.1 现有做法卡在哪
客服 Agent 的评测长期被两种"软"方式裹挟:
- 单轮 completion / 多选 benchmark:测的是"会不会答题",不是"能不能在十轮对话里把一笔退款办对"。
- LLM-as-judge 给轨迹打分:快,但已被反复证明有 verbosity bias、self-preference、position bias(我们的 AgentJudgeBench 那期专门拆过)。用 LLM 当裁判去判"这个 Agent 办业务办得好不好",本质上是在用另一个可能犯错的模型去给一个可能犯错的模型背书。
更隐蔽的坑是:绝大多数 benchmark 假设"只有 Agent 能动世界,用户只是答话的信息源"(原文叫 single-control)。但真实客服里,用户也得动手——确认短信、在 App 上点同意、自己改个密码。Agent 算得再对,如果用户没被引导好去完成他那一半操作,活儿照样黄。这类"协调失败"在单控设定里根本测不出来。
1.2 τ²-bench 的核心主张
τ²-bench(Sierra Research,arXiv 2506.07982,MIT,GitHub sierra-research/tau2-bench)要做的是:把客服 Agent 放进一个"用户也会用工具改共享状态"的双控环境里,用程序化 oracle 判最终结果,用 LLM 模拟用户,从而可规模化、可复现地测量可靠性。
四个关键贡献(直接决定它为什么值得做一期):
- Telecom 双控域,建模成 Dec-POMDP:agent 与 user 都用工具作用在共享动态环境上,同时考察"推理"和"引导用户"。
- 组合式任务生成器:从原子组件程序化拼出多样且可验证的任务,保证域覆盖与可控复杂度(不用人工写每条边角 case)。
- 和用户模拟器强耦合的环境:用户行为被工具和可观状态约束,仿真保真度高于"随便聊"。
- 细粒度错误分解:通过消融把"推理错"和"沟通/协调错"分开报。
读者画像:评测负责人、算法工程师、要上线 Agent 的应用开发者。真实采用方:τ 系列(τ-Bench / τ²-Bench / τ³-Bench)已是客服 / 技术支持类 Agent 可靠性评测的事实标准,Sierra 本身就是做生产级客服 Agent 的厂商,1.9k★、2026-08 仍在提交,企业界广泛用于上线前回归。
2. 实现路径与步骤(重点,照抄可跑通)
目标:三天内跑通"mock 零成本自测 → 真实域出 pass^k"的最小闭环。全程不需要 GPU,但需要能调 LLM 的 API(走 LiteLLM)。
步骤 1 · 环境准备(~30 分钟,零 GPU)
# 1) 装 uv(任意方式,官方脚本)curl -LsSf https://astral.sh/uv/install.sh | sh# 2) 克隆并进入git clone https://github.com/sierra-research/tau2-benchcd tau2-bench# 3) 同步依赖(core 已含 airline/retail/telecom/mock 四域文本模式)uv sync# 4) 配密钥:底层走 LiteLLM,任何受支持提供商都行cp .env.example .env# 编辑 .env,填入例如 OPENAI_API_KEY=...
环境硬约束:Python 必须 >=3.12, <3.14(uv 会处理,但本机若有多版本要留意);语音模式另需 brew install portaudio ffmpeg(本期不用)。
怎么算这步成功:uv run tau2 intro 能列出可用域(mock / airline / retail / telecom / banking_knowledge)和命令,说明装好了。
步骤 2 · 零成本自测闭环(mock 域,1 trial)
uv run tau2 run --domain mock \ --agent-llm gpt-4.1 --user-llm gpt-4.1 \ --num-trials 1 --num-tasks 5
--domain mock:内置模拟域,不依赖外部业务后端,最快验证整条链路能跑、密钥通、结果能落盘。- 跑完结果在
data/simulations/,用 uv run tau2 view 浏览每轮的 tool call、用户消息和最终环境状态。
怎么算成功:能看到 5 个任务的轨迹 JSON 和一个汇总(pass^1 数字)。这一步零业务数据、几乎零成本,专门用来排环境坑。
步骤 3 · 跑真实域并算 pass^k(需 API)
# airline 域,官方约定 4 trials、temperature=0,用于算 pass^k 可靠性uv run tau2 run --domain airline \ --agent-llm gpt-4.1 --user-llm gpt-4.1 \ --num-trials 4 --num-tasks 50 --temperature 0
- 官方 leaderboard 用 4 trials / temp 0 / message_limit 100。要拿"可靠性"就必须多 trial——pass^k 之所以成立,靠的是同一任务跑 k 次。
- 换域只需改
--domain:retail(114) / telecom(双控,114) / banking_knowledge(需先 uv sync --extra knowledge)。
怎么算成功:输出里每个任务有 4 次 trial 的 0/1 结果;把"4 次全成功"的任务比例算出来,就是该任务的 pass^4(即 leaderboard 口径的可靠性)。
步骤 4 · 接入你自己的 Agent(替换默认 tool-calling)
默认 --agent-llm 走的是内置 tool-calling solver。要评你自研 Agent,实现 src/tau2/agent/ 下的接口,或参考 examples/agents/:
# 最小契约:给定当前消息历史 + 环境工具 schema,返回带 tool_call 的回复defmy_agent(messages, tool_schemas): resp = client.chat.completions.create( model=MY_MODEL, messages=messages, tools=tool_schemas)return resp.choices[0].message
把你的 Agent 包成这个契约后,用 --agent-llm 指向它(或改 orchestrator 注册),就能在同一环境 / 同一用户模拟器下和 GPT-4.1 同台对比——这正是"模型 vs 框架 vs harness"解耦的评测纪律(见我们 AgentCompass 那期)。
步骤 5 · 程序化重算 pass^k(最小片段,零成本验证指标定义)
不用调任何 API,先把这个指标本身吃透:
import numpy as npdefpass_metrics(r, k=4):"""r: 同一任务的 k 次 trial 结果列表, 元素 ∈ {0,1}""" r = np.asarray(r, dtype=int) pass1 = r.mean() # 平均成功率(覆盖) passk = 1.0if r[:k].sum() == k else0.0# 单任务: k 次全成功=1 否则 0return pass1, passk# 例: 某任务 4 次 = [1,1,0,1]p1, pk = pass_metrics([1,1,0,1], k=4)print(p1, pk) # 0.75 0.0 <- 平均 75%, 但"连续 4 次都成"=0%
关键直觉:pass^1=0.75 看着不差,但 pass^4=0——意味着这个 Agent 在 4 次尝试里至少有一次会翻车。对要上线的客服系统,你关心的是后者。
步骤 6 · 成本估算(粗估,按 gpt-4.1 量级)
每个任务 = num_trials × 多轮对话 ×(agent + user 两个模型) 的 token 消耗。真实域单任务典型 10~20 轮交换。
注:精确数字随模型、轮数、域长度浮动,上表为量级参考。telecom 双控域因交互更长,单位成本更高。
关键超参表
| | | |
|---|
--domain | | | |
--num-trials | | | |
--num-tasks | | | |
--agent-llm | | | |
--user-llm | | | 仪器效应 |
--temperature | | | |
常见报错与规避
command not found: tau2 / uv 没生效 → 用 uv run tau2 ... 而非裸 tau2;确认 uv sync 成功。- LiteLLM
model not found / 401 → .env 里 key 没填或 provider 名不对;LiteLLM 路由名要和 .env 一致。 - Python 版本报错 → 必须 3.12~3.13;用
uv 自带的 Python 或 pyenv 切。 - 分数和 taubench.com 对不上 → 不是 bug,是 user-llm 不同带来的 harness 效应(呼应我们 Harness-Bench 那期);换用户模拟器等于换了测量仪器,结论必须标注 user-llm 版本。
- banking_knowledge 跑不起来 → 需先
uv sync --extra knowledge(RAG 检索管线)。 - 只盯着 pass^1 排座次 → 双控域下 pass^k 才是可靠性,pass^1 高不代表"每次都对"。
跑起来要花多少(小结)
- 时间:环境 30 分钟;mock 自测分钟级;真实域全量 ×4 trials 视 API 速率,单域几十分钟到几小时。
- API 费用:单域全量 ×4 trials 约数百元(gpt-4.1 量级),可先用
--num-tasks 5 试水。
3. 原理讲解
3.1 为什么这样有效
传统客服 Agent 评测的两个脆弱点,τ²-bench 分别用两招堵死:
- 用程序化环境状态 oracle 替代 LLM judge。最终评分是
env.state 是否满足 eval 谓词(如 booking.seat_type == 'window'),是确定性的 0/1,不靠另一个 LLM 主观打分——这直接绕开了 LLM-as-judge 的各类 bias,也避免了 Goodhart(你没法靠"写得更像正确答案"去骗一个查数据库状态的判分器)。 - 用 LLM 用户模拟器替代人工标注。客服交互的真实用户太贵、太慢、太不可复现;用一个被"工具和可观状态"约束的 LLM 用户,既保留了多轮动态,又能无限次重放。
3.2 双控建模:为什么"用户在场"更难
把交互建模成 Dec-POMDP(去中心化部分可观测马尔可夫决策过程):
- 世界里有一个共享、动态的环境状态(如航空订座数据库)。
- Agent 有自己的 observation / action space(调业务工具)。
- User 也有自己的 observation / action space(在双控域里,用户也能调工具改同一个状态,比如自己在 App 上确认)。
单控(原 τ-Bench)里 user 只是"答话的信息源",Agent 独享改世界的能力;双控(τ²-Bench telecom)里 user 也持工具。于是出现一类全新失败模式:Agent 推理对了,但没引导好用户去完成他那一半操作——论文的消融正是把"推理错误"和"沟通/协调错误"分开报的,且实验显示从 no-user 切到 dual-control,性能显著下降。
3.3 指标:pass^1 与 pass^k
每个 trial 给一个二值 reward r ∈ {0,1}(最终环境状态是否匹配目标)。
pass^1 = E[r] # 平均成功率(覆盖:做对几题)# pass^k: k 次独立 trial 全部成功的概率(可靠性:每次都对)pass^k = E[ 1( r_1=1 ∧ ... ∧ r_k=1 ) ]# leaderboard 约定 k=4、temperature=0,单任务估计:pass^k_task = 1.0 if all(r[:4]) else 0.0 # 多任务取均值
为什么 pass^k 比 pass^1 更该进 SLA:客服场景里一次失败代价极高(改错 DB、违规退款、惹投诉)。部署方关心的是"每次都成功的概率",而不是"平均成功概率"。pass^1=0.75 的 Agent,4 次里必翻一次;pass^4=0 意味着它不具备可靠性。这就是为什么论文和 leaderboard 把 pass^k 当主指标。
3.4 工程取舍
- 用户模拟器保真度 vs 成本:更聪明的 user-llm 仿真更真,但更贵,且会改变分数(仪器效应)——所以必须固定并披露 user-llm。
- pass^k 需要多 trial:可靠性估计的方差随 k 增大而减小,但成本线性×k。实践用 k=4 平衡。
- 解耦设计的价值:环境判定是确定性的、用户模型是可换的、任务生成是程序化的——三者解耦,你才能干净地回答"分低到底是模型菜、还是 harness 坑、还是任务难"(这正是 AgentCompass 强调的纪律)。
4. 效果验证与适用边界
4.1 量化结果(τ²-bench,官方设定:user=gpt-4.1,4 trials,temp 0)
| | | | | |
|---|
| | | | | |
| | | | | |
| | | | | |
| telecom:no-user → dual-control | | | | |
| | | | | |
注:上述分域 pass^1 为论文报告量级,精确值随 user-llm 配置与评测日期浮动(telecom 在不同 retrieval/config 下差异明显),引用时务必标注 user-llm 与配置。
4.2 业务收益(单列说明)
- 上线前量化可靠性:用 pass^k 直接当 SLA 依据("连续 4 次都做对的概率"),替代"拍脑袋觉得 demo 行"。
- 免去真人回归:用户模拟器 + 程序化 oracle 让回归测试可无限重放、可 CI 化,省下人工客服抽检成本。
- 错误可归因:把失败拆成"推理错 / 沟通协调错",指导是练模型还是改提示词 / 交互设计。
- 跨 scaffold 横向对比:同一环境同一用户模拟器下比不同 Agent 实现,座次才有意义。
4.3 决策清单(什么条件下成立 / 失效)
- ✅ 成立:你有工具调用型客服 / 技术支持场景,且部署前需要量化可靠性、定位协调失败、做跨实现选型。
- ❌ 失效 / 退化:纯知识问答(无状态变更、无用户动手)、或只需单轮 completion 的场景——τ²-bench 的强项恰恰在"多轮 + 共享状态 + 双控",用错了域就是杀鸡用牛刀。
- 🔁 换业务需重新验证:非客服域(如代码、数据分析)τ² 没有现成环境,你得自己搭"工具集 + 策略文档 + 程序化 oracle",这是主要工作量。
- ⚠️ 已知局限:用户模拟器存在偏差(仪器效应,必须固定披露);telecom 双控域局限在客服类交互;pass^k 依赖多次 trial,成本随 k 升。
- 🔒 合规风险:策略合规(如"未经取消不得退款")靠 oracle 校验,但隐私 / 监管敏感场景仍需人工复核,不能全信自动判分。
复现清单
① 上手三步走
uv sync 装依赖 + cp .env.example .env 填 LiteLLM key。uv run tau2 run --domain mock --agent-llm gpt-4.1 --user-llm gpt-4.1 --num-trials 1 --num-tasks 5 跑通零成本自测。- 换
--domain airline --num-trials 4 出 pass^k;用本文 §2 步骤 5 的片段程序化复算指标。
② 踩坑记录
- user-llm 是"测量仪器",换了分数就变,结论必须标注 user-llm 版本(harness 效应)。
- telecom 双控域分数天然最低,不是你 Agent 菜,是"引导用户"本就难。
- Python 必须 3.12~3.13;banking_knowledge 需
uv sync --extra knowledge。
③ 实用评分卡
| | |
|---|
| | |
| | |
| | |
| | 程序化 oracle 确定性判分,但 user-llm 有仪器效应 |
| | |
④ 关键源码 / 论文链接
- 仓库:https://github.com/sierra-research/tau2-bench[1]
- 论文:https://arxiv.org/abs/2506.07982[2]
- 排行榜:https://taubench.com[3]
- 前驱 τ-Bench:https://github.com/sierra-research/tau-bench[4]
今日反问
为什么衡量一个要上线的客服 Agent,pass^k(k 次尝试全成功的概率)比 pass^1(平均成功率)更该写进 SLA——毕竟后者看着"更漂亮"?
引用链接
[1]https://github.com/sierra-research/tau2-bench
[2]https://arxiv.org/abs/2506.07982
[3]https://taubench.com
[4]https://github.com/sierra-research/tau-bench