online branch: main

2026-10-02

RSS llms.txt GitHub

Agent 错误怎么分析:从失败样本到修复优先级

$
Agent 错误怎么分析:从失败样本到修复优先级

用户第一轮已经提供订单号,客服机器人到了第四轮又问一次。用户重发订单号,机器人仍无法查询,最后转给人工。

在这个假设场景里,给提示词补一句“不要重复索要用户已经提供的信息”很容易。但订单号究竟在哪里丢了?早期会话没有进入当前上下文,摘要压缩时删掉了数字,还是模型看到了却把查询参数传空?三个位置要用不同方式修。

错误分析要先沿着会话和工具记录找到证据,再把一条失败放进其他记录中比较。此时才轮到分类、计数和排序。下面沿着这个示例展开,方法主要依据 Langfuse Academy 的错误分析与评估课程。

先读到哪里出了问题

打开一条 trace,不等于看见了原因。trace 只是一次执行中被记录下来的输入、调用、返回和输出。它能提供多少解释,取决于当时记录了什么。

沿着刚才的客服例子往前看:用户在哪一轮提供订单号?那一轮是否进入本次会话历史?摘要里有没有保留?模型调用查询工具时传了什么参数?工具实际返回什么?找到最早与任务要求不符的步骤,并记下具体证据。

一条有用的阅读笔记可以是:“第一轮消息中有订单号,但会话压缩摘要只保留了退款意图,没有保留订单号;下一轮查询失败后,模型再次索要该信息。”它已经指向一个能检查的环节。写成“幻觉”“准确性不足”则把信息丢掉了。研发看到这两个词,仍要重新读一遍记录。

“第一处出错”是帮助定位的读法,不是保证找到因果根源的算法。某个异常可能由更早的配置引起;记录也可能缺失。如果看见检索没有返回相关文档,只能先确认检索结果不足,不能仅凭这条 trace 就断定检索模型有问题。索引过期、权限过滤、问题改写、查询参数,都可能进一步解释它。

因此笔记应区分观察与假设。观察写“查询返回零条”;假设写“可能与权限过滤有关,需对照可访问文档列表”。别把猜测混进类目,等它成为统计数字后,再把猜测当作结论引用。

结果正常的记录也要看。有时客服答案碰巧正确,查询工具却用了上一次会话的订单号;有时模型答得不完整,客服人员在发送前补齐了。只看用户收到的内容,会把补救能力误算成系统能力。反过来,一条最终失败也可能经历了正确检索和正确工具调用,只在最后生成时丢了限定条件。

这解释了为什么记录粒度会限制分析。整个任务只留一段输入和一段输出,就无法区分“没取到”和“取到了没用”。遇到这种情况,合理的结论是需要补记录,而不是给模型能力打一个更低的分。

阅读时暂时不要急着套类目

Langfuse Academy 把错误分析与定性研究联系起来:先阅读,用自己的话描述哪里失败,再从笔记中归纳类别。它与拿一份预定义清单打勾,承担不同工作。

已知的 JSON 格式契约、越权动作、安全底线,当然可以从第一天就检查。开放阅读的价值在于给清单之外的问题留位置。客服机器人可能每句都准确,却没有在用户第一次否认时追问;投放助手可能引用了真实数据,却跨客户比较了不相容的指标口径。这些失败很难由一个通用“准确率”覆盖。

已有分类不必丢掉。维护期可以带着旧类目阅读,但要保留自由文本笔记和“暂不能归类”的入口。旧类目能加快标注;如果它要求每个新问题都挤进现成格子,就会挡住新问题。

同样,模型可以整理笔记、提出候选聚类、预标新记录。领域负责人需要复核类目边界和修复动作,特别检查模型是否把少见的问题并入常见类。这里保留人工责任,是因为分类结果会影响工程投入,并非声称模型永远不能起一个好名字。

从失败阅读到修复任务

先挑值得读的,再补能估计的

错误分析不必一开始就从全部流量随机抽取。重复提问、人工大幅改稿、负面反馈、某个质量分持续下降,都可以帮助找到值得读的记录。它们提高发现问题的效率,却会改变样本构成。

