2.1 循环的四大阶段:发现、规划、执行、验证 — Loop Engineering 的核心控制流 本节导读:深入解析循环的四个核心阶段(Discover → Plan → Execute → Verify),理解每个阶段的职责、设计原则和常见陷阱,掌握构建可靠循环控制流的方法。 学习目标 深入理解循环四阶段(discover → plan → execute → verify)的具体职责 掌握每个阶段的设计原则和最佳实践 学会识别和避免各阶段的常见陷阱 理解循环控制流与 ReAct 模式的关系 核心概念 循环工程的控制流可以用一个简洁的伪代码表示: 正如 Tosea.
本节导读:深入解析循环的四个核心阶段(Discover → Plan → Execute → Verify),理解每个阶段的职责、设计原则和常见陷阱,掌握构建可靠循环控制流的方法。
循环工程的控制流可以用一个简洁的伪代码表示:
state = init_state(goal) for step in range(MAX_STEPS): thought = model.reason(state) # DISCOVER + PLAN action = model.choose_action(state) # PLAN + EXECUTE result = tools.execute(action) # EXECUTE state = update(state, result) # VERIFY state = compact(state) # 上下文管理 if verifier.passes(state): # VERIFY return success(state) if no_progress(state) or budget.exhausted(): return escalate_to_human(state) return escalate_to_human(state)
正如 Tosea.ai 的指南所说:"Almost everything interesting in loop engineering is a decision about one of these lines."(循环工程中几乎所有有趣的事情,都是对其中某一行代码的决策。)
发现阶段的目标是让 Agent 获取对当前状态的准确认知。这是循环的起点,也是最容易出问题的地方——如果 Agent 对现状的认知有偏差,后续所有阶段都会建立在错误基础上。
核心职责:
设计原则:
常见陷阱:
规划阶段是 LLM 发挥核心作用的环节——分析发现的信息,推理出最佳的行动方案。
核心职责:
设计原则:
常见陷阱:
执行阶段是 Agent 与真实环境交互的环节——编辑代码、运行命令、创建文件。
核心职责:
设计原则:
常见陷阱:
验证阶段是循环的决策点——根据验证结果决定循环继续还是停止。
核心职责:
设计原则:
# 好的验证标准 verifiers = [ {"name": "测试套件", "command": "npm test", "pass_on": 0}, {"name": "TypeScript", "command": "npx tsc --noEmit", "pass_on": 0}, {"name": "ESLint", "command": "npx eslint src/", "pass_on": 0}, {"name": "覆盖率", "command": "npx jest --coverage", "min": 80}, ] # 差的验证标准(不要这样做) # "代码看起来不错" ← 主观判断,不可自动检查 # "尽量提高性能" ← 无明确阈值 # "改善代码质量" ← 永远不知道何时停止
""" four_phase_loop.py - 完整的四阶段循环实现 展示 Discover → Plan → Execute → Verify 的完整流程 """ import subprocess import json from dataclasses import dataclass, field from typing import Optional @dataclass class LoopState: """循环状态 - 贯穿四个阶段""" goal: str round: int = 0 discoveries: list = field(default_factory=list) plan: Optional[str] = None actions_taken: list = field(default_factory=list) verify_results: list = field(default_factory=list) status: str = "idle" class FourPhaseLoop: def __init__(self, goal: str, project_path: str): self.state = LoopState(goal=goal) self.project_path = project_path self.max_rounds = 10 def discover(self): """阶段一:发现""" print(f"\n🔍 [Discover] 第 {self.state.round + 1} 轮发现...") # 1. 运行测试 test = subprocess.run( ["npm", "test", "--", "--json", "--silent"], cwd=self.project_path, capture_output=True, text=True, timeout=60 ) # 2. 运行类型检查 tsc = subprocess.run( ["npx", "tsc", "--noEmit"], cwd=self.project_path, capture_output=True, text=True, timeout=30 ) # 3. 汇总发现 test_passed = test.returncode == 0 type_ok = tsc.returncode == 0 discovery = { "tests_passed": test_passed, "type_check_passed": type_ok, "test_output": test.stdout[-500:] if not test_passed else "All passed", "type_errors": tsc.stdout[-300:] if not type_ok else "None" } self.state.discoveries.append(discovery) print(f" 测试: {'✅' if test_passed else '❌'}") print(f" 类型: {'✅' if type_ok else '❌'}") return discovery def plan(self, discovery): """阶段二:规划""" print(f"\n🧠 [Plan] 基于发现制定计划...") if discovery["tests_passed"] and discovery["type_check_passed"]: self.state.plan = "所有检查通过,无需操作" print(" 计划: 无需操作,目标已达成") return self.state.plan # 简化版规划(实际中由 LLM 完成) actions = [] if not discovery["tests_passed"]: actions.append("分析测试失败输出,定位根因") actions.append("修复相关代码") actions.append("重新运行测试验证") if not discovery["type_check_passed"]: actions.append("修复类型错误") self.state.plan = " → ".join(actions) print(f" 计划: {self.state.plan}") return self.state.plan def execute(self, plan): """阶段三:执行(示意,实际由 Agent 完成)""" print(f"\n🔧 [Execute] 执行计划...") # 实际中这里调用 AI Agent API # 示例:subprocess.run(["claude", "-p", plan, "--allowedTools", "write,edit"]) print(" [Agent 正在分析和执行...]") self.state.actions_taken.append({ "round": self.state.round + 1, "plan": plan, "status": "executed" }) def verify(self): """阶段四:验证""" print(f"\n✅ [Verify] 验证结果...") # 重新运行所有验证器 test = subprocess.run( ["npm", "test"], cwd=self.project_path, capture_output=True, text=True, timeout=60 ) tsc = subprocess.run( ["npx", "tsc", "--noEmit"], cwd=self.project_path, capture_output=True, text=True, timeout=30 ) result = { "tests_passed": test.returncode == 0, "type_check_passed": tsc.returncode == 0, "all_passed": test.returncode == 0 and tsc.returncode == 0 } self.state.verify_results.append(result) print(f" 综合: {'✅ 全部通过' if result['all_passed'] else '❌ 未达标'}") return result def run(self): """运行完整循环""" self.state.status = "running" print(f"\n{'='*50}") print(f"🎯 目标: {self.state.goal}") print(f"🔄 最大轮次: {self.max_rounds}") print(f"{'='*50}") for i in range(self.max_rounds): self.state.round = i discovery = self.discover() plan = self.plan(discovery) if "无需操作" in plan: self.state.status = "success" break self.execute(plan) result = self.verify() if result["all_passed"]: self.state.status = "success" print(f"\n🎉 循环在第 {i+1} 轮达成目标!") break # 无进展检测 if i >= 2: recent = [v["tests_passed"] for v in self.state.verify_results[-3:]] if all(not x for x in recent): self.state.status = "stuck" print(f"\n⚠️ 连续 3 轮无进展,循环停止") break else: self.state.status = "max_rounds" print(f"\n⚠️ 达到最大轮次 {self.max_rounds}") return self.state
# 在 Claude Code 中体验各阶段 claude # 1. 纯 Discover:只看不做 > 分析当前项目的测试状态和类型检查结果,不要修改任何文件 # 2. Plan + Execute:有计划地执行 > 阅读上一个分析结果,制定修复计划,然后执行修复 # 3. 完整循环:Discover → Plan → Execute → Verify > /goal "修复所有失败测试和类型错误"
A:绝大多数情况下是的,但允许回退。典型情况:Execute 阶段发现了一个 Plan 阶段没考虑到的依赖关系,需要回退到 Plan 重新规划。关键是每一轮的四个阶段是有序的,但跨轮之间可以基于新的发现调整计划。
A:应该缓存,但要验证是否过时。外部状态文件(如 progress.md)可以记录上次循环的发现,新一轮开始时先读取再验证。这避免了每轮从头发现的开销。但如果有其他人修改了代码或依赖更新了,缓存可能过期——因此 Discover 阶段仍然需要至少一次快速验证。
A:这是最常见的情况。处理方式:(1) 记录哪些验证通过了,哪些没通过;(2) 下一轮的 Discover 聚焦于未通过的部分;(3) 避免修改已经通过的验证相关代码(防止回归)。这就是为什么验证标准应该分维度设置——你不需要所有维度同时通过才开始工作,可以逐个击破。
本节深入解析了循环的四个核心阶段。Discover 提供"我在哪"的准确认知,Plan 决定"下一步做什么",Execute 与真实环境交互,Verify 判断"做得好不好"。四个阶段构成一个完整的控制流单元,每轮循环重复执行,直到目标达成或触发停止条件。
下一节我们将介绍六大基础设施原语——让循环从理论走向可落地的工程实践。
关键词:Loop Engineering, 循环四阶段, Discover, Plan, Execute, Verify, ReAct, 验证器, 控制流, Agent Loop, 教程, 架构
难度:进阶
预计阅读:15 分钟