Agent Loop Engineering
引言
如果把 Chatbot 和 Agent 的架构差异压缩成一句话,答案往往就是 Agent Loop:把 LLM 放进一个 while 循环里,让它反复「思考 → 行动 → 观察」,直到任务完成或触发终止条件。
各家框架——Claude Code、Cursor、Vercel AI SDK、LangGraph、smolagents——表面 API 千差万别,但剥开抽象层后,核心逻辑惊人地一致。Loop 本身已是「 solved problem」;真正决定 Agent 能否上线的,是 Loop 外围的工程化:上下文管理、安全护栏、错误分类、成本控制和优雅降级。
本文尝试把 Agent Loop 从概念到生产实践串成一条线,作为 Agent Handbook 中 工作流 与 任务规划 的补充阅读。
最小 Agent Loop
去掉框架包装,每个 Agent 本质上都在跑同一段伪代码:
def run_agent(prompt, tools):
messages = [{"role": "user", "content": prompt}]
while True:
response = call_llm(messages, tools)
if response.has_tool_calls:
messages.append(response)
messages.append(execute_tools(response.tool_calls))
else:
return response.text # 无 tool call → 终止
几个关键信号:
| 响应类型 | 含义 | 下一步 |
|---|---|---|
含 tool_calls | 模型还需要更多信息或要执行动作 | 执行工具,把结果 append 到 messages,继续循环 |
| 纯文本回复 | 模型认为信息已足够 | 返回最终结果,退出循环 |
Tool Call 是 continuation signal(继续循环);纯文本是 termination signal(结束)。模型通过是否发起工具调用来「决定」自己是否还需要再转一圈——这就是 Agent 与固定 Workflow 的 根本分野。
Anthropic 在 Building Effective Agents 中划了一条很实用的线:
- Workflow:开发者预定义控制流,LLM 在固定节点上被调用。
- Agent:模型在开放循环中动态决定下一步——调哪个工具、何时停止。
ReAct(Yao et al., 2022)把这套「推理与行动交织」的形式化得很清楚:每步生成 Thought → Action → Observation,Observation 写回上下文驱动下一步。这与本仓库 任务规划 一节中的 ReAct 描述一脉相承。
单轮循环里发生了什么
可以把每一轮迭代理解成一次 状态转移:
与「一次请求一次响应」的 Chat 不同,Agent Loop 是 carry state between iterations:对话历史、工具返回值、中间 todo、错误信息都会累积在 state 里,让第 N+1 轮与第 N 轮在相同模型、相同工具集下做出不同决策。
这里 state 是 单次运行的 scratch space(会话内状态),比跨会话的 Memory 更窄、更可变;二者在工程上往往分层管理,但 Loop 读写的就是 state。