Park 等人在 Amazon Alexa 的研究中,高精度筛选后,所收集缺陷样本中真正的目标错误占比由 14.3% 提升到 39.0%。按这两个数计算,命中比例约为原来的 2.7 倍。这个结果说的是特定筛选流程下的样本质量,不是用户整体错误率增加,更不能直接换算成每小时阅读效率提高 2.7 倍;每条样本的阅读成本未必相同。论文见这里。

这类筛选也有排除条件。论文重点选择系统性、具有修复可能性的缺陷。偶发问题、当前系统无法修复的问题,可能不在所收样本中。它适合回答“这里有什么值得改”,无法单独回答“全部用户有多少次遇到了它”。

给样本标明用途,可以省掉很多后续争论。

样本用途 常见入口 可以报告什么
发现失败方式 投诉、重试、人工编辑、风险切片 看到了哪些问题,以及证据
估计总体发生率 明确总体下的概率抽样 在抽样与口径限制下的发生比例
检查特定风险 严重失败、长尾、对抗输入 该风险场景内的表现
比较变更 同一批输入的新旧版本输出 哪些输入改善、退化或保持不变

假设从 50 条投诉中找到 20 条引用错误,可以写“这批投诉样本中,20 条存在引用错误”。不能直接写“产品引用错误率 40%”。后者换了分母,读者却往往看不出来。

对总体发生率,简单随机抽样是容易解释的起点。分层概率抽样也可以用来估计:先按场景抽样,再根据总体各层权重合并。真正的问题是过采样后没有加权,或者样本根本没有已知入选概率。分层概率抽样与按兴趣挑选案例不同,能否估计要看入选机制和权重。

例子很具体:高风险场景在线上只占 1%,为了研究它,在阅读样本里占了 30%。不加权时,它会主导样本失败率;加权回线上分布后,才能估计整体。即使算出了总体,高风险切片也应单独报告,否则风险又会被平均值压小。

自然反馈还受到“谁愿意反馈”的影响。Marlin 等人的音乐评分研究中,64.85% 的受访用户表示,对歌曲的喜好会影响是否评分;对“最爱”(Love)的歌曲,选择“非常经常”(Very Often)评分的比例为 93.91%,中性歌曲为 36.50%。这是 UAI 2007 的研究,2012 年是 arXiv 上传时间。它给出的警告是自选评分不能自然代表全部偏好,具体比例不应移植到 AI 用户身上。原始论文。

点击也一样。Joachims 等人的研究说明,搜索排名会影响点击;被点击并不等于绝对相关。拿“用户点过的资料”作为好案例时,需要同时考虑曝光与位置。这里无需把每项偏差都算成一个校正系数,但应把入口写进样本元数据,避免后续忘记它是怎样被选中的。

起步量只解决开工问题

Academy 在从零选择评估指标时,建议先读 30–50 条 trace,用自由文本笔记和总体 pass/fail 帮助归纳失败类别。实验课程建议用 20–30 个真实例子并排比较两个版本。数据集课程的 15–30 行,则指最小完整版本的起步规模。

这三个数字对应三种任务。它们不是统计精度保证,也不是一旦读满就必须停止。对于某个狭窄问题,十几条可能已能找到明确规律;面对多渠道、多客群系统,同样条数可能连主要场景都没覆盖。

停止阅读可以参考新增笔记是否还在产生新的可行动类别,但要同时确认主要切片已经出现。只抽一个渠道,很快“不再发现新类目”,可能只是样本太窄。即使本轮分类趋稳,换模型、重写提示词、新增工具后也要重新检查。

发现类别和精确估计发生率需要不同投入。想把 8% 与 9% 分开,所需样本不能由“起步读 30 条”来决定。此时应明确目标精度、样本单位与抽样方式,再安排测量。错误分析可以先提供候选类别,不必假装同一小批阅读已经完成了统计验证。

把笔记归成能交给别人的分类

第一轮笔记往往很不整齐。有人写“重复追问”,有人写“没有订单号”,还有人写“工具查询失败后又问了一遍”。这些可能属于同一个会话信息丢失问题,也可能是不同环节造成的相似症状。不能仅因句子相似就合并。

检查候选类目时,先问它对应什么动作。若三条笔记都要修改会话摘要,可以暂时合并;若一条是历史截断、一条是摘要漏项、一条是工具参数为空,就值得分开。分类细到能映射修复位置,通常比细到能给每次异常单独起名更有用。

