智能体循环

A2
概念 · 智能体 AI 详解

智能体循环。

如果说"智能体就是一个处在循环里的模型"是口号,那么本篇就是把这个循环完整画出来。你将能够逐步追踪:从用户陈述目标的那一刻,到智能体停下来的那一刻,中间究竟发生了什么——模型输出了什么、外壳程序如何处理它、工具结果如何重新进入对话、以及是什么让循环终止。这是智能体 AI 中最重要的一张图;其余一切都是它的变体。

STEP 1

一张图看懂循环。

循环有四个位置。模型和外壳程序交替工作;环境位于外部,只能通过工具触及。

                 ┌─────────────────────────────────────┐
                 │                                     │
                 ▼                                     │
        ┌──────────────────┐                           │
        │   1. MODEL CALL  │   harness sends: goal +    │
        │  (the "reason")  │   full history so far      │
        └────────┬─────────┘                           │
                 │ model emits ONE of:                 │
                 │   (a) a tool call                   │
                 │   (b) a final answer                │
                 ▼                                     │
        ┌──────────────────┐                           │
        │  2. BRANCH        │                          │
        │  tool call? ──────┼── final answer ──► STOP  │
        └────────┬─────────┘                           │
                 │ yes, a tool call                    │
                 ▼                                     │
        ┌──────────────────┐                           │
        │  3. ACT           │  harness executes the    │
        │  run the tool     │  requested tool against  │
        │                   │  the ENVIRONMENT         │
        └────────┬─────────┘                           │
                 │ tool returns a result               │
                 ▼                                     │
        ┌──────────────────┐                           │
        │  4. OBSERVE       │  harness appends the     │
        │  feed result back │  result to the history ──┘
        └──────────────────┘  (now loop again)

把它当作一句话来读:模型对目标进行推理并决定一个动作;外壳程序对环境执行该动作;结果被追加进历史;模型带着这个新信息再次推理。不断重复,直到模型产生一个最终答案而非工具调用,或某个护栏将其停止。

STEP 2

模型实际输出的是什么——以及谁来运行工具。

一个几乎所有智能体新手都会绊倒的微妙点:模型从不自己运行工具。模型只输出一个结构化请求——"我想以 city=\"Berlin\" 调用 get_weather"。是外壳程序(你的代码)决定是否满足那个请求、执行它、并把结果报告回去。模型是大脑;外壳程序是双手,也是看门人。

具体来说,循环的一轮在传输层上看起来是这样:

# Turn N: harness → model (the request)
messages = [
  {"role": "user",      "content": "What's the weather in Berlin, in Fahrenheit?"},
  # ... any prior turns/tool results would be here ...
]
tools = [{"name": "get_weather", "input_schema": {...}}]

# Turn N: model → harness (it asks for a tool, does NOT run it)
{ "type": "tool_use", "name": "get_weather",
  "input": { "city": "Berlin", "units": "metric" } }

# Turn N: harness runs the real function, then appends the result
result = get_weather(city="Berlin", units="metric")   # → 14°C
messages.append({"role": "tool",
                 "content": '{"temp_c": 14}'})

# Turn N+1: harness calls the model AGAIN with the result attached.
# Model now reasons: "14°C is 57°F. The user wanted Fahrenheit and
# asked nothing else." → emits a FINAL answer, no tool call → STOP.

有三点要牢牢记住。第一,工具结果是作为"更多的对话内容"重新进入的——模型通过阅读追加到其上下文中的文本来"观察",这与一条新的用户消息完全一样。第二,是模型自己决定把摄氏度换算成华氏度的;工具处理模型无法可靠完成的事,模型处理推理粘合。第三,循环结束是因为模型选择了回答而非再调用一个工具——没人告诉它任务完成了;是它自己决定的。

STEP 3

循环如何知道该停下来。

终止是朴素智能体出错的地方,所以它值得单独讲。一个构建良好的循环恰好有四种结束方式,一个健壮的智能体四种都要有:

  • 自然完成。模型输出一个最终答案,没有工具调用。这是预期的出口:模型判断目标已满足。它本身也是最不可靠的,这正是另外三种存在的原因。
  • 步数预算。外壳程序对迭代计数,并在比如第 20 步硬性停止。这是防止无限循环的安全带。它不在乎模型是否认为自己完成了;它只是拒绝第 21 次调用模型。
  • 资源预算。对令牌、墙钟时间或花费金额设上限。一个毫无进展的循环每一轮仍在烧上下文(回忆:上下文是智能体消耗的最昂贵的东西),所以成本上限是一种安全机制,而不只是一个记账机制。
  • 护栏 / 人类闸门。一个外部检查触发了——工具返回了一个被禁止的动作、一个策略过滤器跳闸了、或某一步需要人类批准而没有获得。循环停下来并移交。

自制智能体在生产中最常见的单一故障是没有步数预算。一个困惑的模型会乐此不疲地永远以略微不同的参数调用同一个工具——每一轮局部看都合理,循环永远不会自然完成,而你发现它时,账单已经来了,或限流已经触发。绝不要在没有硬性迭代上限的情况下运行循环。"模型会知道何时停止"不是一个停止条件;那是一种期望。

STEP 4

循环为何如此强大——又为何如此易错。

循环的力量在于复利:每一步的决策都由此前每一步的实际结果所告知,因此智能体能从一个错误的转向中恢复、对一个意外错误作出反应、并找到一条没人编写过的路径。一个带固定分支的工作流做不到这一点;一旦现实偏离了流程图,它就卡住了。循环的全部价值,就在于它不需要那张流程图。

同样这个特性也是它特征性故障的根源,现在就把它们命名出来,会在后面"智能体在哪里失败"那篇里得到回报:

  • 打转 / 无进展。模型不断行动,但状态并未朝目标推进——经典的"卡在循环里"。步数预算能遏制它;良好的观察设计能预防它。
  • 目标漂移。经过许多轮后,积累的上下文淹没了最初的目标,模型开始优化某个与所要求的微妙不同的东西。越长的循环漂移越多;周期性地重申目标会有帮助。
  • 错误级联。一个糟糕的观察(一个误导性的工具结果)导致一个错误的决策,这又产生一个更糟的观察,循环放大它自己的错误,而非纠正它。
  • 过度行动。模型采取了一个有重大后果的动作(删除、发送、付款),而人类本会在此停下来斟酌,因为循环中没有任何东西强制它暂停。这正是单独讲述的"人在环路"调节旋钮存在的原因。

牢牢抓住这个结构:推理 → 行动 → 观察 → 重复,并带有明确的停止条件。本维基后面的每一种架构——ReAct、规划再执行、多智能体系统、反思循环——都是同一副骨架,只是其中某一部分被加以扩展。如果你能追踪一次工具调用:从模型的输出,穿过外壳程序,进入环境,再作为观察回到上下文,那么你就理解了智能体 AI 的引擎。其余的都是调优。