Loop Engineering
Loop Engineering 是设计 Agent 如何发现任务、构造上下文、执行动作、观察反馈、验证结果、迭代修复、停止或升级给人的工程方法。一句话:让 Agent 自主地、持续地、可靠地完成一个目标,不需要人全程盯着。
它和前几篇的关系是递进的。Prompt 决定每轮模型如何思考和行动,Context 决定每轮模型能看到什么,Harness 决定工具、权限、状态和预算,Loop 决定这些步骤如何重复、验证和停止。没有好的 loop 设计,前三层再好也只是单次任务的工具,不是系统。
循环的对象
裸 ReAct 循环的是“思考、行动、观察”的文本模板。Loop Engineering 把循环本身当系统治理,每一圈真正在变化的是五类变量:
- 上下文:每轮喂什么,不是无脑往后拼,要选、要压、要截
- 状态:进度、已拿到的关键结果、原始目标,独立存储,不混在对话里
- 预算:步数、Token、时间、成本,把预算当一等公民
- 工具集:按循环阶段动态收放,而不是全量暴露
- 终止:凭什么判断该停,不能全信模型说的“我做完了”
终止条件与失败出口
这是最容易被搞混的一对概念:
- 终止条件管“做完了就停”。目标可验证,测试绿了、lint 干净了、指标达标
- 失败出口管“做不完也得停”。重试到上限、预算触顶、超时
无人值守的循环两者缺一不可。只有终止条件没有失败出口,一个改不动的任务会重试到天亮,账单三位数美元。
停止条件必须可程序化验证,不是“代码质量变好”这种主观描述,而是“all tests pass and lint is clean”。判断条件是否成立的应该是独立检查器,不是干活的那个模型自己说了算。maker 和 checker 从停止条件就开始分离。
三道闸
成本控制是 Loop 的基础设施,不是省钱技巧。三道硬性防线:
| 防线 | 机制 | 说明 |
|---|---|---|
| 迭代上限 | MAX_ITER |
先跑几次看正常任务需要多少轮,设成 2 到 3 倍。设成 1000“以防万一”等于没有 |
| 无进展检测 | 对比相邻两轮状态 | commit hash、文件 checksum、测试通过数。连续 N 轮无变化认定卡死 |
| 金额预算 | 每轮累计 token 成本 | 迭代次数是间接控制,dollar budget 是直接控制。多 Agent 场景尤其重要,并发消耗没有总量控制必失控 |
预算的三层:单任务重试上限、全局 token 预算、墙钟超时。任何一层触顶,循环就该优雅退出,基于已有信息给答案,而不是无限烧下去。
六组件
一个真正可用的 Loop 至少有六个组件:
Loop 的六个组件
- Goal Contract:任务目标、非目标(不要顺手做什么)、允许范围、验收标准、风险等级、预算。防 goal drift,越改越偏离原始目标
- Context Builder:每轮选择必要上下文,保留当前计划、最近失败输出、关键错误片段,历史只留摘要
- Action Executor:工具、命令、编辑都受权限和沙箱控制
- Verifier:测试、规则、模型或人。自产自检是最常见的反模式,生成器不能当自己的裁判
- Stop Policy:success、max_steps、max_time、max_cost、no_progress、repeated_failure、risk_trigger
- Trace Store:每轮记录输入摘要、模型输出、工具调用、观察、diff、验证结果、成本、停止原因
失效模式
| 失效模式 | 表现 | 防护 |
|---|---|---|
| Token burn | 一直重试没有进展 | max_cost 加 no_progress |
| Goal drift | 越改越偏离目标 | Goal Contract 加 diff 审查 |
| Self-grading | Agent 自己宣布成功 | 外部 verifier |
| Test gaming | 为通过测试写假实现 | 人类 review 加额外测试 |
| 无限兜圈 | 反复尝试同一失败操作 | 卡死检测加强制停止 |
| 成本爆炸 | 单轮读入超大文件导致单轮成本极高 | dollar budget 加单轮 token 上限 |
最关键的教训:gate 可信之前不要启动 loop。一个总是回答“通过”的 verifier,会让循环快速跑完所有迭代,每轮都“成功”退出,交付一堆没经过真正检验的产出。这比不做验证更糟,因为你以为它被验证过。
成熟度分级
L0 手动 prompting,人复制错误信息继续提示。L1 单轮 Agent,能调工具但人决定下一步。L2 有限循环,有 max_steps 和测试。L3 可观测循环,有 trace、预算、失败归因、回滚。L4 调度循环,定时发现任务自动分派,高风险人工审批。L5 组织级循环,多 Agent、多队列、持续评估。
上线要渐进:从手动流程固化成带验证的脚本,跑稳了再加调度和持久状态,之后才放手无人值守。一步从手动跳到完全无人,是最大的反模式。
面试追问
- 终止条件和失败出口什么区别? 终止条件管“做完了就停”(测试绿了),失败出口管“做不完也得停”(重试上限、预算、超时)。无人值守时缺了后者会无限重试烧光预算
- Loop 比 Harness 多什么? Harness 是单轮的安全网:工具、权限、状态、预算。Loop 管跨轮:什么时候开始、每轮喂什么、怎么验证、什么时候停、失败怎么升级。还有调度节奏和跨运行的状态接力
- 怎么防死循环? 三道闸:迭代上限设成正常轮数的 2 到 3 倍、无进展检测(对比 commit hash 或测试数)、金额预算。重复失败检测到同类错误反复出现就升级给人
- verifier 为什么必须独立? 自产自检是反模式。生成器自己评估自己会“护短”,gate 不可信时循环快速“成功”退出,交付未经验证的产出。maker 和 checker 从停止条件开始就要分离
- 什么任务不适合 Loop? 没有可自动衡量的指标(“做好看点”)、失败代价不可控、目标本身没定义清楚、上下文太敏感不能交给自动系统。判断标准:终止条件能不能写成一段返回 0 或 1 的代码