问题

代码生成类 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)

与"重新生成"的本质区别:保留对的,只修错的;每次修复基于诊断而非重掷骰子。

实战要点

  • 沙箱是前提:没有可重复执行+完整错误捕获的环境,自愈无从谈起
  • 错误分类先行:语法错误(秒修)、逻辑错误(需要推理)、环境问题(改代码无用)——策略完全不同
  • 修复时给模型最小上下文:出错函数 + 报错信息 + 相关依赖,别把整个文件塞回去让它重写
  • 预算耗尽必须升级(转人工/放弃),并留下完整诊断轨迹——自愈的底线是"不隐瞒失败"