今天我们继续学习Agent 中的计划生成器,通过这篇文章我们解决如下三个问题:
1)什么时候用 ReAct,什么时候用 Plan-and-Execute
2)Planner 应该怎样“拆解—执行—观测—再规划”?
3)如何在你的工程里快速落地(附 FastAPI + React AntD 最小可跑模板)。


一、为什么一定要上 Planner?

当任务具有多步骤多工具信息不完备时,单轮 LLM 往往会迷路。Planner 的职责是:分解目标 → 组织步骤 → 驱动执行 → 观测验证 → 必要时再规划。
它是 Agent 的节拍器调度大脑

典型场景

  • 技术调研:搜索 → 去重与评分 → 结构化笔记 → 生成报告/PPT
  • 运维诊断:Prometheus 拉取指标 → 对比 Grafana 面板 → 触发 HTTP 压测 → 收敛结论
  • RAG 流水线:解析文档 → 切分 → 向量化 → 检索 → 问答/摘要

二、两种主流范式与快速选型

1) ReAct(Reason + Act)

“边思考边行动”:思考 → 选工具 → 执行 → 观察 → 再思考 循环。

  • 优势:对动态/不确定信息更稳,路径可随观察自我修正
  • 代价:步数和成本不易控,易陷入“想太多”的循环

2) Plan-and-Execute(先计划、后执行)

先产出全局计划(可带里程碑/验收标准),再由执行器按计划推进,必要时触发再规划

  • 优势可控、可审计、可展示进度
  • 代价:初始信息不足时易偏航,必须设计好再规划触发器

3) 实战选型表

维度 ReAct Plan-and-Execute
任务不确定性 高(信息缺失多) 低(流程固定)
成本/时延预估 较难 较易(按步骤)
可观测/审计
适用案例 在线检索、多工具探索 报告流水线、数据管道

经验法则:探索/信息不足→先 ReAct;流程固化/要可视化进度→Plan-and-Execute,并保留再规划“逃生门”。


三、落地架构(建议照此搭骨架)


四、可直接复用的 Prompt 片段

System(基线)

你是一个严谨的 Agent Planner。目标:将复杂任务拆成可验证的小步骤,
并在成本、时延与成功率之间平衡。
要求每步包含:step_name, intent, tool, inputs, expected_output, success_criteria。
计划需给出:overall_acceptance, 预算上限与风险项。
仅能使用提供的工具目录与参数 schema.

ReAct 循环

[思考] 当前子目标:{sub_goal}
[计划] 候选工具与原因:{tool_ranking}
[行动] 调用:{tool_name} 参数:{params}
[观察] 得到:{observation}
[评估] 是否满足 success_criteria?若否,更新子目标/工具并继续。

Plan 阶段(一次性计划)

为任务“{user_goal}”生成不超过 {max_steps} 步的执行计划。
每步输出:step_name, intent, tool, inputs, expected_output, success_criteria。
计划末尾输出:overall_acceptance, risk_list, fallback 策略。

Execute 阶段

按第 {i} 步执行,必要时调用工具。
输出:observation, achieved?, next_step_suggestion。
若连续失败≥{k}次或验证不通过→请求再规划。

再规划触发器(规则+LLM 混合更稳)

输入:observation, fail_count, 验证结果。
若满足任一规则→返回 "REPLAN" 并说明变更;否则 "CONTINUE"。
五、最小可跑模板(FastAPI + React AntD)
这套模板默认“离线可跑”:内置两个假工具(prom_query/http_probe),方便你本地验证流程。上线时把它们换成真实接口即可。
目录建议:
planner-demo/
├─ backend/
│  ├─ app.py
│  └─ requirements.txt
└─ frontend/
└─ src/PlanConsole.tsx
  1. backend/requirements.txt
fastapi==0.112.2
uvicorn==0.30.6
pydantic==2.8.2

说明:为了“即装即跑”,这里用纯 Python 有限状态机实现(不强依赖 LangGraph)。你要接 LangGraph 很简单,把执行循环换成 graph.invoke 即可。

  1. backend/app.py
