返回文章

Loop Engineering:为 Coding Agent 设计可控的反馈循环

Loop Engineering 关注的不是把提示词写得更长,而是设计跨多轮运行的控制结构:任务如何触发,状态如何保存,结果如何验证,以及系统何时重试、停止或转交给人。

Loop Engineering 控制循环封面图

先说边界

Loop Engineering 是一个正在形成中的词。截至 2026 年 6 月,它还不是已经定型的行业标准。

本文讨论的范围也更窄:coding agent / 软件工程场景。后面的五个问题、控制面、能力层和 Loop Card,都是我为了落地实践采用的分析框架,不是通用规范。

我对它的工作定义是:

Loop Engineering 是围绕 Coding Agent 设计跨多轮运行的反馈控制结构:任务如何触发,状态如何持久化,结果如何验证,以及系统何时继续、重试、停止或转交给人。

它不是让 Agent 无边界自跑。更准确地说,它追求的是受控自动化。

为什么会出现这个问题

很多 AI 编程流程看起来已经自动化了,其实真正的调度器还是人。

常见流程是:

  1. 人写需求。
  2. Agent 改代码。
  3. 人跑测试。
  4. 测试失败后,人把错误贴回去。
  5. Agent 再改一轮。
  6. 人判断能不能结束。

这个流程当然也是循环,但循环主要存在人的脑子里。

人负责记住上下文、判断风险、挑验证命令、区分代码问题和环境问题,还要决定什么时候停止。规模一大,这套方式就会漏。

Loop Engineering 要做的,是把这些隐性的人工判断沉淀成系统能读取、执行和审查的结构。

它和 Prompt、Context、Harness 的关系

这些概念有重叠,不是互斥分类。下面只是便于讨论的工程分工。

  • 概念:Prompt Engineering;关注点:当前调用中的指令、示例和输出约束;典型问题:这一轮怎么表达任务
  • 概念:Context Engineering;关注点:当前调用实际提供给模型的信息集合;典型问题:哪些文件、历史、规则、错误进入上下文
  • 概念:Harness Engineering;关注点:Agent 执行、观察和保存状态的运行机制;典型问题:工具、权限、沙箱、测试、状态、恢复怎么组织
  • 概念:Loop Engineering;关注点:跨步骤、跨尝试、跨运行的控制策略;典型问题:何时触发、如何验证、怎样转移状态、何时停止

Prompt 和工具描述通常也是 context 的一部分。Harness 也可能承担状态、验证、重试和恢复。Loop 往往是由 harness 或 orchestrator 实现出来的控制策略。

所以不能简单说“Prompt 是一句话,Loop 是系统”。更准确的区别是:Prompt 更关注当前调用,Loop 更关注多轮工作如何推进和收敛。

一个最小 Loop 要回答什么

我习惯用五个问题检查一个 Loop:

  • 问题:目标;含义:本轮要解决什么,什么叫完成
  • 问题:上下文;含义:哪些事实必须读取,哪些信息不能猜
  • 问题:行动;含义:Agent 可以做什么,哪些操作禁止
  • 问题:证据;含义:改完看什么:测试、日志、截图、代码差异还是运行产物
  • 问题:决策;含义:成功、重试、换路线、停止还是转人工

但真正的闭环还需要显式控制流:

触发

-> 读取外部状态与上下文

-> 执行动作

-> 收集证据

-> 判定结果

-> 成功 / 重试 / 换路线 / 转人工 / 停止

-> 持久化状态

这里要区分三件事:

  • Evidence / 证据:系统看到了什么,比如测试输出、日志、截图、代码差异。
  • Oracle / 判定器:这些证据是否满足成功标准。
  • Decision / 状态转移:下一步是继续、停止、重试、缩小范围,还是转交给人。

没有判定器,日志和截图只是一堆材料。没有状态转移,循环就只是重复执行。

一个最小 Loop 的触发、上下文、行动、证据、判定、决策和状态轨道

四个控制面

一个可用的 Loop 至少还要补四个控制面。

1. 外部状态

Agent 不能只依赖当前对话历史。跨会话、跨上下文窗口、跨任务恢复时,需要有外部状态记录:

  • 当前任务版本。
  • 已尝试方案。
  • 已排除原因。
  • 代码 revision。
  • 证据位置。
  • 未解决风险。

否则下一轮很容易重复尝试,或者把已经排除的方案再做一遍。

2. 预算

预算不是财务概念而已,也是工程边界:

  • 最多尝试几轮。
  • 每轮最长运行多久。
  • 最多调用多少工具。
  • 什么时候判定“无进展”。

没有预算的 Agent 循环,容易从自动化变成自动试错。

3. 权限与副作用

Loop 必须区分:

  • 只读分析。
  • 本地改代码。
  • 开 PR。
  • 改配置。
  • 部署。
  • 访问生产数据。
  • 修改密钥、账单或供应商策略。

越靠近外部副作用,越需要人工确认和审计。

4. 失败分类

失败之后不能只有“再试一次”。

  • 失败类型:确定性代码失败;默认动作:把诊断证据反馈给修复循环
  • 失败类型:临时基础设施失败;默认动作:有限重试并退避
  • 失败类型:Flaky check;默认动作:隔离检查,不让 Agent 修改业务代码迎合噪音
  • 失败类型:Oracle 不明确;默认动作:停止并人工判断
  • 失败类型:权限或策略冲突;默认动作:禁止重试,直接升级
  • 失败类型:连续无进展;默认动作:缩小范围或结束本轮

很多危险不是 Agent 不会改,而是它在错误层面持续改。

Loop Engineering 的外部状态、预算、权限副作用和失败分类四个控制面

Gate 和 Eval 不是一回事

