智能体评估中的模拟用户。
你读过的每一个多轮智能体分数,量的都是两套系统,而被测的只是其中一套——另一套是一个扮演客户的语言模型,通常没有版本、没有被评估过,并且通常单凭自己就能把你智能体的分数挪动好几个点。请把模拟器当成一项带版本号和校准记录的依赖来对待,否则你的回归测试集会报告一些你根本没做过的变化。
没有它,你就没法评估一个对话式智能体。
静态样例对单轮有效:给提示词、拿答案、打分。可一旦智能体的第二个动作取决于用户对第一个动作的回应,它就失效了。一段录下来的对话,回答不了智能体提出的、当初那位真实用户从未被问过的问题。
- 要选的不是"模不模拟",而是"模拟器是不是显式的"。回避它的团队最终会得到一个隐式的等价物:一份固定脚本,智能体一旦走出既定路径就会在它面前默默失败,而这被记成了任务失败,其实是样例失败。
- 这正是 τ-bench 及其后继者的设计——智能体一边与一位被模拟的客户交谈、一边调用领域 API,并按一份它必须始终遵守的成文规程被评分。这个结构如今已是任何声称"测的是智能体而非补全"的基准的标准形状。
- 也就是说,公开数字同样继承了这个问题。一份排行榜上的智能体排名,是以它的那个模拟器为条件的;两份用了不同模拟器的基准,即便任务清单重叠也不可比——这正是批判地阅读智能体基准里的理由之一。
分数是联合的。像钉依赖那样把模拟器钉住。
如果这个季度的模拟用户比上个季度更愿意主动交代信息,你的智能体就少了几次问出蹩脚澄清问题的机会,分数于是上去了。而你的智能体什么也没变。这不是什么微妙效应,它是"智能体评估莫名其妙漂移"最常见的单一成因。
- 把塑造模拟器行为的一切都版本化——模型 ID、温度、随机种子、人设提示词、那份规程文档,以及停止规则。把它们与结果存在一起,而不是存在某个人的笔记本里。
- 一次只改一样。在同一次发布里既升级模拟器的模型、又改动智能体,会让结果无法解读。若非升级不可,先用未改动的智能体重新打一次基线,并把两个数字都公布出来。
- 绝不要让智能体、模拟器和裁判用同一个模型。共享的盲区会让三者相互关联:模拟器恰好用智能体最擅长的措辞发问,裁判恰好接受它自己也会给出的那套推理。至少要把裁判拆出去,见 LLM 作为智能体评判者。
- 给方差留出预算。两套随机系统串在一起会把分布拉宽,于是一个若在静态样例上会显著的差异,在这里可能只是噪声。多跑几个种子、读区间而不是读点值——见评估方差与统计功效。
一次模拟器升级,是对你测量仪器的一次破坏性变更。请按发布一次 schema 迁移的方式来发布它:提前公告、重新打基线,并且绝不与被测对象捆在一起发。
认清模拟器骗你的四种方式。
模拟用户的失败有固定的方向,而每一种都会以可预料的方式让你的分数产生偏差。这四种在对话记录里都看得见,在汇总数字里都看不见。
- 过于配合。它回答清晰、从不自相矛盾、从不沉默,并且接受第一个被提出的方案。你的智能体看上去可以上生产了,然后它遇到一位真实客户说"不对,是另一个",却不说是哪一个。
- 答案泄漏。人设提示词里含着目标状态,模拟器一被追问就把它交了出去。智能体在一道它从不必解的题上拿了高分,而这处泄漏只有把对话读一遍才找得到。
- 人设漂移。大概到第八轮,模拟用户开始表现得像一位乐于助人的助手——主动提建议、做总结、通情达理——因为那正是它的底座模型被训练成的样子。而长程任务恰恰是这件事最要命的地方。
- 对抗性过头。为做鲁棒性测试而把它调猛,模拟器就变成了一个谁也没见过的用户。它制造出的失败是真实的失败,只不过针对的是一个不真实的分布,而修好它们要在别处付出能力代价。
推而广之:模拟器的职责是有代表性,不是表现好。请朝着你的真实流量去优化它,并接受一个事实——它自身的对话质量无关紧要。
在信任一个数字之前,先拿真实对话记录去校准。
模拟器赢得可信度的方式,与裁判一样——在一份样本上对照真值检验,并在任何东西变动时重新检验。这里的真值,就是你自己的生产对话。
- 抽取真实对话记录并刻画它们。解决一次问题需要几轮、用户多久改变一次主意、多久提供一次错误的实体、多久放弃一次。这些就是你的目标分布。
- 拿它们去给模拟器打分。如果真实用户要十一轮而模拟器只要四轮,那它建模的不是你的用户,而是一位配合的、你那份人设提示词的读者。
- 从聚类里造人设,别凭想象造。手足无措的新手、赶时间的行家、报错了账号的用户——都从真实流量里推出来,并保留它们的相对频率,这样汇总出来的分数才有意义。
- 按周期重新校准。你的用户在变、你的产品在变,而模拟器对哪一样都毫无察觉。这与标注与标签运营是同一份运维纪律,只不过施加在一位合成标注员身上。
给智能体打分,别给这一对打分。
每段对话只给一个通过/不通过,会把"两套系统里是哪一套失败了"藏起来,而那恰恰是你唯一需要知道的事。把坐标轴拆开,模拟器的贡献就现形了。
- 结果——终态是否与目标一致——由程序对照环境来核验,绝不去问模拟器满不满意。一位满意的模拟用户,是整轮运行里最不可信的信号。
- 规程遵守——智能体一路上有没有破坏某条成文规则。这正是一个好结果会掩盖掉的失败,也是轨迹评估在这里对得起它成本的原因。
- 重复之间的一致性。报告"同一任务连续成功 k 次",而不是 k 次里取最好。一个五次里成三次的智能体,在生产里不是"60% 的智能体",它是一个会辜负两位客户的智能体。
- 一个"模拟器故障"分类。给评分者一个显式的裁定项——"模拟用户让这一局根本没法赢"——并跟踪它的占比。若它超过百分之几,就先修模拟器,再去读任何别的数字。
知道什么时候压根不该模拟。
模拟是做上线前多轮行为回归的正确工具。而对团队们惯常拿它去做的另外几件事,它是错的工具。
- 不能用来做绝对质量声明。对着一个模拟器得到的"94% 任务成功率",是一句关于"这一对"的陈述。内部报可以,对外绝不,对监管方更绝不。
- 不能替代生产信号。真实的放弃率、真实的升级转人工率、真实的重复来访率,量的是任何模拟器都生成不出来的东西——这正是生产反馈信号里的论点。
- 不能用于安全攸关的验收。若某个失败模式带有监管后果或物理后果,它需要一场由人来跑的场景演练,而不是一场合成的。
- 不能用在静态样例就够用的地方。单轮抽取、分类与格式化,用静态用例去测更便宜也更稳定。只有当"分支本身"才是被测对象时,才去伸手拿模拟器。
先做这一件事:把模拟器的模型 ID 和提示词钉进版本控制,然后用今天的模拟器、在智能体一行未改的前提下,把上个季度的评测重跑一遍。你得到的那个差值,就是这期间你做过的每一个智能体决策的误差棒——而对多数团队来说,跑这一趟是能买到的最便宜的一小时评估工作。
相关:为什么评估智能体很难讲底下的六条成因,评判者校准与元评估把同一份纪律施加在评分者身上,智能体评估是概念层面的入门。