AI Agent 入门(六):Agent 规划能力 —— Plan-then-Execute 模式实战

📅 2026/7/8 15:15:06 👁️ 阅读次数 📝 编程学习
AI Agent 入门(六):Agent 规划能力 —— Plan-then-Execute 模式实战

本文是 AI Agent 入门系列的第 6 篇。前 5 课的 Agent 已经会调用工具、有记忆了,但面对复杂任务时它只会"走一步看一步"。
学完本篇,你的 Agent 将学会先想好再做——自动拆解任务、制定计划、按步骤执行、最终汇总。


本课目标

  • 理解 Agent 为什么需要规划能力
  • 掌握 Plan-then-Execute(先规划后执行)模式
  • 知道什么时候不需要规划
  • 亲手实现一个带规划能力的 Agent

本课产出

  • 新建文件lesson06_planning_agent.py,粘贴下文完整代码
  • 运行python lesson06_planning_agent.py "帮我调研 LangChain"
  • 效果:Agent 自动拆解任务 → 逐步执行 → 汇总生成结构化报告

一、为什么需要规划?

前 4 课的 ReAct Agent 是"走一步看一步"的:

用户:帮我调研 LangChain 和 CrewAI,并做对比分析 ReAct Agent: ① 搜索 "LangChain" → 拿到信息 ② 搜索 "CrewAI" → 拿到信息 ③ 对比分析 → 给出答案

看起来没问题,但实际上 Agent 在第 ① 步时并不知道后面还有多少步。如果搜索没找到有用信息,它可能在第 ③ 步才发现"数据不够",白忙了前三步。

Plan-then-Execute的做法是:

① 先制定计划(不执行,只思考): 1. 搜索 LangChain 的定义和核心功能 2. 搜索 CrewAI 的定义和核心功能 3. 对比两者的架构和适用场景 4. 生成对比分析报告 ② 按计划逐步执行(每步观察结果,必要时调整) ③ 汇总所有步骤,生成最终报告

好处显而易见:

ReAct(无规划)Plan-then-Execute
全局视野每步只看到上一步先看到完整的路线图
容错能力出错后重新推理某步失败只重试该步
可解释性需要跟踪每轮计划本身就很清晰
适合任务2-3 步的简单任务4+ 步的复杂任务

二、Plan-then-Execute 的三阶段

┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Phase 1 │ │ Phase 2 │ │ Phase 3 │ │ 制定计划 │ ──→ │ 逐步执行 │ ──→ │ 汇总输出 │ │ (LLM 规划) │ │ (ReAct × N) │ │ (LLM 总结) │ └──────────────┘ └──────────────┘ └──────────────┘

Phase 1 — 制定计划:一个专门做"规划"的 LLM 调用。告诉 LLM 任务是什么,让它输出 3-5 个有序步骤。temperature 设低(0.2)保证稳定性。

Phase 2 — 逐步执行:对每个步骤,启动一个 mini Agent(类似第 4 课的 ReAct 循环),用工具去获取信息、做计算,输出该步的结论。

Phase 3 — 汇总输出:把所有步骤的结论拼接起来,再调一次 LLM,让它生成结构化的最终报告。

三、什么时候不需要规划?

情况说明
问题一步能答“1+1 等于几?”——不需要规划,直接调工具
步骤完全确定“每天早上 9 点发天气提醒”——固定流程比规划更稳
需要快速响应规划本身要 1-2 次 LLM 调用,有延迟成本
用户已给明确指令“先搜 A,再搜 B,再对比”——直接执行即可

四、完整代码

新建lesson06_planning_agent.py,粘贴以下代码:

