第01章 为什么规划很难:从命令到目标的跨越

第01章 为什么规划很难:从命令到目标的跨越

“给一个工人一把锤子,他会钉钉子。给他一座房子要建,他就需要规划。AI Agent面临的正是后者。” —— 自动规划领域研究者


你告诉一个 Agent:“帮我写一份竞品分析报告。”

这不是一个命令——这是一个目标。在目标和可执行动作之间,横亘着一个巨大的鸿沟。怎么收集竞品信息?收集哪些维度?先写哪部分?如果某个网站访问失败怎么办?格式要求是什么?

规划,就是填平这个鸿沟的能力。它是 Agent 从"工具调用机器"升级为"自主智能体"的关键跨越。


1.1 命令执行 vs. 目标规划:根本区别

# ====================================================
# 对比:命令执行模式 vs. 目标规划模式
# ====================================================

# ---- 模式一:命令执行(传统Assistant)----
# 用户给出精确指令,Agent逐条执行

class CommandExecutor:
    """命令执行模式:一问一答,无规划能力"""
    
    async def execute(self, command: str) -> str:
        # 每次调用都是独立的,无记忆,无规划
        # 用户必须把任务分解好,才能交给Agent
        response = await openai_call(command)
        return response

# 使用方式:用户自己做规划
steps = [
    "搜索竞品A的功能列表",
    "搜索竞品B的定价页面",
    "总结以上信息成表格",
    "生成报告大纲",
    "写报告第一节",
    # ... 用户必须想清楚所有步骤
]
for step in steps:
    result = await executor.execute(step)


# ---- 模式二:目标规划(Planning Agent)----
# 用户给出高层目标,Agent自己分解并执行

class PlanningAgent:
    """目标规划模式:接收目标,自主制定并执行计划"""
    
    async def pursue_goal(self, goal: str) -> str:
        # 第一步:理解目标
        goal_analysis = await self.analyze_goal(goal)
        
        # 第二步:制定计划(这是关键!)
        plan = await self.create_plan(goal_analysis)
        
        # 第三步:执行计划(可能动态调整)
        result = await self.execute_plan(plan)
        
        return result

# 使用方式:用户只需说清楚目标
agent = PlanningAgent()
report = await agent.pursue_goal(
    "帮我写一份关于AI Agent平台的竞品分析,"
    "对比Langchain、LlamaIndex、CrewAI三家,"
    "重点分析功能完整性、定价和开发者体验"
)

# ====================================================
# 核心区别总结
# ====================================================

DIFFERENCE = {
    "命令执行": {
        "谁来规划": "用户",
        "Agent的角色": "执行器",
        "灵活性": "低(计划刚性,无法应对意外)",
        "适用场景": "步骤清晰、不会变化的固定流程",
        "失败方式": "用户没想清楚 → 执行了错误的步骤",
    },
    "目标规划": {
        "谁来规划": "Agent自己",
        "Agent的角色": "自主体",
        "灵活性": "高(可动态调整、重规划)",
        "适用场景": "复杂、多步骤、结果不确定的任务",
        "失败方式": "规划器质量不足 → 生成了坏计划",
    }
}

1.2 规划失败的七大根源

# ====================================================
# 规划失败案例分析
# ====================================================

import asyncio
from openai import AsyncOpenAI

client = AsyncOpenAI()

# ---- 失败根源 1:目标不明确 ----

async def demo_unclear_goal():
    """模糊目标会导致规划方向错误"""
    
    vague_goal = "帮我分析一下市场"
    # Agent可能理解为:
    # - 分析股票市场?
    # - 分析某产品的目标市场?
    # - 分析竞争对手的市场份额?
    
    clear_goal = "分析2026年中国AI Agent SaaS市场,重点关注企业用户规模和头部厂商份额"
    
    # 教训:规划的第一步是澄清目标,而不是立即分解任务
    
    response = await client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "你是一个规划助手。分析以下目标是否清晰,如不清晰请列出歧义点。"},
            {"role": "user", "content": f"目标:{vague_goal}"}
        ]
    )
    print("目标分析:", response.choices[0].message.content)


# ---- 失败根源 2:步骤粒度错误 ----

# 粒度太粗:无法执行
bad_plan_too_coarse = [
    "Step 1: 了解竞品",   # 太模糊,不知道怎么执行
    "Step 2: 写报告",     # 太模糊,从哪里开始?
]

# 粒度太细:效率极低,难以跟踪
bad_plan_too_fine = [
    "打开浏览器",
    "在地址栏输入google.com",
    "按下回车键",
    "在搜索框输入关键词",
    "点击搜索按钮",
    # ... 几百个步骤
]

