跳转至

Coding Agent 经常生成错误代码时,如何建立可验证的修复闭环?

  • ID:Q012
  • 难度:进阶 / 系统设计
  • 标签:Coding Agent、Sandbox、Test、Repair Loop、Harness

可视化图解

flowchart TD
  B[Bug / 失败日志] --> R[复现与定位]
  R --> P[生成最小修改计划]
  P --> C[编辑代码]
  C --> T[运行针对性测试]
  T --> V{验证通过}
  V -->|否| A[分析新证据]
  A --> R
  V -->|是| D[Diff 审查与风险检查]
  D --> O[输出修复证据]

核心结论

Coding Agent 的可靠性不能依赖“让模型自检”,而要把代码变更放入可执行、可观察、可回滚的工程 Harness 中。 模型负责提出修改和解释,编译器、测试、静态分析、运行环境和 Review Gate 提供外部真值。

一、最小闭环

对应流程使用 Mermaid 图解展示。

“生成 → 执行 → 报错 → 再生成”只是起点;生产系统还需要控制修改范围、验证目标、循环预算和副作用。

二、任务验收条件

Agent 开始前先形成可检查的 Definition of Done:

  • 哪些行为必须改变;
  • 哪些兼容性不能破坏;
  • 必须通过哪些测试;
  • 允许修改哪些目录;
  • 性能和安全要求;
  • 输出应包含哪些 Artifact。

若没有验收标准,Agent 可能通过删除测试、吞掉异常或硬编码结果“修复”。

三、隔离工作区

使用容器、Sandbox 或 Git Worktree:

  • 固定代码快照和依赖;
  • 限制文件系统和网络;
  • 最小凭证;
  • 资源和时间限制;
  • 所有变更通过 Git Diff 记录;
  • 失败后可重置。

不要直接让 Agent 在共享主工作区或生产机器修改。

四、验证金字塔

按成本从低到高执行:

  1. 语法和格式;
  2. 类型检查、Lint、AST / 安全规则;
  3. 单个相关测试;
  4. 模块测试;
  5. 构建与启动冒烟;
  6. 集成 / E2E;
  7. 人工 Review。

优先运行最小相关验证,获得快速反馈;提交前再根据风险扩大范围。不能为了省成本永远不跑集成验证,也不能每次小改都先跑全量套件。

五、错误分类

{
  "stage": "compile",
  "error_type": "missing_symbol",
  "location": "src/A.java:18",
  "evidence_ref": "artifact://build-log#L88-L101",
  "retryable_by_edit": true
}

区分:

  • 代码错误;
  • 测试预期错误;
  • 环境 / 依赖错误;
  • 权限和网络;
  • 非确定性测试;
  • 任务理解错误;
  • 验收标准不完整。

不是所有失败都应让模型继续改代码。环境错误继续改代码会越修越偏。

六、Repair 与 Replan

局部语法和测试失败可以 Repair;出现以下信号应 Replan:

  • 连续两次修改同一区域仍无进展;
  • 错误从一个模块扩散到多个模块;
  • 验收条件与现有架构冲突;
  • Agent 开始改测试来适配实现;
  • 发现初始根因判断错误;
  • 修改范围显著超预算。

Replan 需要回到目标、证据和架构约束,不是简单换一句 Prompt。

七、循环控制

设置:

  • 最大编辑轮次;
  • 最大测试次数;
  • Token、时间和费用;
  • 修改文件数量;
  • Diff 行数;
  • 重复错误签名检测;
  • 无进展检测。

达到阈值时输出当前状态、失败证据和人工接管建议,不能无限尝试。

八、防止作弊式通过

检查:

  • 是否删除或跳过测试;
  • 是否降低断言;
  • 是否捕获并忽略异常;
  • 是否硬编码测试数据;
  • 是否修改构建配置绕过检查;
  • 是否引入过宽权限;
  • 是否产生无关大面积重构。

测试通过只是必要条件,不是充分条件。

九、Diff Review

Review Gate 关注:

  • 修改是否与任务一致;
  • API 和兼容性;
  • 安全;
  • 错误处理;
  • 性能;
  • 测试质量;
  • 无关改动;
  • 可维护性。

可以使用另一个模型做初筛,但高风险代码仍需人工。Reviewer 必须看到原任务、Diff、测试结果和关键源码,而不是只看 Agent 摘要。

十、经验回流

失败案例应先归因,再决定沉淀位置:

  • 工具或环境问题 → Harness;
  • 仓库规范 → AGENTS.md / Skill;
  • 常见错误 → 静态规则或测试;
  • 模型行为问题 → Few-shot / 评测 / 微调;
  • 业务架构知识 → 文档和代码结构。

不要把每次修复对话都直接写入向量库。

常见错误回答

沙箱执行,报错后让模型反思,直到测试通过。

还缺错误分类、验收标准、无进展、作弊检测、Diff Review 和预算。

面试口述版

Coding Agent 要运行在隔离 Workspace 中,先明确 Definition of Done,再按格式、编译、静态分析、相关测试、构建和冒烟逐级验证。失败结果结构化并绑定日志证据,代码错误进入 Repair,环境或任务理解错误进入 Replan。Runtime 限制轮次、时间、Diff 和重复错误,检测删除测试、吞异常等作弊式通过。最终由 Diff Review 和验收 Gate 决定完成,经验再按 Harness、Skill、测试或模型问题分类回流。模型负责提出修改,外部验证系统负责证明修改成立。

结合个人项目

CI/CD 修复 Agent 可以先在 OpenSandbox 复现并修改,执行单个相关构建和启动冒烟;只有证据、测试和 Diff 都通过后才生成 PR,不能直接修改生产配置。