配音

规划模式(Planning)

课程简介

任务分解与动态规划,智能体自主编排执行步骤。

🎬 本课程视频:Agentic AI — AI 智能体设计模式


规划模式(Planning):自主分解与动态执行

一、为什么需要规划模式?

复杂的现实任务通常不能一步完成。假设你需要「撰写一份关于生成式 AI 市场机会的深度研究报告」——这个任务涉及市场数据收集、主要玩家分析、技术趋势研判、商业模型评估等多个维度。如果用传统方式,直接把任务丢给 LLM,生成的内容往往是泛泛而谈的综述,缺乏深度和针对性。

规划模式的核心思想是:先想清楚怎么做,再动手执行。这就像登山一样,专业的登山者不会直接往山顶冲,而是先研究路线、评估天气、准备装备、分阶段推进。每一步完成后再评估进展,调整下一步计划。

二、任务分解:规划的基石

2.1 什么是任务分解?

任务分解(Task Decomposition)是将复杂目标拆解为一系列可执行的子任务的过程。好的任务分解遵循以下原则:

  1. 独立性:每个子任务尽量独立,减少任务间的耦合
  2. 可执行性:每个子任务都能被单个工具调用或单次 LLM 推理完成
  3. 可验证性:每个子任务完成时都有明确的验收标准
  4. 层次性:任务可以继续分解为更细粒度的子任务

2.2 任务分解的方式

自顶向下分解:从最终目标出发,逐层分解。

最终目标:撰写 AI 市场报告

第一层分解:
├── 市场数据收集
├── 竞争格局分析
├── 技术趋势研究
└── 报告撰写与审核

第二层分解(以市场数据收集为例):
├── 搜索全球 AI 市场规模数据
├── 获取区域市场分布数据
├── 收集头部企业营收数据
└── 标注所有数据来源

自底向上聚合:先确定所有需要的子任务,再合并组织成完整计划。这种方式适合经验丰富的领域专家。

三、动态规划:应对不确定性

静态规划假设一切按计划进行,但现实世界充满不确定性。数据源可能不可用、中间结果可能不符合预期、外部环境可能变化。动态规划让智能体在执行过程中实时评估进展,根据实际情况调整后续步骤。

3.1 动态规划的决策点

在规划的每个执行步骤后,智能体都需要回答以下问题:

  1. 完成度评估:当前步骤的输出是否达到质量标准?
  2. 偏差检测:当前结果是否偏离了预期路径?
  3. 重规划决策:是否需要修改剩余计划?
  4. 资源评估:还有多少 Token 和时间预算?

3.2 重规划策略

当检测到需要重规划时,智能体可以选择以下策略:

四、Tree of Thoughts(思维树)

Tree of Thoughts 是规划模式的前沿技术之一,由普林斯顿大学的研究团队提出。它的核心思想是:不让 LLM 沿着单一的推理路径前进,而是同时探索多个可能的路径,形成一个「思维树」。

4.1 思维树的工作原理

初始问题
├── 思路 A ── 继续 A1 ── 继续 A1a
│           └── 继续 A2 ── 继续 A2a
│                        └── 继续 A2b
├── 思路 B ── 继续 B1 ── 继续 B1a
│           └── 继续 B2
└── 思路 C ── 继续 C1

在每个决策点,模型生成多个候选思路,评估每个思路的可行性,选择最有希望的路径继续探索。通过广度优先或深度优先搜索,在有限的搜索空间中找到最优解。

4.2 思维树的实现

评估标准:
- 确定性(sure):95%+ 确定这个方向正确
- 可能(likely):60-95% 可能正确
- 不确定(unsure):低于 60%

搜索策略:
- 广度优先(BFS):保持 K 个最优路径
- 深度优先(DFS):深入探索最优路径,遇到死胡同时回溯
- 束搜索(Beam Search):K 个路径保持一定的多样性

五、实际案例:构建 AI 研究报告系统

让我们通过一个实际案例来理解规划模式的应用:

