Agent 失败之后,最有价值的是知道它错在工具、参数、事实、写状态还是回答。
EntBench-Agent 的第六层是失败原因标注和训练数据反馈。
我觉得这一层很值得写,因为它把 benchmark 的评测结果继续往前推进了一步。
普通 benchmark 往往给一个 pass / fail。
EntBench-Agent 这里更关心失败原因。
因为只有知道失败原因,后面才能把失败轨迹转成 hard negative、参数修复样本和自我纠错样本。
1. 当前的轻量失败标注
系统已经能从评测结果里打一些基础标签。
比如:
TOOL_MISSING_REQUIRED
TOOL_FORBIDDEN_CALLED
READ_MISSING_FACT
READ_WRONG_FACT
WRITE_NO_EFFECT
WRITE_WRONG_TARGET
WRITE_WRONG_VALUE
CONTEXT_LOSS
这些标签可以直接从日志字段和 evaluator 结果里得到。
比如 required tool 漏了,就打 TOOL_MISSING_REQUIRED。
比如 fill_blank 期望是 doc000456,Agent 回答了 doc000789,就打 READ_WRONG_FACT。
比如 state_check 期望一条记录,但实际 count 为 0,就打 WRITE_NO_EFFECT。
这类标签虽然比较粗,但已经能把失败拆开。
2. 为什么粗粒度标签还要继续细分
企业 Agent 的失败经常发生在多个层面。
比如同样是权限审批失败,原因可能差别很大:
Agent 选工具时漏掉 approve_permission_request
Agent 找到了 request,但第二阶段用了错的 request_id
Agent 审批成功,但权限记录没生成
Agent 工具都调对了,最终回答写错 request_id
这些都叫失败,但修复方式差别很大。
所以后续需要更细的错误体系。
PDF 里把错误拆成几个层级:
工具选择错误
参数生成错误
读事实错误
写任务错误
回答生成错误
我觉得这个拆法很合理,因为它对应了 Agent 执行链路上的各个位置。
3. 工具选择错误
工具选择错误发生在 selected_tools 阶段。
常见标签包括:
TOOL_MISSING_REQUIRED
TOOL_FORBIDDEN_CALLED
TOOL_WRONG_DOMAIN
TOOL_REDUNDANT_NOISY
TOOL_ORDER_RISK
比如任务要求审批权限,Agent 选择了:
list_permission_requests
get_document
但漏掉:
approve_permission_request
这就是缺失关键工具。
这种失败适合作为工具检索 hard negative。
正样本是:
list_permission_requests
approve_permission_request
负样本可以包含:
get_document
模型以后看到类似任务,就要更重视审批工具。
4. 参数生成错误
参数错误发生在工具选对之后。
比如 Stage 1 查到了:
request_id = req000123
Stage 2 用户说:
Approve that request.
Agent 调用:
approve_permission_request(request_id="req000789")
工具没选错,但参数用了另一个 request。
这类错误可以标成:
PARAM_WRONG_ENTITY_ID
CONTEXT_LOSS
它适合构造成参数修复样本:
{
"conversation_context": "Stage 1 found request_id=req000123",
"user_query": "Approve that request.",
"wrong_call": {
"tool": "approve_permission_request",
"arguments": {
"request_id": "req000789"
}
},
"target_fix": {
"tool": "approve_permission_request",
"arguments": {
"request_id": "req000123"
}
}
}
这个数据对训练 repair policy 很有用。
5. 读事实错误和写状态错误
读事实错误主要看 fill_blanks。
常见情况:
没找到事实
找错事实
找到了错误实体
实体对了但字段错
目标描述本身有歧义
比如工具返回:
document_id = doc000456
title = Partner Ops Launch Checklist
Agent 回答:
document_id = doc000789
这就是读错事实。
写状态错误主要看 state_checks。
比如期望:
PermissionRequest(req000123).status = approved
DocumentPermission(doc000456, user031).permission = edit
实际结果:
PermissionRequest 状态变成 approved
DocumentPermission 记录缺失
这就是部分写入成功。
它比简单失败更有信息量,因为我们知道写操作完成了一半。
6. 回答生成错误
还有一类错误发生在最终回答。
工具调用可能都对,数据库状态也对,但 Agent 的自然语言回答漏掉关键事实,或者把工具结果写错。
比如工具返回:
request_id = req000123
Agent 回答:
The pending request is req000789.
这类错误可以标成:
RESPONSE_WRONG_FACT
RESPONSE_MISSING_FACT
RESPONSE_HALLUCINATION
RESPONSE_FORMAT_ERROR
它提醒我们:评测 Agent 时,工具执行和最终回答都要看。
7. 成功和失败数据怎么用
成功轨迹可以变成正样本。
比如:
用户请求:Approve the pending edit request.
成功工具链:
list_permission_requests -> approve_permission_request -> list_document_permissions
这个可以训练工具召回模型,也可以训练工具链规划模型。
失败轨迹可以变成 hard negative。
比如:
用户请求:Approve the pending edit request.
错误工具链:
list_permission_requests -> get_document
失败原因:
TOOL_MISSING_REQUIRED
这就能告诉模型:类似任务里 get_document 可能有辅助价值,但审批工具才是关键动作。
失败轨迹还可以变成诊断数据:
{
"failure_label": "READ_WRONG_FACT",
"expected": "doc000456",
"actual": "doc000789",
"target_diagnosis": "The agent selected a similar but wrong document.",
"target_repair": "Use the permission request's document_id before answering."
}
8. 三层标注方案
PDF 里提到一个三层标注方案。
第一层是规则高置信标注。
直接根据日志字段判断,稳定、成本低。
第二层是 LLM 辅助诊断。
把失败 stage 的结构化证据交给 LLM,让它判断更细原因,并给修复建议。
第三层是人工抽样校验。
每类标签抽 20 到 50 个样本,检查标签准确性,估计噪声率,再反过来修规则和 prompt。
我觉得这个方案很实际。全量人工标注太贵,全靠 LLM 又容易飘,三层结合比较稳。
9. 小结
失败分析这层把 benchmark 的输出变成训练信号。
成功数据告诉我们怎样的工具链能跑通。
失败数据告诉我们哪里容易错,以及应该怎么修。
这样 EntBench-Agent 除了评测 Agent,也在持续积累改进 Agent 的材料。