Agent如何将错误信息转化为自主学习信号,形成有效的反馈循环
Agent 在沙箱中执行代码后,会产生两种结果:成功或失败。在传统的自动化系统中,失败意味着停止——脚本返回非零退出码,流水线报错,任务终止。但在 Agent 系统中,失败不是终点,而是学习信号。一个精心设计的反馈循环可以将"测试失败"、“Lint 报错”、"类型不匹配"等信息转化为 Agent 的修正方向,驱动 Agent 自主修复问题。这就是 Harness 中最有价值的机制之一:Try-Fail-Observe-Fix 循环。但这个循环有一个核心设计挑战:反馈信息的质量直接决定了 Agent 的修复效果。一个模糊的错误信息(“something went wrong”)几乎无法帮助 Agent 修复问题;而一个精确的错误信息(“expected typestringbut gotnumberat line 42”)可以让 Agent 直接定位并修复问题。核心概念Try-Fail-Observe-Fix 循环详解┌──────────────────────────────────────────────┐ │ Agent 执行循环 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Try │───→│ Fail │───→│ Observe │ │ │ │ 尝试执行 │ │ 获取错误 │ │ 分析原因 │ │ │ └─────────┘ └─────────┘ └────┬────┘ │ │ ▲ │ │ │ │ ┌─────────┐ │ │ │ └─────────│ Fix │←────────┘ │ │ │ 修正代码 │ │ │ └─────────┘ │ │ │ │ 退出条件: │ │ - 所有验证通过 → 任务完成 │ │ - 修复预算耗尽 → 升级给人类 │ │ - 连续 N 次相同错误 → 陷入循环,升级 │ └──────────────────────────────────────────────┘这个循环的三个关键设计参数:参数含义推荐值修复预算(Budget)最大允许的尝试次数3-5 次循环检测连续相同错误的阈值2-3 次反馈格式错误信息的结构化程度结构化 JSON + 人类可读摘要反馈信号的类型不同类型的失败产生不同类型的反馈信号,Agent 对它们的处理能力也不同:类型一:编译/类型错误src/auth.ts(42,5): error TS2322: Type 'number' is not assignable to type 'string'.Agent 修复能力:⭐⭐⭐⭐⭐ — 位置精确、原因明确,Agent 几乎可以 100% 修复。类型二:Lint 错误src/api.ts:15:3 error @typescript-eslint/no-unused-vars 'tempVar' is defined but never usedAgent 修复能力:⭐⭐⭐⭐⭐ — 直接删除未使用的变量即可。类型三:单元测试失败FAIL tests/auth.test.ts ✗ should reject expired tokens Expected: { status: 401, error: "TOKEN_EXPIRED" } Received: { status: 500, error: "INTERNAL_ERROR" }Agent 修复能力:⭐⭐⭐⭐ — 知道期望和实际结果,但需要理解为什么不同。类型四:运行时异常TypeError: Cannot read property 'name' of undefined at UserService.getUser (src/service/user.ts:28:15) at AuthController.login (src/controller/auth.ts:12:8)Agent 修复能力:⭐⭐⭐ — 有堆栈信息,但需要理解为什么值是 undefined。类型五:逻辑错误(测试通过但行为不对)(没有任何错误信号——测试全部通过,但业务逻辑有误)Agent 修复能力:⭐ — 没有反馈信号,Agent 无法知道有问题。这就是为什么 Golden Tests 如此重要。反馈信息的结构化设计好的反馈信息应该包含五个要素:{"error_type":"test_failure",