智能体执行循环

执行循环把决策、工具执行、结果回传和停止判断连接起来,使智能体能够用上一步的结果决定下一步。

返回概念图谱 →

理解与应用

执行循环是智能体运行时反复进行的一套过程:读取当前任务状态,产生下一步行动,执行行动,再把观察结果写回状态。只调用一次模型,拿到一个工具名称,并没有完成这个循环。应用还需要真正运行工具,把结果交回模型,并判断任务是否已经完成、需要继续还是必须暂停。

继续看报销调查。第一轮只有报销单号,查询后获得“已退回”和退回记录编号;第二轮读取退回记录,得到需要核对发票的信息;第三轮读取附件,才形成有依据的回答。每轮开始时的状态都比上一轮多了一点信息。运行程序要保留的不只是聊天文字,还包括已查过的对象、当前结果和哪些问题尚未解决。

假如读取附件超时,循环不能把超时当作“没有附件”。它可以在允许的次数内重试,或告知用户暂时无法核实。如果等待的是用户补充材料,就应暂停而非反复查询。成功、工具失败、等待输入和超出预算是不同的结束状态;轮数用完只是限制触发,并不能说明用户的问题已经解决。

长任务还会遇到进程中断。记录每次行动的开始、完成和外部回执,可以让恢复后的运行程序知道从哪里继续。只读查询一般可以重新获取;提交申请一类有副作用的操作,则可能在网络超时时已经生效。此时要先查提交状态,再判断是否重试,避免因为循环重启而重复提交。

关系速览
智能体(Agent)包含 →智能体执行循环

在可执行的助手中,循环负责读取观测、选择行动和判断是否停止;对话外观本身不能证明存在执行循环。

智能体执行循环包含 →工具(Tools)

允许操作外部系统的循环需要工具执行环节;纯文本助手可以没有外部工具。

智能体执行循环应用于 →ReAct:推理与行动交替进行

ReAct 是把行动与观测交替组织起来的一种循环模式。

动手试一试:同样走两轮,结束原因可能不同

三个任务都经过两轮,只有第一个完成。第三个案例虽然在输入列表里放了后续成功结果,但循环没有运行到那一步,不能使用它。这段代码只验证停止分支,真实系统还需要实现工具执行和状态持久化。

将代码保存为 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 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。