智能体设计模式

第6章:规划

通过面向目标的规划和行动序列在AI智能体中开发战略思维能力

第6章:规划

智能行为通常不仅仅是对即时输入的反应。它需要远见、将复杂任务分解为更小、可管理的步骤,以及制定如何实现期望结果的策略。这就是规划模式发挥作用的地方。从核心来说,规划是智能体或智能体系统制定行动序列以从初始状态向目标状态移动的能力。

规划模式概述

在AI的背景下,将规划智能体视为您委托复杂目标的专家是有帮助的。当您要求它"组织团队场外活动"时,您定义的是"什么"——目标及其约束——而不是"如何"。智能体的核心任务是自主制定实现该目标的路线。它必须首先理解初始状态(如预算、参与者数量、期望日期)和目标状态(成功预订的场外活动),然后发现连接它们的最优行动序列。计划不是预先知道的;它是响应请求而创建的。

这个过程的一个标志是适应性。初始计划仅仅是一个起点,而不是严格的脚本。智能体的真正力量是其整合新信息并引导项目绕过障碍的能力。例如,如果首选场地变得不可用或选择的餐饮服务商被完全预订,有能力的智能体不会简单地失败。它会适应。它记录新的约束,重新评估其选项,并制定新计划,也许通过建议替代场地或日期。

然而,认识到灵活性和可预测性之间的权衡至关重要。动态规划是一个特定工具,不是通用解决方案。当问题的解决方案已经被充分理解且可重复时,将智能体限制在预定的、固定的工作流中更有效。这种方法限制智能体的自主性以减少不确定性和不可预测行为的风险,保证可靠和一致的结果。因此,使用规划智能体与简单任务执行智能体的决定取决于一个问题:"如何"需要被发现,还是已经知道?

实际应用和用例

规划模式是自主系统中的核心计算过程,使智能体能够综合行动序列以实现指定目标,特别是在动态或复杂环境中。此过程将高级目标转换为由离散、可执行步骤组成的结构化计划。

在程序化任务自动化等领域,规划用于编排复杂的工作流。例如,像新员工入职这样的业务流程可以分解为有向的子任务序列,如创建系统账户、分配培训模块以及与不同部门协调。智能体生成计划以逻辑顺序执行这些步骤,调用必要工具或与各种系统交互以管理依赖关系。

在机器人和自主导航中,规划对于状态空间遍历是基础的。系统,无论是物理机器人还是虚拟实体,必须生成路径或行动序列以从初始状态转换到目标状态。这涉及优化时间或能耗等指标,同时遵守环境约束,如避免障碍或遵循交通规则。

这种模式对于结构化信息综合也是关键的。当被要求生成像研究报告这样的复杂输出时,智能体可以制定包括信息收集、数据总结、内容构建和迭代完善等不同阶段的计划。同样,在涉及多步问题解决的客户支持场景中,智能体可以创建并遵循诊断、解决方案实施和升级的系统计划。

本质上,规划模式允许智能体超越简单的反应性行动,实现面向目标的行为。它提供了解决需要相互依赖操作连贯序列的问题所必需的逻辑框架。

实践代码(Crew AI)

以下部分将演示使用Crew AI框架实现规划器模式。此模式涉及首先制定多步计划以解决复杂查询,然后顺序执行该计划的智能体。

import os
from dotenv import load_dotenv
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI

# 从.env文件加载环境变量以确保安全
load_dotenv()

# 1. 明确定义语言模型以确保清晰
llm = ChatOpenAI(model="gpt-4-turbo")

# 2. 定义清晰且专注的智能体
planner_writer_agent = Agent(
    role='文章规划者和写作者',
    goal='规划然后撰写关于指定主题的简洁、引人入胜的摘要。',
    backstory=(
        '你是一位经验丰富的内容策略师和作家,专门将复杂主题转化为'
        '易于理解且引人入胜的内容。你擅长制定详细计划并执行它们。'
    ),
    verbose=True,
    allow_delegation=False,
    llm=llm
)

