《AI 渐进编程》之十二:海狮做对了喂小鱼,Agent 做对了喂什么?
前一篇讲的是open_issues.md:
把暂时不能解决、但又不能忘掉的问题留下来。
这一篇讨论另一个问题:
当 Agent 做对了一轮任务,系统怎样确认“这次已经通过”?
海狮做对动作以后,训练员会喂它一条小鱼。
那么,Agent 做对以后,应该“喂”什么?
不是一句“做得不错”,也不是让模型因为受到表扬而变聪明。
Agent 真正需要的是一个明确的通过信号:
- 验收条件已经满足;
- 当前结果可以保留;
- 修改不需要继续扩大;
- 项目可以进入下一状态;
- 已验证的结果可以成为后续工作的依据。
1. 为什么需要通过信号?
AI 编程中经常出现两种问题。
改对了还继续改
问题已经解决,但因为没有明确的结束条件,Agent 继续重构附近代码、增加无关功能,甚至把已经正确的部分重新改坏。
只改对一部分就宣布完成
页面不报错了,不代表后端没有错误副作用;一个测试通过了,也不代表正常路径没有被破坏。
所以,一轮任务不能靠“看起来差不多”结束。
系统需要明确判断:
当前结果能不能保留,这轮任务能不能结束。
2. Agent 得到的“鱼”是什么?
Agent 得到的不是情绪鼓励,而是一组工程信号:
- 测试通过;
- 编译成功;
- 关键路径验证完成;
- 没有产生错误副作用;
- 修改范围没有越界;
- 剩余风险已经记录;
- 当前任务被标记为完成。
这里说的 reward,并不会直接重新训练模型或修改模型参数。
它主要完成三件事:
- 判断结果是否可以接受;
- 决定修改循环是否结束;
- 把已验证结果写回项目。
因此,更准确地说,验收提供的是:
工作流中的通过信号和状态转移条件。
3. 购物车程序怎样验收?
假设任务是:
修复空购物车结算时的异常行为。
验收不能只看页面是否报错,还要检查:
- 空购物车是否返回安全错误;
- 是否阻止支付和下单;
- 正常购物车是否仍然可以结算;
- 是否没有创建错误订单;
- 是否只修改了允许修改的文件;
- 剩余问题是否写入
open_issues.md。
只有这些条件都满足,系统才能确认:
当前结果可以保留,这轮任务可以结束。
这就是 Agent 得到的“鱼”。
4. 验收条件要提前写
验收不能等任务结束以后再临时决定。
它应该在任务开始时写进current_task.md:
## Task Fix the empty-cart checkout path. ## Allowed - `checkout/service.py` - `tests/test_checkout.py` - `revision_log.md` - `open_issues.md` ## Acceptance 1. Empty-cart checkout returns a safe error. 2. Normal checkout still passes. 3. No payment request is sent. 4. No order is created. 5. Only allowed files are changed. 6. Remaining risks are recorded.这份文件提前规定了:
- 什么叫正确;
- 什么叫越界;
- 什么必须验证;
- 什么情况才算完成。
因此,验收既是终点,也是方向。
5. 测试通过不等于任务通过
测试只能检查已经写入测试的条件。
Agent 可能让测试通过,却同时:
- 写死返回结果;
- 破坏正常业务路径;
- 产生未被测试覆盖的副作用;
- 修改范围外文件;
- 忘记更新项目状态。
所以,完整验收通常包括:
代码测试 + 业务语义 + 副作用检查 + 修改边界 + 状态回写 = 本轮任务通过All tests passed只能证明已有测试通过,不能自动证明整个任务完成。
6. 通过以后还要回写状态
验收完成后,需要把结果写回项目:
revision_log.md:记录修改原因、验证方法和结果;open_issues.md:关闭已解决问题,保留剩余风险;state.md:更新当前状态和下一步;current_task.md:结束当前任务。
这一步把一次性的通过结果,变成下一轮可以继续使用的项目事实。
否则,下一个 Agent 仍然不知道:
- 哪条路径已经验证;
- 哪些问题已经解决;
- 为什么代码现在这样;
- 哪些风险仍然存在。
7. 本章小结
海狮做对了,训练员会喂它一条小鱼。
Agent 做对了,得到的是一组明确的通过信号:
- 目标已经完成;
- 关键路径已经验证;
- 正常行为没有被破坏;
- 修改范围没有越界;
- 剩余风险已经记录;
- 当前结果可以保留;
- 项目可以进入下一状态。
验收不是让 Agent 感到被表扬,而是在决定:
这一轮修改能不能停止,当前结果能不能进入项目历史。
前一篇用open_issues.md保存尚未解决的问题。
这一篇用验收保存已经验证的结果。
一个防止问题被忘记,一个防止正确结果再次被破坏。
两者共同推动项目一轮一轮地收敛。
下一章,我会继续讲:程序项目里的工作台应该怎么搭,才能把代码、状态和人类视图分开。