def planning_agent(objective, max_steps=20):
    '''一个基于规划模式的智能体'''

    # 第一步:制定计划
    planning_prompt = f'''
    目标:{objective}

    请将上述目标分解为一系列可执行的步骤。
    每个步骤包含:
    - 步骤描述(step_description):这个步骤要做什么
    - 依赖步骤(dependencies):需要先完成的步骤编号
    - 预期产出(expected_output):期望的输出结果
    - 质量指标(quality_check):如何评判这个步骤是否成功

    返回 JSON 格式的计划。
    '''

    plan = llm_call(planning_prompt)

    completed_steps = []
    step_results = {}

    for step in range(max_steps):
        # 找到下一个可执行的步骤
        next_step = find_next_executable(plan, completed_steps, step_results)
        if next_step is None:
            break  # 所有步骤完成

        # 执行步骤
        result = execute_step(next_step, step_results)
        step_results[next_step.id] = result

        # 质量检查
        quality_check = check_quality(next_step, result)
        if not quality_check.passed:
            # 步骤未通过质量检查,进行修复或重规划
            if should_retry(quality_check):
                # 重试当前步骤
                result = execute_step(next_step, step_results, context=quality_check.feedback)
                step_results[next_step.id] = result
            else:
                # 需要重新规划
                plan = replan(plan, completed_steps, step_results, next_step)

        completed_steps.append(next_step)

        # 检查是否已经收集到足够信息可以结束
        if check_completion(plan, completed_steps):
            break

    # 生成最终输出
    final_output = synthesize_results(objective, step_results)
    return final_output

六、规划模式的最佳实践

6.1 何时使用规划模式

推荐使用
- 需要多步骤执行的任务
- 任务步骤之间存在依赖关系
- 不同步骤需要使用不同工具
- 输出质量要求高,需要分阶段验证

不建议使用
- 简单的一步式任务
- 对响应延迟有严格要求的实时场景
- 模型已经能够直接高质量完成的任务

6.2 减少规划开销

规划模式会引入额外的 Token 消耗和延迟。以下是减少开销的策略:

  1. 预定义模板:对于常见任务类型,预先编写任务分解模板,减少每次规划的计算
  2. 并行执行:可并行的子任务同时执行,减少总耗时
  3. 缓存计划:相似任务的计划可以缓存复用
  4. 自适应规划:简单任务直接执行,复杂任务启用规划

七、总结

规划模式让智能体从一次性输出进化为能够自主分解任务、动态调整执行策略的智能执行者。任务分解是规划的基石,动态规划让系统能够应对现实世界的不确定性,Tree of Thoughts 技术进一步提升了复杂推理任务的成功率。合理使用规划模式可以在不增加模型参数量的情况下显著提升复杂任务的完成质量。

七、实现一个规划 Agent 的 Python 框架

下面我们来看一个简化但完整的规划 Agent 实现:

class PlanningAgent:
    def __init__(self, llm, tools):
        self.llm = llm
        self.tools = tools
        self.plan = []
        self.results = {}

    def decompose(self, objective):
        """将目标分解为子任务"""
        prompt = f"""
        将以下目标分解为可执行的子任务列表:
        目标:{objective}
        要求:
        - 每个子任务应该简单到可以在一次 LLM 调用中完成
        - 标记子任务之间的依赖关系
        - 明确每个子任务的预期产出
        """
        response = self.llm.generate(prompt)
        self.plan = self.parse_tasks(response)
        return self.plan

    def execute(self, objective):
        self.decompose(objective)
        # 拓扑排序 - 按依赖关系执行
        while self.plan:
            ready = [t for t in self.plan if not t.dependencies]
            for task in ready:
                result = self.execute_task(task)
                self.results[task.id] = result
                self.plan.remove(task)
        return self.synthesize()

八、规划模式的评估

规划效果可以从以下维度评估:
- 分解合理性:子任务是否 MECE(相互独立、完全穷尽)
- 执行效率:计划步骤数 vs 实际最优步骤数
- 适应能力:遇到意外时能否有效调整计划
- 完成质量:最终输出是否达到目标要求

