规划与推理
问题
Agent 如何进行任务规划和分解?有哪些规划策略?
答案
规划(Planning)是 Agent 将复杂目标分解为可执行子任务的能力,是区分简单工具调用和真正 Agent 的关键。
一、规划策略
1. 任务分解(Task Decomposition)
PLANNING_PROMPT = """你是一个任务规划助手。将用户的复杂任务分解为可执行的子步骤。
任务:{task}
请按以下格式输出执行计划:
1. [步骤描述] - 使用工具:[工具名]
2. [步骤描述] - 使用工具:[工具名]
...
注意:
- 步骤之间要有逻辑顺序
- 每步应该是一个可独立执行的原子操作
- 标注哪些步骤可以并行执行
"""
2. Plan-and-Execute 模式
与纯 ReAct 的区别:
- ReAct:每步都重新思考下一步做什么(逐步推进)
- Plan-and-Execute:先生成完整计划,再逐步执行(全局视角)
3. 自适应规划
def adaptive_planning(task: str, llm):
# 1. 生成初始计划
plan = generate_plan(task, llm)
results = []
for i, step in enumerate(plan.steps):
# 2. 执行当前步骤
result = execute_step(step)
results.append(result)
# 3. 检查是否需要调整计划
if should_replan(plan, results, llm):
# 基于已有结果重新规划剩余步骤
remaining_task = summarize_remaining(task, results)
plan = generate_plan(remaining_task, llm)
return synthesize_results(results, llm)
二、ReAct vs Plan-and-Execute
| 维度 | ReAct | Plan-and-Execute |
|---|---|---|
| 规划方式 | 逐步决策 | 先规划后执行 |
| 全局视角 | 弱 | 强 |
| 灵活性 | 高(随时调整) | 需重新规划 |
| 适用任务 | 简单、步骤少 | 复杂、步骤多 |
| Token 消耗 | 每步都带完整上下文 | 规划阶段集中消耗 |
三、反思与自我纠正
Agent 需要能够评估自己的输出并进行修正:
REFLECTION_PROMPT = """评估以下回答的质量:
问题:{question}
回答:{answer}
请从以下维度评分(1-5):
1. 准确性:信息是否正确?
2. 完整性:是否回答了所有方面?
3. 相关性:是否切题?
如果分数 < 4,请指出问题并给出改进建议。
"""
常见面试问题
Q1: Agent 的规划能力受什么限制?
答案:
- LLM 推理能力:规划本质依赖 LLM 的推理——模型越强,规划越好
- Context Window:长计划需要大量上下文记录历史步骤
- 工具理解:Agent 需要理解每个工具能做什么才能正确规划
- 不确定性传递:每步的错误会传递并放大
Q2: 如何提升 Agent 的规划质量?
答案:
- 使用更强的模型(GPT-4o、Claude Opus)做规划
- 提供 Few-shot 示例(成功的规划案例)
- 限制计划步骤数(通常 5-10 步)
- 添加自我反思和重新规划机制