一个类目应包含名称、定义、正例、反例和不确定时的处理方式。例如“摘要遗漏业务标识”,定义为原始会话已有明确标识,但摘要没有保留,导致后续任务缺少该信息;正例是订单号被摘要删掉;反例是历史与摘要都有订单号,但工具参数传空。这样下一位同事才不会把所有重复追问都归给会话摘要。

类目应尽量清晰、可行动、可稳定标注,并保留兜底入口。“稳定”指相同证据下判定标准尽量一致,不是要求每周分类分布不变。失败分布发生变化,恰好可能是改动生效或新风险出现的证据。

上层类目可以少一些,子类用来定位具体步骤。上层先保留 5–9 类,可以作为便于管理的起点,但不是课程给出的硬门槛。若两个类目始终引出同一动作,可以合并;若一个类目内部需要不同责任人、不同修法,可以拆分。最终数量服从产品问题,不服从一个漂亮的数字。

一条记录可以有多个问题

选择主类目有助于统计主要原因,但不必因此取消多个独立问题的标注。一个会话可以既丢失订单号,又泄露数据;统计各类发生率时,它可以计入两类,各比例之和超过 100% 是重叠的结果,不妨碍按频次排序。

团队可以采用“主类目+辅助标签”:按第一处可确认的偏离确定主类目,用于主因分布;其余问题作为辅助标签,用于风险覆盖。也可以对每个失败模式分别做二值判断,报告“存在该问题的会话比例”。两种方法都能用,前提是明确计数单位和是否允许重叠。

特别是安全问题,不宜因它不是“第一处出错”就从统计中消失。第一处偏离帮助归因,独立护栏帮助发现严重后果,两个视角应该同时保留。

“未分类”也别随手删除。占比高时,可能是新类型出现、定义含糊、证据缺失,也可能是本轮分类范围太窄。需要区分“其他已知问题”与“无法判断”,否则数据不足会被误读成失败类型太多。

复核分歧,比追一个一致率更有用

分类标准通常在阅读中形成。读到第五十条时,人们对“什么算遗漏”的理解,可能已不同于第五条。因此形成第一版定义后,应回标早期样本,检查新标准是否被一致应用。

第二位评审者可以做两种不同复核。要验证类目是否可交接,就给他相同定义和样例,独立标注同一批记录,不先展示另一人的答案。要探索漏掉的失败方式,则可以先不展示分类,让他独立写阅读笔记。两者目的不同:前者检查一致性,后者增加发现视角。

讨论时优先处理分歧。有人认为“没有回答预算问题”,另一个人认为“已经回答但不够详细”,往往说明定义缺少边界。补一个反例,比要求两人“尽量一致”更可执行。

WildFeedback 在用户反馈识别任务中报告,GPT-4 与人工对满意信号的一致性 κ 为 0.69,对不满意信号为 0.50。它说明这一具体任务的判断并不容易,不能推出所有失败分类“都不应期待 0.9”。对象、类目、标注指南改变后,一致性也会改变。κ 与普通一致率还是不同指标,不应混写。ACL 2026 论文。

也别只报总一致率。若失败仅占 10%,一个永远判“没有失败”的标注器能达到 90% 一致,却漏掉全部失败。这是 Academy 在评估器校准中给出的例子。需要检查各类漏标、误标、兜底使用,以及定义不清的样本。关键类目少时,逐条检查误判往往比再算一个总分更有帮助。

模型预标可以降低人工负担,但抽检不能只看高置信度和大类。小类、罕见风险、模型与人工冲突的样本,都应纳入复核。否则分类表看起来更整齐,少见问题却被系统性抹掉了。

有了频次,还要决定先修哪一类

分类表的列至少应有:样本范围、类目、数量、分母、影响、证据是否充分、建议动作、负责人。如果当前只有筛选样本,就用样本内计数表达;总体比例没有依据时宁可空着,不要用精确小数包装它。

频次高不自动等于优先级高。Academy 引用了 OpenAI 的票据处理演练:商家名提取错误率高达 85%,但这些错误与系统承担的审计决策不相关,团队停止追踪这一项。这个例子有具体业务前提,不意味着商家名普遍不重要。如果产品的目的就是商家核验,它显然会影响决策。

相反,低频的数据泄露、越权承诺,也可能需要立即处理。排序应同时看发生频次、用户或业务影响、修复可行性。有些团队用“频次×影响×可修性”表达,这更适合作为讨论维度,不宜把主观打分乘出一个数,就当作客观优先级。高风险底线应该单独判定,不能被低频或难修压到队尾。

