失败分类法与分诊。
「它幻觉了」不是一份缺陷报告,而一个塞满这类标签的待办列表,正是团队读了一千条轨迹却什么也没修好的原因——这个标签描述的是烟,而每一次智能体失败都是一条级联链,它看得见的末端恰恰是信息量最小的一段。改为标注第一个出错的步骤:仅这一处改变,就能把一堆轶事变成一个有归属人的队列,因为每一类「首个出错步骤」都恰好对应一个修法、一个能动手的人。
症状分类法无法把工作派出去。
团队最先想到的那些类别——幻觉、死循环、拒答、答错、太慢——都是对「人最后注意到的那件事」的描述。它们看着像分类,因为它们确实把失败切开了;但它们过不了唯一重要的那道测试:拿到这个标签,有人知道该改什么吗?
- 它们互为下游。第 2 步的检索没命中,第 9 步就编出一条引用。被标成「幻觉」之后,它落到了负责提示词的人头上。提示词没问题,是索引过期了。
- 它们把不同的成因压成一堆。「死循环」同时涵盖:一个永远返回同样错误的工具、一个没有终止条件的计划、以及一个分不清两条几乎一样的搜索结果的模型。三个团队、三种修法、一个桶。
- 它们在构造上就无法被修。没有人会被指派去「减少幻觉」。人们被指派的是「让检索器把那张发票返回来」——那是一张工单。
这与多智能体系统内部的信用分配是同一个记账问题,并不会因为轨迹是线性的就消失。
标注第一个出错的步骤。
定下一条规则并要求所有人遵守:标签打在最早的那一步——在该步上,一个称职的操作者,握着与智能体完全相同的上下文,会做出不同的动作。那一点之后的一切都属于下游,一律不打标签。这条规则十分钟就能教会,而且能消掉标注者之间的大部分分歧。
对几乎任何使用工具的智能体,第一轮扫下来都会落在六到七个类别里:
- 任务理解——智能体解的是另一个问题。修法在提示词、澄清策略或受理表单里。
- 接地与检索——需要的事实本可取到却没取,或取到的是错的、过期的。修法在索引、查询或时效性管线里。
- 工具选择——意图对,工具错;或该用工具时没用。修法在工具描述和工具集的大小里。
- 参数构造——工具对,参数错。修法在 schema、枚举与默认值里,不在模型里。
- 工具错误处理——工具说了实话,智能体却无视它、原样重试、或编一个值绕过去。修法在错误信息的设计与重试策略里。
- 状态与记忆——智能体推翻或遗忘了同一次运行中早已确立的事情。修法在压缩策略与记忆写入路径里。
- 停止——活儿干了一半就收工,或者停不下来。修法在终止条件与预算里。
注意这份清单到底是什么:你的工具、你的索引、你的策略,一行一个。这正是重点。一个点名「你拥有的组件」的分类法产出工单;一个点名「模型行为」的分类法产出会议。它是轨迹评测在运维侧的面孔——同样是从结果转向过程,只不过瞄准的是优先级排序而非打分。
从你自己的轨迹里长出来,而不是从这一页抄。
上面那份清单是一个起手形状,不是答案。真正会主导你队列的类别取决于你的工具面——一个智能体整天泡在某个不稳定的合作方 API 里的团队,会发现自己一半的失败值得单开子类,而通用分类法恰好会把这件事藏起来。自下而上地建 v1:
- 两个人独立读同样的 100 条轨迹,为「第一个出错的步骤」各写一句自由文本。此时先不要类别。这是最贵的一段,没有捷径,预算一天。
- 把这些句子当面聚成簇,一次会开完。需要写一整段才能区分的两个类别,合并;占样本超过约 25% 的类别,拆开。
- 各自独立地用草案给 30 条新轨迹打标,算一致率。低于大约 80%,说明定义还不够锋利、不能交给别人用——通常是两个类别在重叠,而分歧点会直接指出是哪两个。
- 冻结 v1,附上书面定义和每类一个真实例子。例子干的活比定义多。
把这件事反复跑起来的那套机制——标注指南、标注者一致性、工具链——是标注与打标运营。本步是那次一次性的工作:告诉那套机制该标什么。
让抽样别把分类法变成一幅「投诉画像」。
你读什么,就会修什么,所以抽样决定路线图。只读点了踩的轨迹,得到的是「什么惹恼了愿意出声的用户」的分类法,而那和「你的智能体在哪里出错」并不是一回事。从三条流里取样,并且各自分开:
- 已知坏例——显式负反馈、升级工单、被中止的运行。真实失败密度高,但严重偏向「看得见」的那些。参见生产反馈信号。
- 成本尾部——步数、令牌或墙钟时间的 p99。这里几乎每一次运行都是失败,无论有没有人投诉;停止类与工具错误处理类的缺陷最先在这条流里现形。
- 均匀随机——最无聊的一条,也是唯一能给出「每一类到底有多常见」无偏估计的一条。它还是你发现那些「输出看着没问题、因此没人报告」的失败的地方。
三条都标,然后在排优先级之前按随机流的发生率加权回来。一个占了你投诉队列 40%、却只占生产 3% 的类别,是客服话术问题,不是工程问题——而反过来的那种,又常见又无声,才是那种让你丢掉一个客户却连工单都没有的问题。你还能回头去读多久,取决于轨迹抽样与留存的上限;这件事要在需要那些轨迹之前定,而不是之后。
每个类别都得有出口,而出口是一个检测器。
只能产出一张月度幻灯片的分类法是失败的。每个类别要靠背上三样东西来赢得自己的位置:
- 一个归属人——能改动这个类别所指之物的那个人。如果不存在这样的人,说明类别定义的层级选错了。
- 回归用例——每类至少有一条轨迹连同触发它的输入被提升进评测集。这是一个类别不再复发的主要方式,也是评测集保持鲜活、而不至于饱和的方式。
- 一个检测器——一条规则、一项检查或一个评判器,能在无人读轨迹的情况下对新发生的同类问题报警。一个你无法自动检测的类别,是一个你永远说不出「已修复」的类别;你只能说你不再注意到它了。
检测器通常比看上去便宜。工具错误处理表现为同样的参数、同样的工具调用被原样重复。停得太晚就是步数超过阈值。检索未命中可以这样抓:问一句「检索回来的任何一个片段里,是否包含最终答案中的那个实体」。把 LLM 评判器留给便宜规则确实失效的那几类,并且要校准它——评判器本身也是一个会漂移的组件,它的误报率会直接进入你据以排优先级的那些计数里。检测器一旦持续运行,它们就喂给回归检测,分类法也就从一项研究变成一块活的看板。
把「其他」当作健康指标。
分类法会衰减,而且恰恰在你的系统变化最剧烈时衰减最快。换模型会改变智能体出错的构成;新增工具会带来新类别;被修好的类别不再出现,它的定义就在那些活着的类别旁边悄悄腐烂。有一个数字能告诉你现在处于什么位置:落进 其他 的那部分标注占比。
- 低于 5%——健康;或者是你的标注者在把轨迹硬塞进最近的桶里。抽查几条「打得很自信」的标签就能分辨。
- 高于约 15%——分类法已经描述不了这个系统了。用新的 100 条轨迹重新推导一遍;这要一天,比一个季度的工单错派便宜。
- 任何一次模型、提示词或工具变更之后,先在一小批新样本上重标,再决定要不要相信旧的比例。换模型动的不只是通过率,还有失败的形状——而工具漂移可以在你什么都没改的情况下就替你动一遍。
这周就把便宜的版本做掉:拉 50 条随机生产轨迹加 20 条成本尾部的轨迹,每条写一句话点名第一个出错的步骤——不要类别,不要工具,不要开会。读到第 40 条时簇就已经很明显了,而最大的那两个簇,几乎从来不是团队一直在争论的那两个。然后在写第一行修复代码之前,给每个簇配一个归属人和一个检测器;没有检测器,你无法证明修复有效。开始之前先把追踪铺好,因为一次无法重放的失败就是一次无法归类的失败。