
前文我们依次学习了基础对话、聊天记忆(MySQL 持久化)、Tool 工具调用,单个 Agent 只能兼顾规划、查时间、查天气全部工作,任务混杂容易输出混乱。本章进入多 Agent(Multi-Agent),把复杂任务拆分为多个专业子智能体,由总调度 Agent 统一分发、汇总结果,实现职责分离、输出更专业稳定。
一、什么是多 Agent,为什么需要多 Agent?
1. 单 Agent 痛点
单个智能体承载全部任务:行程规划、天气查询、预算核算、餐饮推荐,系统提示词冗长,模型容易混淆职责,长上下文下回答质量大幅下降;新增业务能力就要修改一套提示词,维护成本极高。
2. 多 Agent 核心思想
职责拆分、专人专岗:把复杂大任务拆解多个垂直专业子 Agent,再由一个调度 Supervisor Agent 接收用户需求、分配任务、汇总所有子 Agent 输出,整合为最终完整答案。 类比企业团队:前台调度(Supervisor)→ 行程规划专员 / 天气专员 / 预算专员(子 Agent)。
3. 多 Agent 适用场景
二、主流通用 Multi-Agent 架构模式详解
当前,业界通用的Spring AI / LangGraph / AutoGen 广泛采用Supervisor 主管调度、Hierarchical 分层树形、Pipeline 流水线串行、Decentralized 去中心化对等协作 等四种多智能体架构,下面分析这四种多智能体架构模式的核心思想和适用场景,帮助开发者根据业务选型。
模式 1:Supervisor 主管调度模式(本文案例采用)
由中央协调智能体作为唯一入口,所有子 Agent 互不通信,仅与 Supervisor 交互;调度层负责需求解析、任务分发、结果汇总、冲突修正。

此模式适用于中小型业务、垂直领域综合问答(旅游方案、企业咨询、客服系统),也是 Spring AI 入门首选模式。
模式 2:Hierarchical 分层树形模式
多级树形分层,顶层主管不直接操作底层子 Agent,只对接中层 Manager;每个中层管理一组垂直子智能体,层层分发、层层汇总。

此模式多用于大型企业平台、多产品线综合 Agent 系统(金融、政企复杂业务)。
模式 3:Pipeline 流水线串行模式
智能体按固定线性顺序串行执行,前一个 Agent 输出作为后一个输入,任务有强先后依赖。

此模式流程固定、可预测,便于加校验规则,适合文档处理、报告生成、数据清洗等标准化流水线任务。
模式 4:Decentralized 去中心化对等协作模式(Swarm 蜂群)
无中心控制,所有智能体对等,自主协商、互相传递信息,自主判断是否需要其他 Agent 协助。

架构模式比对表
架构模式 | 控制方式 | 实现难度 | 并发性能 | 可调试性 | 典型业务 |
|---|---|---|---|---|---|
Supervisor 主管 | 集中控制 | 低 | 中等 | 极佳 | 旅游、客服、综合问答 |
Hierarchical 分层 | 树形分级 | 高 | 高 | 良好 | 政企、金融多模块平台 |
Pipeline 流水线 | 串行固定 | 极低 | 差 | 极佳 | 文档、数据处理流水线 |
去中心化蜂群 | 无中心 | 极高 | 高 | 差 | 创意、学术辩论 |
三、案例说明
接下来,通过案例详细解析如何使用Spring AI 实现多智能体架构。案例使用Supervisor 主管 Multi-Agent架构模式,延续之前的旅游行程规划案例,各Agent具体分工如下:
执行流程:用户提问 → Supervisor 拆解任务 → 并行 / 串行调用行程 / 天气 / 预算子 Agent → 收集三份结果 → 整合输出完整旅游方案

四、项目准备
在实现项目之前,需要选择支持该功能的 AI 模型。本文选择智普 AI 大模型进行演示,同时,需先完成以下准备工作:
1. 基础信息
2. 完整项目分层结构
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 version="1.0" encoding="UTF-8"?>
<project xmlns="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>
4. application.properties 配置
spring.application.name=Weiz-SpringAI-Agent-Tools
server.port=8080
spring.ai.zhipuai.api-key=你的智谱API Key
spring.ai.zhipuai.base-url=https://open.bigmodel.cn/api/paas
spring.ai.zhipuai.chat.options.model=GLM-4-Flash
logging.level.org.springframework.ai=INFO
logging.level.com.example=DEBUG
五、核心代码实现
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;
@Component
public 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));
}
}2. 行程规划子 Agent ItineraryAgent
行程规划子 Agent 垂直专注行程规划领域,仅接收用户出行需求,输出每日景点、交通、游玩时长,不涉及天气、预算相关内容,职责单一,提示词轻量化,保证输出精准。
package com.example.weizspringai.agent;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public 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;
@Component
@RequiredArgsConstructor
public 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;
@Component
@RequiredArgsConstructor
public 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;
@Component
@RequiredArgsConstructor
public class SupervisorAgent {
private final ItineraryAgent itineraryAgent;
private final WeatherAgent weatherAgent;
private final BudgetAgent budgetAgent;
private final ChatClient chatClient;
/** 主调度逻辑:分发任务、汇总三份子结果 */
public String dispatchAndSummary(String userDemand){
// 1. 分发调用三个专业子Agent
String 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;
@Service
@RequiredArgsConstructor
public 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;
@RestController
@RequestMapping("/multiAgent")
@RequiredArgsConstructor
public 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以内
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