Loop(循环,也称 Agent Loop、智能体主循环)是 Agent 执行任务的核心引擎:从接收目标开始,Agent 反复执行"模型推理、工具调用、结果反馈、再推理"的基本循环,直到模型判断任务完成才退出。大语言模型本身无状态且被动,一次调用只能生成一段文本;Loop 赋予模型"行动、观察、修正"的能力,是普通对话系统与智能体的分水岭。

本教程将系统讲解 Loop 的概念定义、工作机制与终止条件,梳理它与 Harness、Tool Calling、Context、Workflow、Hook 等概念的分工,并结合主流 Agent 工具介绍循环的调优方法与常见问题的治理思路,帮助你理解 Agent"跑起来"的底层原理。

前置教程

如想快速开始学习本教程,你可能需要先完成以下前置教程:

1. 什么是 Loop

1.1 概念定义

Loop(循环)在编程中指重复执行一段代码的控制结构。在 AI Agent 语境下,Loop 指 Agent 从接收任务到完成任务之间,反复执行"模型推理、工具调用、结果反馈"的基本执行循环

业界对 Agent 有一个经典概括:Agent 就是在循环中使用工具的 LLM(An LLM calling tools in a loop)。Anthropic 在《Building effective agents》一文中给出的 Agent 定义同样落在循环上——模型根据每一步的观察结果自主决定下一步行动,直到任务完成。

拆解这个定义,Loop 由四个组成部分协作完成:

组成部分 职责 类比
模型推理 分析当前上下文,决定下一步做什么 大脑思考
工具调用 执行模型决定的动作 双手操作
结果反馈 把执行结果写回上下文 眼睛观察
循环控制 判断任务是否完成,决定继续或退出 完工验收

单次调用大语言模型,得到的是"一段话";让模型在 Loop 中反复调用工具,得到的是一个能干活的 Agent。Loop 是对话系统与智能体的分水岭。

1.2 从单次调用到循环执行

Loop 与普通的单次 LLM 调用有本质差异:

维度 单次 LLM 调用 Loop 循环执行
执行步骤 一次生成全部答案 多轮迭代逐步推进
中间结果 无,出错无法修正 每轮观察结果,可随时修正
上下文 请求级,用完即弃 会话级,随轮次累积
任务复杂度 问答、翻译、摘要等单步任务 编程、调研、运维等多步任务
类比 查一次地图 开导航去目的地,每到一个路口重新规划

以"修复一个失败的测试"为例:单次调用只能靠模型凭训练知识猜测原因;Loop 模式下,模型先运行测试、再读取报错、定位代码、修改后重跑验证——每一步都建立在真实的观察之上。

1.3 为什么复杂任务离不开 Loop

现实中的复杂任务几乎都具备"步骤有依赖、环境不可预知、结果需验证"的特征,这些正是单次调用的短板:

复杂任务的特性 单次调用的局限 Loop 如何解决
步骤间存在依赖 拿不到前一步的真实结果 结果实时写回上下文,下一步基于事实决策
环境不可预知 模型只能凭训练知识猜测 工具返回真实环境状态,按实际情况调整
结果需要验证 无法自查输出正确性 执行后重跑测试、复查文件,用观察收尾
中途可能出错 一次出错全盘皆输 失败原因反馈给模型,修正后重试

2. Loop 的工作机制

2.1 循环的基本结构

一次完整的 Agent 执行由若干轮迭代组成,每轮迭代经历四个阶段:

graph LR A[接收用户目标] --> B[模型推理
分析上下文并决策] B --> C{是否调用工具} C -->|是| D[工具执行
读写文件/运行命令/查询接口] D --> E[结果写回上下文] E --> B C -->|否| F[输出最终答复
循环结束] style A fill:#d6eaf8,stroke:#2980b9,stroke-width:2px style B fill:#ffecd6,stroke:#e67e22,stroke-width:2px style C fill:#f4ecf7,stroke:#7d3c98,stroke-width:2px style D fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style E fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style F fill:#d6eaf8,stroke:#2980b9,stroke-width:2px

四个阶段的执行者与职责如下:

阶段 执行者 职责
模型推理 LLM 读取完整上下文,决定调用哪些工具或直接答复
工具执行 Harness 与工具管理器 校验权限后执行工具,返回真实结果
结果写回 Harness 把工具结果作为消息追加到对话上下文
终止判断 Loop 控制器 模型无工具调用即自然终止,或触发上限强制终止

