Skip to content

循环工程(Loop Engineering)

循环工程是面向 AI Agent 场景的核心工程方向,关注 AI 系统在连续反馈中完成复杂任务的完整循环机制设计。

核心不是优化单次输出,而是让模型在多步行动、反馈、修正的过程中最终收敛完成目标。

为什么需要 Loop Engineering

单次 LLM 调用能做的事有限:
- 写一段代码 ✅
- 回答一个问题 ✅

但无法完成复杂任务:
- "帮我给这个项目加上完整的用户认证功能"
  → 需要:分析现有代码 → 设计方案 → 写代码 → 测试 → 修复 → ...
  → 需要多步循环,且有反馈

4 个工程层的关系

Loop Engineering(循环工程)
    ↑ 多步反馈循环、终止条件
Harness Engineering(承载管控工程)
    ↑ 执行、验证、安全边界
Context Engineering(上下文工程)
    ↑ 信息输入、上下文管理
Prompt Engineering(提示工程)
    ↑ 单次输入优化

层层叠加,不是互相替代。

核心设计维度

1. 终止条件设计

明确什么情况下循环继续、什么情况下停止,避免 Agent 无限空转:

python
def agent_loop(task):
    max_steps = 50
    for step in range(max_steps):
        # 执行一步
        action = llm.decide_next_action(task)
        result = harness.execute(action)

        # 终止条件
        if task.is_completed():
            return result

        if result.has_error():
            if cannot_recover(result.error):
                ask_human_for_help()
                return None

        # 继续循环
        task.add_feedback(result)

    # 达到最大步数,终止
    raise TimeoutError("任务未在限定步数内完成")

常见终止条件

条件说明
任务完成测试通过、目标达成
超过最大步数防止无限循环
需要人工确认遇到高风险操作
连续失败同一错误重复出现 3 次

2. 失败修正机制

让 Agent 在动作失败后不是盲目重试,而是能判断失败原因:

python
def execute_with_feedback(action, max_retry=3):
    for attempt in range(max_retry):
        result = harness.execute(action)

        if result.success:
            return result

        # 分析失败原因
        error_type = analyze_error(result.error)

        if error_type == "syntax_error":
            # 语法错误:让 LLM 修复代码
            action["code"] = llm.fix_syntax(action["code"], result.error)

        elif error_type == "missing_dependency":
            # 缺少依赖:让 LLM 添加依赖
            action["code"] = llm.add_dependency(action["code"], result.error)

        elif error_type == "logic_error":
            # 逻辑错误:需要重新设计方案
            action = llm.redesign(action, result.error)

        else:
            # 未知错误:请求人工介入
            ask_human(f"无法自动修复错误:{result.error}")
            break

    return None

3. 循环状态管理

设计 Agent 每步产生的新信息的留存、更新、清理规则:

python
class AgentState:
    def __init__(self):
        self.task = None          # 原始任务
        self.steps = []           # 执行步骤历史
        self.context = []         # 当前上下文
        self.failed_attempts = [] # 失败记录

    def add_step(self, action, result):
        self.steps.append({"action": action, "result": result})

        # 只保留最近 N 步(避免上下文过长)
        if len(self.steps) > 10:
            self.steps = self.steps[-10:]

    def get_context_for_next_step(self):
        """为下一步决策准备上下文"""
        return {
            "task": self.task,
            "recent_steps": self.steps[-5:],  # 最近 5 步
            "failed_attempts": self.failed_attempts
        }

与 Context Engineering 的配合:循环状态需要高效管理上下文,避免信息过载。

4. 人机协作边界设计

明确哪些节点需要人工介入:

python
HUMAN_APPROVAL_REQUIRED = [
    "delete_data",      # 删除数据
    "deploy_to_prod",   # 部署到生产环境
    "send_external_email",  # 发送对外邮件
    "execute_paid_api",  # 调用付费 API
    "modify_config"     # 修改配置文件
]

def execute(action):
    if action["type"] in HUMAN_APPROVAL_REQUIRED:
        approved = ask_human_for_approval(action)
        if not approved:
            return {"status": "rejected_by_user"}

    return harness.execute(action)

不盲目追求完全全自动,合适的人机协作比完全自主更可靠。

实际案例

Case 1:自动编程 Agent

任务:给项目添加用户认证功能

循环过程:
Step 1:分析现有代码 → 反馈:项目使用 Express + JWT
Step 2:设计认证方案 → 反馈:需要安装依赖
Step 3:安装依赖 → 反馈:成功
Step 4:写认证中间件 → 反馈:测试失败(密码未加密)
Step 5:修复(加入 BCrypt) → 反馈:测试通过
Step 6:写测试 → 反馈:覆盖率 80%
[终止:任务完成]

Case 2:LangChain Agent 的循环

python
from langchain.agents import initialize_agent, AgentType

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    max_iterations=10,      # 终止条件 1:最大迭代次数
    early_stopping_method="force",  # 终止条件 2:强制停止
    verbose=True
)

# Agent 会自动循环:
# 思考 → 选工具 → 执行 → 观察结果 → 思考 → ...
agent.run("帮我分析这个项目的性能瓶颈")

与"自我反思"的区别

自我反思(Self-Reflection):
- 范围:单次任务的 quality 提升
- 动作:生成 → 批评 → 改进
- 适合:写作、代码优化

循环工程(Loop Engineering):
- 范围:复杂任务的完整执行流程
- 动作:思考 → 执行 → 观察 → 修正 → ... → 终止
- 适合:AI Agent、自动编程、复杂任务执行

自我反思是循环工程的一种具体实现方式,但循环工程的含义更广。

设计原则

  1. 明确终止条件:不要让 Agent 无限循环
  2. 失败要有策略:不是盲目重试,而是分析错误、调整策略
  3. 状态要高效管理:上下文太长会影响效果,需要裁剪
  4. 关键节点人工介入:不要盲目追求全自动
  5. 完整的日志:方便调试和审计

相关资源