问题
代码生成类 Agent 的典型失败:生成的代码跑不通,Agent 对着报错信息"重新生成一版",还是不通,再生成……没有定位-修复-验证的闭环,靠运气收敛。
核心模式
自愈循环:执行 → 捕获失败 → 定位根因 → 定向修复 → 重新验证,循环到通过或预算耗尽。修复是"靶向手术"而非"推倒重来"。
code = generate(task)
for attempt in range(MAX_ATTEMPTS):
result = sandbox.run(code) # 沙箱执行,捕获全部信号
if result.ok:
return code
# 定位:错误在哪一行?根因是什么?(语法/逻辑/环境/依赖)
diagnosis = localize(result.error, code)
if diagnosis.kind == "environment":
fix_environment(diagnosis) # 环境问题不修代码
continue
# 定向修复:只改出错区域,保留其余部分
code = repair(code, diagnosis, context=journal)
journal.record(diagnosis) # 失败日记(第 08 讲)
raise EscalateToHuman(journal)
与"重新生成"的本质区别:保留对的,只修错的;每次修复基于诊断而非重掷骰子。
实战要点
- 沙箱是前提:没有可重复执行+完整错误捕获的环境,自愈无从谈起
- 错误分类先行:语法错误(秒修)、逻辑错误(需要推理)、环境问题(改代码无用)——策略完全不同
- 修复时给模型最小上下文:出错函数 + 报错信息 + 相关依赖,别把整个文件塞回去让它重写
- 预算耗尽必须升级(转人工/放弃),并留下完整诊断轨迹——自愈的底线是"不隐瞒失败"