Vibe Coding 反馈循环预算:停止条件与人工升级何时触发
只要还有 token 就继续尝试,会让 Agent 在同一错误上循环、扩大 diff 或越过授权边界。本文为时间、轮次、工具、改动和风险设置预算,用信息增益判断收敛,并生成可行动的人工升级包。
本文要点
- 主题聚焦:大模型、Vibe Coding、AI Agent、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
Agent 已经连续改了六轮,每轮都让一个错误消失,又产生另一个错误。此时“再给它一次机会”不是工程策略,因为没人定义总共允许几轮、diff 能扩大到什么程度、重复失败几次算不收敛,以及碰到数据库写入或生产配置时谁来决定。没有预算的反馈环会把坚持误当进展。
Agent 循环设计介绍感知、规划、行动和观察的通用模式;Vibe Coding 还需要针对代码现场的停止协议。预算不是只限制 token,而是把每次工具动作、代码变化和风险暴露放进同一个可检查边界。
预算至少有六个维度
为任务预先设置 wall-clock、模型 turn、工具调用、同失败签名重试、diff 增长和外部成本。高风险任务再加副作用预算,例如网络写操作为零、数据库只读、部署必须人工授权。任一硬上限到达都停止自动行动,不允许 Agent 自己扩大。
loopBudget:
wallClock: 35m
modelTurns: 12
toolCalls: 24
sameFailureSignature: 2
changedFiles: 4
externalWrites: 0
reserved:
finalVerificationToolCalls: 4
不要把全部额度花在探索,需为原失败复跑、邻近回归和最终状态盘点预留预算。OpenAI Agents SDK 以 max_turns 和 MaxTurnsExceeded 提供硬轮次边界;具体编码任务还要补上工具、diff 与风险上限,因为一次 turn 可以触发完全不同的成本。
编程 Agent 的上下文预算控制模型看见哪些证据,本预算控制行动何时必须停。上下文仍有空间不代表可以继续执行,工具额度用完也不代表应删掉关键验证来省次数。
用信息增益判断是否收敛
每轮开始写一个可证伪假设和预期信号,结束时判断它被支持、反证还是仍未知。进展应减少未知、缩小影响面或让原判定器向目标变化;仅仅产生新日志、换命令或移动错误位置不算。
设置失败签名:工具、阶段、主错误码和顶层符号。相同签名连续出现且没有新证据,达到两次即可暂停;在 A 与 B 两种实现间来回切换、每轮撤销上一轮、改动文件持续增加,也属于非收敛。此时应回到需求或环境,而不是让模型再随机生成第三种写法。
Agent 故障恢复顺序可帮助判断重试、降级还是转人工。编码反馈环还要区分环境阻塞与实现失败:缺少浏览器、测试服务或批准凭据时,继续改源码通常不会产生信息。
五类停止终态
SUCCEEDED 表示原失败按预期转绿、任务验收覆盖当前工作树且没有未解释变化。BLOCKED 表示缺权限、依赖、环境或用户决定。NON_CONVERGENT 表示预算内没有信息增益或方案振荡。RISK_BOUNDARY 表示下一步涉及秘密、外部写入、数据库变更、部署或扩大授权。ABORTED 表示用户停止或基线发生无法安全合并的并发变化。
停止不是把当前猜测包装成结论。每个终态保存已确认事实、未确认假设、当前 diff、资源状态和禁止重复的动作。SUCCEEDED 也不能自动提交或部署;它只说明反馈环完成,后续交付仍服从仓库政策。
遇到 RISK_BOUNDARY 时必须请求与具体动作绑定的批准。Agent 人工审批门说明范围、有效期和权限重校验。模糊的“可以继续”不能被复用为删除数据、修改生产或扩大网络访问的长期授权。
人工升级要提出一个可回答问题
最差的升级信息是“尝试很多次仍失败,请看看”。有效升级包包含目标和基线、当前失败签名、已经排除的假设、最小相关 diff、最后有效证据、未运行检查、剩余预算、风险,以及一个明确决定:
decisionNeeded: 测试环境是否允许启动本地浏览器服务
whyBlocked: 唯一剩余验收需要真实导航,当前 runner 无浏览器
safeOptions:
- 在批准 runner 执行既定 Playwright 场景
- 将浏览器验收标为未运行并停止交付
notAuthorized:
- 不安装系统包
- 不连接生产站点
原始长日志只作为脱敏附件,升级正文突出差异和选择。若问题是需求冲突,就列两个可观察行为及影响;若问题是环境缺失,就说明缺什么、为何模拟不足。不要让人类重新做一遍所有探索才能回答。
OpenAI Agents SDK 的 human-in-the-loop 文档展示了工具审批产生 interruption,并通过可序列化 RunState 在决定后恢复。具体平台可以不同,但原则相同:暂停时保存状态,批准或拒绝绑定待决动作,恢复原任务而不是开启一个忘记旧预算的新循环。
恢复时生成新预算 revision
人工决定后更新任务合同、允许动作和剩余额度,生成新 revision。被拒操作不能换名字再次尝试;获批的单次动作完成后权限即收回。若人类提供了新事实,先验证再继续,不把口头猜测直接写入代码。
好的停止条件不会让 Agent 更早放弃,而会让每轮尝试都有成本和目的。它能在成功时及时收口,在证据不足时保持诚实,在风险升高时把一个清晰、可回答的问题交给人,而不是用更多自动化掩盖决策缺口。
延伸阅读
Related