跳转至

Loop Engineering:Agent 循环、停止条件与恢复

Loop Engineering 研究的是:

Agent 如何一轮一轮行动,并且知道什么时候继续、什么时候停止、什么时候恢复。

普通 LLM 调用是一次性的:

输入 -> 输出

Agent 是循环式的:

目标
  ↓
思考
  ↓
工具调用
  ↓
观察结果
  ↓
更新状态
  ↓
继续或停止

所以 Agent 产品的稳定性,很大程度取决于 loop 设计。

2026 年看 Loop Engineering 的新共识

联网查了一圈主流资料后,可以把现在的共识压缩成五句话。

1. 先做 workflow,再做自由 Agent

Anthropic 的《Building Effective Agents》把 workflow 和 agent 分开:

Workflow:LLM 和工具被编排在预定义流程里。
Agent:LLM 能动态决定自己的过程和工具使用。

这对 Loop Engineering 很重要。

不要一开始就写:

while not done:
    让模型自己决定一切

更稳的路线是:

确定性 workflow
  ↓
局部 LLM 决策
  ↓
有限 Agent loop
  ↓
必要时 Multi-Agent

2. Loop 不是 prompt 技巧,而是运行时系统

LangGraph 这类框架强调 durable execution、persistence、human-in-the-loop。

这说明生产 Agent loop 要支持:

  • 持久化状态。
  • 中断后恢复。
  • 人工介入。
  • 流式输出。
  • checkpoint。
  • replay。

所以 loop 不应该只存在于模型上下文里。

它应该是一个可以恢复、可以审计、可以暂停的运行时。

3. 应用要拥有 orchestration、tool execution、approval、state

OpenAI Agents 相关文档也强调:

模型可以计划和调用工具
但应用要拥有编排、工具执行、审批和状态

换句话说:

LLM 做判断
应用做控制
runtime 做兜底

这是防止 Agent 乱跑的底线。

4. 工具调用可以看成结构化输出

12-Factor Agents 里一个很实用的观点是:

Tools are structured outputs.

也就是说,模型不是“真的执行工具”。

模型只是输出:

{
  "tool": "read_file",
  "arguments": {
    "path": "src/AuthService.java"
  }
}

真正执行的是你的应用代码。

这会让设计更清楚:

LLM 负责提出下一步动作
程序负责验证、执行、记录和回填

5. Evaluator-optimizer loop 要有硬停止

生成者 + 评审者循环很常见。

但如果没有限制,会变成:

生成 -> 评审 -> 修改 -> 评审 -> 修改 -> ...

所以 evaluator loop 必须有:

  • blocking issue 定义。
  • revision 上限。
  • pass/fail 结构化输出。
  • 成本和时间预算。
  • 人工升级条件。

Addy Osmani:Loop 在 Harness 之上

Addy Osmani 在 2026 年 6 月的 Loop Engineering 里给了一个很有用的视角:

不要只做“我来提示 Agent”,而是设计一个系统,让这个系统去提示、检查和推进 Agent。

这句话可以翻译成工程语言:

Prompt Engineering:我写一段提示词,让模型这次答好。
Context Engineering:我决定模型这一轮该看到什么。
Harness Engineering:我给 Agent 一个可控运行环境。
Loop Engineering:我设计一个能反复发现、执行、检查、记录、继续的系统。

Addy 把一个成熟 loop 拆成 5 个部件,再加一个外部记忆:

部件 作用 Agent 产品里的体现
Automations 定时发现和分派任务 每天检查 issue、CI、PR、报错日志
Worktrees 隔离并行任务 一个任务一个独立工作区,避免互相覆盖
Skills 固化项目知识 把项目规范、命令、约束写进可加载技能
Plugins / Connectors 连接真实工具 GitHub、Linear、Slack、数据库、浏览器
Sub-agents 分离生成和验证 一个实现,一个审查,一个做安全检查
External state 保存长期进展 Markdown、任务系统、数据库、trace store

这个观点很关键:

Loop 不是单次对话里的 while 循环
Loop 是一个围绕 Agent 运行的持续工程系统

如果没有外部 state,Agent 每次启动都像第一次见项目。

如果没有 verifier,Agent 很容易自己宣布自己完成。

如果没有 worktree,并行 Agent 很容易互相覆盖文件。

MindStudio:Loop 的基本解剖

MindStudio 的文章 更偏实现,把 loop 定义成:

模型行动
  ↓
环境反馈
  ↓
模型根据反馈决定下一步
  ↓
直到达到停止条件

它强调 loop 和 chain 的区别:

类型 控制方式 适合
Chain 固定步骤,线性执行 摘要、抽取、格式转换
Loop 根据反馈动态调整 写代码、调试、搜索、修复

一个好 loop 至少要有 5 件事:

