概述

在构建 AI Agent 时,你很快会发现“一次调用 LLM 就完成任务”的场景少之又少。真实世界中的任务往往需要多步推理、外部工具调用(搜索、数据库查询)、上下文积累以及自我纠错。这种**反复执行“感知 → 思考 → 行动 → 观察”**的过程,就是 Loop Engineering(循环工程) 的核心价值所在。

本文将从概念到实战,解释为什么我们需要显式地设计循环,而不是简单地在 prompt 里写“请反复思考”。

核心概念

什么是 Loop Engineering

Loop Engineering 指的是在 AI Agent 系统中,显式地构建一个循环执行引擎,该引擎能够:

  1. 维持状态:记录当前的观察、历史对话、已完成步骤。
  2. 决策下一步:基于当前状态,由 LLM 或规则决定下一步动作(思考、调用工具、输出等)。
  3. 执行动作:调用外部函数、API、代码解释器等。
  4. 将结果反馈回状态:形成闭环。

这种循环不同于简单的“while 循环”,它强调 智能体内部的推理与工具调用交替进行,直到达到停止条件。

为什么不能一次完成?

假设我们要 Agent 完成:“请搜索最新的 AI 论文,总结并翻译成中文,然后发一封邮件给团队。”

  • 一次调用 LLM:LLM 无法真正搜索网络,只能胡编数据。
  • 多步 Agent 循环:
    1. Agent 决定调用 search_web(行动)
    2. 得到搜索结果(观察)
    3. 思考后决定 summarize(行动)
    4. 得到摘要(观察)
    5. 决定 translate + send_email(行动)
    6. 完成并退出。

如果没有循环,就无法将工具调用的结果喂回 LLM 的上下文,整个系统就退化成了“一次性调用”。

实战:一个简单的 Loop Engineering 实现

下面用 Python 演示一个极简的 Agent 循环,它使用 OpenAI 兼容的 API,并支持 searchcalculate 两个工具。

import json
from openai import OpenAI

client = OpenAI()

# 工具定义
tools = [
    {
        "type": "function",
        "function": {
            "name": "search_web",
            "description": "搜索网络信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {"type": "string", "description": "搜索关键词"}
                },
                "required": ["query"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "calculate",
            "description": "执行数学计算",
            "parameters": {
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "数学表达式,如 2 + 3 * 4"
                    }
                },
                "required": ["expression"]
            }
        }
    }
]

def simulate_call_function(name, args):
    """模拟工具执行,实际可对接真实API"""
    if name == "search_web":
        return f"模拟结果:关于'{args['query']}'的最新信息是……"
    elif name == "calculate":
        try:
            result = eval(args["expression"])
            return str(result)
        except:
            return "计算错误"
    return "未知工具"

def agent_loop(prompt, max_steps=10):
    messages = [
        {"role": "system", "content": "你是一个智能助手,可以使用工具。每次只回答你需要做什么,或者给出最终答案。"},
        {"role": "user", "content": prompt}
    ]
    step = 0
    while step < max_steps:
        step += 1
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=messages,
            tools=tools,
            tool_choice="auto"
        )
        assistant_message = response.choices[0].message
        messages.append(assistant_message)

        # 判断是否有工具调用
        if assistant_message.tool_calls:
            for tool_call in assistant_message.tool_calls:
                func_name = tool_call.function.name
                func_args = json.loads(tool_call.function.arguments)
                result = simulate_call_function(func_name, func_args)
                # 将工具结果作为消息加入
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": result
                })
            # 循环继续,下一次 LLM 会看到结果
            continue
        else:
            # 没有工具调用,说明 LLM 给出了最终回答
            break
    
    # 返回最后一条助手消息
    return messages[-1].content

# 测试
result = agent_loop("今天天气怎么样?如果气温超过30度,告诉我如何降温。")
print(result)

这个例子展示了最核心的循环:LLM 决定是否调用工具 → 执行工具 → 结果返回 → 再次调用 LLM 决策。这就是 Loop Engineering 的本质。

注意事项

1. 防止无限循环

必须设置最大步数限制(如上代码中的 max_steps=10)。如果没有限制,Agent 可能陷入“思考-调用工具-再思考”的死循环。

2. 状态管理与上下文窗口

每次循环都会向 messages 中添加新的消息,很快会超过 LLM 的上下文长度限制。需要策略:

  • 丢弃最早的历史(滑动窗口)
  • 总结历史并压缩(summarization)
  • 使用支持长上下文的模型(如 Gemini 1.5 Pro)

3. 工具调用的可靠性

工具返回的结果可能是错误的、不完整的,甚至导致崩溃。Loop Engineering 需要设计重试机制异常处理

4. 退出条件

除了最大步数,还应该有更智能的退出条件:

  • LLM 明确表示“任务完成”
  • 用户主动中断
  • 检测到重复相同动作超过 N 次

5. 成本控制

每次循环都调用 LLM API,成本线性增长。可以引入成本预算,在达到预算时强制结束或降级。

总结

Loop Engineering 并非“多余的设计”,而是 AI Agent 能够从简单问答进化到真实自动化工作流的关键。它让 Agent 能够:

  • 与外部环境交互(工具、数据库、API)
  • 自我纠正(观察到错误后重新思考)
  • 逐步构建复杂结果(搜索→分析→总结→生成→发送)

没有循环,Agent 只是一个高级的 Prompt 模板;有了精心设计的循环,Agent 才能真正模拟人类的“行动-观察-调整”模式。Loop Engineering 是 Agent 的骨架,决定了它能走多远。