# 正确粒度:一步对应一个可测试、可完成的工作单元
good_plan = [
    "搜索竞品A的官网,提取产品功能列表",    # 1个工具调用可完成
    "搜索竞品B的定价页,提取价格信息",      # 1个工具调用可完成
    "对比功能和价格,生成结构化比较表",      # 1次LLM调用可完成
    "基于比较表,生成分析报告",            # 1次LLM调用可完成
]


# ---- 失败根源 3:忽略前提条件 ----

async def demo_missing_preconditions():
    """忽略步骤前提条件导致执行失败"""
    
    # 错误计划:直接写报告,没检查信息是否充分
    broken_plan = [
        "写竞品分析报告",  # 失败!没有数据,什么都写不出来
    ]
    
    # 正确计划:先满足前提条件
    correct_plan = [
        {
            "step": "收集竞品信息",
            "preconditions": [],  # 无前提
            "outputs": ["competitor_data"],
        },
        {
            "step": "验证数据完整性",
            "preconditions": ["competitor_data"],  # 需要上一步完成
            "outputs": ["validated_data"],
        },
        {
            "step": "生成分析报告",
            "preconditions": ["validated_data"],  # 需要上一步完成
            "outputs": ["final_report"],
        },
    ]
    
    return correct_plan


# ---- 失败根源 4:不考虑工具局限 ----

TOOL_LIMITATIONS = {
    "web_search": {
        "限制": "无法访问需要登录的页面",
        "错误计划": "搜索competitor的内部定价文档",
        "正确做法": "搜索公开定价页面,必要时说明数据不完整",
    },
    "code_execution": {
        "限制": "无法访问外部网络",
        "错误计划": "运行代码直接调用第三方API",
        "正确做法": "生成代码让用户在本地运行,或使用有网络权限的工具",
    },
    "file_operations": {
        "限制": "只能访问指定目录",
        "错误计划": "读取用户根目录下的所有文件",
        "正确做法": "只操作工作目录内的文件",
    },
}


# ---- 失败根源 5:对结果没有验证 ----

async def plan_without_validation():
    """没有中间验证的计划,错误会级联放大"""
    
    # 每一步都需要验证,而不是假设成功
    
    async def execute_with_validation(step: str, expected_output_type: str) -> dict:
        result = await execute_step(step)
        
        # 验证结果
        if not result:
            raise ValueError(f"步骤 '{step}' 返回空结果")
        
        if expected_output_type == "list" and not isinstance(result, list):
            raise TypeError(f"期望列表,得到 {type(result)}")
            
        return {"status": "success", "output": result}
    
    plan = [
        ("搜索竞品列表", "list"),
        ("提取每个竞品的功能", "dict"),
        ("生成比较矩阵", "dataframe"),
    ]
    
    results = []
    for step, output_type in plan:
        try:
            result = await execute_with_validation(step, output_type)
            results.append(result)
        except Exception as e:
            print(f"步骤失败,需要重规划:{e}")
            # 触发重规划逻辑
            break
    
    return results


async def execute_step(step: str) -> any:
    """模拟执行步骤"""
    return {"result": f"执行了: {step}"}


# ---- 失败根源 6:无法处理并发 ----

async def sequential_vs_parallel():
    """串行 vs. 并行执行对比"""
    
    import time
    
    # 串行执行(效率低)
    async def sequential_search():
        start = time.time()
        result_a = await search("竞品A功能")    # 等待3秒
        result_b = await search("竞品B功能")    # 再等3秒
        result_c = await search("竞品C功能")    # 再等3秒
        elapsed = time.time() - start
        print(f"串行执行耗时: {elapsed:.1f}秒")  # ~9秒
        return [result_a, result_b, result_c]
    
    # 并行执行(规划器识别无依赖关系)
    async def parallel_search():
        start = time.time()
        results = await asyncio.gather(
            search("竞品A功能"),    # 同时开始
            search("竞品B功能"),    # 同时开始
            search("竞品C功能"),    # 同时开始
        )
        elapsed = time.time() - start
        print(f"并行执行耗时: {elapsed:.1f}秒")  # ~3秒
        return list(results)
    
    # 规划器需要识别:这三步之间没有依赖关系 → 可以并行
    # 这是规划质量的重要指标之一


async def search(query: str) -> str:
    """模拟搜索操作"""
    await asyncio.sleep(3)
    return f"搜索结果: {query}"


# ---- 失败根源 7:过度规划(Analysis Paralysis)----

OVER_PLANNING_EXAMPLE = """
目标:发一条推文

糟糕的过度规划:
1. 市场调研推文效果最佳发布时间
2. A/B测试10个不同文案版本
3. 分析目标受众画像
4. 制定内容日历
5. 设计配图风格指南
6. 规划话题标签策略
... (计划本身花了比写推文更多的时间)

合适的规划:
1. 确定推文主题
2. 起草文案(<280字符)
3. 选择相关话题标签
4. 发布
"""

1.3 规划能力的三个层次