要素 问题
Clear goal 到底什么叫完成?
Tool set Agent 可以用哪些工具?
Context management 每轮该给模型哪些上下文?
Termination logic 什么时候停?
Error recovery 失败后如何换策略?

所以 Loop Engineering 的核心不是“让模型多想几轮”,而是:

目标要可验收
反馈要结构化
状态要可恢复
预算要可强制
停止要可证明

几种主流 Loop Pattern

Retry Loop

最简单的重试循环。

flowchart LR
    A["Call Tool / Model"] --> B{"Success?"}
    B -->|"Yes"| C["Done"]
    B -->|"No"| D["Classify Error"]
    D --> E["Change Strategy"]
    E --> A

适合:

  • 临时网络失败。
  • JSON 格式错误。
  • 可恢复的工具超时。

注意:

Retry 不是重复同一件事
每次重试都必须改变策略或缩小问题

Plan-Execute-Verify Loop

这是代码 Agent 最常用的结构。

flowchart TD
    G["Goal"] --> P["Plan"]
    P --> X["Execute"]
    X --> V["Verify"]
    V -->|"pass"| D["Done"]
    V -->|"blocking issue"| P
    V -->|"budget / risk"| H["Human or Stop"]

适合:

  • 修 bug。
  • 实现功能。
  • 写文档并检查链接。
  • 生成报告并验证引用。

关键点:

Verify 最好和 Execute 分离
写的人不要做唯一评审者

Explore-Narrow Loop

先探索,再收敛。

flowchart LR
    A["Broad Search"] --> B["Collect Candidates"]
    B --> C["Rank / Filter"]
    C --> D["Deep Dive"]
    D --> E{"Enough Evidence?"}
    E -->|"No"| A
    E -->|"Yes"| F["Synthesis"]

适合:

  • 调研。
  • 源码阅读。
  • 多方案比较。
  • 不知道问题根因的排障。

Human-in-the-Loop

高风险或低置信度时停下来。

flowchart TD
    A["Agent Step"] --> B{"Risk or Uncertainty"}
    B -->|"low"| C["Continue"]
    B -->|"high"| D["Ask Human Approval"]
    D -->|"approved"| C
    D -->|"rejected"| E["Stop / Revise"]

适合:

  • 删除文件。
  • 改生产配置。
  • 发邮件。
  • 花钱调用工具。
  • 访问敏感数据。

Multi-Agent Loop

多个 Agent 协作时,loop 要更严格。

flowchart TD
    O["Orchestrator"] --> A["Worker A"]
    O --> B["Worker B"]
    A --> R["Shared State / Blackboard"]
    B --> R
    R --> V["Verifier"]
    V -->|"pass"| D["Done"]
    V -->|"revise"| O
    V -->|"max hops"| H["Stop"]

关键:

多 Agent 不能自由互相聊天
必须由 orchestrator 控制 owner、contract、deadline、max_hops

Workflow 和 Agent 的分界线

Loop Engineering 第一件事是判断:

这个任务需要 workflow,还是需要 agent?
任务特征 更适合
步骤固定、风险高 Workflow
需要审批和审计 Workflow
每次路径差不多 Workflow
环境开放、路径不确定 Agent
需要根据观察动态调整 Agent
需要探索、搜索、调试 Agent

例子:

退款审批:Workflow
代码 bug 修复:Agent
企业知识库问答:RAG workflow
复杂调研报告:Planner + Agent loop

真实系统常常混合:

外层 workflow 控制风险
内层 agent loop 处理开放子任务

五种常见 Workflow Pattern

Anthropic 总结的几种 workflow pattern 很适合放进 Loop Engineering。

Prompt Chaining

把任务拆成固定步骤。

flowchart LR
    A["Step 1: Extract"] --> B["Step 2: Check"]
    B --> C["Step 3: Write"]

适合:

  • 文档处理。
  • 信息抽取。
  • 固定格式生成。

关键:

每一步都有明确输入输出
每一步之间可以加校验

Routing

先判断类型,再走不同分支。

flowchart TD
    A["User Request"] --> B{"Router"}
    B -->|"refund"| C["Refund Flow"]
    B -->|"tech"| D["Tech Support Flow"]
    B -->|"code"| E["Code Agent"]

适合:

  • 客服。
  • 企业助手。
  • 多能力产品。

关键:

路由错了后面都错
所以 routing eval 很重要

Parallelization

多个子任务并行。

flowchart LR
    A["Task"] --> B["Search Source A"]
    A --> C["Search Source B"]
    A --> D["Search Source C"]
    B --> E["Merge"]
    C --> E
    D --> E

适合:

  • 多源检索。
  • 多文件分析。
  • 多候选答案比较。

关键:

合并结果时要去重、冲突检测和引用来源

