七 第三编 · 第一章 · · 约 4 分钟读完

Loop

Agent 反复执行"观察 → 思考 → 行动"直到目标达成。

结构层 循环 ReAct

一定义

Loop(循环)是 Agent 的运行骨架。模型每次不是只答一次就结束,而是在循环里反复"看 → 想 → 做",直到任务完成或主动放弃。

二为什么重要

没有 Loop,Agent 一次性给完答复就走 —— 错了没法改、不确定没法查。Loop 是让 Agent 能修正自己、能查证、能放弃的机制。

三三种典型 Loop

1. ReAct(Reason + Act)

最经典。每轮都让模型先输出思考,再选行动。

Thought: 我需要先查北京天气。
Action:  get_weather(city="Beijing")
Obs:     {"temp": 22, "sky": "晴"}
Thought: 数据够了,可以回答了。
Final:   北京今天 22 度,晴。

2. Reflection(反思)

每轮不仅做事,还评估上一轮的结果,然后决定下一步。常见做法:一个 Agent 做,另一个 Agent 评。

3. Plan-and-Execute(先规划,再执行)

先用一次 LLM 调用把任务拆成步骤,然后按步骤执行。遇到失败时,回到"规划"阶段重排。

四最小可跑的例子(ReAct)

def react_loop(goal, max_steps=8):
    trace = [{"role": "user", "content": goal}]
    for _ in range(max_steps):
        resp = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=trace,
            tools=tools,
        )
        msg = resp.choices[0].message
        trace.append(msg)
        if not msg.tool_calls:
            return msg.content       # 模型选择结束
        for call in msg.tool_calls:
            obs = run_tool(call)
            trace.append({"role": "tool",
                          "tool_call_id": call.id,
                          "content": obs})
    return "步数用尽"

五常见误区

  • Loop 没终止条件 —— 必须有"任务完成"的判断,否则模型会自己造答案。
  • 没有最大步数 —— 一定设上限,防止无限循环把账户跑空。
  • trace 无限增长 —— 上下文会爆炸,要在中途摘要、压缩、丢弃旧回合。
  • Loop 与工具耦合太死 —— 把 Loop 抽象出来,让它能跑不同的工具集。