一、什么是多 Agent为什么需要多 Agent1. 单 Agent 痛点单个智能体承载全部任务行程规划、天气查询、预算核算、餐饮推荐系统提示词冗长模型容易混淆职责长上下文下回答质量大幅下降新增业务能力就要修改一套提示词维护成本极高。2. 多 Agent 核心思想职责拆分、专人专岗把复杂大任务拆解多个垂直专业子 Agent再由一个调度 Supervisor Agent 接收用户需求、分配任务、汇总所有子 Agent 输出整合为最终完整答案。类比企业团队前台调度Supervisor→ 行程规划专员 / 天气专员 / 预算专员子 Agent。3. 多 Agent 适用场景业务流程复杂、包含多维度信息输出旅游、方案撰写、电商售后每个领域有独立专业知识需要差异化系统提示词系统需持续新增业务模块希望低耦合扩展长对话、长上下文场景拆分降低单轮提示词长度二、主流通用 Multi-Agent 架构模式详解当前业界通用的Spring AI / LangGraph / AutoGen 广泛采用Supervisor 主管调度、Hierarchical 分层树形、Pipeline 流水线串行、Decentralized 去中心化对等协作 等四种多智能体架构下面分析这四种多智能体架构模式的核心思想和适用场景帮助开发者根据业务选型。模式 1Supervisor 主管调度模式本文案例采用由中央协调智能体作为唯一入口所有子 Agent 互不通信仅与 Supervisor 交互调度层负责需求解析、任务分发、结果汇总、冲突修正。此模式适用于中小型业务、垂直领域综合问答旅游方案、企业咨询、客服系统也是 Spring AI 入门首选模式。模式 2Hierarchical 分层树形模式多级树形分层顶层主管不直接操作底层子 Agent只对接中层 Manager每个中层管理一组垂直子智能体层层分发、层层汇总。此模式多用于大型企业平台、多产品线综合 Agent 系统金融、政企复杂业务。模式 3Pipeline 流水线串行模式智能体按固定线性顺序串行执行前一个 Agent 输出作为后一个输入任务有强先后依赖。此模式流程固定、可预测便于加校验规则适合文档处理、报告生成、数据清洗等标准化流水线任务。模式 4Decentralized 去中心化对等协作模式Swarm 蜂群无中心控制所有智能体对等自主协商、互相传递信息自主判断是否需要其他 Agent 协助。架构模式比对表架构模式控制方式实现难度并发性能可调试性典型业务Supervisor 主管集中控制低中等极佳旅游、客服、综合问答Hierarchical 分层树形分级高高良好政企、金融多模块平台Pipeline 流水线串行固定极低差极佳文档、数据处理流水线去中心化蜂群无中心极高高差创意、学术辩论三、案例说明接下来通过案例详细解析如何使用Spring AI 实现多智能体架构。案例使用Supervisor 主管 Multi-Agent架构模式延续之前的旅游行程规划案例各Agent具体分工如下调度 Supervisor Agent总入口接收用户完整出行需求拆解子任务调用对应子 Agent最后汇总所有输出整合完整行程行程规划子 Agent负责景点、交通、每日时段安排天气查询子 Agent内置时间工具查询目的地实时天气给出穿搭建议预算核算子 Agent根据天数、人数、景点门票预估整体开销。执行流程用户提问 → Supervisor 拆解任务 → 并行 / 串行调用行程 / 天气 / 预算子 Agent → 收集三份结果 → 整合输出完整旅游方案四、项目准备在实现项目之前需要选择支持该功能的 AI 模型。本文选择智普 AI 大模型进行演示同时需先完成以下准备工作1. 基础信息Spring Boot 3.5.3 Spring AI 1.0.0JDK17 智谱 GLM-4-Flash项目名Weiz-SpringAI-MultiAgent2. 完整项目分层结构com.example.weizspringai├── WeizSpringAiMultiAgentApplication.java # 启动类├── agent # 所有Agent定义│ ├── SupervisorAgent.java # 总调度Agent│ ├── ItineraryAgent.java # 行程子Agent│ ├── WeatherAgent.java # 天气子Agent携带时间Tool│ └── BudgetAgent.java # 预算子Agent├── tool # 复用前文时区工具│ ├── TimeMethodTool.java│ └── CityRequest.java├── service # 多Agent调度业务服务│ └── MultiAgentService.java└── controller # 对外HTTP接口└── MultiAgentController.java3. pom.xml 完整依赖?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.example/groupIdartifactIdWeiz-SpringAI-MultiAgent/artifactIdversion0.0.1-SNAPSHOT/version/parentartifactIdWeiz-SpringAI-MultiAgent-Simple/artifactIdnameWeiz-SpringAI-MultiAgent-Simple/namedescriptionWeiz-SpringAI-MultiAgent-Simple/descriptionpropertiesjava.version17/java.versionmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-zhipuai/artifactId/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-client-chat/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project4. application.properties 配置spring.application.nameWeiz-SpringAI-Agent-Toolsserver.port8080spring.ai.zhipuai.api-key你的智谱API Keyspring.ai.zhipuai.base-urlhttps://open.bigmodel.cn/api/paasspring.ai.zhipuai.chat.options.modelGLM-4-Flashlogging.level.org.springframework.aiINFOlogging.level.com.exampleDEBUG五、核心代码实现1. 时区查询 Tool工具为系列前文实现的时区查询 Tool天气子 Agent 内部会自动调用用于获取目的地当前时间为穿搭建议提供时间依据无需重复开发。package com.example.weizspringai.tool;import org.springframework.ai.tool.annotation.Tool;import org.springframework.ai.tool.annotation.ToolParam;import org.springframework.stereotype.Component;import java.time.LocalDateTime;import java.time.ZoneId;import java.util.Map;Componentpublic class TimeMethodTool {Tool(description 根据城市名称获取对应时区当前日期时间)public String getCityCurrentTime(ToolParam(description 城市名称如北京、成都、厦门) String city){MapString, String zoneMap Map.of(北京,Asia/Shanghai,成都,Asia/Shanghai,厦门,Asia/Shanghai,伦敦,Europe/London);String zone zoneMap.getOrDefault(city,Asia/Shanghai);return city 当前时间 LocalDateTime.now(ZoneId.of(zone));}}2. 行程规划子 Agent ItineraryAgent行程规划子 Agent 垂直专注行程规划领域仅接收用户出行需求输出每日景点、交通、游玩时长不涉及天气、预算相关内容职责单一提示词轻量化保证输出精准。package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class ItineraryAgent {private final ChatClient chatClient;/** 根据出行需求生成每日景点交通行程 */public String generateRoute(String demand){String sysPrompt 你是专业行程规划子Agent只负责输出每日景点、交通路线、游玩时长无需预算、无需天气穿搭只输出行程结构用户需求{demand}输出格式按天划分上午/下午/晚间三段标注景点、交通方式、建议停留时长。.replace({demand}, demand);return chatClient.prompt().system(sysPrompt).user(demand).call().content();}}3. 天气子 Agent WeatherAgent内置 Time 工具天气子 Agent 绑定 Time 时区 Tool会自动调用工具获取目的地当前时间结合季节时段输出穿搭、防晒、防雨建议仅输出天气相关内容不干涉行程与预算逻辑。package com.example.weizspringai.agent;import com.example.weizspringai.tool.TimeMethodTool;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class WeatherAgent {private final ChatClient chatClient;private final TimeMethodTool timeTool;/** 根据目的地结合当地时间给出出行穿搭建议 */public String getWeatherAdvice(String destination){String sysPrompt 你是天气穿搭子Agent先调用工具获取目的地当前时间再根据季节时段给出出行穿搭、防晒防雨建议简洁输出。目的地{city}.replace({city}, destination);return chatClient.prompt().system(sysPrompt).user(查询destination出行穿搭建议).tools(timeTool).call().content();}}4. 预算核算子 Agent BudgetAgent预算核算子 Agent 仅负责旅游费用核算自动拆分住宿、门票、餐饮、交通四大开销计算人均总价不输出行程、天气相关内容边界清晰。package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class BudgetAgent {private final ChatClient chatClient;/** 根据天数、人数、目的地核算整体预算 */public String calcBudget(String demand){String sysPrompt 你是旅游预算核算子Agent仅核算人均总花费拆分门票、餐饮、交通、住宿四项明细不输出行程、天气内容用户出行需求{demand}.replace({demand}, demand);return chatClient.prompt().system(sysPrompt).user(demand).call().content();}}5. 核心调度 SupervisorAgent调度 SupervisorAgent是多 Agent 架构核心调度中心统一接收用户原始需求串行调用三类子 Agent 获取独立输出最后汇总全部内容统一排版整合为一份完整旅游方案同时内置简易目的地提取逻辑供天气 Agent 使用。package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class SupervisorAgent {private final ItineraryAgent itineraryAgent;private final WeatherAgent weatherAgent;private final BudgetAgent budgetAgent;private final ChatClient chatClient;/** 主调度逻辑分发任务、汇总三份子结果 */public String dispatchAndSummary(String userDemand){// 1. 分发调用三个专业子AgentString routeResult itineraryAgent.generateRoute(userDemand);String dest extractCity(userDemand); // 提取目的地String weatherResult weatherAgent.getWeatherAdvice(dest);String budgetResult budgetAgent.calcBudget(userDemand);// 2. 汇总全部信息整合完整旅游方案String summaryPrompt 你是总规划师整合下面三份专业输出生成一份完整通顺的旅游方案【每日行程安排】%s【目的地天气与穿搭】%s【费用预算明细】%s要求结构清晰分三大块排版语言亲切适合出行参考。.formatted(routeResult,weatherResult,budgetResult);// 调用模型整合输出return chatClient.prompt().system(summaryPrompt).user(整合完整旅游方案).call().content();}// 简易提取目的地生产可优化正则/LLM提取private String extractCity(String demand){if(demand.contains(厦门)) return 厦门;if(demand.contains(成都)) return 成都;if(demand.contains(北京)) return 北京;return demand.split(游玩)[0];}}6. 业务 Service 层封装业务统一封装层Controller 不直接操作 Agent通过 Service 中转实现分层解耦便于后续扩展记忆、权限、日志等通用能力。package com.example.weizspringai.service;import com.example.weizspringai.agent.SupervisorAgent;import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Service;ServiceRequiredArgsConstructorpublic class MultiAgentService {private final SupervisorAgent supervisorAgent;/** 对外统一多Agent执行入口 */public String generateFullTravelPlan(String userRequest){return supervisorAgent.dispatchAndSummary(userRequest);}}7. Controller 接口负责对外访问接口接收用户出行需求参数调用业务 Service返回标准化 JSON 结构便于前端解析展示。package com.example.weizspringai.controller;import com.example.weizspringai.service.MultiAgentService;import lombok.RequiredArgsConstructor;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import java.util.Map;RestControllerRequestMapping(/multiAgent)RequiredArgsConstructorpublic class MultiAgentController {private final MultiAgentService multiAgentService;GetMapping(/travelPlan)public MapString, Object travelPlan(RequestParam(demand) String demand){String fullPlan multiAgentService.generateFullTravelPlan(demand);return Map.of(code,200,msg,多Agent协作生成完整旅游方案成功,userDemand,demand,travelPlan,fullPlan,agentMode,Supervisor调度 行程/天气/预算三子Agent);}}六、验证测试1. 测试请求地址项目启动成功后在浏览器中访问地址http://localhost:8080/multiAgent/travelPlan?demand两人去厦门玩三天偏好海滨景点不吃辣人均预算1500以内2. 执行流程复盘传入厦门出行需求Supervisor 提取城市为厦门行程 Agent 生成三天海滨每日路线天气 Agent 调用 Time 工具获取厦门当前时间输出夏季穿搭防晒建议预算 Agent 拆分住宿、餐饮、门票控制人均 1500调度 Agent 整合三部分内容结构化输出完整方案。3. 返回 JSON 结果{agentMode: Supervisor调度 行程/天气/预算三子Agent,code: 200,travelPlan: 【厦门旅游方案】\n\n一、行程安排\n\n**第一天鼓浪屿风情之旅**\n- 上午乘坐轮渡前往鼓浪屿游览这座充满历史韵味的岛屿感受其独特的建筑风格和休闲氛围。建议停留时长2-3小时。\n- 下午返回厦门岛前往厦门大学漫步在校园内感受这所百年学府的文化底蕴。建议停留时长1-2小时。\n- 晚间前往曾厝垵体验当地的小吃和文艺氛围享受一个轻松愉快的夜晚。建议停留时长2-3小时。\n\n**第二天海滨休闲与宗教文化体验**\n- 上午前往白城沙滩享受阳光沙滩的悠闲时光。建议停留时长2-3小时。\n- 下午参观南普陀寺感受佛教文化的庄严与宁静。建议停留时长1-2小时。\n- 晚间沿环岛路骑行欣赏厦门的夜景享受运动的乐趣。建议停留时长2-3小时。\n\n**第三天历史遗迹与自然生态探索**\n- 上午参观胡里山炮台了解厦门的历史变迁。建议停留时长1-2小时。\n- 下午游览厦门植物园探索丰富的植物种类和生态环境。建议停留时长2-3小时。\n- 晚间漫步至沙坡尾感受老厦门的生活气息。建议停留时长1-2小时。\n\n二、目的地天气与穿搭\n- 当前厦门时间为2026年6月22日17:33:51厦门属于亚热带季风气候出行时建议穿着轻薄透气、宽松舒适的衣服如T恤、短裤、裙子等。同时携带防晒霜、遮阳帽等防晒用品雨天可备雨伞或雨衣。\n\n三、费用预算明细\n- **门票费用**约280元/人\n- **餐饮费用**约150元/人\n- **交通费用**约200元/人\n- **住宿费用**约900元/人\n\n**总计**约1620元/人\n\n注意事项\n- 以上预算为估算实际费用可能因季节、酒店预订情况等因素有所变动。\n- 餐饮费用未包含饮料和小费可根据个人喜好和消费习惯调整。\n- 门票费用未包含可能产生的额外费用如导游、讲解等。\n- 交通费用未包含可能的景点内部交通费用。\n\n本方案旨在为您提供一个结构清晰、内容丰富的厦门旅游指南希望您在厦门的旅程愉快,userDemand: 两人去厦门玩三天偏好海滨景点不吃辣人均预算1500以内,msg: 多Agent协作生成完整旅游方案成功}总结本章基于 Spring AI 实现调度式多 Agent 协作系统使用旅游行程案例将复杂出行任务拆分为行程、天气、预算三个专业化子智能体由 Supervisor 统一分发、汇总结果。相比单一 Agent多 Agent 架构职责清晰、易维护、输出质量更高是企业级 AI 系统标准设计方案。后续将进一步深挖 Multi Agent 高级特性 比如引入对话记忆——Supervisor 绑定 MySQL 持久化记忆记住用户长期偏好动态路由——让调度 Agent 自主判断需要调用哪些子 Agent无需固定全部调用结合 RAG——每个子 Agent 绑定专属知识库景点知识库 / 餐饮知识库
Spring AI 实战:多 Agent 协作实战 —— 分工拆解复杂旅游行程任务
发布时间:2026/7/17 15:59:11
一、什么是多 Agent为什么需要多 Agent1. 单 Agent 痛点单个智能体承载全部任务行程规划、天气查询、预算核算、餐饮推荐系统提示词冗长模型容易混淆职责长上下文下回答质量大幅下降新增业务能力就要修改一套提示词维护成本极高。2. 多 Agent 核心思想职责拆分、专人专岗把复杂大任务拆解多个垂直专业子 Agent再由一个调度 Supervisor Agent 接收用户需求、分配任务、汇总所有子 Agent 输出整合为最终完整答案。类比企业团队前台调度Supervisor→ 行程规划专员 / 天气专员 / 预算专员子 Agent。3. 多 Agent 适用场景业务流程复杂、包含多维度信息输出旅游、方案撰写、电商售后每个领域有独立专业知识需要差异化系统提示词系统需持续新增业务模块希望低耦合扩展长对话、长上下文场景拆分降低单轮提示词长度二、主流通用 Multi-Agent 架构模式详解当前业界通用的Spring AI / LangGraph / AutoGen 广泛采用Supervisor 主管调度、Hierarchical 分层树形、Pipeline 流水线串行、Decentralized 去中心化对等协作 等四种多智能体架构下面分析这四种多智能体架构模式的核心思想和适用场景帮助开发者根据业务选型。模式 1Supervisor 主管调度模式本文案例采用由中央协调智能体作为唯一入口所有子 Agent 互不通信仅与 Supervisor 交互调度层负责需求解析、任务分发、结果汇总、冲突修正。此模式适用于中小型业务、垂直领域综合问答旅游方案、企业咨询、客服系统也是 Spring AI 入门首选模式。模式 2Hierarchical 分层树形模式多级树形分层顶层主管不直接操作底层子 Agent只对接中层 Manager每个中层管理一组垂直子智能体层层分发、层层汇总。此模式多用于大型企业平台、多产品线综合 Agent 系统金融、政企复杂业务。模式 3Pipeline 流水线串行模式智能体按固定线性顺序串行执行前一个 Agent 输出作为后一个输入任务有强先后依赖。此模式流程固定、可预测便于加校验规则适合文档处理、报告生成、数据清洗等标准化流水线任务。模式 4Decentralized 去中心化对等协作模式Swarm 蜂群无中心控制所有智能体对等自主协商、互相传递信息自主判断是否需要其他 Agent 协助。架构模式比对表架构模式控制方式实现难度并发性能可调试性典型业务Supervisor 主管集中控制低中等极佳旅游、客服、综合问答Hierarchical 分层树形分级高高良好政企、金融多模块平台Pipeline 流水线串行固定极低差极佳文档、数据处理流水线去中心化蜂群无中心极高高差创意、学术辩论三、案例说明接下来通过案例详细解析如何使用Spring AI 实现多智能体架构。案例使用Supervisor 主管 Multi-Agent架构模式延续之前的旅游行程规划案例各Agent具体分工如下调度 Supervisor Agent总入口接收用户完整出行需求拆解子任务调用对应子 Agent最后汇总所有输出整合完整行程行程规划子 Agent负责景点、交通、每日时段安排天气查询子 Agent内置时间工具查询目的地实时天气给出穿搭建议预算核算子 Agent根据天数、人数、景点门票预估整体开销。执行流程用户提问 → Supervisor 拆解任务 → 并行 / 串行调用行程 / 天气 / 预算子 Agent → 收集三份结果 → 整合输出完整旅游方案四、项目准备在实现项目之前需要选择支持该功能的 AI 模型。本文选择智普 AI 大模型进行演示同时需先完成以下准备工作1. 基础信息Spring Boot 3.5.3 Spring AI 1.0.0JDK17 智谱 GLM-4-Flash项目名Weiz-SpringAI-MultiAgent2. 完整项目分层结构com.example.weizspringai├── WeizSpringAiMultiAgentApplication.java # 启动类├── agent # 所有Agent定义│ ├── SupervisorAgent.java # 总调度Agent│ ├── ItineraryAgent.java # 行程子Agent│ ├── WeatherAgent.java # 天气子Agent携带时间Tool│ └── BudgetAgent.java # 预算子Agent├── tool # 复用前文时区工具│ ├── TimeMethodTool.java│ └── CityRequest.java├── service # 多Agent调度业务服务│ └── MultiAgentService.java└── controller # 对外HTTP接口└── MultiAgentController.java3. pom.xml 完整依赖?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.example/groupIdartifactIdWeiz-SpringAI-MultiAgent/artifactIdversion0.0.1-SNAPSHOT/version/parentartifactIdWeiz-SpringAI-MultiAgent-Simple/artifactIdnameWeiz-SpringAI-MultiAgent-Simple/namedescriptionWeiz-SpringAI-MultiAgent-Simple/descriptionpropertiesjava.version17/java.versionmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-zhipuai/artifactId/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-client-chat/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project4. application.properties 配置spring.application.nameWeiz-SpringAI-Agent-Toolsserver.port8080spring.ai.zhipuai.api-key你的智谱API Keyspring.ai.zhipuai.base-urlhttps://open.bigmodel.cn/api/paasspring.ai.zhipuai.chat.options.modelGLM-4-Flashlogging.level.org.springframework.aiINFOlogging.level.com.exampleDEBUG五、核心代码实现1. 时区查询 Tool工具为系列前文实现的时区查询 Tool天气子 Agent 内部会自动调用用于获取目的地当前时间为穿搭建议提供时间依据无需重复开发。package com.example.weizspringai.tool;import org.springframework.ai.tool.annotation.Tool;import org.springframework.ai.tool.annotation.ToolParam;import org.springframework.stereotype.Component;import java.time.LocalDateTime;import java.time.ZoneId;import java.util.Map;Componentpublic class TimeMethodTool {Tool(description 根据城市名称获取对应时区当前日期时间)public String getCityCurrentTime(ToolParam(description 城市名称如北京、成都、厦门) String city){MapString, String zoneMap Map.of(北京,Asia/Shanghai,成都,Asia/Shanghai,厦门,Asia/Shanghai,伦敦,Europe/London);String zone zoneMap.getOrDefault(city,Asia/Shanghai);return city 当前时间 LocalDateTime.now(ZoneId.of(zone));}}2. 行程规划子 Agent ItineraryAgent行程规划子 Agent 垂直专注行程规划领域仅接收用户出行需求输出每日景点、交通、游玩时长不涉及天气、预算相关内容职责单一提示词轻量化保证输出精准。package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class ItineraryAgent {private final ChatClient chatClient;/** 根据出行需求生成每日景点交通行程 */public String generateRoute(String demand){String sysPrompt 你是专业行程规划子Agent只负责输出每日景点、交通路线、游玩时长无需预算、无需天气穿搭只输出行程结构用户需求{demand}输出格式按天划分上午/下午/晚间三段标注景点、交通方式、建议停留时长。.replace({demand}, demand);return chatClient.prompt().system(sysPrompt).user(demand).call().content();}}3. 天气子 Agent WeatherAgent内置 Time 工具天气子 Agent 绑定 Time 时区 Tool会自动调用工具获取目的地当前时间结合季节时段输出穿搭、防晒、防雨建议仅输出天气相关内容不干涉行程与预算逻辑。package com.example.weizspringai.agent;import com.example.weizspringai.tool.TimeMethodTool;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class WeatherAgent {private final ChatClient chatClient;private final TimeMethodTool timeTool;/** 根据目的地结合当地时间给出出行穿搭建议 */public String getWeatherAdvice(String destination){String sysPrompt 你是天气穿搭子Agent先调用工具获取目的地当前时间再根据季节时段给出出行穿搭、防晒防雨建议简洁输出。目的地{city}.replace({city}, destination);return chatClient.prompt().system(sysPrompt).user(查询destination出行穿搭建议).tools(timeTool).call().content();}}4. 预算核算子 Agent BudgetAgent预算核算子 Agent 仅负责旅游费用核算自动拆分住宿、门票、餐饮、交通四大开销计算人均总价不输出行程、天气相关内容边界清晰。package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class BudgetAgent {private final ChatClient chatClient;/** 根据天数、人数、目的地核算整体预算 */public String calcBudget(String demand){String sysPrompt 你是旅游预算核算子Agent仅核算人均总花费拆分门票、餐饮、交通、住宿四项明细不输出行程、天气内容用户出行需求{demand}.replace({demand}, demand);return chatClient.prompt().system(sysPrompt).user(demand).call().content();}}5. 核心调度 SupervisorAgent调度 SupervisorAgent是多 Agent 架构核心调度中心统一接收用户原始需求串行调用三类子 Agent 获取独立输出最后汇总全部内容统一排版整合为一份完整旅游方案同时内置简易目的地提取逻辑供天气 Agent 使用。package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;ComponentRequiredArgsConstructorpublic class SupervisorAgent {private final ItineraryAgent itineraryAgent;private final WeatherAgent weatherAgent;private final BudgetAgent budgetAgent;private final ChatClient chatClient;/** 主调度逻辑分发任务、汇总三份子结果 */public String dispatchAndSummary(String userDemand){// 1. 分发调用三个专业子AgentString routeResult itineraryAgent.generateRoute(userDemand);String dest extractCity(userDemand); // 提取目的地String weatherResult weatherAgent.getWeatherAdvice(dest);String budgetResult budgetAgent.calcBudget(userDemand);// 2. 汇总全部信息整合完整旅游方案String summaryPrompt 你是总规划师整合下面三份专业输出生成一份完整通顺的旅游方案【每日行程安排】%s【目的地天气与穿搭】%s【费用预算明细】%s要求结构清晰分三大块排版语言亲切适合出行参考。.formatted(routeResult,weatherResult,budgetResult);// 调用模型整合输出return chatClient.prompt().system(summaryPrompt).user(整合完整旅游方案).call().content();}// 简易提取目的地生产可优化正则/LLM提取private String extractCity(String demand){if(demand.contains(厦门)) return 厦门;if(demand.contains(成都)) return 成都;if(demand.contains(北京)) return 北京;return demand.split(游玩)[0];}}6. 业务 Service 层封装业务统一封装层Controller 不直接操作 Agent通过 Service 中转实现分层解耦便于后续扩展记忆、权限、日志等通用能力。package com.example.weizspringai.service;import com.example.weizspringai.agent.SupervisorAgent;import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Service;ServiceRequiredArgsConstructorpublic class MultiAgentService {private final SupervisorAgent supervisorAgent;/** 对外统一多Agent执行入口 */public String generateFullTravelPlan(String userRequest){return supervisorAgent.dispatchAndSummary(userRequest);}}7. Controller 接口负责对外访问接口接收用户出行需求参数调用业务 Service返回标准化 JSON 结构便于前端解析展示。package com.example.weizspringai.controller;import com.example.weizspringai.service.MultiAgentService;import lombok.RequiredArgsConstructor;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import java.util.Map;RestControllerRequestMapping(/multiAgent)RequiredArgsConstructorpublic class MultiAgentController {private final MultiAgentService multiAgentService;GetMapping(/travelPlan)public MapString, Object travelPlan(RequestParam(demand) String demand){String fullPlan multiAgentService.generateFullTravelPlan(demand);return Map.of(code,200,msg,多Agent协作生成完整旅游方案成功,userDemand,demand,travelPlan,fullPlan,agentMode,Supervisor调度 行程/天气/预算三子Agent);}}六、验证测试1. 测试请求地址项目启动成功后在浏览器中访问地址http://localhost:8080/multiAgent/travelPlan?demand两人去厦门玩三天偏好海滨景点不吃辣人均预算1500以内2. 执行流程复盘传入厦门出行需求Supervisor 提取城市为厦门行程 Agent 生成三天海滨每日路线天气 Agent 调用 Time 工具获取厦门当前时间输出夏季穿搭防晒建议预算 Agent 拆分住宿、餐饮、门票控制人均 1500调度 Agent 整合三部分内容结构化输出完整方案。3. 返回 JSON 结果{agentMode: Supervisor调度 行程/天气/预算三子Agent,code: 200,travelPlan: 【厦门旅游方案】\n\n一、行程安排\n\n**第一天鼓浪屿风情之旅**\n- 上午乘坐轮渡前往鼓浪屿游览这座充满历史韵味的岛屿感受其独特的建筑风格和休闲氛围。建议停留时长2-3小时。\n- 下午返回厦门岛前往厦门大学漫步在校园内感受这所百年学府的文化底蕴。建议停留时长1-2小时。\n- 晚间前往曾厝垵体验当地的小吃和文艺氛围享受一个轻松愉快的夜晚。建议停留时长2-3小时。\n\n**第二天海滨休闲与宗教文化体验**\n- 上午前往白城沙滩享受阳光沙滩的悠闲时光。建议停留时长2-3小时。\n- 下午参观南普陀寺感受佛教文化的庄严与宁静。建议停留时长1-2小时。\n- 晚间沿环岛路骑行欣赏厦门的夜景享受运动的乐趣。建议停留时长2-3小时。\n\n**第三天历史遗迹与自然生态探索**\n- 上午参观胡里山炮台了解厦门的历史变迁。建议停留时长1-2小时。\n- 下午游览厦门植物园探索丰富的植物种类和生态环境。建议停留时长2-3小时。\n- 晚间漫步至沙坡尾感受老厦门的生活气息。建议停留时长1-2小时。\n\n二、目的地天气与穿搭\n- 当前厦门时间为2026年6月22日17:33:51厦门属于亚热带季风气候出行时建议穿着轻薄透气、宽松舒适的衣服如T恤、短裤、裙子等。同时携带防晒霜、遮阳帽等防晒用品雨天可备雨伞或雨衣。\n\n三、费用预算明细\n- **门票费用**约280元/人\n- **餐饮费用**约150元/人\n- **交通费用**约200元/人\n- **住宿费用**约900元/人\n\n**总计**约1620元/人\n\n注意事项\n- 以上预算为估算实际费用可能因季节、酒店预订情况等因素有所变动。\n- 餐饮费用未包含饮料和小费可根据个人喜好和消费习惯调整。\n- 门票费用未包含可能产生的额外费用如导游、讲解等。\n- 交通费用未包含可能的景点内部交通费用。\n\n本方案旨在为您提供一个结构清晰、内容丰富的厦门旅游指南希望您在厦门的旅程愉快,userDemand: 两人去厦门玩三天偏好海滨景点不吃辣人均预算1500以内,msg: 多Agent协作生成完整旅游方案成功}总结本章基于 Spring AI 实现调度式多 Agent 协作系统使用旅游行程案例将复杂出行任务拆分为行程、天气、预算三个专业化子智能体由 Supervisor 统一分发、汇总结果。相比单一 Agent多 Agent 架构职责清晰、易维护、输出质量更高是企业级 AI 系统标准设计方案。后续将进一步深挖 Multi Agent 高级特性 比如引入对话记忆——Supervisor 绑定 MySQL 持久化记忆记住用户长期偏好动态路由——让调度 Agent 自主判断需要调用哪些子 Agent无需固定全部调用结合 RAG——每个子 Agent 绑定专属知识库景点知识库 / 餐饮知识库