Orchestrator-Workers

一个 orchestrator 动态拆任务,workers 执行。

flowchart TD
    O["Orchestrator"] --> W1["Worker 1"]
    O --> W2["Worker 2"]
    O --> W3["Worker 3"]
    W1 --> O
    W2 --> O
    W3 --> O
    O --> S["Synthesis"]

适合:

  • 子任务数量不固定。
  • 需要动态分工。
  • 多文件代码任务。

关键:

orchestrator 要控制预算、任务 contract 和停止条件

Evaluator-Optimizer

生成器和评估器循环。

flowchart LR
    G["Generator"] --> E["Evaluator"]
    E -->|"revise"| G
    E -->|"pass"| D["Done"]
    E -->|"fail / blocked"| H["Human or Stop"]

适合:

  • 代码修改。
  • 报告写作。
  • 结构化输出。
  • 高质量内容生成。

关键:

Evaluator 只能用 blocking issue 触发重做
非阻塞建议不能无限循环

最小 Agent Loop

一个最小循环:

flowchart TD
    A["User Goal"] --> B["Build Context"]
    B --> C["LLM Decision"]
    C --> D{"Decision Type"}
    D -->|"Tool Call"| E["Execute Tool"]
    E --> F["Observation"]
    F --> G["Update State"]
    G --> H{"Done?"}
    H -->|"No"| B
    H -->|"Yes"| I["Final Response"]
    D -->|"Final Answer"| I

伪代码:

while True:
    context = build_context(state)
    decision = call_model(context, tools=tools)

    if decision.type == "final_answer":
        return decision.content

    observation = run_tool(decision.tool_call)
    state = update_state(state, decision, observation)

    if should_stop(state):
        return summarize_current_best(state)

这段看起来简单,真正难的是:

should_stop 怎么判断?
失败怎么恢复?
上下文怎么更新?
预算怎么控制?

Loop 的状态机

不要让 Agent loop 只有 while True

生产系统里建议用状态机。

stateDiagram-v2
    [*] --> CREATED
    CREATED --> PLANNING
    PLANNING --> RUNNING
    RUNNING --> WAITING_TOOL
    WAITING_TOOL --> RUNNING
    RUNNING --> REVIEWING
    REVIEWING --> DONE
    REVIEWING --> RUNNING: retry
    REVIEWING --> ESCALATED: needs human
    RUNNING --> FAILED: budget exceeded
    RUNNING --> CANCELLED: user cancelled

状态机的好处:

  • 每一步都可观测。
  • 容易恢复。
  • 容易设置超时。
  • 容易审计。
  • 不容易无限循环。

Loop 的输入和输出

每一轮 loop 都应该有明确输入和输出。

输入:

  • 当前目标。
  • 当前状态。
  • 最近观察。
  • 可用工具。
  • 预算剩余。
  • 权限。
  • 相关记忆。

输出:

  • 下一步动作。
  • 工具参数。
  • 更新后的计划。
  • 是否完成。
  • 是否需要用户。
  • 是否需要转交。

如果输出只是自然语言:

我接下来应该查一下文件。

系统很难执行。

更好的输出是结构化的:

{
  "action": "tool_call",
  "tool": "read_file",
  "arguments": {
    "path": "src/AuthService.java"
  },
  "reason": "需要确认 token 过期判断逻辑",
  "expected_observation": "找到过期判断实现"
}

停止条件

Loop Engineering 最重要的问题是停止。

停止条件可以分成 6 类。

1. 目标完成

最理想的停止:

任务目标已完成
验收条件已满足

例子:

代码已修改
相关测试通过
diff 范围合理
最终说明已生成

2. 无法继续

Agent 遇到阻塞:

  • 缺少权限。
  • 缺少文件。
  • API 失败。
  • 用户信息不足。
  • 工具不可用。

这时应该停止并说明阻塞,而不是继续猜。

3. 达到预算

预算包括:

max_steps
max_tool_calls
max_agent_calls
max_tokens
max_cost
max_wall_time
max_retries

达到预算后要:

  • 停止继续调用。
  • 返回当前进展。
  • 说明还缺什么。

4. 没有新增信息

如果连续几轮没有获得新信息,就该停。

例子:

连续 3 次搜索都返回同样资料
连续 2 次测试都是同一个错误
连续 2 次修改没有改变失败原因

可以记录:

information_gain = low

5. 质量验收通过

用 evaluator 判断是否完成。

{
  "verdict": "pass",
  "blocking_issues": [],
  "confidence": 0.91
}

如果没有 blocking issue,就不要继续让 Agent 无休止优化。

6. 需要人工确认

高风险操作要停下来。

例如:

  • 删除文件。
  • 修改生产配置。
  • 执行数据库写操作。
  • 发送邮件。
  • 花钱调用外部服务。