# 3. 定义规划任务
planning_task = Task(
    description=(
        '为关于"{topic}"的文章制定详细计划。'
        '计划应包括:'
        '1. 主要部分和子部分'
        '2. 每个部分的关键点'
        '3. 信息收集策略'
        '4. 目标受众考虑'
        '5. 预期长度和结构'
        '输出应该是结构化的计划,可以作为后续写作任务的指南。'
    ),
    expected_output='关于指定主题的详细、结构化文章计划',
    agent=planner_writer_agent
)

# 4. 定义写作任务
writing_task = Task(
    description=(
        '基于规划任务中制定的计划,撰写关于"{topic}"的简洁、引人入胜的文章。'
        '文章应该:'
        '- 遵循计划中概述的结构'
        '- 包含所有关键点'
        '- 适合目标受众'
        '- 具有吸引人的标题和副标题'
        '- 长度适中(约500-800字)'
        '- 包含相关示例或案例研究'
    ),
    expected_output='关于指定主题的完整、结构化的文章',
    agent=planner_writer_agent
)

# 5. 创建crew
content_creation_crew = Crew(
    agents=[planner_writer_agent],
    tasks=[planning_task, writing_task],
    process=Process.sequential,
    verbose=True
)

# 6. 执行crew
def create_content(topic: str):
    """为给定主题创建内容"""
    print(f"开始为'{topic}'创建内容...")
    
    # 使用主题更新任务描述
    planning_task.description = planning_task.description.format(topic=topic)
    writing_task.description = writing_task.description.format(topic=topic)
    
    # 执行crew
    result = content_creation_crew.kickoff()
    
    print("内容创建完成!")
    return result

# 示例用法
if __name__ == "__main__":
    topic = "人工智能在医疗保健中的未来"
    content = create_content(topic)
    print(f"\n生成的内容:\n{content}")

此代码演示了使用Crew AI框架的规划模式实现。它创建了一个智能体,该智能体首先制定详细计划,然后基于该计划执行写作任务。这种方法确保内容创建过程结构化且高效。

实践代码(LangChain)

以下示例使用LangChain框架演示规划模式:

from langchain.agents import Tool, AgentExecutor, create_react_agent
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.tools import DuckDuckGoSearchRun
from langchain.schema import AgentAction, AgentFinish
import json

# 初始化语言模型
llm = ChatOpenAI(model="gpt-4", temperature=0)

# 定义搜索工具
search = DuckDuckGoSearchRun()

# 定义规划工具
def create_plan(goal: str) -> str:
    """为给定目标创建详细计划"""
    planning_prompt = f"""
    为以下目标创建详细计划:
    目标: {goal}
    
    请提供:
    1. 主要步骤列表
    2. 每个步骤的详细说明
    3. 所需资源
    4. 潜在挑战
    5. 成功指标
    
    以JSON格式返回计划。
    """
    
    response = llm.invoke(planning_prompt)
    return response.content

# 定义执行工具
def execute_step(step: str, context: str = "") -> str:
    """执行计划中的单个步骤"""
    execution_prompt = f"""
    执行以下步骤:
    步骤: {step}
    上下文: {context}
    
    请提供执行此步骤的详细说明和结果。
    """
    
    response = llm.invoke(execution_prompt)
    return response.content

# 定义工具
tools = [
    Tool(
        name="create_plan",
        description="为给定目标创建详细计划",
        func=create_plan
    ),
    Tool(
        name="execute_step",
        description="执行计划中的单个步骤",
        func=execute_step
    ),
    Tool(
        name="search",
        description="搜索最新信息",
        func=search.run
    )
]

# 定义提示模板
prompt = PromptTemplate(
    template="""
    你是一个规划专家。你的任务是帮助用户制定和执行计划。
    
    可用工具:
    {tools}
    
    工具名称: {tool_names}
    
    用户问题: {input}
    
    请使用适当的工具来帮助用户。
    """,
    input_variables=["input", "tools", "tool_names"]
)

# 创建智能体
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 示例使用
def plan_and_execute(goal: str):
    """规划并执行目标"""
    result = agent_executor.invoke({"input": f"请帮我规划并执行以下目标: {goal}"})
    return result

# 运行示例
if __name__ == "__main__":
    goal = "组织一次成功的产品发布活动"
    result = plan_and_execute(goal)
    print(f"规划结果: {result}")