Loop Engineering 里经常会混用 check、gate、eval。它们最好分开。

  • Check / Gate:判断这一次运行能不能通过,比如单测、契约测试、导入回归、浏览器验证。
  • Eval:比较某个模型、Prompt、工具或 Harness 版本,在一组任务和多次 trial 上的总体表现。

Gate 解决“这次能不能过”。Eval 解决“这个系统版本是否整体更好”。

所以,trace 只能提供改进假设。Prompt、模型、工具或 harness 的修改,应该经过离线 eval 和回归验证后再进入主流程。

Gate 关注本次运行是否通过,Eval 关注跨版本多次试验的整体表现

Loop Engineering 的能力层

下面不是严格线性的成熟度模型,而是一组通常会逐步补齐的能力层。

M0:人工闭环

人提出目标,Agent 改代码,人选择检查命令,人判断结果。

不少团队仍主要依赖这种方式。它能工作,但很吃人的经验和注意力。

M1:规则契约化

把隐性规则写出来。

例如:

  • 哪些路径是核心链路。
  • 哪些文件改动必须跑哪些检查。
  • 哪些操作必须人工确认。
  • 哪些失败不能继续重试。
  • 哪些证据必须保存。

这一步不需要先造平台。先有一张清楚的 Loop Card 就够。

M2:验证可重复

把检查变成可重复执行的 gate。

不要只写“确保不破坏核心功能”,而是准备固定样本、固定命令、明确成功条件和失败证据。

目标不是完全消除不稳定,而是让判定器尽量确定;对不稳定检查,要能识别、隔离和处理。

M3:人工触发的受控循环

这时可以允许 Agent 在边界内多跑几轮。

但必须有最大轮数、无进展判断、失败分类、外部状态和人工升级规则。

如果两轮之后仍然是同一类失败,就不要继续猜。可能是环境、oracle、权限或模型能力问题。

M4:事件驱动循环

CI、任务系统、监控或定时器可以自动触发诊断、分析或草拟 PR。

这一层的关键不是“加一个 cron”,而是处理真实运行问题:

  • 重复事件和幂等性。
  • 并发运行和工作区隔离。
  • 取消、超时和死信处理。
  • 副作用审计。
  • 凭据与权限边界。

我不建议一上来就自动合并或自动部署。更稳的是影子模式:系统只分析或提出修改,人和门禁决定是否进入主线。

M5:Trace 提供假设,Eval 负责门禁

最有复利的是改进循环。

重复失败不应该只修一次,而要聚类成样本,反过来改工具、规则、Prompt、模型策略或测试。

但 trace 不是直接改生产策略的理由。它只提供假设。真正进入主流程之前,要通过 eval、回归集和对照验证。

示例:把核心路径保护变成受控循环

在一个已有核心链路和回归资产的项目中,Loop Engineering 的低风险起点之一,是核心路径保护。

假设某条导入链路是核心能力。它不能只靠一句“不要破坏”。更稳的做法是:

  • 相关代码变更触发检查。
  • 用固定样本验证接口契约和持久化结果。
  • 保存失败证据。
  • 写入外部状态。
  • 根据判定结果决定通过、重试、缩小范围或转人工。

注意,这条 gate 本身不是完整 Loop。它是 Loop 里的验证门禁。完整 Loop 还需要触发、状态、决策和升级路径。

这就是现实价值:把“我记得这个很重要”,变成“系统每次都会检查这个,并知道下一步怎么处理”。

不要把它理解成什么

Loop Engineering 不是:

  • 更长的 Prompt。
  • 更复杂的工作流平台。
  • 让 Agent 无人值守改生产。
  • 把所有测试每次都跑一遍。
  • 失败后无限自动重试。
  • 用代码掩盖模型能力边界。

它更像一套控制系统。

让 AI 工作有触发、有状态、有证据、有判定器、有预算、有退出条件。

一个最小实践模板

如果今天就想开始,不要先造平台。先拿一条最重要的核心路径,写出一张最小 Loop Card

下面是示例值,不是通用推荐:

loop: core-path-preservation

trigger:

change_surface:

- path: apps/extension/**

- path: apps/api/**/import*

state_store:

path: artifacts/loop-runs/{run_id}/state.json

goal:

preserve_core_capability: true

success_criteria:

- historical fixture imports successfully

- persisted result matches compatibility contract

- failure evidence is saved when check fails

checks:

- name: import-contract

command: pnpm test:import-contract

timeout_minutes: 5

pass_condition: exit_code == 0

- name: smoke-core-path

command: pnpm regression:smoke

timeout_minutes: 10

pass_condition: exit_code == 0

evidence:

save_to: artifacts/loop-runs/{run_id}/

include:

- command output

- fixture id and hash

- code diff summary

- failure class

decision_policy:

on_success: mark_passed

on_code_failure: retry_with_evidence

on_flaky_check: isolate_and_escalate

on_unclear_oracle: escalate_to_human

budget:

max_attempts: 2

max_runtime_minutes: 20

stop_conditions:

- same_failure_twice

- permission_required

- production_side_effect_detected

human_approval:

required_for:

- changing tests

- changing production config

- changing provider or model policy

side_effect_policy:

allow:

- local code edits

- local test execution

forbid:

- production config mutation

- credential mutation

- silent fallback that hides failure

这张卡仍然很小,但它已经把 Loop Engineering 从口号落到了工程结构:触发、状态、验证、证据、决策、预算和停止条件都能被系统读取。

最后

Prompt Engineering 提高单轮交互的可控性。

Loop Engineering 提高多轮工作的可重复性和可审查性。

真正重要的不是让 Agent 跑得更远,而是让系统知道:

  • 凭什么开始。
  • 凭什么继续。
  • 凭什么算完成。
  • 凭什么停下来找人。

概念来源

相关工程实践