循环的每一轮都是一次完整的模型调用。用户在界面上看到的一个"步骤",背后对应的就是一轮迭代。

2.2 一次完整循环的执行示例

以"修复项目中的失败测试"为例,观察模型如何通过多轮迭代推进任务:

用户目标:修复项目中失败的测试

第 1 轮:调用终端工具运行测试
        观察到 2 个用例失败,报错指向 user_service.py
第 2 轮:调用文件读取工具查看 user_service.py
        观察到 get_user 函数未处理用户不存在的情况
第 3 轮:调用文件编辑工具补充空值判断
        修改完成
第 4 轮:再次运行测试
        全部通过
第 5 轮:不再调用工具,向用户汇报修改内容
        循环自然终止

对应的调用时序如下:

sequenceDiagram participant U as 用户 participant L as Loop 控制器 participant M as LLM participant T as 工具 U->>L: 提交目标(修复失败测试) loop 每一轮迭代 L->>M: 携带完整上下文请求推理 M-->>L: 返回工具调用指令或最终答复 L->>T: 执行工具(运行测试/读写文件) T-->>L: 返回执行结果 L->>L: 结果写回上下文 end L-->>U: 输出最终答复,循环结束

这个例子体现了 Loop 的两个关键性质:

  • 决策基于观察:模型先看到报错信息才知道要读哪个文件,先看到代码才知道改哪里,每一步都依赖上一轮的真实结果;
  • 完成由模型判断:测试全部通过后,模型认为目标已达成,输出文字答复而不再调用工具,循环随之结束。

2.3 最小可行循环的代码骨架

Loop 的结构用代码表达非常直观,下面是一个约二十行的最小循环骨架:

from openai import OpenAI

client = OpenAI()
messages = [{"role": "user", "content": "修复项目中失败的测试"}]

while True:
    # 每轮迭代就是一次完整的模型调用
    response = client.chat.completions.create(
        model="glm-4.7-flash",
        messages=messages,
        tools=TOOL_DEFINITIONS,
    )
    message = response.choices[0].message

    if not message.tool_calls:
        # 模型不再调用工具,输出最终答复,循环结束
        print(message.content)
        break

    messages.append(message)
    for call in message.tool_calls:
        result = execute_tool(call)          # 在本地执行模型请求的工具
        messages.append({                    # 结果写回上下文,供下一轮推理
            "role": "tool",
            "tool_call_id": call.id,
            "content": result,
        })

代码虽短,却包含了 Loop 的全部要素:while True 是循环骨架,create 调用对应每轮的模型推理,execute_tool 对应工具执行,messages.append 对应结果写回,break 对应自然终止。实际产品中的循环会在此基础上叠加权限审批、上下文压缩、并发调度、预算控制等工程能力。完整可运行的 Tool Calling 示例可参考 ToolCalling工具调用技术分析与应用教程

2.4 循环的终止条件

循环必须有出口,主流工具设计了多层终止机制:

终止类型 触发机制 说明
自然终止 模型输出中不再包含工具调用,仅返回文字答复 模型判断任务已完成
步数上限 迭代次数达到预设的最大轮数 防止任务无限拖延
Token 预算 累计消耗超过预算上限 控制单次任务的执行成本
时间上限 任务运行时间超时 有明确截止时间的场景
人工中断 用户在界面上主动停止 发现方向跑偏及时止损
错误熔断 连续多轮失败或同一操作反复报错 避免在死路上持续消耗

自然终止由模型主导,代表"任务完成";其余几种由系统或用户兜底,属于"执行保护"。设计合理的终止条件,本质是在完成质量与执行成本之间取得平衡。

3. Loop 与相关概念的关系

3.1 概念关系图谱

graph LR H[Harness
宿主环境] --> L[Loop
执行循环] L --> TC[Tool Calling
行动齿轮] L --> C[Context
上下文累积] L --> K[Hook
确定性控制点] L --> AG[Agent
心跳机制] W[Workflow
流程编排] -.->|编排多个循环| L MCP[MCP
工具接入] --> TC style L fill:#f4ecf7,stroke:#7d3c98,stroke-width:2px style H fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style TC fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style C fill:#d6eaf8,stroke:#2980b9,stroke-width:2px style K fill:#fef9e7,stroke:#b7950b,stroke-width:2px style AG fill:#e8f4f8,stroke:#1a6b8a,stroke-width:2px style W fill:#fdebd0,stroke:#e67e22,stroke-width:2px style MCP fill:#fadbd8,stroke:#c0392b,stroke-width:2px