# ====================================================
# Agent规划能力分级模型
# ====================================================

from dataclasses import dataclass
from typing import List, Optional
from enum import Enum

class PlanningLevel(Enum):
    REACTIVE = 1      # 反应式:无规划
    DELIBERATIVE = 2  # 审慎式:有规划
    METACOGNITIVE = 3 # 元认知式:对规划本身进行规划


@dataclass
class AgentCapability:
    level: PlanningLevel
    description: str
    example: str
    limitations: List[str]


PLANNING_LEVELS = [
    AgentCapability(
        level=PlanningLevel.REACTIVE,
        description="接到指令立即执行,无任何前瞻性思考",
        example="""
# Level 1: 反应式Agent
async def reactive_agent(user_input: str) -> str:
    # 直接把输入扔给LLM,不做任何规划
    response = await client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": user_input}]
    )
    return response.choices[0].message.content

# 特点:简单、快速,但无法处理复杂多步骤任务
result = await reactive_agent("帮我分析这份500页的财务报告")
# 结果:直接尝试"分析",但不知道如何分块、不知道重点,质量极差
        """,
        limitations=[
            "无法分解复杂任务",
            "无法处理多步骤依赖",
            "遇到障碍不知如何调整",
            "无法利用工具完成超出单次调用的任务",
        ]
    ),
    
    AgentCapability(
        level=PlanningLevel.DELIBERATIVE,
        description="在执行前先制定计划,按计划执行,遇到问题可以重规划",
        example="""
# Level 2: 审慎式Agent
async def deliberative_agent(goal: str) -> str:
    # 步骤1:分析目标,制定计划
    plan = await create_plan(goal)
    print(f"制定计划: {[s['title'] for s in plan]}")
    
    # 步骤2:按计划执行,跟踪进度
    results = []
    for step in plan:
        try:
            result = await execute_step(step)
            results.append(result)
        except Exception as e:
            # 步骤3:遇到障碍,动态重规划
            new_steps = await replan(step, e, results)
            plan = plan[:plan.index(step)] + new_steps + plan[plan.index(step)+1:]
    
    # 步骤4:综合结果
    return await synthesize(results)

# 特点:能处理中等复杂度任务,有基本的错误恢复能力
        """,
        limitations=[
            "规划质量受限于LLM能力",
            "无法进行前瞻性风险评估",
            "在高度不确定环境中可能规划失效",
        ]
    ),
    
    AgentCapability(
        level=PlanningLevel.METACOGNITIVE,
        description="不仅规划任务,还评估规划质量、预测风险、优化规划策略",
        example="""
# Level 3: 元认知式Agent
async def metacognitive_agent(goal: str) -> str:
    # 步骤1:分析目标
    goal_analysis = await analyze_goal(goal)
    
    # 步骤2:生成多个候选计划
    candidate_plans = await generate_multiple_plans(goal_analysis, n=3)
    
    # 步骤3:评估每个计划(元认知!)
    plan_scores = []
    for plan in candidate_plans:
        score = await evaluate_plan(plan, criteria=[
            "可行性", "效率", "鲁棒性", "资源消耗"
        ])
        plan_scores.append((plan, score))
    
    # 步骤4:选择最优计划
    best_plan = max(plan_scores, key=lambda x: x[1]["total_score"])[0]
    
    # 步骤5:执行,持续监控并调整
    return await execute_with_monitoring(best_plan)

# 特点:高质量规划,强鲁棒性,接近人类专家水平
        """,
        limitations=[
            "计算成本高",
            "延迟较大(需要多轮LLM调用)",
            "实现复杂度高",
        ]
    ),
]


# ====================================================
# 本书的覆盖范围
# ====================================================

BOOK_COVERAGE = {
    "第1-4章": "掌握 Level 2(审慎式)的核心技术",
    "第5-8章": "实现 Level 2 的高级特性(依赖图、动态重规划、树形搜索)",
    "第9-11章": "工程实践:让规划系统真正可用",
    "第12章": "展望 Level 3(元认知式)的前沿方向",
}

1.4 衡量规划质量的基准框架

# ====================================================
# 规划质量评估框架(贯穿全书)
# ====================================================

from typing import Dict, Any
import json

