τ²-Bench
τ²-Bench 测评基准简介
τ²-Bench(Tau Squared Bench,也写作TAU2-Bench) 是由普林斯顿大学与 Sierra Research 于 2025 年推出的权威大模型智能体(Agent)评测基准,核心评估**双控环境(Dual-Control)**下的对话、工具调用与合规能力。 基准官方仓库:https://github.com/sierra-research/tau2-bench
一、核心定位与背景
前身:τ-Bench 的增强版,修复大量代码问题并新增领域。
核心创新:双控交互(Dual-Control)
AI 智能体 与用户共同控制 共享动态环境(非单向指令)。
双方均可调用工具、修改状态、验证结果,更贴近真实协作场景。
核心目标:评测智能体的 任务完成、工具使用、策略遵守、多轮沟通 综合能力。
二、三大评测领域
覆盖真实客服场景,每个领域含独立 业务策略、工具集、数据库、任务集:
Airline(航空)
任务:航班查询、改签、退票、选座、行李、里程兑换。
工具:查票、改期、取消、支付、会员查询。
Retail(零售电商)
任务:订单查询、修改、退款、换货、投诉、优惠券。
工具:查单、退货、换货、补发、折扣。
Telecom(电信,新增)
任务:套餐办理、流量/话费查询、网络排障、停机复机、国际漫游。
工具:开户、停机、查账单、修障、开通漫游。
三、核心评测机制(细粒度评估)
采用 5 种自动校验方式 组合,避免单一关键词匹配的粗粒度问题:
db_check:数据库最终状态是否符合预期(如漫游已开启)。
tool_call:工具调用顺序、参数、次数是否正确。
policy_check:是否违反业务规则(如超额退票、禁售品)。
goal_check:用户核心需求是否达成。
dialogue_check:回复是否准确、合规、自然。
四、关键评测指标
Pass^1:单轮任务 完全成功率(主指标)。
Pass^k:k 轮独立运行中全部成功的概率(稳定性)。
错误分解:
推理错误:逻辑、工具选择、策略理解错误。
交互错误:沟通歧义、信息缺失、用户协作失败。
领域平均分:三大领域综合得分(排行榜核心)。
五、技术特点
双控建模:形式化为 Dec-POMDP(分散式部分可观测马尔可夫决策)。
可靠用户模拟器:AI 模拟用户,与环境强耦合,减少模拟偏差。
自动评估:全程无需人工,可复现、可对比。
多模式评估:
标准模式:双控协作(真实场景)。
No-User 模式:Agent 全权控制(隔离推理能力)。
AISBench中快速上手 τ²-Bench 测评
1. 准备推理服务
确保本地或云端部署了遵循 OpenAI chat/completions API 规范且支持tool call的被测推理服务和模拟用户的推理服务(如 VLLM、OpenAI 等)。
2. 安装AISBench测评工具&τ²-Bench额外依赖
参考AISBench安装文档安装AISBench测评工具。
安装τ²-Bench额外依赖:
# AISBench工具根目录下执行 pip install -r requirements/datasets/tau2_dependencies.txt
注意,AISBench依赖的tau2-bench仓库的commit id为 c5b2d228d850c59b749b93cf32c4745d3aa53967(2025年2月的版本)。
3. 配置τ²-Bench任务的自定义配置文件
在AISBench工具根目录下修改
ais_bench/configs/agent_example/tau2_bench_task.py中必要的配置(主要是配置被测推理服务和模拟用户的推理服务的信息)
# ......
models = [
dict(
abbr="openai-v1-chat",
api_key=None, # API KEY 默认是个无效字符串 ,内部会声明OPENAI_API_KEY
agent = None, # 使用的 agent 实现,默认为 DEFAULT_AGENT_IMPLEMENTATION
llm_agent = "openai/qwen3", # 必填,agent 使用的 LLM,填写"openai/{推理服务的模型名称}"
llm_args_agent = { # agent LLM 的参数,支持传其他兼容openai接口格式的参数
"api_base": "http://localhost:2498/v1", # 必填,推理服务的base_url
"temperature": 0.5
},
)
]
# ......
sub_tasks = ["airline", "retail", "telecom"]
for task in sub_tasks:
datasets.append(
dict(
abbr=f'tau2_bench_{task}',
args = dict(
domain = task, # -d, 要运行的模拟域,可选值为 "airline", "retail", "telecom"
num_trials = 1, # 每个任务运行的次数,默认为 1
user = None, # 使用的 user 实现,默认为 DEFAULT_USER_IMPLEMENTATION
llm_user = "openai/qwen3", # 必填,user 使用的 LLM,填写"openai/{推理服务的模型名称}"
llm_args_user = { # user LLM 的参数,支持传其他兼容openai接口格式的参数
"api_base": "http://localhost:2498/v1", # 必填,推理服务的base_url
"temperature": 0.0
},
# ......
max_concurrency = 5, # 并发运行的最大模拟数,默认为 DEFAULT_MAX_CONCURRENCY=5
),
)
)
# ......
配置文件中max_concurrency表示单个任务(“airline”, “retail”, “telecom”)的最大并发数,默认值为5。
4. 执行τ²-Bench任务
在AISBench工具根目录下执行以下命令:
# 执行τ²-Bench任务 ais_bench ais_bench/configs/agent_example/tau2_bench_task.py --max-num-workers 3
--max-num-workers参数表示任务最大并发数,--max-num-workers 3表示"airline", “retail”, "telecom"这3个任务会并行执行。
执行过程看板示例
Base path of result&log : outputs/default/20260408_091146
Task Progress Table (Updated at: 2026-04-08 10:22:37)
Page: 1/1 Total 4 rows of data
Press Up/Down arrow to page, 'P' to PAUSE/RESUME screen refresh, 'Ctrl + C' to exit
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| Task Name | Process | Progress | Time Cost | Status | Log Path | Extend Parameters |
+===================================+===========+============================================================+=============+==========+=================================================+=====================+
| openai-v1-chat/tau2_bench_airline | 1856223 | [###### ] 10/50 Running TAU2 Bench | 0:07:13 | running | logs/eval/openai-v1-chat/tau2_bench_airline.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| openai-v1-chat/tau2_bench_retail | 1856224 | [###### ] 25/114 Running TAU2 Bench | 0:11:56 | running | logs/eval/openai-v1-chat/tau2_bench_retail.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| openai-v1-chat/tau2_bench_telecom | 1856222 | [################## ] 71/114 Running TAU2 Bench | 1:09:51 | running | logs/eval/openai-v1-chat/tau2_bench_telecom.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
执行过程中所有结果文件会生成在outputs/default/{时间戳}(如outputs/default/20260408_091146)目录下,过程中可以在outputs/default/{时间戳}/logs/eval/openai-v1-chat/tau2_bench_{任务名称}.out查看对应任务的详细执行日志。
任务执行完成后,会打印如下精度结果:
| dataset | version | metric | mode | total_count | openai-v1-chat |
|----- | ----- | ----- | ----- | ----- | -----|
| tau2_bench_airline | / | pass^1 | unknown | 50 | 38.00 |
| tau2_bench_retail | / | pass^1 | unknown | 114 | 21.05 |
| tau2_bench_telecom | / | pass^1 | unknown | 114 | 33.33 |
| tau2_bench_pass^1_avg | - | naive_average | unknown | / | 30.80 |
| tau2_bench_pass^1_avg-weighted | - | weighted_average | unknown | / | 29.14 |
tau2_bench_avg表示三大领域的简单平均得分。tau2_bench_avg-weighted表示三大领域的加权平均得分(权重为各领域的任务数),权重为每个领域的任务数。
最终
outputs/default/{时间戳}目录下结果文件的结构如下:
outputs/default/20260408_091146
├── configs
│ └── 20260409_111604_1191827.py
├── logs # 过程日志
│ └── eval
│ └── openai-v1-chat
│ ├── tau2_bench_airline.out # airline评测过程详细执行日志
│ ├── tau2_bench_retail.out # retail评测过程详细执行日志
│ └── tau2_bench_telecom.out # telecom评测过程详细执行日志
├── results # 最终结果
│ └── openai-v1-chat
│ ├── tau2_bench_airline # airline评测过程详细执行结果
│ │ └── tau2_run_detail.json
│ ├── tau2_bench_airline.json # airline任务的精度结果
│ ├── tau2_bench_retail # retail任务的评测过程详细执行结果
│ │ └── tau2_run_detail.json
│ ├── tau2_bench_retail.json # retail任务的精度结果
│ ├── tau2_bench_telecom # telecom任务的评测过程详细执行结果
│ │ └── tau2_run_detail.json
│ └── tau2_bench_telecom.json # telecom任务的精度结果
└── summary # 最终汇总的精度结果
├── summary_20260409_111604.csv
├── summary_20260409_111604.md
└── summary_20260409_111604.txt
中断后继续执行测评
并发交大的情况下,部分模型服务在大量多轮对话过程中可能会出现错误返回,导致任务失败,例如:
Base path of result&log : outputs/default/20260408_091146
Task Progress Table (Updated at: 2026-04-08 10:22:37)
Page: 1/1 Total 4 rows of data
Press Up/Down arrow to page, 'P' to PAUSE/RESUME screen refresh, 'Ctrl + C' to exit
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| Task Name | Process | Progress | Time Cost | Status | Log Path | Extend Parameters |
+===================================+===========+============================================================+=============+==========+=================================================+=====================+
| openai-v1-chat/tau2_bench_airline | 1856223 | [###### ] 10/50 Running TAU2 Bench | 0:07:13 | error | logs/eval/openai-v1-chat/tau2_bench_airline.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| openai-v1-chat/tau2_bench_retail | 1856224 | [###### ] 25/114 Running TAU2 Bench | 0:11:56 | error | logs/eval/openai-v1-chat/tau2_bench_retail.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| openai-v1-chat/tau2_bench_telecom | 1856222 | [################## ] 71/114 Running TAU2 Bench | 1:09:51 | running | logs/eval/openai-v1-chat/tau2_bench_telecom.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
这个时候可以手动中断任务执行,例如按下Ctrl + C, 随后执行如下命令在之前完成的测评进度基础上继续测评:
# ais_bench ais_bench/configs/agent_example/tau2_bench_task.py --max-num-workers 3 --reuse {时间戳}
ais_bench ais_bench/configs/agent_example/tau2_bench_task.py --max-num-workers 3 --reuse 20260408_091146
单条case多次执行(pass^k)
在AISBench工具根目录下修改
ais_bench/configs/agent_example/tau2_bench_task.pynum_trials参数的取值为需要执行的次数(默认为1)
# ......
sub_tasks = ["airline", "retail", "telecom"]
for task in sub_tasks:
datasets.append(
dict(
abbr=f'tau2_bench_{task}',
args = dict(
domain = task, # -d, 要运行的模拟域,可选值为 "airline", "retail", "telecom"
num_trials = 5, # 每个任务运行的次数,默认为 1
# ......
),
)
)
# ......
执行
ais_bench ais_bench/configs/agent_example/tau2_bench_task.py --max-num-workers 3命令后每条case会执行num_trials次,进度条的总数也会相应增加至num_trials倍。
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| Task Name | Process | Progress | Time Cost | Status | Log Path | Extend Parameters |
+===================================+===========+============================================================+=============+==========+=================================================+=====================+
| openai-v1-chat/tau2_bench_airline | 1856223 | [###### ] 30/250 Running TAU2 Bench | 0:07:13 | running | logs/eval/openai-v1-chat/tau2_bench_airline.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| openai-v1-chat/tau2_bench_retail | 1856224 | [###### ] 75/568 Running TAU2 Bench | 0:11:56 | running | logs/eval/openai-v1-chat/tau2_bench_retail.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| openai-v1-chat/tau2_bench_telecom | 1856222 | [###### ] 76/568 Running TAU2 Bench | 1:09:51 | running | logs/eval/openai-v1-chat/tau2_bench_telecom.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
最终打印的精度结果如下:
| dataset | version | metric | mode | total_count | openai-v1-chat |
|----- | ----- | ----- | ----- | ----- | -----|
| tau2_bench_airline | a39421 | pass^1 | gen | 10 | 46.00 |
| tau2_bench_airline | a39421 | pass^2 | gen | 10 | 37.00 |
| tau2_bench_airline | a39421 | pass^3 | gen | 10 | 34.00 |
| tau2_bench_airline | a39421 | pass^4 | gen | 10 | 32.00 |
| tau2_bench_airline | a39421 | pass^5 | gen | 10 | 30.00 |
| tau2_bench_retail | a39421 | pass^1 | gen | 23 | 32.17 |
| tau2_bench_retail | a39421 | pass^2 | gen | 23 | 19.13 |
| tau2_bench_retail | a39421 | pass^3 | gen | 23 | 13.48 |
| tau2_bench_retail | a39421 | pass^4 | gen | 23 | 8.70 |
| tau2_bench_retail | a39421 | pass^5 | gen | 23 | 4.35 |
| tau2_bench_telecom | a39421 | pass^1 | gen | 23 | 62.61 |
| tau2_bench_telecom | a39421 | pass^2 | gen | 23 | 44.78 |
| tau2_bench_telecom | a39421 | pass^3 | gen | 23 | 36.52 |
| tau2_bench_telecom | a39421 | pass^4 | gen | 23 | 32.17 |
| tau2_bench_telecom | a39421 | pass^5 | gen | 23 | 30.43 |
| tau2_bench_pass^5_avg | - | naive_average | gen | / | 21.59 |
| tau2_bench_pass^5_avg-weighted | - | weighted_average | gen | / | 19.64 |
使用 TAU2-mini 采样子集
TAU2-mini 是由 AISBench 提供的 TAU2 采样子集,通过 K-means 聚类算法对原始数据集进行约 1/10 规模的采样,在测试得分上与原始数据集大致相同,用于快速验证模型能力与降低评测成本。数据集地址:TAU2-mini。
1. 下载 TAU2-mini 数据集
从 魔乐社区 下载数据集。下载后解压,记下数据集根目录路径(下文称 <TAU2_MINI_ROOT>)。
2. 替换 tau2 的原始数据集文件
在安装环境上执行如下命令找到 tau2 的安装路径:
pip3 show tau2 | grep "Editable project location"
执行得到类似如下输出:
Editable project location: {tau2安装路径}/benchmark/src/tau2
将 TAU2-mini 数据中的文件替换 tau2 中的原始数据集文件(请提前备份好 {tau2安装路径}/src/benchmark/tau2/data/tau2/domains):
cp -r <TAU2_MINI_ROOT>/tau2_subsets/* {tau2安装路径}/src/benchmark/tau2/data/tau2/domains
3. 修改 AISBench 中 tau2-bench 的配置文件
在上述快速上手配置的基础上,额外修改 ais_bench/configs/agent_example/tau2_bench_task.py 中的 task_split_name 参数:
# ......
for task in sub_tasks:
datasets.append(
dict(
abbr=f'tau2_bench_{task}',
args = dict(
# ......
task_split_name = "mini", # 使用 mini 分割
# ......
),
)
)
# ......
4. 执行测评
与标准流程一致,执行如下命令:
ais_bench ais_bench/configs/agent_example/tau2_bench_task.py --max-num-workers 3
执行完成后,各领域的任务数变为 airline 5 条、retail 11 条、telecom 11 条,精度结果示例:
| dataset | version | metric | mode | total_count | openai-v1-chat |
|----- | ----- | ----- | ----- | ----- | -----|
| tau2_bench_airline | a39421 | pass^1 | gen | 5 | 40.00 |
| tau2_bench_retail | a39421 | pass^1 | gen | 11 | 27.27 |
| tau2_bench_telecom | a39421 | pass^1 | gen | 11 | 54.55 |
| tau2_bench_pass^1_avg | - | naive_average | gen | / | 40.61 |
| tau2_bench_pass^1_avg-weighted | - | weighted_average | gen | / | 40.74 |