Agent Loop
Agent Loop 是 runtime 内部的原子执行循环:模型调用 → tool call → 工具结果回填 → 下一轮模型调用,直到产生最终输出或命中停止条件。
#concept
#evergreen
#ai
#architecture
[!info] related notes
- 所属 MOC: AI Agent Application MOC
- 相关: Agent Engine, Agent Runtime, ReAct Pattern
- 易混淆: Agent 执行闭环, Orchestration
Agent Loop
一句话定义
Agent Loop 是 Agent 的核心执行循环:调用 LLM → 检查是否有 tool_call → 执行工具 → 结果回传 LLM → 继续推理,直到 LLM 输出最终回答或触发停止条件。
核心原理
最小 Agent Loop
async def agent_loop(messages: list, tools: list, llm) -> str:
for step in range(MAX_STEPS):
# 1. 调用 LLM
response = await llm.chat(messages, tools=tools)
# 2. 检查是否有 tool_call
if not response.tool_calls:
# 没有 tool_call,LLM 直接回复
return response.content
# 3. 执行每个 tool_call
for tool_call in response.tool_calls:
result = await execute_tool(tool_call)
messages.append(tool_call_message(tool_call, result))
return "达到最大步数"
带事件流的 Agent Loop
async def agent_loop_with_events(context: Context) -> AsyncIterator[Event]:
messages = build_messages(context)
for step in range(MAX_STEPS):
response = await llm.chat(messages, tools=tools)
if response.tool_calls:
for tool_call in response.tool_calls:
yield ToolCallStartEvent(tool_call)
result = await execute_tool(tool_call)
yield ToolCallResultEvent(tool_call, result)
messages.append(tool_result_message(tool_call, result))
else:
yield TextDeltaEvent(response.content)
break
yield DoneEvent()
停止条件
| 条件 | 说明 |
|---|---|
| LLM 无 tool_call | 模型决定直接回复 |
| 达到 max_steps | 防止无限循环 |
| 工具执行失败 | 某步失败需要降级 |
| 用户取消 | 前端中断 |
| 超时 | 整体时间超限 |
边界:Agent Loop 不等于完整 Agent 执行闭环
Agent Loop 只描述 runtime 中最小的重复控制结构:模型产生下一步动作,runtime 执行动作并把 observation 回填,然后进入下一轮。它不自动涵盖任务规划、审批策略、durable state、失败恢复、ground-truth verification 等系统级职责。
这些职责如何与 loop 组合成可控执行系统,见 Agent 执行闭环;多个 agent / workflow 如何被组织和约束,见 Orchestration。
常见坑
- 不做 max_steps 限制: Agent 可能无限循环
- 不处理 tool_call 为空的情况: LLM 可能输出空的 tool_calls
- 不检查停止条件: 每步都应该检查是否应该停止
- 消息累积不控制: 每步都追加消息,上下文越来越大
学习检查
不看正文回答:
- Agent Loop 的一轮至少包含哪三个阶段?
- 为什么“模型没有 tool call”只能算一种停止路径,而不是唯一停止条件?
- Agent Loop 与 Agent 执行闭环 的职责边界是什么?
- 如果工具调用有副作用,为什么仅靠 messages 继续循环不足以保证可恢复性?