3.2 Loop vs Workflow

Workflow概念详解 讲解的 Workflow 与 Loop 都能驱动多步骤任务,核心区别在于"谁决定下一步":

维度 Loop Workflow
下一步由谁决定 模型实时推理决策 开发者预先编排
步骤数量 动态,随任务复杂度伸缩 固定,运行前已确定
确定性 每次执行路径可能不同 同样输入走同样路径
适用任务 开放式、探索性任务 结构固定、重复执行的任务
类比 探险家按现场情况开路 工厂流水线按图纸组装

两者在实践中经常配合:Workflow 的某个节点内部可以运行一个完整的 Loop(例如"自动修复"节点内部是一个修复循环);反过来,Loop 中的模型也可以在推理后决定触发某个 Workflow。决策权在模型手中时是 Loop,固化在流程图中时是 Workflow。

3.3 Loop 与 Harness

Harness(见 Harness概念详解)是 Loop 的宿主与供给者:

Loop 需要的能力 Harness 提供的组件
每轮的模型调用 模型接入层,管理 API、重试与流式输出
工具执行 工具管理器,负责注册、匹配与执行
结果写回 上下文管理器,维护对话消息列表
行为边界 权限管理器,审批高危操作
终止兜底 生命周期管理,控制超时与预算

Loop 本身只定义了"反复调用模型直到完成"的骨架,让它真正跑起来的基础设施全部由 Harness 提供。可以说 Loop 定义了节奏,Harness 提供了乐器。

3.4 Loop 与 Tool Calling、MCP

Tool Calling(见 ToolCalling工具调用技术分析与应用教程)是 Loop 每一轮的"行动"环节:模型在推理后产出工具调用指令,循环执行工具并把结果反馈回来。没有工具调用,模型每轮都只能输出文字,循环在第一轮就会自然终止,Agent 随之退化为普通对话。

MCP(见 MCP概念详解与应用完整教程)则决定了 Loop 的行动空间:接入的 MCP 服务器越多,模型每轮可选的工具就越丰富,同一个循环骨架能覆盖的任务面就越宽。

3.5 Loop 与 Context

Context(见 Context上下文及相关概念详解)与 Loop 是"随行档案"与"行进步伐"的关系——循环每前进一步,上下文就增长一分:

写入时机 写入内容 作用
用户提交目标时 任务描述与约束 定义循环的终点
模型每轮推理后 思考过程与工具调用指令 记录决策依据
工具执行后 执行结果或报错信息 为下一轮提供观察材料

长任务的循环轮次可达数十轮,上下文随之快速膨胀,因此主流工具引入了上下文压缩机制(达到阈值时把早期历史折叠为摘要)。压缩时机与循环关系紧密——Claude Code 的 PreCompact 钩子正是挂在压缩动作之前,详见 Hook钩子概念详解

3.6 Loop 与 Hook

Hook(见 Hook钩子概念详解)是挂在 Loop 关键事件点上的确定性控制。循环的每一轮都会经过"工具调用前、工具调用后"等事件,钩子在这些位置强制校验、拦截或补充上下文:

graph LR M[模型推理] --> P[PreToolUse 钩子
校验与拦截] P --> T[工具执行] T --> PO[PostToolUse 钩子
格式化与审计] PO --> W[结果写回上下文] W --> M style M fill:#ffecd6,stroke:#e67e22,stroke-width:2px style P fill:#fef9e7,stroke:#b7950b,stroke-width:2px style T fill:#d5f5e3,stroke:#27ae60,stroke-width:2px style PO fill:#fef9e7,stroke:#b7950b,stroke-width:2px style W fill:#d6eaf8,stroke:#2980b9,stroke-width:2px

Loop 提供节奏,Hook 在每个节拍上植入强制规则:提示词约束影响模型"想做什么",Hook 决定系统"允许做什么",两者共同保证长循环任务不越界。

4. Loop 的实践应用

4.1 主流 Agent 工具中的 Loop

