跳到主要内容

tau2-bench (τ²/τ³-Bench) — 架构与原理

30 秒导读: 这是 Sierra 出的一套「客服 AI 好不好用」的自动考卷。它让一个 LLM 假扮打电话来的顾客,让被考的 Agent(也是 LLM)在一个能真读真写的模拟环境里帮顾客办事,最后不看聊天记录漂不漂亮,只看数据库最终有没有被改成正确的样子来给 0/1 分。τ² 的独门之处:顾客的手机、账户这些状态,顾客自己和 Agent 两边都能改,逼 Agent 学会「指挥用户动手」而不只是自己调 API。

1. 这是什么(零基础也能懂)

一句话定义: tau2-bench 是一个评测框架——把「客服对话 + 工具调用 + 会变的业务数据」拼成一场可自动打分的模拟,用来量化不同大模型当客服 Agent 时的靠谱程度。

解决谁的什么问题。 假设你在做一个订机票/退货/修宽带的 AI 客服,你想知道「换成 GPT-x 还是 Claude-y,谁办错的事更少」。人工陪聊几百轮再核对结果,太贵。tau2-bench 把「顾客」也换成 LLM,把「后台系统」换成一个内存数据库,于是可以一晚上自动跑几千通电话,给出一个可比较的分数。

它能做什么(功能):

  • 内置 5 个领域(mock / airline / retail / telecom / banking_knowledge),每个领域带策略文本、工具集、任务集。
  • 三种被考对象形态:正常对话 Agent、拿到「标准答案步骤」的作弊 Agent(测 user 模拟器用)、无用户纯自己干活的 solo Agent。
  • 两种沟通模式:文本回合制(half-duplex)和语音全双工(full-duplex,τ³ 新增)。
  • 一套多维打分:数据库终态、是否说了该说的话、是否调了该调的工具、LLM 主观评判。
  • 稳定性指标 pass^k:同一题重复跑 k 次全对的概率,衡量「碰运气过」还是「真会」。

用起来什么样: 一条命令跑一次评测——

tau2 run --domain airline --agent-llm gpt-4.1 --user-llm gpt-4.1 \
--num-trials 1 --num-tasks 5
# 结果落在 data/simulations/,用 `tau2 view` 翻看每通对话

一句话直觉/类比: 把它想成驾照路考。考官(user 模拟器)按剧本制造路况,考生(Agent)实际操作车(工具改环境),最后只看车最终停没停对车位(数据库终态),不看你方向盘打得优不优雅。τ² 的加料是:这台车副驾(用户)也有一套踏板,有些操作必须让副驾来踩,考生只能动嘴指挥。

2. 顶层全景(它大概怎么转)

一场评测(一个 task 的一次 trial)的数据流:

任务 Task ┌──────────── Orchestrator(裁判/传声筒)────────────┐
├ user_scenario (顾客剧本) ──▶ │ │
├ initial_state (开局状态)──▶ │ User ⇄ Agent 轮流发言,谁调工具就转给 Env │
└ evaluation_criteria(答案) │ │ │ │ │
│ │ ▼ ▼ ▼ │
│ │ UserSim LLMAgent Environment │
│ │ (LLM演顾客) (被考对象) (工具+内存DB) │
│ └──────────────────┬─────────────────────────────────────┘
│ │ 跑完得到 messages(整段轨迹)
│ ▼
└───────────────────────────────▶ Evaluator(对答案)
│ 把轨迹重放进「预测环境」
│ 把答案步骤重放进「标准环境」
▼ 比两边 DB 哈希 + 查该说的话
reward ∈ {0,1}

部件一句话职责:

部件干什么在哪个文件
Orchestrator回合制传声筒:决定这一步谁对谁说话、何时终止src/tau2/orchestrator/orchestrator.py
Environment持有工具集 + 内存数据库,执行工具调用、维护状态src/tau2/environment/environment.py
UserSimulator用 LLM 扮演顾客,按 user_scenario 提要求、答问题src/tau2/user/user_simulator.py
LLMAgent被考对象,读策略、调工具、回话src/tau2/agent/llm_agent.py
evaluate_simulation打分总入口,按 reward_basis 把各分量乘起来src/tau2/evaluator/evaluator.py
EnvironmentEvaluator核心裁判:重放轨迹与答案,比数据库哈希src/tau2/evaluator/evaluator_env.py
registry领域/Agent/User 的名字→构造器映射表src/tau2/registry.py
compute_metrics汇总 avg_reward、pass^k 等指标src/tau2/metrics/agent_metrics.py

主线走一遍(高层):

  1. 按名字从 registry 取领域环境、Agent、User,用 task.initial_state 把环境和对话历史设成开局(Orchestrator.initialize,orchestrator.py:483)。
  2. 进入 run 的模板循环:反复 step() 直到 done(orchestrator.py:260)。每步把「当前消息」从发起角色转给目标角色;谁发的是工具调用就转给 Env 执行,结果再转回去。
  3. 顾客说 ###STOP###、或达到步数/错误/超时上限,循环结束,打包成 SimulationRun
  4. evaluate_simulation 把这段轨迹重放进一个新环境算出终态,和「标准答案轨迹」算出的终态比哈希,得 0/1 分(evaluator.py:88)。
  5. 多次 trial 的分数交给 compute_metrics 出 avg_reward 和 pass^k。

3. 怎么读这套文档(阅读地图)

由浅入深,建议顺着读:

讲什么谁该读
01-orchestrator回合制主循环、三个角色如何轮转、双控为什么是核心创新想懂「一通电话怎么被跑出来」的人
02-environment环境/工具/数据库怎么搭,评测时怎么把消息「重放」成状态想加领域、想懂状态从哪来的人
03-evaluation打分内核:reward_basis 乘法门、DB 哈希比对、pass^k想懂「凭什么算对/算错」的人(最关键一章)
04-participants-and-domainsAgent/User 变体、solo 模式、五领域、语音与知识扩展、代码地图想选对被考形态、想跳进源码的人

如果你只读一章,读 03-evaluation——tau2-bench 的价值和最反直觉的设计都在打分逻辑里。