Agent 的本质是循环
所有 Agent 都在做同一件事:感知 → 推理 → 行动 → 观察结果 → 重复。这个循环怎么设计,决定了 Agent 的能力上限。
第一代:ReAct 循环
ReAct(Reasoning + Acting)是最经典的 Agent 模式:
Thought: 用户想了解今天的天气,我需要搜索
Action: search_weather("北京 今天")
Observation: 北京今天晴,最高温32°C
Thought: 搜索结果已获得,可以回答用户
Answer: 北京今天晴天,最高温度32°C。
核心代码
def react_loop(query, max_iterations=5):
messages = [{"role": "user", "content": query}]
for i in range(max_iterations):
response = llm.invoke(messages + [
{"role": "system", "content": REACT_PROMPT}
])
if "Final Answer:" in response:
return parse_answer(response)
action = parse_action(response)
observation = execute_tool(action)
messages.append({"role": "assistant", "content": response})
messages.append({"role": "user", "content": f"Observation: {observation}"})
return "达到最大迭代次数"
ReAct 的问题
- 短视决策:每一步只考虑当前最优,缺乏全局规划
- Token 浪费:每轮都把完整历史发给 LLM
- 容易跑偏:一旦某步出错,后续步骤连锁偏移
- 无法并行:严格串行,效率低
第二代:Plan-and-Execute
Plan-and-Execute 将循环拆为两个阶段:
阶段一:规划
def plan(query):
prompt = f"""将以下任务分解为具体步骤:
任务:{query}
输出JSON格式的步骤列表。"""
plan = llm.invoke(prompt)
return json.loads(plan)
# 输出示例
{
"steps": [
{"id": 1, "action": "search", "params": {"query": "2026年AI Agent市场规模"}},
{"id": 2, "action": "search", "params": {"query": "主要Agent框架市场份额"}},
{"id": 3, "action": "analyze", "params": {"source": "step1+step2"}},
{"id": 4, "action": "write_report", "params": {"source": "step3"}}
]
}
阶段二:执行
def execute_plan(steps):
results = {}
for step in steps:
result = execute_step(step, results)
results[step["id"]] = result
# 动态重规划
if step.get("replan"):
new_steps = replan(query, results)
steps = merge_plan(steps, new_steps)
return results
优势对比
| 维度 | ReAct | Plan-and-Execute |
|---|---|---|
| 全局视野 | 无 | 有 |
| 可并行 | ❌ | ✅(无依赖步骤) |
| 错误恢复 | 依赖LLM自行纠正 | 可重新规划 |
| Token 效率 | 低(重复发送历史) | 高(只发当前步骤) |
| 复杂任务 | 容易失败 | 表现稳定 |
第三代:自适应循环
2026 年最新的研究趋向于动态选择策略:
class AdaptiveAgent:
def __init__(self):
self.strategies = {
"simple": ReActStrategy(),
"complex": PlanExecuteStrategy(),
"research": TreeOfThoughtStrategy(),
}
def run(self, query):
complexity = self.assess_complexity(query)
strategy = self.select_strategy(complexity)
result = strategy.execute(query)
# 如果失败,升级策略
if not result.success and strategy != "research":
return self.run_with_higher_strategy(query)
return result
def assess_complexity(self, query):
factors = {
"steps_required": self.estimate_steps(query),
"tools_needed": self.identify_tools(query),
"domain_breadth": self.assess_breadth(query),
}
score = sum(factors.values())
if score < 5: return "simple"
if score < 15: return "complex"
return "research"
循环中断与恢复
生产级 Agent 必须支持循环的暂停和恢复:
class CheckpointedAgent:
def __init__(self, checkpoint_store):
self.store = checkpoint_store
def run(self, task_id, query):
# 从检查点恢复
state = self.store.load(task_id) or {"step": 0, "results": {}}
while state["step"] < len(state["plan"]):
step = state["plan"][state["step"]]
try:
result = self.execute_step(step)
state["results"][step["id"]] = result
state["step"] += 1
# 保存检查点
self.store.save(task_id, state)
except Exception as e:
state["error"] = str(e)
self.store.save(task_id, state)
raise
return state["results"]
实际效果对比
在 GAIA Benchmark 上的表现:
| 策略 | Level 1 | Level 2 | Level 3 | 平均 Token |
|---|---|---|---|---|
| ReAct | 58% | 32% | 12% | 8.2K |
| Plan-Execute | 72% | 51% | 28% | 5.6K |
| Adaptive | 78% | 59% | 35% | 6.1K |
Adaptive 策略在 Level 1 上 Token 消耗略高(因为多了复杂度评估),但在复杂任务上优势明显。
结论
Agent 循环设计正在从"一种模式打天下"走向"按需选择、动态切换"。ReAct 不会消失——它仍然是简单任务的最佳选择。但面对真实业务场景的复杂性,Plan-and-Execute 和自适应策略正在成为主流。
选择建议:
- 简单 QA:ReAct 足够
- 多步骤任务:Plan-and-Execute
- 开放性研究:自适应 + Tree of Thought
- 生产环境:务必加 checkpoint 和错误恢复
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