工具 Loop 的体现 用户可见的痕迹
Claude Code 每个回合内部运行多轮"推理、工具调用"迭代,直至任务完成 界面上逐步展示的每一次工具调用
Codex 以主循环驱动,回合内多次调用模型与工具 每步操作与思考过程的流式输出
ZCode 与 Claude Code 同构的回合制循环 工具调用日志与迭代进度
Claude Agent SDK 把循环封装为 query() 函数,开发者传入目标即可获得执行结果 应用内嵌的自主执行能力

理解了 Loop,你在使用这些工具时会看得更懂:界面上的每个"步骤"对应循环的一轮迭代;回合结束时,模型输出了不含工具调用的最终答复,本轮循环随之收尾。

4.2 循环调优的关键参数

参数与机制 作用 调优建议
最大迭代轮数 限制循环上限,防止无限执行 简单任务设小(如 10 轮),复杂任务放宽
权限模式 决定每轮工具调用是否需要人工批准 只读操作自动放行,写操作与命令执行需审批
上下文压缩阈值 控制历史折叠的触发时机 长任务适当调低,避免上下文溢出
Token 与费用预算 为单次任务设置消耗上限 按任务价值分级,探索性任务给足预算
并行工具调用 无依赖的工具同时执行 模型支持时开启,可显著缩短总轮数

4.3 循环常见异常与治理

异常 典型现象 治理手段
死循环 模型反复执行同一操作,或修改后又改回 用 Hook 拦截重复调用;在提示词中明确成功标准;升级模型能力
提前终止 步数上限过小,任务只做了一半 调大上限;把大任务拆解为多个子目标
上下文溢出 长任务后期模型遗忘早期信息 启用压缩;用子 Agent 隔离中间过程
成本失控 Token 消耗远超预期 设置预算上限;精简工具列表,减少每轮提示体积

其中子 Agent 是控制循环规模的重要手段:主循环把独立子任务(如"全局搜索引用")交给子 Agent,子 Agent 在自己的循环中消化大量工具输出,只把最终结论带回主循环,主上下文因此保持精简(子 Agent 机制见 Agent概念详解)。

循环轮数是 Agent 任务的真实成本计量单位——每一轮都是一次模型调用,轮数翻倍意味着成本与失败风险同步上升。观察一个 Agent 的轮数消耗,是评估其任务设计是否合理最直观的方式。

5. 总结

5.1 核心内容回顾

  • Loop(循环) 是 Agent 的核心执行引擎:模型推理、工具调用、结果反馈、终止判断四个阶段反复迭代,直到任务完成。
  • 业界对 Agent 的经典概括是"在循环中使用工具的 LLM",Loop 是对话系统与智能体的分水岭。
  • 循环的每轮迭代对应一次完整的模型调用;模型不再调用工具时循环自然终止,步数、预算、超时与人工中断构成系统兜底。
  • Harness 是 Loop 的宿主,提供模型接入、工具执行、上下文维护与权限控制;Tool Calling 是循环的行动齿轮,MCP 决定行动空间的宽度。
  • Context 随循环逐轮增长,长任务依赖压缩机制;Hook 挂载在循环的事件点上,为概率性执行注入确定性规则。
  • Loop 与 Workflow 的区别在于决策权:模型实时决策是 Loop,开发者预先编排是 Workflow,实践中两者经常配合。

5.2 常见问题与解答

问:Loop 和 ReAct 是什么关系?

答:ReAct(推理加行动)是循环内部模型使用的推理模式——"思考、行动、观察"交替进行;Loop 是承载这种模式的执行结构。可以理解为 ReAct 是舞步,Loop 是舞池。

问:模型为什么不把所有工具一次性调用完?

答:因为许多工具调用之间存在依赖——必须先看到测试报错,才知道要读哪个文件。Loop 的价值正在于"观察后再决策"。对于相互独立的调用,主流模型支持在同一轮并行发起,兼顾效率与正确性。

问:循环轮数越多,任务完成得越好吗?

答:并非如此。轮数增加意味着更高的 Token 成本、更长的等待时间和更大的跑偏风险。任务设计的目标是用尽可能少的轮数达成目标,常用手段包括拆解子任务、并行工具调用和使用子 Agent 隔离中间过程。

问:如何判断一个循环该结束了?

答:两层机制配合。模型层面,目标达成后输出纯文本答复,循环自然终止;系统层面,通过最大轮数、预算上限、超时和人工中断兜底,确保循环永远不会失控。前者追求"完成",后者保证"可控"。