""" AI Agent 入门(六):Plan-then-Execute 规划模式 """importjson,os,sysfrompathlibimportPathfromdotenvimportload_dotenv SCRIPT_DIR=Path(__file__).parent load_dotenv(SCRIPT_DIR/".env")try:sys.stdout.reconfigure(encoding='utf-8')except:passfromopenaiimportOpenAI DEEPSEEK_API_KEY=os.getenv("DEEPSEEK_API_KEY")ifnotDEEPSEEK_API_KEY:print("[ERROR] 未检测到 API Key!");exit(1)client=OpenAI(api_key=DEEPSEEK_API_KEY,base_url="https://api.deepseek.com")MODEL="deepseek-chat"# ===========================================# 工具# ===========================================defsearch_info(keyword:str)->str:db={"ai agent":"AI Agent 由 LLM + Tools + Memory + Planning 组成。LangChain、CrewAI 是主流框架。","langchain":"LangChain 是开源 LLM 应用框架。核心:Chain(链式调用)、Agent(自主决策)、Tool(工具集成)、Memory(记忆)。","crewai":"CrewAI 是多 Agent 协作框架。核心:Agent(角色)、Task(任务)、Crew(团队)。适合需要分工协作的场景。","react":"ReAct = Reasoning + Acting。Agent 交替进行 Thought 和 Action,通过 Observation 迭代推进。","planning":"Agent 规划能力指将复杂任务分解为可执行步骤。主流:Plan-then-Execute、ReWOO、Tree-of-Thought。",}fork,vindb.items():ifkinkeyword.lower():returnf"[{k}]\n{v}"returnf"未找到 [{keyword}]。可搜:AI Agent, LangChain, CrewAI, ReAct, Planning"defcalculator(expr:str)->str:try:ifnotall(cinset("0123456789+-*/(). ")forcinexpr):return"不允许的字符"returnf"{expr}={eval(expr)}"exceptExceptionase:returnf"错误:{e}"TOOLS=[{"type":"function","function":{"name":"search_info","description":"搜索技术知识","parameters":{"type":"object","properties":{"keyword":{"type":"string"}},"required":["keyword"]}}},{"type":"function","function":{"name":"calculator","description":"数学计算","parameters":{"type":"object","properties":{"expr":{"type":"string"}},"required":["expr"]}}},]TOOL_MAP={"search_info":search_info,"calculator":calculator}# ===========================================# Phase 1: 生成计划# ===========================================defgenerate_plan(task:str)->list[str]:print("\n"+"="*60+"\n[Phase 1] 制定计划...\n"+"="*60)resp=client.chat.completions.create(model=MODEL,messages=[{"role":"system","content":"你是任务规划专家,只输出编号步骤列表。"},{"role":"user","content":f"将以下任务拆解为3-5步:\n{task}\n格式:\n1. 具体动作\n2. 具体动作"}],temperature=0.2,)text=resp.choices[0].message.contentprint(text)steps=[]forlineintext.strip().split("\n"):line=line.strip()iflineandline[0].isdigit():forsepin[". ","、",") "]:idx=line.find(sep,1)ifidx>0:steps.append(line[idx+len(sep):].strip());breakprint(f"解析出{len(steps)}步:{[f'{i}.{s[:30]}...'fori,sinenumerate(steps,1)]}")returnstepsor[task]# ===========================================# Phase 2: 执行单步# ===========================================defcall_tool(tc):n=tc.function.name;args=json.loads(tc.function.arguments)f=TOOL_MAP.get(n)print(f" ->{n}({json.dumps(args,ensure_ascii=False)})")r=f(**args)ifargselsef("")print(f" <-{r[:100]}")returnrdefexecute_step(step:str,max_it=4)->str:msgs=[{"role":"system","content":"完成当前子任务,需要信息时用 search_info,需要计算时用 calculator。"},{"role":"user","content":f"子任务:{step}"}]for_inrange(max_it):resp=client.chat.completions.create(model=MODEL,messages=msgs,tools=TOOLS)msg=resp.choices[0].messageifmsg.tool_calls:msgs.append(msg)fortcinmsg.tool_calls:msgs.append({"role":"tool","tool_call_id":tc.id,"content":call_tool(tc)})else:returnmsg.contentor""returnf"[超限]{step}"# ===========================================# Phase 3: 汇总# ===========================================defsummarize(task:str,results:list[dict])->str:print("\n"+"="*60+"\n[Phase 3] 汇总生成报告...\n"+"="*60)ctx="\n\n".join(f"### 步骤{r['step']}:{r['task']}\n{r['result']}"forrinresults)resp=client.chat.completions.create(model=MODEL,messages=[{"role":"system","content":"你是总结专家。基于各步骤结果,生成 Markdown 格式的完整报告。"},{"role":"user","content":f"任务:{task}\n\n各步骤结果:\n{ctx}\n\n请生成最终报告。"}],temperature=0.3,)final=resp.choices[0].message.contentprint(f"\n{'='*60}\n[最终报告]\n{'='*60}\n")print(final)returnfinal# ===========================================# 主流程# ===========================================defplan_and_execute(task:str):steps=generate_plan(task)print("\n"+"="*60+f"\n[Phase 2] 执行{len(steps)}步...\n"+"="*60)results=[]fori,stepinenumerate(steps,1):print(f"\n-- Step{i}/{len(steps)}:{step[:50]}... --")result=execute_step(step)results.append({"step":i,"task":step,"result":result})print(f" [Step{i}完成]{result[:100].replace(chr(10),' ')}...")final=summarize(task,results)returnfinalif__name__=="__main__":task=" ".join(sys.argv[1:])iflen(sys.argv)>1else\"帮我调研 LangChain 和 CrewAI,说明它们是什么、有什么区别"plan_and_execute(task)