预算设计

预算不要只写在 prompt。

Runtime 要强制执行。

一个任务预算可以这样:

{
  "max_steps": 25,
  "max_tool_calls": 40,
  "max_llm_calls": 30,
  "max_retries_per_tool": 2,
  "max_wall_time_seconds": 600,
  "max_tokens": 200000,
  "max_cost_usd": 3.0
}

每轮 loop 都应该看到剩余预算:

{
  "steps_left": 8,
  "tool_calls_left": 12,
  "wall_time_left_seconds": 120
}

这样模型更容易做取舍。

但最终执行权在 runtime。

错误恢复

Agent 不可避免会遇到失败。

常见失败:

失败 恢复方式
工具超时 重试一次,降低输入规模
文件不存在 搜索路径或请求用户
测试失败 读取失败日志,定位原因
API rate limit backoff,减少并发
JSON 输出不合法 修复格式,不重做全部任务
权限不足 请求审批或返回阻塞
上下文太长 压缩历史,保留关键状态

恢复不是无脑 retry。

每次 retry 都要有新策略:

同样输入、同样工具、同样参数,重复三次通常没有意义。

反思循环要谨慎

很多 Agent 会加 Reflexion:

失败
  ↓
反思原因
  ↓
重试

这有用,但也危险。

如果没有可靠反馈,反思可能变成自我编故事。

建议:

  • 只在有明确失败信号时反思。
  • 反思输出结构化。
  • 只允许有限轮重试。
  • 反思要绑定证据。
  • 成功后才考虑写入记忆。

结构化反思:

{
  "failure_type": "test_failed",
  "evidence": "AuthServiceTest line 42 failed",
  "hypothesis": "边界时间使用了本地时区",
  "next_strategy": "检查 token expiry 比较逻辑",
  "retry_allowed": true
}

Planner、Executor、Evaluator Loop

一个更稳的 loop 是三段式:

flowchart LR
    P["Planner"] --> E["Executor"]
    E --> V["Evaluator"]
    V -->|"pass"| D["Done"]
    V -->|"revise"| P
    V -->|"blocked"| H["Human / Stop"]

这比单个 Agent 自己判断更稳。

Planner 负责:

  • 拆任务。
  • 更新计划。

Executor 负责:

  • 调工具。
  • 产出 artifacts。

Evaluator 负责:

  • 判断完成度。
  • 给出 blocking issue。

Loop 和上下文压缩

长任务里,历史会越来越长。

不能每轮把完整历史放进去。

需要压缩:

raw trace
  ↓
state summary
  ↓
task ledger
  ↓
current context

保留:

  • 目标。
  • 约束。
  • 已完成事项。
  • 关键证据。
  • 当前阻塞。
  • 下一步。

丢弃:

  • 重复日志。
  • 无关探索。
  • 过期假设。
  • 大量原始输出。

Loop 和工具结果

工具结果不能原样乱塞。

建议:

raw tool output
  ↓
artifact storage
  ↓
summary
  ↓
important snippets
  ↓
context injection

例子:

{
  "tool": "run_tests",
  "status": "failed",
  "summary": "1 test failed: AuthServiceTest.testExpiredToken",
  "important_lines": [
    "expected: expired",
    "actual: valid"
  ],
  "artifact_ref": "artifacts/test-log-001.txt"
}

Loop 和 Multi-Agent

Multi-Agent 的 loop 更容易失控。

所以每个 delegation 都要有:

  • owner。
  • contract。
  • deadline。
  • max_hops。
  • allowed actions。
  • expected output。
  • done condition。

不要让 Worker Agent 自由互相拉群聊天。

Loop 观测指标

Loop 需要指标。

指标 说明
steps 总步数
llm_calls 模型调用次数
tool_calls 工具调用次数
retries 重试次数
time_to_done 完成耗时
cost token 和工具成本
blocked_rate 阻塞率
human_escalation_rate 转人工比例
repeated_action_rate 重复动作比例
no_information_gain_steps 无新增信息步数

这些指标能直接指导优化:

重复动作多 -> 调整状态和停止条件
阻塞率高 -> 工具权限或上下文缺失
成本高 -> 压缩历史或减少反思轮次

Loop Engineering Checklist

做 Agent loop 时检查:

  • 是否有明确状态机?
  • 每轮输出是否结构化?
  • 是否有预算?
  • 预算是否由 runtime 强制?
  • 是否有目标完成判定?
  • 是否有 evaluator?
  • 是否有无新增信息检测?
  • 是否有限制 retry?
  • 高风险动作是否会停下来?
  • 工具结果是否被摘要?
  • 长历史是否会压缩?
  • 是否能取消任务?
  • 是否能从中断恢复?
  • 是否保存 trace?

下一步

继续读:

参考资料