可修性低也不等于暂时放弃。若风险不可接受,短期动作可以是缩小工具权限、转人工、限制适用场景或回滚。修好模型并非唯一修复办法。

这里可以分成三条处理路径。证据明确的局部 bug 直接修;反复出现、定义稳定的问题纳入持续评估;价值有限或当前证据不足的问题继续观察。每条都应写清下一次触发动作的条件,避免“先观察”成为永久搁置。

Langfuse 的客服教学案例里,人工改稿增多后,团队发现机器人引用了过时的导出界面,原因是帮助文章索引陈旧。刷新索引并重新检查相关场景,比专门新增一个长期模型评估器更直接。它是教学案例,不是生产事故统计;其中的“一次性修复”也不表示以后永远不会再次陈旧。

所以“修完就忘掉”需要换成更审慎的工程判断:不必为每个问题建立昂贵的常设 judge,但已知回归风险可以留下廉价检查,索引更新机制也需要负责人。JSON 格式、日期格式等问题是否还需回归检查,取决于保障方式和复发代价,不能仅因一次提示词修改有效就全部撤掉。

什么时候值得把分类变成评估器

把失败模式转成评估器之前,先确认它仍会影响行动。指标下降会阻止发布吗?某类问题上升会触发调查吗?如果结果变化不会改变任何处理,应重新考虑它是否值得持续计量。

接着看判定依据。工具是否真的写入、工单是否关闭、字段是否合法、链接是否存在,能从系统状态或契约检查的,应优先用代码。只检查模型说“已完成”不够,环境中应有对应结果。两段表述是否推荐同一做法、回答是否得到上下文支持,则可能需要模型判断或人工复核。

Academy 建议从 10–20 个真实案例起步,逐个标注并写短评,再构建一个窄的 judge。这个规模有助于把标准写清,不保证评估器已经适合所有流量。验证还要覆盖通过、失败、未知等结果,尤其检查严重问题被漏放的情况。

此时错误分析已有的笔记、类目定义、正反例可以直接复用。它减少的不是模型调用次数,而是评估器设计时的猜测。若说不清某个问题在什么条件下成立,就先保留人工判断,别把模糊标准交给另一个模型后称为自动评估。

评估器上线后仍需定期读记录。一个连续数月满分的非关键指标,可以触发复核:问题是否被稳定解决,数据分布是否变了,还是评估器失去检测能力。长期回归和护栏可能仍值得保留。撤掉前要看风险与成本,不能仅以“总是满分”为理由。

下一轮不要把分类当成答案

比较新旧版本时,要用同一批输入看具体变化。只把新旧各自抽来的二十条并排放着,人群和输入差异也会混进去。对重复运行具有波动的系统,还需记录配置并考虑多次运行,而非把一次输出当成稳定能力。

维护节奏可以先做小批量滚动阅读,重大变更后扩大受影响场景。每轮 20–30 条、三十分钟等安排,适合当作排期起点,不是效率已经被实验证明的方案。复杂多步 trace 的阅读成本与简短对话差异很大。

每轮保留一份可以接续的材料:类目版本、定义与样例、抽样入口、尚未确认的原因、动作及负责人。类目改变时,旧趋势不能无声拼接;需要回标一批共有样本,或注明统计口径发生变化。

这份材料随后会进入数据集与实验。严重的已确认失败,可以转成可运行、经审阅的回归样例;有争议的分类,先补证据与标准;需要持续追踪的模式,再考虑评估器。下一篇要处理的,就是如何让这些样例在两次运行之间保持可比。

本轮错误分析结束时,团队应能拿着记录说明:问题从哪里开始、目前哪些证据还缺、样本允许报告什么比例,以及谁来执行修复。若只能交付一张“幻觉占比”图,还需要回到具体记录里继续读。

来源与口径

方法主线来自 Langfuse Error analysis、Choosing what to evaluate 与 Writing good evaluators。采样、编码与持续评估的工程建议,是结合适用条件作出的建议;它们不表示厂商给出了统一标准。

另参考 Customer support chatbot、Designing datasets、Experiments。论文数据在正文附近链接原文;反馈与代理指标的进一步案例放在相邻文章展开,避免同一段研究在全系列反复复述。