运行结果示例

$ python lesson06_planning_agent.py "帮我调研 LangChain 和 CrewAI" ============================================================ [Phase 1] 制定计划... ============================================================ 1. 搜索 LangChain 的定义、核心功能和典型应用场景 2. 搜索 CrewAI 的定义、核心功能和典型应用场景 3. 对比分析 LangChain 和 CrewAI 的架构差异和适用场景 4. 生成对比分析报告,包括各自优劣势和选型建议 解析出 4 步 ============================================================ [Phase 2] 执行 4 步... ============================================================ -- Step 1/4: 搜索 LangChain -- -> search_info({"keyword":"LangChain"}) <- [langchain] LangChain 是开源 LLM 应用框架... [Step 1 完成] LangChain 是一个开源的大语言模型应用框架... -- Step 2/4: 搜索 CrewAI -- -> search_info({"keyword":"CrewAI"}) <- [crewai] CrewAI 是多 Agent 协作框架... [Step 2 完成] CrewAI 是一个多 Agent 协作框架... -- Step 3/4: 对比分析 -- [Step 3 完成] 两者核心差异:LangChain 通用框架,CrewAI 多 Agent... -- Step 4/4: 生成报告 -- [Step 4 完成] 基于前面的分析,以下是完整对比报告... ============================================================ [Phase 3] 汇总生成报告... ============================================================ [最终报告] ## LangChain vs CrewAI 技术对比 ### 一、各自定位 - LangChain:通用 LLM 应用开发框架,提供 Chain/Agent/Tool/Memory 等模块 - CrewAI:多 Agent 协作框架,通过角色分工实现复杂任务的团队化执行 ### 二、核心差异 ... ### 三、选型建议 - 需要灵活构建各类 LLM 应用 → LangChain - 需要多个 Agent 分工协作 → CrewAI - 两者可以组合使用

常见报错

问题原因解决
计划解析出 0 步LLM 输出格式不标准代码有兜底:直接用原任务
某步骤执行超限该步太复杂或工具数据不足调大max_iterations
最终报告空洞前几步没收集到有效信息丰富search_info的知识库

动手练习

  1. search_info的知识库扩充 10 条,验证大知识库对报告质量的影响
  2. 改成"人类确认"模式:计划出来先让你看看,同意再执行
  3. 对比同一个任务,分别用第 4 课(无规划)和本课(有规划)跑一次,记录结果质量差异

思考题

  1. Plan-then-Execute 最大的缺点是什么?(提示:如果计划本身有错误呢?)
  2. 如果 Agent 规划出 20 个步骤,你会怎么处理?
  3. “执行到第 3 步时发现第 1 步做错了” —— 怎么设计一个能自己修正的 Agent?

📦 完整代码

本课程所有代码已托管在 GitCode:

git clone git@gitcode.com:gcw_A202cbBm/ai-agent.git cd ai-agent/code

也可直接访问:https://gitcode.com/gcw_A202cbBm/ai-agent


下一篇预告:AI Agent 入门(七):提示工程 —— System Prompt、工具描述与 Few-shot 优化

最后一课,我们将回头审视整个系统——如何通过优化提示词让 Agent 更聪明、更可靠。


如果您觉得有用,欢迎点赞、转发、评论、关注