智能体执行循环
执行循环把决策、工具执行、结果回传和停止判断连接起来,使智能体能够用上一步的结果决定下一步。
理解与应用
执行循环是智能体运行时反复进行的一套过程:读取当前任务状态,产生下一步行动,执行行动,再把观察结果写回状态。只调用一次模型,拿到一个工具名称,并没有完成这个循环。应用还需要真正运行工具,把结果交回模型,并判断任务是否已经完成、需要继续还是必须暂停。
继续看报销调查。第一轮只有报销单号,查询后获得“已退回”和退回记录编号;第二轮读取退回记录,得到需要核对发票的信息;第三轮读取附件,才形成有依据的回答。每轮开始时的状态都比上一轮多了一点信息。运行程序要保留的不只是聊天文字,还包括已查过的对象、当前结果和哪些问题尚未解决。
假如读取附件超时,循环不能把超时当作“没有附件”。它可以在允许的次数内重试,或告知用户暂时无法核实。如果等待的是用户补充材料,就应暂停而非反复查询。成功、工具失败、等待输入和超出预算是不同的结束状态;轮数用完只是限制触发,并不能说明用户的问题已经解决。
长任务还会遇到进程中断。记录每次行动的开始、完成和外部回执,可以让恢复后的运行程序知道从哪里继续。只读查询一般可以重新获取;提交申请一类有副作用的操作,则可能在网络超时时已经生效。此时要先查提交状态,再判断是否重试,避免因为循环重启而重复提交。
动手试一试:同样走两轮,结束原因可能不同
三个任务都经过两轮,只有第一个完成。第三个案例虽然在输入列表里放了后续成功结果,但循环没有运行到那一步,不能使用它。这段代码只验证停止分支,真实系统还需要实现工具执行和状态持久化。
将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。
Python 代码
# 用预设工具观察检查循环的停止逻辑。
def run(observations, max_steps):
history = []
for observation in observations[:max_steps]:
history.append(observation)
if observation == "原因已核实":
return "completed", history
if observation == "等待用户补充附件":
return "paused", history
status = "budget_exhausted" if len(history) == max_steps else "incomplete"
return status, history
cases = [
["已退回", "原因已核实"],
["已退回", "等待用户补充附件"],
["读取超时", "读取超时", "原因已核实"],
]
for case in cases:
status, history = run(case, max_steps=2)
print(status, "|", " → ".join(history))运行结果
completed | 已退回 → 原因已核实 paused | 已退回 → 等待用户补充附件 budget_exhausted | 读取超时 → 读取超时
常见误区
- 把所有异常改写成“没有查到”,会使下一轮依据一个并不存在的业务事实继续推理。
- 只保存最后一句回答而不保存行动记录,中断后就无法判断哪些操作已生效。
前置与延伸
建议先读
相关概念
参考与版本
Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- Anthropic:Building effective agents ↗
已核对官方文章对 workflow、agent 及环境反馈的区分;工程原则参考,不把文中产品清单视为固定版本。 · 核验:2026-10-10
- Anthropic:Effective harnesses for long-running agents ↗
已核对官方文章的跨会话进度工件与验证思路;本文记录格式为原创示例,不要求使用特定产品。 · 核验:2026-10-10