from fastapi import FastAPI
from pydantic import BaseModel, Field
from typing import Any, Dict, List, Optional, Literal
from fastapi.middleware.cors import CORSMiddleware
# ---------- 假工具(换成你的真实接口) ----------
class ToolResult(BaseModel):
ok: bool
data: Any = None
error: Optional[str] = None
cost: float = 0.0
def http_probe(url: str, qps: int, duration_s: int) -> ToolResult:
# TODO: 替换成你的压测/HTTP 客户端
return ToolResult(ok=True, data={"status": 200, "latency_p95_ms": 120})
def prom_query(expr: str, lookback: str = "5m") -> ToolResult:
# TODO: 替换成你的 Prometheus API
return ToolResult(ok=True, data={"value": 0.012})
TOOLS = {
"http_probe": {"call": http_probe, "schema": {"url": str, "qps": int, "duration_s": int}},
"prom_query": {"call": prom_query, "schema": {"expr": str, "lookback": str}},
}
# ---------- 计划与状态 ----------
class Step(BaseModel):
step_name: str
intent: str
tool: Literal["http_probe","prom_query","none"]
inputs: Dict[str, Any] = Field(default_factory=dict)
expected_output: str = ""
success_criteria: str = ""
class State(BaseModel):
user_goal: str
mode: Literal["react","plan_execute"] = "plan_execute"
plan: List[Step] = Field(default_factory=list)
step_idx: int = 0
observation: str = ""
retries: int = 0
done: bool = False
logs: List[str] = Field(default_factory=list)
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]
)
# ---------- 简单 Planner ----------
@app.post("/api/plan", response_model=State)
def make_plan(payload: Dict[str, Any]):
goal = payload.get("user_goal", "评估接口健康度")
mode = payload.get("mode", "plan_execute")
state = State(user_goal=goal, mode=mode)
# 真实环境应调用 LLM 产出计划;这里给一个可跑示例
state.plan = [
Step(
step_name="Check error rate",
intent="Pull error ratio from Prom",
tool="prom_query",
inputs={"expr":"rate(http_requests_errors_total[5m])","lookback":"5m"},
expected_output="current error ratio",
success_criteria="得到非空数值"
),
Step(
step_name="Run HTTP probe",
intent="Baseline API latency",
tool="http_probe",
inputs={"url":"https://example.com/api/health","qps":20,"duration_s":10},
expected_output="p95 latency",
success_criteria="状态码200 且得到p95"
),
]
state.logs.append("Plan created with 2 steps.")
return state
# ---------- 执行器(单步推进) ----------
@app.post("/api/execute", response_model=State)
def execute_step(state: State):
if state.done or state.step_idx >= len(state.plan):
state.done = True
state.logs.append("No more steps.")
return state
step = state.plan[state.step_idx]
if step.tool == "none":
state.observation = "No-op."
state.step_idx += 1
state.retries = 0
state.logs.append(f"Step {state.step_idx} no-op.")
return state
tool_entry = TOOLS.get(step.tool)
if not tool_entry:
state.observation = f"Unknown tool: {step.tool}"
state.logs.append(state.observation)
state.retries += 1
return state
try:
result: ToolResult = tool_entry["call"](**step.inputs)
if result.ok:
state.observation = f"OK: {result.data}"
state.logs.append(f"Step {state.step_idx} success. obs={result.data}")
state.step_idx += 1
state.retries = 0
else:
state.observation = f"ERR: {result.error}"
state.logs.append(f"Step {state.step_idx} failed. err={result.error}")
state.retries += 1
# 简易再规划:重试>=2时降级参数
if state.retries >= 2 and step.tool == "http_probe":
step.inputs["qps"] = max(5, int(step.inputs.get("qps", 20) * 0.5))
state.logs.append(f"Replan: reduce QPS to {step.inputs['qps']}.")
state.retries = 0
if state.step_idx >= len(state.plan):
state.done = True
state.logs.append("All steps completed.")
except Exception as e:
state.observation = f"EXC: {e}"
state.logs.append(state.observation)
state.retries += 1
return state

运行

cd backend
pip install -r requirements.txt
uvicorn app:app --reload --port 8000

3) frontend/src/PlanConsole.tsx(React 18 + Ant Design)

