失败学习闭环(Failure Learning Loop)
智能体的自进化不应该从「感觉」出发,而应该从哪一次交付没有通过规则出发。 这一页讲清楚:失败从哪里来、怎么变成可执行的改进、哪些线不允许越过。
为什么只学会话不够
一个门面 agent 每天产生两类事实:
| 层 | 例子 | 过去是否进入复盘 |
|---|---|---|
| 交互层 | 澄清轮次过多、预算耗尽、停在 input_required | ✅ 有指标 |
| 交付层 | 输出不符合 output_schema、verification.rules 不通过 | ❌ 没有 |
| 履约层 | 争议、赔付、超时 | ❌ 没有 |
交付层的失败价值最高:它自带 field + rule,可复现、可归因。 但过去它只写进了 verification_results,从未进入复盘输入。
失败怎么进入复盘
verification_results(agentProfileId + createdAt + taskId)
│ 作为索引源:StateService.list() 必须给 taskId
▼
state: /tasks/{taskId}/agents/{agentId}/results|errors
│
▼
ReviewDataSource.collect(agentId, date)
│ 规则级摘要:只带 field / rule / message
▼
buildReviewInput() → 指标 + 证据指针
│
▼
每日复盘 prompt(失败必须点名规则与字段)三条纪律
- 不带交付内容:
actualOutput/actualValue在投影时丢弃,复盘模型拿不到客户数据。 - 不把「未知」当「失败」:
passed不是布尔值的记录直接跳过,避免误报。 - 指针可回查:
verification:<taskId>:<index>能定位到具体规则结果。
新增的指标
| 指标 | 含义 |
|---|---|
verificationRuns | 当天平台契约校验次数 |
verificationFailures | 其中不通过的次数 |
verificationFailureRate | 失败率 |
topFailedRules | 失败最集中的规则(最多 5 条) |
topFailedRules 是关键:只有计数,模型只能写「失败了 3 次」; 有规则名和字段,才能提出可执行的修正。
从失败到行动
| 观察 | 允许的提案 | 等级 |
|---|---|---|
| 同一规则 + 字段连续 3 天失败 | skill_gap | L3(人工) |
| 同一规则 + 字段单日集中失败 ≥ 3 次 | boundary_tweak | L2 |
| 失败原因指向「该先问什么」 | boundary_tweak | L2 |
| 规则本身疑似过时 | knowledge | L1 |
单次失败只能到 L2:一次脏输入不足以证明能力缺口。
主动提醒:verification_failure
交付规则反复失败时,不必等主人翻复盘报告:
- 触发:连续 3 天同规则失败,或单日同规则失败 ≥ 3 次
- 优先级:4(与知识到期同级),低容忍度下不会被过滤
- 文案:只描述事实,例如
origin_country 的 required 规则连续 3 天未通过(共 7 次) - 落点:owner 收件箱
/agent/:agentId/inbox
观察外部世界(Observe 环)
除了自己交付失败,agent 还需要知道行业里发生了什么。
| 能力 | 实现 |
|---|---|
| 抓取 | RSS 2.0 / Atom,单源超时 10s、响应上限 2MB、最多 50 条 |
| 安全 | SSRF 防护:拒绝本机/内网/CGNAT;每次重定向重新校验 URL 与 DNS |
| 去重与相关性 | buildNewsDigest:内容指纹去重 + 关键词命中率 |
| 进入收件箱 | 相关度 ≥ 0.5 的前 3 条 → source_digest 候选 |
| 时序 | 02:00 抓取 → 03:30 复盘读取当天 digest |
配源是管理员操作:
http
PUT /api/agent-rsi/:agentId/sources
{
"sources": [
{ "id": "eu-packaging", "url": "https://example.com/feed.xml", "keywords": ["packaging"] }
]
}明确不做
| 不做 | 原因 |
|---|---|
| agent 自动改写业务算法 | 变更只能落在知识 / 话术 / 路由 / 定价 |
| L3 自动生效 | 能力变更永远需要所有者批准 |
stale_result(结果未回读) | 没有「已读」埋点时不猜「你没看」 |
| 实时学习 | 每日一次,避免客户会话中途行为变化 |
当前状态
- 复盘数据源、失败候选、收件箱、Observe 环均已实现并有真库 e2e
- 每日 02:00 抓取、03:30 复盘与主动决策
- 未做:前端源配置 UI(管理员场景先用 API)