九、总结

规划模式让 AI 系统从“条件反射式”的响应升级为“深思熟虑式”的解决问题。

关键要点回顾:
- 静态规划适合执行路径固定的场景
- 动态规划更适合不确定性高的场景
- 任务分解遵循 MECE 原则
- Tree of Thoughts 探索多条推理路径
- 需要平衡规划的收益和 Token 成本

下节课我们将继续学习多智能体协作模式。

七、实现一个规划 Agent 的 Python 框架

下面我们来看一个简化但完整的规划 Agent 实现:

class PlanningAgent:
    def __init__(self, llm, tools):
        self.llm = llm
        self.tools = tools
        self.plan = []
        self.results = {}

    def decompose(self, objective):
        """将目标分解为子任务"""
        prompt = f"""
        将以下目标分解为可执行的子任务列表:
        目标:{objective}
        要求:
        - 每个子任务应该简单到可以在一次 LLM 调用中完成
        - 标记子任务之间的依赖关系
        - 明确每个子任务的预期产出
        """
        response = self.llm.generate(prompt)
        self.plan = self.parse_tasks(response)
        return self.plan

    def execute(self, objective):
        self.decompose(objective)
        # 拓扑排序 - 按依赖关系执行
        while self.plan:
            ready = [t for t in self.plan if not t.dependencies]
            for task in ready:
                result = self.execute_task(task)
                self.results[task.id] = result
                self.plan.remove(task)
        return self.synthesize()

八、规划模式的评估

规划效果可以从以下维度评估:
- 分解合理性:子任务是否 MECE(相互独立、完全穷尽)
- 执行效率:计划步骤数 vs 实际最优步骤数
- 适应能力:遇到意外时能否有效调整计划
- 完成质量:最终输出是否达到目标要求

九、总结

规划模式让 AI 系统从“条件反射式”的响应升级为“深思熟虑式”的解决问题。

关键要点回顾:
- 静态规划适合执行路径固定的场景
- 动态规划更适合不确定性高的场景
- 任务分解遵循 MECE 原则
- Tree of Thoughts 探索多条推理路径
- 需要平衡规划的收益和 Token 成本

下节课我们将继续学习多智能体协作模式。

七、实现一个规划 Agent 的 Python 框架

下面我们来看一个简化但完整的规划 Agent 实现:

class PlanningAgent:
    def __init__(self, llm, tools):
        self.llm = llm
        self.tools = tools
        self.plan = []
        self.results = {}

    def decompose(self, objective):
        """将目标分解为子任务"""
        prompt = f"""
        将以下目标分解为可执行的子任务列表:
        目标:{objective}
        要求:
        - 每个子任务应该简单到可以在一次 LLM 调用中完成
        - 标记子任务之间的依赖关系
        - 明确每个子任务的预期产出
        """
        response = self.llm.generate(prompt)
        self.plan = self.parse_tasks(response)
        return self.plan

    def execute(self, objective):
        self.decompose(objective)
        # 拓扑排序 - 按依赖关系执行
        while self.plan:
            ready = [t for t in self.plan if not t.dependencies]
            for task in ready:
                result = self.execute_task(task)
                self.results[task.id] = result
                self.plan.remove(task)
        return self.synthesize()

八、规划模式的评估

规划效果可以从以下维度评估:
- 分解合理性:子任务是否 MECE(相互独立、完全穷尽)
- 执行效率:计划步骤数 vs 实际最优步骤数
- 适应能力:遇到意外时能否有效调整计划
- 完成质量:最终输出是否达到目标要求

九、总结

规划模式让 AI 系统从“条件反射式”的响应升级为“深思熟虑式”的解决问题。

关键要点回顾:
- 静态规划适合执行路径固定的场景
- 动态规划更适合不确定性高的场景
- 任务分解遵循 MECE 原则
- Tree of Thoughts 探索多条推理路径
- 需要平衡规划的收益和 Token 成本

下节课我们将继续学习多智能体协作模式。

延伸阅读