[智能体设计模式] 第6章:规划
规划模式概述
在AI领域,可以将规划智能体视为你委托复杂目标的专家。当你让它“组织一次团队团建”,你定义的是“做什么”目标及约束条件,而不是“怎么做”。智能体的核心任务是自主制定通往目标的路径。它首先要理解初始状态(如预算、参与人数、期望日期)和目标状态(成功预订团建活动),然后发现连接两者的最优行动序列。计划并非预先设定,而是根据请求动态生成。
这一过程的显著特征是适应性。智能体的真正能力在于能根据新信息调整方向,灵活应对障碍。例如,如果首选场地不可用或餐饮供应商已满,优秀的智能体不会直接失败,而是会适应变化,重新评估选项,制定新计划,比如建议替代场地或调整日期。
但也要认识到灵活性与可预测性之间的权衡。动态规划是一种特定工具,并非万能方案。当问题的解决路径已知且可重复时,约束智能体按照预定、固定流程执行更有效。这种方式限制了智能体的自主性,减少了不确定性和不可预测行为,确保结果可靠一致。因此,是否采用规划智能体,关键在于“怎么做”需不需要探索,还是已经明确。
实践应用与场景
规划模式是自主系统中的核心计算过程,使智能体能够在动态或复杂环境下,合成一系列行动以达成指定目标,将高层目标转化为结构化、可执行的步骤。
在流程自动化领域,规划用于编排复杂工作流。例如,企业新员工入职流程可拆解为创建系统账号、分配培训模块、协调各部门等子任务。智能体生成计划,按逻辑顺序执行这些步骤,调用必要工具或与系统交互以管理依赖关系。
在机器人与自主导航领域,规划是状态空间遍历的基础。无论是实体机器人还是虚拟系统,都需生成路径或行动序列,从初始状态到目标状态,优化时间或能耗等指标,同时遵守环境约束,如避障或遵守交通规则。
实战代码(CrewAI)
以下代码演示了如何用CrewAI框架实现规划者模式。智能体首先制定多步骤计划以解决复杂问题,然后按顺序执行。
CrewAI规划者智能体示例
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 # 绑定指定LLM
)# 3. 定义结构化且具体的任务
topic = "强化学习在AI中的重要性"
high_level_task = Task(description=(f"1. 针对主题“{topic}”制定摘要的要点计划(项目符号列表)。\n"f"2. 根据计划撰写约200字的摘要。"),expected_output=("最终报告包含两个部分:\n\n""### 计划\n""‑ 摘要主要观点的项目符号列表。\n\n""### 摘要\n""‑ 主题的简明、结构化总结。"),agent=planner_writer_agent,
)# 创建 Crew,指定顺序处理流程
crew = Crew(agents=[planner_writer_agent],tasks=[high_level_task],process=Process.sequential,
)# 执行任务
print("## 正在运行规划与写作任务 ##")
result = crew.kickoff()print("\n\n---\n## 任务结果 ##\n---")
print(result)上述代码使用CrewAI库创建了一个智能体,负责规划并撰写指定主题的摘要。首先导入必要库并加载环境变量,明确指定ChatOpenAI语言模型。创建名为planner_writer_agent的智能体,设定其角色和目标,强调规划与技术写作能力。定义任务,要求先制定摘要计划,再根据计划撰写内容,并规定输出格式。组建Crew,指定顺序处理,最后调用crew.kickoff()执行任务并输出结果。
OpenAIDeepResearchAPI
OpenAIDeepResearchAPI是专为自动化复杂研究任务设计的工具。它采用先进的智能体模型,能自主推理、规划并从真实世界来源合成信息。与简单问答模型不同,它会将高层查询拆解为子问题,利用内置工具进行网络搜索,最终生成结构化、带引用的报告。API提供完整流程的编程访问,目前支持如o3-deep-research-2025-06-26(高质量合成)和o4-mini-deep-research-2025-06-26(低延迟应用)等模型。
该API的优势在于自动化原本需数小时的人工研究,输出专业级、数据驱动的报告,适用于业务决策、投资分析或政策建议。主要特点包括:
- 结构化带引用输出:生成有条理的报告,内嵌引用并关联来源元数据,确保结论可验证、数据有据可查。
- 透明性:与ChatGPT的黑箱过程不同,API公开所有中间步骤,包括智能体推理、具体搜索查询和代码执行,便于调试和深入分析。
- 可扩展性:支持ModelContextProtocol(MCP),开发者可连接私有知识库和内部数据,实现公私融合检索。
使用方法:向client.responses.create端点发送请求,指定模型、输入提示和可用工具。输入通常包括定义智能体角色和输出格式的system_message,以及用户查询。必须包含web_search_preview工具,可选添加code_interpreter或MCP工具(见第十章)用于内部数据。
OpenAIDeepResearchAPI示例
from openai import OpenAI# 用你的 API 密钥初始化客户端
client = OpenAI(api_key="YOUR_OPENAI_API_KEY")# 定义智能体角色和用户研究问题
system_message = """你是一名专业研究员,需撰写结构化、数据驱动的报告。
关注数据洞见,使用可靠来源,并在正文中插入引用。"""
user_query = "研究司美格鲁肽对全球医疗体系的经济影响。"# 创建Deep Research API调用
response = client.responses.create(model="o3-deep-research-2025-06-26",input=[{"role": "developer","content": [{"type": "input_text", "text": system_message}]},{"role": "user","content": [{"type": "input_text", "text": user_query}]}],reasoning={"summary": "auto"},tools=[{"type": "web_search_preview"}]
)# 获取并打印最终报告
final_report = response.output[-1].content[0].text
print(final_report)# ---获取内嵌引用和元数据---
print("---引用---")
annotations = response.output[-1].content[0].annotationsif not annotations:print("报告中未发现引用。")
else:for i, citation in enumerate(annotations):# 被引用的文本片段cited_text = final_report[citation.start_index:citation.end_index]print(f"引用{i+1}:")print(f"被引用文本:{cited_text}")print(f"标题:{citation.title}")print(f"链接:{citation.url}")print(f"位置:字符{citation.start_index}–{citation.end_index}")print("\n" + "="*50 + "\n")# ---检查中间步骤---
print("---中间步骤---")# 1. 推理步骤:模型生成的内部计划和摘要
try:reasoning_step = next(item for item in response.output if item.type == "reasoning")print("\n[发现推理步骤]")for summary_part in reasoning_step.summary:print(f"‑ {summary_part.text}")
except StopIteration:print("\n未发现推理步骤。")# 2. 网络搜索调用:智能体实际执行的搜索查询
try:search_step = next(item for item in response.output if item.type == "web_search_call")print("\n[发现网络搜索调用]")print(f" 执行查询:'{search_step.action['query']}'")print(f" 状态:{search_step.status}")
except StopIteration:print("\n 未发现网络搜索步骤。")# 3. 代码执行:智能体使用代码解释器运行的代码
try:code_step = next(item for item in response.output if item.type == "code_interpreter_call")print("\n[发现代码执行步骤]")print(" 输入代码:")print(f" ```python\n{code_step.input}\n ```")print(" 输出结果:")print(f" {code_step.output}")
except StopIteration:print("\n 未发现代码执行步骤。")上述代码利用OpenAI API执行“深度研究”任务。首先用API密钥初始化客户端,定义智能体角色和用户研究问题。构造API调用,指定模型、输入和工具,要求自动推理摘要并启用网络搜索。调用后,提取并打印最终报告。
随后,尝试获取报告中的引用和元数据,包括被引用文本、标题、链接和位置。最后,检查并输出模型的中间步骤,如推理、搜索和代码执行,便于分析智能体的推理和操作过程。
