ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

第 4 篇(07-08 章):规划设计模式与多代理设计模式

第 4 篇(07-08 章):规划设计模式与多代理设计模式 第 4 篇07-08 章规划设计模式与多代理设计模式文章目录第 4 篇07-08 章规划设计模式与多代理设计模式一、第 07 章规划设计1. 定义整体目标及拆解任务2. 多代理编排的规划代理3. 迭代规划二、第 08 章多智能体设计模式1. 多智能体适用的场景2. 使用多智能体相比单一智能体的优势3. 实现多智能体设计模式的构建模块4. 多智能体交互的可视性5. 多代理模式6. 场景退款流程三、代码示例讲解规划如何真正落地示例一规划器-执行器第 07 章① 定义计划的数据结构Pydantic 模型② 规划器把目标变成结构化 JSON③ 实际运行结果规划器输出译为中文④ 执行器按依赖顺序调度子任务⑤ 实际运行结果执行器输出译为中文⑥ 机制总结规划器-执行器如何把目标变成结果完整代码示例一示例二多代理工作流第 08 章① 用 WorkflowBuilder 串联专职代理② 实际运行结果TravelPlanner 输出译为中文节选③ 实际运行结果TravelConcierge 审查输出译为中文节选④ 扩展工作流追加 BudgetReviewer⑤ 实际运行结果扩展工作流译为中文节选⑥ 机制总结顺序流水线如何实现迭代提质完整代码示例二示例一与示例二的区别本系列「微软《AI Agents for Beginners》实战解读」基于微软官方课程逐章讲解并结合实践扩展。本篇覆盖第 07 章《规划设计》与第 08 章《多智能体设计模式》。文中子标题沿用官方课程原文示例基于 Microsoft Agent FrameworkMAF模型后端为 DeepSeekOpenAI 兼容协议。本篇代码讲解结合真实运行结果结果已译为中文每个示例末尾附完整可运行代码。一、第 07 章规划设计复杂任务无法一步完成。规划设计模式的核心是明确定义整体目标、将复杂任务拆解为可管理的子任务、利用结构化输出实现机器可读响应并以事件驱动方式处理动态任务与意外输入。1. 定义整体目标及拆解任务现实任务大多过于复杂代理需要一个简明的目标来指导规划与行动。以生成一份三天的旅行行程为例该目标仍需细化——目标越明确代理与人类协作者越能聚焦于正确结果航班选项、酒店推荐、活动建议等。任务拆解。将大型任务拆成有目标的小任务后更易管理。旅行行程可拆为机票预订、酒店预订、租车、个性化定制。每个子任务可由专门代理或流程处理一个代理专查最佳机票另一个负责酒店协调/下游代理将结果汇总为完整行程。模块化方法也便于渐进增强——随时间添加美食推荐或本地活动代理。结构化输出。LLM 能生成结构化输出如 JSON使下游代理或服务更易解析处理在多代理上下文中尤为重要。理论扩展任务分解Task Decomposition。这是复杂问题求解的通用策略——将目标分解为可独立求解的子问题分别求解后合并。工程实现的关键是明确子任务的依赖与归属谁做、依赖什么、优先级这为结构化输出提供语义基础。2. 多代理编排的规划代理一个规划代理接收用户请求后将其分解为子任务并生成结构化计划随后路由给相应专职代理。执行流程接收请求规划代理处理用户消息生成结构化旅行计划。列出代理及其工具代理注册表包含专职代理机票、酒店、租车、活动及其能力。路由计划单任务场景直接发给专门代理多任务场景通过群聊管理器协调多代理协作。总结结果汇总各代理结果向用户呈现。理论扩展规划器-执行器分工Planner-Executor。该模式将想与做分离规划代理负责任务分解与分配输出机器可读 JSON专职代理负责执行。此架构降低单个代理的认知负担且规划与执行可独立迭代与替换。3. 迭代规划部分任务需要来回调整或重新规划——一个子任务的结果会影响下一个。例如代理订票时发现意外数据格式需先调整策略再进行后续预订用户反馈如更改航班时间也会触发部分重新规划。这种动态迭代保证最终方案符合现实约束与变化的用户偏好。理论扩展规划-执行-再规划循环。迭代规划本质是Plan-Execute-Replan 循环执行中发现新约束或失败时将历史结果与当前计划回传规划代理触发重新规划。这是代理系统应对不确定性的核心机制与第 05 章 Agentic RAG 的评估-优化循环同构。二、第 08 章多智能体设计模式多智能体是一种设计模式允许多个智能体协同工作以实现共同目标广泛应用于机器人技术、自动系统与分布式计算等领域。本章回答何时用多智能体、相对单智能体的优势、构建模块与交互可视性。1. 多智能体适用的场景三种场景下多智能体更有益大工作负载可细分为更小任务分配给不同智能体实现并行处理与更快完成如大型数据处理。复杂任务拆分为子任务每个智能体专注特定方面如自动驾驶中分别管理导航、障碍检测、通信。多样的专长不同智能体具备不同专长如医疗中分别管理诊断、治疗方案、病人监测。2. 使用多智能体相比单一智能体的优势单一智能体适合简单任务复杂任务下多智能体具备三类优势专业化每个智能体专注特定任务避免单一智能体面对复杂任务时的混淆。可扩展性增加智能体比让单一智能体承担更多任务更易扩展。容错性单个智能体失败时其他智能体可继续运行保障系统可靠性。以旅游预订为例单一智能体需负责航班、酒店、租车全流程工具混杂导致系统复杂难维护多智能体系统将各环节分离更加模块化、易维护、可扩展——类似普通旅游局与特许经营旅游局的对比。3. 实现多智能体设计模式的构建模块以旅游预订为例构建模块包括智能体通信专职代理需要交流并共享用户偏好与限制需决定哪些智能体共享信息、如何共享。协调机制代理需协调行动以满足偏好与约束如酒店与租车代理协调机场位置约束。智能体架构代理需具备内部结构以决策与学习如航班代理根据用户历史偏好推荐航班。多智能体交互可视性需工具与技术跟踪代理活动与交互包括日志监控、可视化与性能指标。多代理模式可采用集中式、分散式与混合式架构。人机交互人类在环中指导代理何时请求人工介入。4. 多智能体交互的可视性理解智能体间交互对调试、优化与保障系统有效性至关重要。三类工具日志和监控工具记录每个代理执行的动作谁、做什么、何时、结果。可视化工具绘制智能体间信息流识别瓶颈与低效。性能指标跟踪完成任务时间、吞吐量与推荐准确率等。5. 多代理模式课程介绍三种具体模式群聊Group Chat。支持多个智能体通过消息协议交换信息每个代理代表群聊中的一个参与者可发送、接收并回应消息。典型用例团队协作、客户支持、社交网络。工作交接Hand-off。支持智能体间交接任务每个代理代表任务或工作流的一个步骤按预定规则将任务交接给下一代理。典型用例客户支持、任务管理、工作流自动化。协同过滤Collaboration / Recommendation。多个具备不同专长的智能体协作向用户推荐内容。以股票建议为例行业专家代理、技术分析代理、基本面分析代理各自贡献汇总为更全面的建议。理论扩展编排模式的抽象。群聊、交接、协同过滤分别对应多智能体编排的并行协作、顺序接力、专家聚合三类拓扑。MAF 的WorkflowBuilder以有向图统一表达这些拓扑节点为代理边为数据流使编排声明化、可审计。6. 场景退款流程以客户申请产品退款为例可拆分为专门处理退款流程的代理与可复用于业务其他部分的通用代理退款流程专属代理客户代理发起、卖家代理处理、支付代理退款、解决方案代理解决问题、合规代理遵守政策。通用代理运输、反馈、升级、通知、分析、审计、报告、知识、安全、质量等——可用于退款及其他业务流程。理论扩展角色建模与复用。该场景演示了多智能体系统的角色建模Role Modeling——将业务流程分解为职责单元并区分流程专属角色与可复用横切角色后者在其他流程中直接复用提升系统构建效率。三、代码示例讲解规划如何真正落地以下代码取自课程code_samples已适配 DeepSeek 后端并附实际运行结果译为中文。重点回答规划器如何把一个目标变成一份可执行计划执行器又如何按计划调度示例一规划器-执行器第 07 章① 定义计划的数据结构Pydantic 模型规划的核心前提是结构化输出——先定义计划长什么样再用模型约束输出。Pydantic 模型声明了计划的字段主任务、子任务列表每个子任务含描述、分配对象classTravelSubTask(BaseModel):task_details:strassigned_agent:str# 分配给哪个专职代理classTravelPlan(BaseModel):main_task:strsubtasks:list[TravelSubTask]② 规划器把目标变成结构化 JSON规划代理只负责想。系统提示要求它按指定 JSON 结构拆解任务由于 DeepSeek 不支持response_formatPydantic模型改用json_object模式并用model_validate_json校验解析PLANNER_PROMPTYou are a planner agent. Break the users travel request into subtasks and assign each to an agent. Reply with JSON only: {main_task:...,subtasks:[{assigned_agent:flight_booking,task_details:...}]}rawawaitplanner.run(帮一家四口规划新加坡到墨尔本的旅行。,options{response_format:{type:json_object}})planTravelPlan.model_validate_json(str(raw))③ 实际运行结果规划器输出译为中文输入请求“为两人规划一次 7 天巴黎之旅主题是艺术、美食与历史预算约 5000 美元”。规划器输出如下结构化计划目的地巴黎法国 时长7 天 预算5000 美元 子任务按优先级 [高] 1. 为两人预订往返巴黎CDG经济舱机票 → flight_agent [高] 2. 在预算内预订市中心酒店 7 晚 → hotel_agent [中] 3. 安排机场接送并推荐当地交通 → logistics_agent [高] 4. 预订主要艺术博物馆免排队门票 卢浮宫、奥赛、橘园 → activity_agent [中] 5. 预订历史遗迹导览 凡尔赛宫、圣礼拜堂、圣母院区 → activity_agent [中] 6. 预订美食体验 法式晚餐、美食市场导览、烹饪课 → activity_agent [低] 7. 制定逐日行程并评估巴黎博物馆通票 → logistics_agent观察要点规划器输出的 JSON 携带三层信息——优先级high/medium/low决定处理权重、分配对象assigned_agent决定路由目标、依赖关系隐含在步骤顺序中如博物馆通票依赖第 4、5、6 步。这三层信息正是可执行计划区别于一段描述文字的关键。④ 执行器按依赖顺序调度子任务执行器Concierge 代理读取计划后按依赖顺序逐项调用专职工具订票、订酒店、订活动并输出执行摘要# 执行器将 plan.subtasks 按依赖顺序调度逐个调用对应工具forsubinplan.subtasks:resultawaitexecute_subtask(sub)# 根据 assigned_agent 路由到对应工具⑤ 实际运行结果执行器输出译为中文我将逐步执行该旅行计划并遵守依赖关系。先从无依赖的机票预订开始。 第1步预订往返巴黎机票 → 确认号 FLT-4907 ✓ 机票已确认。现在可并行处理酒店第2步与仅依赖机票的活动预订第4、5、6步。 酒店与所有活动预订已确认。第1、2、4、5、6 步完成。 现在并行处理第3步机场接送依赖 1、2 已满足与第7步博物馆通票依赖 4、5、6 已满足。 所有子任务完成。完整执行摘要 ✅ 航班高→ flight_agent往返巴黎经济舱确认号 FLT-4907 ✅ 酒店高→ hotel_agent市中心 7 晚确认号 HTL-4907 ✅ 机场接送中→ logistics_agentACT-0370 / ACT-0542 交通建议RER B、Métro、Navigo 周票、Vélib 单车 ✅ 博物馆免排队门票高→ activity_agent 卢浮宫 6/2 ACT-8457 · 奥赛 6/3 ACT-1209 · 橘园 6/4 ACT-7640 ✅ 历史导览中→ activity_agent 凡尔赛宫 6/5 ACT-7332 · 圣礼拜堂 6/6 ACT-5989 · 圣母院区 6/6 ACT-5300 ✅ 美食体验中→ activity_agent 法式晚餐 6/7 ACT-4238 · 美食市场导览 6/2 ACT-7344 · 烹饪课 6/7 ACT-2359 ✅ 博物馆通票 逐日行程低→ logistics_agentACT-0600 通票覆盖卢浮宫/奥赛/凡尔赛等节省约 30-50 欧元/人 预算说明所有预订机票、7 晚酒店、9 项活动 2 次接送 2 张通票均在 5000 美元内。⑥ 机制总结规划器-执行器如何把目标变成结果结合代码与运行结果规划落地的完整链路为用户目标 → 规划器输出结构化 JSON子任务优先级分配依赖 → 执行器读取 JSON → 按依赖解析执行顺序 → 无依赖任务先执行互不依赖任务并行执行 → 依赖满足后触发后续任务 → 汇总确认号与行程 → 交付用户三个关键机制结构化输出是桥TravelPlanPydantic让规划结果从自然语言段落变成机器可解析的数据执行器才能编程式遍历、路由、调度。依赖驱动调度运行结果显示执行器先机票无依赖→ 再并行酒店与活动仅依赖机票→ 最后接送与通票依赖已满足——这是dependencies字段驱动的拓扑排序避免子任务在前提未满足时执行。优先级影响权重[高]的机票、酒店、博物馆门票被优先处理[低]的行程与通票在其余完成后收尾。完整代码示例一importasynciofromtypingimportAnnotatedfrompydanticimportBaseModelfromagent_frameworkimporttoolfrom_deepseekimportmake_clientclassTravelSubTask(BaseModel):task_id:intdescription:strassigned_agent:str# 分配给哪个专职代理priority:str# high / medium / lowdependencies:list[int][]classTravelPlan(BaseModel):destination:strtrip_duration_days:intsubtasks:list[TravelSubTask]total_estimated_budget_usd:intnotes:strPLANNER_PROMPTYou are a travel planning agent. When given a travel request: 1. Break it into specific subtasks (flights, hotels, activities, logistics) 2. Assign each subtask to the appropriate specialist agent 3. Set priorities and identify dependencies between tasks 4. Estimate the total budget Reply with JSON only matching: {destination:...,trip_duration_days:7, subtasks:[{task_id:1,description:...,assigned_agent:flight_agent, priority:high,dependencies:[]}], total_estimated_budget_usd:5000,notes:...}tooldefbook_flight(destination:Annotated[str,The destination city],departure_date:Annotated[str,Departure date (YYYY-MM-DD)],return_date:Annotated[str,Return date (YYYY-MM-DD)],)-str:Search and book flights for the trip.returnfFlight booked to{destination}:{departure_date}→{return_date}, confirmation #FLT-{hash(destination)%10000:04d}tooldefreserve_hotel(city:Annotated[str,The city for the hotel],check_in:Annotated[str,Check-in date (YYYY-MM-DD)],check_out:Annotated[str,Check-out date (YYYY-MM-DD)],guests:Annotated[int,Number of guests],)-str:Reserve a hotel room in the destination city.returnfHotel reserved in{city}:{check_in}to{check_out}for{guests}guests, confirmation #HTL-{hash(city)%10000:04d}tooldefbook_activity(activity_name:Annotated[str,Name of the activity or tour],date:Annotated[str,Date of the activity (YYYY-MM-DD)],participants:Annotated[int,Number of participants],)-str:Book a tour, museum visit, or other activity.returnfActivity booked:{activity_name}on{date}for{participants}people, confirmation #ACT-{hash(activity_name)%10000:04d}asyncdefmain():clientmake_client()planning_agentclient.as_agent(nameTravelPlanner,instructionsPLANNER_PROMPT)resultawaitplanning_agent.run(Plan a 7-day trip to Paris for a couple interested in art, cuisine, and history. Budget around $5000.,options{response_format:{type:json_object}},)planTravelPlan.model_validate_json(str(result))print(fDestination:{plan.destination})print(fDuration:{plan.trip_duration_days}days)print(fBudget: ${plan.total_estimated_budget_usd}\nSubtasks:)fortinplan.subtasks:print(f [{t.priority}]{t.task_id}.{t.description}→{t.assigned_agent})concierge_agentclient.as_agent(nameConcierge,instructionsYou are a travel concierge executing a structured travel plan. Use the available tools to fulfil each subtask. Work through the subtasks in order, respecting dependencies. Summarise the results when finished.,tools[book_flight,reserve_hotel,book_activity],)execution_prompt(fExecute the following travel plan for{plan.destination}f({plan.trip_duration_days}days, ${plan.total_estimated_budget_usd}budget):\n\n.join(f- [{t.priority}]{t.task_id}.{t.description}(agent:{t.assigned_agent}, deps:{t.dependencies})fortinplan.subtasks))print(awaitconcierge_agent.run(execution_prompt))if__name____main__:asyncio.run(main())示例二多代理工作流第 08 章① 用 WorkflowBuilder 串联专职代理不同于规划器输出 JSON 后由单个执行器调度多代理工作流将多个专职代理直接串成流水线前一代理的输出自动成为后一代理的输入fromagent_frameworkimportAgentResponseUpdate,WorkflowBuilder planner_agentmake_client().as_agent(nameTravelPlanner,instructions制定详细行程。)concierge_agentmake_client().as_agent(nameTravelConcierge,instructions审查并增强行程。)workflow(WorkflowBuilder(start_executorplanner_agent).add_edge(planner_agent,concierge_agent).build())asyncforeventinworkflow.run(为喜欢美食的夫妇规划5天巴黎之行预算3000美元。,streamTrue):ifevent.typeoutputandisinstance(event.data,AgentResponseUpdate):print(f【{event.data.author_name}】{event.data.text})② 实际运行结果TravelPlanner 输出译为中文节选【TravelPlanner】 为热爱美食的夫妇制定 5 天巴黎行程预算 3000 美元含双人机票、住宿、餐饮、景点与交通。 预算快照双人 机票 $1200 · 住宿 $9505晚≈$190/晚· 餐饮 $550 · 景点 $200 · 交通 $100 · 总计 $3000 居住建议玛黑区3/4区、拉丁区5区、圣马丁运河10区 逐日行程节选 Day 1 到达 拉丁区RER B 进城Rue Mouffetard 美食街野餐巴黎圣母院外观Bouillon Chartier 晚餐特罗卡德罗广场看埃菲尔铁塔夜景 Day 2 卢浮宫 蒙托尔盖伊街卢浮宫Mona Lisa 等生蚝午餐协和广场凯旋门日落 Day 3 蒙马特 玛黑区圣心大教堂红磨坊街LAs du Fallafel 鹰嘴豆泥卷饼天然葡萄酒吧 Le Verre Volé Day 4 市场 奥赛美术馆 卢森堡公园野餐 塞纳河游船 Day 5 埃菲尔铁塔爬楼梯省票 Rue Cler 最后野餐 返程 美食必吃清单羊角包、最佳法棍、生蚝、蜗牛、鹰嘴豆泥卷饼、牛排薯条、奶酪拼盘、马卡龙 实用提示机场坐 RER B 而非出租车买 10 次票车票本餐厅预订注意事项防扒手提醒③ 实际运行结果TravelConcierge 审查输出译为中文节选【TravelConcierge】—— 旅行礼宾审查 总体评价结构扎实、研究充分预算分配现实8.5/10。 1. 预算与后勤审查 - 机票 $1200合理但旺季可达 $1400建议用 Google Flights 提醒并考虑替代机场 - 住宿 $190/晚适合玛黑区 Airbnb注意隐藏费用清洁费、旅游税 - 餐饮 $110/天偏紧晚餐配酒可能超支建议一次餐馆晚餐换市场野餐 - 交通 $100现实两张 RER 两个车票本 2. 逐日增强建议 - Day 1Bouillon Chartier 排队 30-45 分钟建议 18:30 到或去 Bouillon Racine - Day 2生蚝店 Huitrerie Régis 中午开档即到凯旋门可换老佛爷天台免费看塔 - Day 3圣心堂后去蒙马特秘密葡萄园Le Verre Volé 满座可去 La Cave des Papilles - Day 4奥赛美术馆建议 9:30 预约入场市场奶酪在 Fromagerie Beaufils 购买 - Day 5埃菲尔铁塔爬 2 楼楼梯需提前在线订时段 3. 潜在问题与修复 - 预订必需Le Relais de lEntrecôte、Le Verre Volé、埃菲尔铁塔需预订 - 闭馆日卢浮宫周二闭、奥赛周一闭、Aligre 市场周一下午关 - 交通罢工备选 Uber 或步行 - 预算超支防御一次晚餐换野餐、酒只从酒铺买、自带水壶④ 扩展工作流追加 BudgetReviewer工作流的可扩展性在于加一个代理只需加一条边不改已有逻辑budget_agentmake_client().as_agent(nameBudgetReviewer,instructions核对预算并给出修订。)extended_workflow(WorkflowBuilder(start_executorplanner_agent).add_edge(planner_agent,concierge_agent).add_edge(concierge_agent,budget_agent)# 新增审查后交给预算评审.build())⑤ 实际运行结果扩展工作流译为中文节选【TravelPlanner】第二次规划修订版行程预算拆分为 住宿$1000 · 餐饮$1200 · 活动$450 · 交通$150 · 购物$200总计约 $3000 【TravelConcierge】再审查基本批准但 Day 4 过满、Day 3 凡尔赛香榭丽舍太赶建议放慢节奏、替换难订餐厅Septime → Clamato 【BudgetReviewer】输出修订版 修订后 5 天行程更宽松的节奏Day 4 缩短烹饪课为 1.5 小时马卡龙课、更易预订的餐厅Le Verre à Pied 替代 Le Verre Volé 修订后预算住宿 $1000 · 餐饮 $1100 · 活动 $350 · 交通 $150 · 购物 $200 · 总计约 $2800预留 $200 缓冲 关键调整更放松的节奏、预订压力降低、更聪明的开销马卡龙课替代全课、野餐替代部分餐馆⑥ 机制总结顺序流水线如何实现迭代提质多代理工作流的本质是顺序接力 迭代审查TravelPlanner初稿→ TravelConcierge审查指出预算/节奏/预订问题 → BudgetReviewer综合审查意见输出修订预算与行程为什么比单个代理效果更好专业化隔离规划代理专注生成礼宾代理专注挑错预算代理专注控本——各代理指令聚焦输出质量高于一个全能代理。迭代反馈链运行结果显示第三次BudgetReviewer的输出吸收了前两轮的审查意见放慢节奏、替换难订餐厅、压缩预算——这正对应第 09 章的反思-修正思想只是通过代理链而非单一代理实现。可扩展追加代理仅需add_edge工作流拓扑从 2 节点扩为 3 节点已有节点逻辑零改动。完整代码示例二importasynciofromagent_frameworkimportAgentResponseUpdate,WorkflowBuilderfrom_deepseekimportmake_clientasyncdefmain():planner_agentmake_client().as_agent(nameTravelPlanner,instructions你是旅行规划专家根据偏好制定详细行程包含每日安排与预算。,)concierge_agentmake_client().as_agent(nameTravelConcierge,instructions你是旅行礼宾审查并增强行程补充本地建议、发现潜在问题、给出建设性反馈。,)budget_agentmake_client().as_agent(nameBudgetReviewer,instructions你是预算顾问核对行程是否超预算并给出省钱建议。,)# 两代理工作流规划 → 礼宾workflow(WorkflowBuilder(start_executorplanner_agent).add_edge(planner_agent,concierge_agent).build())print( 两代理工作流 )awaitstream_workflow(workflow,为喜欢美食的夫妇规划5天巴黎之行预算3000美元。)# 三代理工作流规划 → 礼宾 → 预算extended_workflow(WorkflowBuilder(start_executorplanner_agent).add_edge(planner_agent,concierge_agent).add_edge(concierge_agent,budget_agent).build())print(\n 三代理工作流 )awaitstream_workflow(extended_workflow,为喜欢美食的夫妇规划5天巴黎之行预算3000美元。)asyncdefstream_workflow(workflow,prompt:str):last_authorNoneasyncforeventinworkflow.run(prompt,streamTrue):ifevent.typeoutputandisinstance(event.data,AgentResponseUpdate):updateevent.dataifupdate.author_name!last_author:print(f\n{update.author_name})last_authorupdate.author_nameprint(update.text,end,flushTrue)print()if__name____main__:asyncio.run(main())示例一与示例二的区别维度示例一规划器-执行器示例二多代理工作流结构一个规划器 一个执行器带工具多个专职代理串联成图分工方式规划器输出 JSON执行器按依赖调度各代理依次接力前一输出喂给后一关键机制结构化输出 依赖解析有向图编排 信息传递适用场景单目标多步骤任务的编排需要多视角迭代生成→审查→修订
返回列表