前文我们依次学习了基础对话、聊天记忆(MySQL 持久化)、Tool 工具调用,单个 Agent 只能兼顾规划、查时间、查天气全部工作,任务混杂容易输出混乱。本章进入多 Agent(Multi-Agent),把复杂任务拆分为多个专业子智能体,由总调度 Agent 统一分发、汇总结果,实现职责分离、输出更专业稳定。
一、什么是多 Agent,为什么需要多 Agent?
业务流程复杂、包含多维度信息输出(旅游、方案撰写、电商售后); 每个领域有独立专业知识,需要差异化系统提示词; 系统需持续新增业务模块,希望低耦合扩展; 长对话、长上下文场景,拆分降低单轮提示词长度




调度 Supervisor Agent:总入口,接收用户完整出行需求,拆解子任务,调用对应子 Agent,最后汇总所有输出整合完整行程; 行程规划子 Agent:负责景点、交通、每日时段安排; 天气查询子 Agent:内置时间工具,查询目的地实时天气,给出穿搭建议; 预算核算子 Agent:根据天数、人数、景点门票预估整体开销。

Spring Boot 3.5.3 + Spring AI 1.0.0 JDK17 智谱 GLM-4-Flash 项目名:Weiz-SpringAI-MultiAgent
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.java
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>Weiz-SpringAI-MultiAgent</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>Weiz-SpringAI-MultiAgent-Simple</artifactId><name>Weiz-SpringAI-MultiAgent-Simple</name><description>Weiz-SpringAI-MultiAgent-Simple</description><properties><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-zhipuai</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-client-chat</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
spring.application.name=Weiz-SpringAI-Agent-Toolsserver.port=8080spring.ai.zhipuai.api-key=你的智谱API Keyspring.ai.zhipuai.base-url=https://open.bigmodel.cn/api/paasspring.ai.zhipuai.chat.options.model=GLM-4-Flashlogging.level.org.springframework.ai=INFOlogging.level.com.example=DEBUG
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){Map<String, 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));}}
package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;@Component@RequiredArgsConstructorpublic 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();}}
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;@Component@RequiredArgsConstructorpublic 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();}}
package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;@Component@RequiredArgsConstructorpublic 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();}}
package com.example.weizspringai.agent;import lombok.RequiredArgsConstructor;import org.springframework.ai.chat.client.ChatClient;import org.springframework.stereotype.Component;@Component@RequiredArgsConstructorpublic 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];}}
package com.example.weizspringai.service;import com.example.weizspringai.agent.SupervisorAgent;import lombok.RequiredArgsConstructor;import org.springframework.stereotype.Service;@Service@RequiredArgsConstructorpublic class MultiAgentService {private final SupervisorAgent supervisorAgent;/** 对外统一多Agent执行入口 */public String generateFullTravelPlan(String userRequest){return supervisorAgent.dispatchAndSummary(userRequest);}}
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;@RestController@RequestMapping("/multiAgent")@RequiredArgsConstructorpublic class MultiAgentController {private final MultiAgentService multiAgentService;@GetMapping("/travelPlan")public Map<String, 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 绑定专属知识库(景点知识库 / 餐饮知识库)
本系列文章源码:https://gitee.com/weizhong1988/weiz-spring-ai
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
我的新书《从零开始学 Spring Cloud微服务架构》已在各大线上线下书店全面上架,热切期待大家前去选购!让我们携手共赴这场精彩绝伦的微服务架构学习盛宴吧!💪
点击图片购买🙏🙏🙏🙏

夜雨聆风