import { useState } from "react";
import { Card, Steps, Button, Space, Typography, Tag, message } from "antd";
type StepItem = {
step_name: string;
intent: string;
tool: string;
inputs: Record<string, any>;
expected_output: string;
success_criteria: string;
};
type State = {
user_goal: string;
mode: "react" | "plan_execute";
plan: StepItem[];
step_idx: number;
observation: string;
retries: number;
done: boolean;
logs: string[];
};
const endpoint = "http://localhost:8000";
export default function PlanConsole() {
const [state, setState] = useState<State | null>(null);
const [loading, setLoading] = useState(false);
const [goal] = useState("评估接口健康度并输出结论");
const createPlan = async () => {
setLoading(true);
try {
const res = await fetch(`${endpoint}/api/plan`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ user_goal: goal, mode: "plan_execute" })
});
const data = await res.json();
setState(data);
} catch {
message.error("创建计划失败");
} finally {
setLoading(false);
}
};
const runStep = async () => {
if (!state) return;
setLoading(true);
try {
const res = await fetch(`${endpoint}/api/execute`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(state)
});
const data = await res.json();
setState(data);
} catch {
message.error("执行失败");
} finally {
setLoading(false);
}
};
return (
<Card title="Planner 控制台(最小可跑)">
<Space direction="vertical" size="large" style={{ width: "100%" }}>
<Space>
<Button type="primary" onClick={createPlan} loading={loading}>
生成计划
</Button>
<Button onClick={runStep} disabled={!state || state.done} loading={loading}>
执行下一步
</Button>
</Space>
{state && (
<>
<Typography.Text>目标:{state.user_goal}</Typography.Text>
<Steps
current={Math.min(state.step_idx, state.plan.length - 1)}
items={state.plan.map((s, i) => ({
title: s.step_name,
status:
i < state.step_idx ? "finish" :
i === state.step_idx && !state.done ? "process" : "wait",
description: (
<div>
<div>意图:{s.intent}</div>
<div>工具:<Tag>{s.tool}</Tag></div>
<div>验证:{s.success_criteria}</div>
</div>
)
}))}
/>
<Card size="small" title="Observation / Logs">
<Typography.Paragraph>
<b>Observation:</b>{state.observation || "-"}
</Typography.Paragraph>
<Typography.Paragraph type="secondary">
{state.logs.map((l, idx) => <div key={idx}>• {l}</div>)}
</Typography.Paragraph>
</Card>
</>
)}
</Space>
</Card>
);
}

前端接入:把该组件挂到你的 AntD 页面即可。上线后可改为 WebSocket 推送 实时更新 observationstatus

六、监控与评估指标(建议接入)

  • 成功率/平均步数/每步失败率/再规划触发率
  • 成本与时延:工具调用次数、token 成本、95/99 分位耗时
  • 质量:success_criteria 达标率、误报/漏报
  • 可观测性:全链路日志(Prompt、工具入参/出参、判定)、可回放

七、落地 Checklist(工程视角)

  • 工具入参 schema 白名单参数校验
  • 最大步数/超时/费用限额
  • 再规划触发规则:连续失败、关键字段缺失、低置信度
  • 结构化沉淀:把稳定策略固化为模板(Case-Based Planning)
  • 审计视图:导出执行轨迹/报告
  • 短期/长期记忆联动(观察写入短期记忆,结构化知识入向量库)

八、常见坑与规避

  • 过度规划:步骤太细 → 设“最少信息可完成”粒度
  • 无限循环:ReAct 无硬阈值 → 必配步数/时长上限
  • 工具误用:描述不清 → 工具卡片写清“何时用/不用”+反例
  • 幻觉入参:强制参数校验 + 必要时二次确认
  • 计划偏航:设置“验收标准”与“再规划门


总结

ReAct 解决不确定环境下的“即时适应”,Plan-and-Execute提供“可控与可审计”。把二者用“再规划门”串起来,你的 Agent 就具备既灵活又可控的决策与执行力。

想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2025 年 AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享

👇👇扫码免费领取全部内容👇👇

一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势

想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI

1. 100+本大模型方向电子书

在这里插入图片描述

2. 26 份行业研究报告:覆盖多领域实践与趋势

报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:

  • 职业趋势:《AI + 职业趋势报告》《中国 AI 人才粮仓模型解析》;
  • 商业落地:《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》;
  • 领域细分:《AGI 在金融领域的应用报告》《AI GC 实践案例集》;
  • 行业监测:《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。

3. 600+套技术大会 PPT:听行业大咖讲实战

PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:

在这里插入图片描述

  • 安全方向:《端侧大模型的安全建设》《大模型驱动安全升级(腾讯代码安全实践)》;
  • 产品与创新:《大模型产品如何创新与创收》《AI 时代的新范式:构建 AI 产品》;
  • 多模态与 Agent:《Step-Video 开源模型(视频生成进展)》《Agentic RAG 的现在与未来》;
  • 工程落地:《从原型到生产:AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。

二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走

想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!

1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位

面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析

2. 102 道 AI 大模型真题:直击大模型核心考点

针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:

3. 97 道 LLMs 真题:聚焦大型语言模型高频问题

专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:


三、路线必明: AI 大模型学习路线图,1 张图理清核心内容

刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!

在这里插入图片描述

路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。

img

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

img

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

img

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

img

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

img

L5阶段:专题集丨特训篇 【录播课】

img
四、资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

👇👇扫码免费领取全部内容👇👇

2025 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