TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

智能体的任务规划设计

把模糊目标拆成子任务,让模型输出 JSON 格式的计划,再把每个子任务分派给对应的智能体。读完能跑通一个规划器。

这篇适合谁,读完能做到什么

适合想让智能体处理多步骤任务、又不想每次手写流程的开发者。读完你能把一个模糊的目标拆成子任务,让模型输出结构化的计划(JSON),再按计划把子任务分派给不同的智能体。

规划要解决什么问题

大多数真实任务一步做不完。智能体需要一个简明的目标来指导规划和行动。示例目标是「生成一份 3 天的旅行行程」,看上去很简单,但还需要细化。目标越清楚,智能体和参与的人就越能聚焦到正确的结果,例如一份包含航班选项、酒店推荐和活动建议的完整行程。[1]

第一步:把目标拆成子任务

行程可以拆成航班预订、酒店预订、租车和个性化四个子任务。每个子任务由专门的智能体处理,最后由一个协调智能体(也叫下游智能体)把结果汇总成一份完整行程。[1]

这种模块化结构方便以后增量扩展。例如,之后可以再加入美食推荐或当地活动建议的智能体,逐步完善行程。[1]

第二步:让模型输出结构化计划

大模型可以输出 JSON 这类结构化内容,下游的智能体或服务更容易解析和处理。在多智能体场景中,这一点尤其有用:规划结果出来后,就能据此执行各个子任务。[1]

示例先用 Pydantic 定义数据结构。导入部分如下:[1]

from pydantic import BaseModel
from enum import Enum
from typing import List, Optional, Union
import json
import os
from typing import Optional
from pprint import pprint
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

智能体类型定义为字符串枚举 AgentEnum,共七个取值,从 flight_booking 到 group_chat_manager。计划由两个 Pydantic 类描述:TravelSubTask 有 task_details 和 assigned_agent 两个字段,TravelPlan 有 main_task、subtasks 和 is_greeting 三个字段。[1]

class AgentEnum(str, Enum):
    FlightBooking = "flight_booking"
    HotelBooking = "hotel_booking"
    CarRental = "car_rental"
    ActivitiesBooking = "activities_booking"
    DestinationInfo = "destination_info"
    DefaultAgent = "default_agent"
    GroupChatManager = "group_chat_manager"

# Travel SubTask Model
class TravelSubTask(BaseModel):
    task_details: str
    assigned_agent: AgentEnum  # we want to assign the task to the agent

class TravelPlan(BaseModel):
    main_task: str
    subtasks: List[TravelSubTask]
    is_greeting: bool

客户端用 FoundryChatClient 创建,项目地址和模型部署名从环境变量 AZURE_AI_PROJECT_ENDPOINT 和 AZURE_AI_MODEL_DEPLOYMENT_NAME 读取,认证使用 AzureCliCredential。[1]

provider = FoundryChatClient(
    project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
    model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
    credential=AzureCliCredential(),
)

系统提示告诉模型,它是一个规划智能体,要根据用户的请求决定运行哪些智能体,并以 JSON 返回,结构包括 main_task 和 subtasks,每个子任务有 assigned_agent 和 task_details。提示里列出了六个可用的智能体:航班预订、酒店预订、租车、活动预订、目的地信息和默认智能体。[1]

用户消息是「为两个孩子的家庭从新加坡去墨尔本制定旅行计划」的英文版 Create a travel plan for a family of 2 kids from Singapore to Melbourne。模型返回的文本用 json.loads 解析,再用 pprint 打印。[1]

第三步:按 assigned_agent 分派

拿到结构化输出后,用每个子任务的 assigned_agent 字段把它路由给对应的智能体,最后再把计划汇总给用户。[1]

规划器的做法分两种情况。子任务只有一个时,把消息直接交给对应的专门智能体;子任务多时,通过群聊管理器(group chat manager)协调多个智能体协作。智能体注册表记录了有哪些智能体,以及每个智能体提供哪些函数或工具。[1]

常见的坑

  • 两段示例代码都把客户端赋给了 provider,后面的调用却写成 client.create_response。照抄时要把变量名统一,否则找不到 client。[1]
  • 示例输出里,is_greeting 是字符串 "False",不是布尔值。如果你的代码用它做判断,要注意这一点,或在解析后做类型转换。[1]
  • 提示里列出的是六个智能体,枚举里却有七个值,多出的 group_chat_manager 不在提示列表中。[1]
  • 文中的迭代规划代码标注为 e.g sample code,第一行注释写着 #.. same as previous code and pass on the user history, current plan,它依赖前面的代码,不能单独运行。[1]

需要重新规划的情况

有些任务需要来回调整,因为一个子任务的结果会影响下一步。例如,智能体订机票时发现了意外的数据格式,可能需要先调整策略,再去订酒店。用户反馈也会触发局部重新规划,比如用户想改坐更早的航班。这样做的目的,是让最终方案符合现实约束和不断变化的偏好。[1]

更完整的规划:Magentic-One

如果想要更完整的规划方案,可以看微软研究院的 Magentic-One。它被描述为一个通用的多智能体系统,用来解决复杂任务,并在多个有挑战性的智能体基准上取得了很好的结果。它的编排器为具体任务制定计划,把任务分派给可用的智能体,同时跟踪进度,必要时重新规划。[1]

限制和常见问题

  • 规划器默认智能体已经具备完成任务所需的函数或工具。这一前提要在搭建时逐个确认,规划器本身不会替你补上工具。[1]
  • 示例只做到规划、分派和汇总为止。摘要器、反思、轮询式群聊等模式可以在此基础上叠加,以进一步定制。[1]
  • 结构化输出依赖模型按格式返回。字段名和枚举值要在提示中写清楚,解析后最好再做一次校验。

下一步

想继续了解规划背后的完整示例,可以看示例 notebook code_samples/07-python-agent-framework.ipynb,也可以读 Magentic-One 的研究博客。[1]

本文改编自 Microsoft 开源课程《AI Agents for Beginners》第 7 课[1],原文以 MIT 许可证发布。

来源

  1. 1
    Planning DesignMicrosoft ai-agents-for-beginners (MIT)

引用本页: 智能体的任务规划设计. TellWorld, https://www.tellworld.net/zh/practice/practice-agent-planning. 更新于 2026-11-14

相关动态