3.4 Loop 循环——Agent 怎么转圈、什么时候停
概念
前面三个知识点解决的是"单次调用"的问题。但 Agent 不是单次调用——它会自主循环:思考 → 调用工具 → 看结果 → 再思考 → 再调用……这就是 Agent Loop。
问题来了:如果模型一直觉得自己需要更多信息,它就会无限循环下去。所以 Loop 的核心不是"怎么转",而是什么时候停。
用法
一个 Agent Loop 的四个环节
-
感知(Observe) :读取当前状态——任务目标、已有产物、工具刚返回的结果。
-
规划(Plan) :基于当前状态决定下一步做什么、调用哪个工具。
-
行动(Act) :执行——调用工具、写文件、检索资料。
-
反思(Reflect) :检查这一步的结果对不对、是否更接近目标,据此决定继续、修正还是停止。
🖼 图:Agent Loop 四环节循环:感知(Observe)→ 规划(Plan)→ 行动(Act)→ 反思(Reflect)——循环往复,直至满足退出条件。
一个标准的 Agent Loop 长这样:
循环开始
① 模型思考(Reasoning):基于当前上下文,决定下一步干什么
② 执行动作(Action):调用工具 or 直接输出答案
③ 观察结果(Observation):把工具返回结果加入上下文
④ 判断:是否满足退出条件?
- 是 → 退出循环,返回最终结果
- 否 → 回到 ①
循环结束
这个就是经典的 ReAct(Reasoning + Acting)循环。每转一圈叫一个"step"或"turn"。
退出条件必须在设计阶段就定好,不能靠模型自己判断。常见的退出条件:
| 退出条件 | 含义 | 用在哪 |
|---|---|---|
| 任务完成 | 模型输出了符合 Schema 的最终答案 | 正常路径 |
| 最大步数限制 | 转了 N 圈还没结束,强制停 | 防止无限循环 |
| 人工关卡 | 到了关键步骤,暂停等人工确认 | 高风险操作前 |
| 超时限制 | 总耗时超过阈值,强制停 | 客户现场防卡死 |
| 错误次数限制 | 连续失败 N 次工具调用,强制停 | 防止反复失败烧 Token |
示例
假设你的运维诊断 Agent 要执行一个"重启服务器"的动作——这属于高风险操作。Loop 设计应该是:
Step 1: 模型思考 → 用户报服务器异常,先查日志
Step 2: 调用 get_server_logs → 返回错误日志
Step 3: 模型思考 → 发现是内存溢出,建议重启
Step 4: 模型准备调用 restart_server 工具
→ 🚧 触发人工关卡:暂停 Loop,等人工确认
Step 5: 人工确认 "同意" → 继续
Step 6: 调用 restart_server → 返回成功
Step 7: 模型输出最终诊断报告 → 任务完成,退出 Loop
如果没设人工关卡会怎样? 模型可能直接重启了一台生产服务器,客户投诉。
如果没设最大步数限制会怎样? 模型查了日志发现不够,查指标发现不够,又去搜知识库,回来又查日志……无限循环,Token 烧光。
一个实际配置示例:
Loop 配置:
max_steps: 10 # 最多转 10 圈
timeout: 60s # 总超时 60 秒
max_consecutive_errors: 3 # 连续失败 3 次就停
human_in_the_loop: # 人工关卡
- action: "restart_server" # 遇到重启动作就暂停
- action: "delete_data" # 遇到删数据动作就暂停
- action: "modify_config" # 遇到改配置动作就暂停
**⚠️ 风险提示:**人工关卡(Human-in-the-loop)不是"加个确认按钮"这么简单。你需要考虑:暂停后怎么通知人?人不在怎么办?超时未确认默认是放行还是拒绝?建议默认拒绝——不确认就不执行,宁可慢不要错。
随堂测
逐题作答,即时反馈
1. 关于 Agent Loop,课文强调的核心问题是什么?
2. 经典 ReAct 循环每转一圈的标准步骤顺序是?
3. 课文示例的 Loop 配置中,max_steps / timeout / max_consecutive_errors 三个参数分别是?