async def evaluate_plan_quality(
    goal: str,
    plan: list,
    model: str = "gpt-4o"
) -> Dict[str, Any]:
    """
    用LLM评估规划质量的简单框架
    后续章节会深入展开每个维度
    """
    
    evaluation_prompt = f"""
请评估以下行动计划的质量。

目标:{goal}

计划:
{json.dumps(plan, ensure_ascii=False, indent=2)}

请从以下5个维度评分(1-10分),并给出具体理由:

1. **完整性**:计划是否覆盖了实现目标所需的所有关键步骤?
2. **可行性**:每个步骤是否真实可执行,前提条件是否满足?
3. **效率**:是否有不必要的步骤?是否错过了可并行的机会?
4. **鲁棒性**:计划是否考虑了可能的失败情况和备选方案?
5. **清晰度**:每个步骤的描述是否清晰,执行者能否理解并独立完成?

以JSON格式返回评分结果。
"""
    
    response = await client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": evaluation_prompt}],
        response_format={"type": "json_object"}
    )
    
    evaluation = json.loads(response.choices[0].message.content)
    
    # 计算总分
    scores = [v for k, v in evaluation.items() if k.endswith("_score")]
    evaluation["total_score"] = sum(scores) / len(scores) if scores else 0
    
    return evaluation


# ---- 快速测试 ----
async def main():
    goal = "写一份AI竞品分析报告"
    
    # 一个糟糕的计划
    bad_plan = [
        {"step": "了解市场", "action": "搜索"},
        {"step": "写报告", "action": "写作"},
    ]
    
    # 一个较好的计划
    good_plan = [
        {"step": "明确分析范围", "action": "与用户确认竞品名单和分析维度"},
        {"step": "收集竞品A信息", "action": "搜索官网、文档、用户评价"},
        {"step": "收集竞品B信息", "action": "搜索官网、文档、用户评价"},
        {"step": "收集竞品C信息", "action": "搜索官网、文档、用户评价"},
        {"step": "建立比较矩阵", "action": "对齐功能、定价、优劣势"},
        {"step": "生成分析报告", "action": "基于矩阵撰写结构化报告"},
        {"step": "验证与修订", "action": "检查数据准确性,完善结论"},
    ]
    
    print("评估糟糕计划:")
    bad_score = await evaluate_plan_quality(goal, bad_plan)
    print(json.dumps(bad_score, ensure_ascii=False, indent=2))
    
    print("\n评估较好计划:")
    good_score = await evaluate_plan_quality(goal, good_plan)
    print(json.dumps(good_score, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    asyncio.run(main())

本章小结

  1. 规划是 Agent 的核心能力:从命令执行到目标规划,是 Agent 从工具到自主体的质变。没有规划,Agent 只能做简单、线性、用户已想清楚的任务。

  2. 规划失败有迹可循:七大失败根源(目标模糊、粒度错误、忽略前提、工具局限、缺少验证、无法并发、过度规划),每一个都有对应的工程解法,本书将逐一覆盖。

  3. 规划能力分三层:反应式 → 审慎式 → 元认知式。大多数实用系统处于 Level 2,追求 Level 3 是方向,但需权衡成本。

  4. 质量评估是规划系统的基础设施:完整性、可行性、效率、鲁棒性、清晰度——五个维度缺一不可,贯穿全书。

  5. 先理解难点,再学解法:规划之所以难,是因为它需要 Agent 具备目标理解、知识推理、工具感知、不确定性处理等多项综合能力。后续章节将分模块深入讲解。

# 核心行动:建立你的第一个规划评估基线
import asyncio
from openai import AsyncOpenAI

async def your_first_planning_baseline():
    """
    在你的项目中,选取一个真实任务,
    用本章的评估框架衡量现有方案的规划质量。
    这将成为后续优化的基准线。
    """
    client = AsyncOpenAI()
    
    # 替换为你的真实场景
    your_goal = "你的Agent需要完成的目标"
    your_current_plan = [
        {"step": "步骤1", "action": "具体行动"},
        # ... 你现有的方案
    ]
    
    score = await evaluate_plan_quality(your_goal, your_current_plan)
    print(f"当前规划质量评分: {score.get('total_score', 0):.1f}/10")
    print("这是你的优化起点。")

asyncio.run(your_first_planning_baseline())

本章提示词模板

【模板1:目标澄清提示词】
你是一个规划助手。用户给出了以下目标,但可能不够清晰:
目标:{user_goal}

请分析:
1. 这个目标中有哪些歧义或不明确之处?
2. 为了制定有效的计划,你需要用户回答哪些澄清问题?(最多3个最重要的问题)
3. 如果用户无法进一步澄清,你会如何做出合理假设?

以结构化格式回答,包含"歧义点"、"澄清问题"和"默认假设"三个部分。
【模板2:计划质量自检提示词】
请检查以下行动计划的质量,作为一个批判性审查者:

目标:{goal}
计划:{plan_json}

逐步检查:
1. 每个步骤的前提条件是否明确且可满足?
2. 步骤之间的依赖关系是否正确?有没有顺序错误?
3. 有哪些步骤可以并行执行以提高效率?
4. 哪些步骤最可能失败?失败时应该怎么处理?
5. 整个计划完成后,目标是否会被完全实现?有没有遗漏?

给出具体的改进建议,而不仅仅是评分。

→ 第02章:任务分解:把复杂目标拆成可执行步骤