实践代码(Google ADK)

以下示例使用Google ADK演示规划模式:

from google.adk.agents import LlmAgent, SequentialAgent
from google.adk.tools import google_search
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.genai import types
import asyncio
import nest_asyncio

# 定义规划智能体
planner_agent = LlmAgent(
    name="planner",
    model="gemini-2.0-flash",
    instruction="""
    你是一个专业的规划专家。你的任务是:
    1. 分析用户的目标
    2. 制定详细的行动计划
    3. 识别所需资源和潜在挑战
    4. 提供执行建议
    
    请始终以结构化的方式提供你的规划建议。
    """,
    description="专业规划智能体",
    tools=[google_search]
)

# 定义执行智能体
executor_agent = LlmAgent(
    name="executor",
    model="gemini-2.0-flash",
    instruction="""
    你是一个执行专家。你的任务是:
    1. 接收规划建议
    2. 制定具体的执行步骤
    3. 提供实施指导
    4. 监控进度并提供反馈
    
    请确保你的建议具体且可操作。
    """,
    description="专业执行智能体",
    tools=[google_search]
)

# 创建顺序智能体
planning_crew = SequentialAgent(
    name="planning_crew",
    sub_agents=[planner_agent, executor_agent],
    description="规划和执行团队"
)

# 运行智能体
async def run_planning_agent(goal: str):
    """运行规划智能体"""
    session_service = InMemorySessionService()
    runner = Runner(
        agent=planning_crew,
        app_name="planning_app",
        session_service=session_service
    )
    
    # 创建会话
    session = await session_service.create_session(
        app_name="planning_app",
        user_id="user_123",
        session_id="session_456"
    )
    
    # 发送消息
    content = types.Content(
        role='user',
        parts=[types.Part(text=f"请帮我规划以下目标: {goal}")]
    )
    
    # 运行智能体
    events = runner.run(
        user_id="user_123",
        session_id="session_456",
        new_message=content
    )
    
    # 处理响应
    for event in events:
        if event.is_final_response():
            print(f"规划结果: {event.content.parts[0].text}")
            break

# 示例使用
if __name__ == "__main__":
    nest_asyncio.apply()
    asyncio.run(run_planning_agent("启动新的在线业务"))

一览

什么: 智能行为需要超越简单反应的能力。智能体必须能够制定战略、分解复杂任务并制定实现目标的行动计划。没有规划能力,智能体只能对即时输入做出反应,无法处理需要多步推理或长期思考的复杂任务。

为什么: 规划模式通过提供制定和执行行动序列的框架来解决这个问题。它使智能体能够:

  • 将复杂目标分解为可管理的步骤
  • 考虑多种行动路径和结果
  • 适应变化的环境和约束
  • 制定长期战略和短期战术

经验法则: 当任务需要多步推理、长期思考或适应变化环境时使用规划模式。它特别适用于:

  • 项目管理任务
  • 复杂问题解决
  • 战略规划
  • 资源分配
  • 风险管理

关键要点

  • 规划模式使智能体能够制定和执行实现目标的行动序列
  • 它涉及将复杂任务分解为可管理的步骤
  • 规划可以是静态的(预定义)或动态的(适应变化)
  • 有效的规划需要考虑约束、资源和潜在挑战
  • 规划模式可以与其他模式(如工具使用、反思)结合使用
  • 现代框架如Crew AI、LangChain和Google ADK提供规划支持

结论

规划模式是智能体系统的基本组成部分,使它们能够超越简单的反应性行为,实现真正的智能和战略性思维。通过提供制定和执行行动序列的框架,规划模式使智能体能够处理复杂任务、适应变化环境并实现长期目标。

掌握规划模式对于构建能够处理现实世界复杂性的智能体系统至关重要。它提供了将高级目标转换为可执行计划所需的工具和技术,使智能体能够有效地导航复杂的问题空间并实现期望的结果。

参考文献

  1. Crew AI文档:https://docs.crewai.com/
  2. LangChain规划指南:https://python.langchain.com/docs/use_cases/planning/
  3. Google ADK文档:https://google.github.io/adk-docs/
  4. 智能体规划研究:https://arxiv.org/abs/2308.11452