Spring AI 实战:多 Agent 协作实战 —— 分工拆解复杂旅游行程任务

本章基于 Spring AI 实现调度式多 Agent 协作系统,使用旅游行程案例,将复杂出行任务拆分为行程、天气、预算三个专业化子智能体,由 Supervisor 统一分发、汇总结果。相比单一 Agent,多 Agent 架构职责清晰、易维护、输出质量更高,是企业级 AI 系统标准设计方案。

前文我们依次学习了基础对话、聊天记忆(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:总入口,接收用户完整出行需求,拆解子任务,调用对应子 Agent,最后汇总所有输出整合完整行程;
  • 行程规划子 Agent:负责景点、交通、每日时段安排;
  • 天气查询子 Agent:内置时间工具,查询目的地实时天气,给出穿搭建议;
  • 预算核算子 Agent:根据天数、人数、景点门票预估整体开销。

执行流程:用户提问 → Supervisor 拆解任务 → 并行 / 串行调用行程 / 天气 / 预算子 Agent → 收集三份结果 → 整合输出完整旅游方案

四、项目准备

在实现项目之前,需要选择支持该功能的 AI 模型。本文选择智普 AI 大模型进行演示,同时,需先完成以下准备工作:

1. 基础信息
  • Spring Boot 3.5.3 + Spring AI 1.0.0
  • JDK17 智谱 GLM-4-Flash
  • 项目名:Weiz-SpringAI-MultiAgent
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.java
3. pom.xml 完整依赖
复制代码
<?xml versinotallow="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();
    }
}
  1. 天气子 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();
    }
}
  1. 预算核算子 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();
    }
}
  1. 核心调度 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];
    }
}
  1. 业务 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);
    }
}
  1. 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以内

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 绑定专属知识库(景点知识库 / 餐饮知识库)

相关推荐
小程故事多_802 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
冬奇Lab2 小时前
开源项目第176期:Better Harness — 不审查 diff,审查工作流本身,给 AI 编程 Agent 的五维评估框架
人工智能·开源·agent
冬奇Lab2 小时前
代码库知识库系列(07):混合检索 BM25 + 向量——Q8 还是失败,而且总分退步了
人工智能
ajassi20002 小时前
AI语音智能体开发日记(十一)为智能设备“声”临其境——详解音频资源自动化生成流程
人工智能·ai·ai编程
2601_949499943 小时前
400G组网低功耗优选!芯瑞科技400G VR4 QSFP112光模块赋能智算中心高速互联
大数据·人工智能·科技
GoAI3 小时前
# AI Agent 记忆框架横向对比报告总结
人工智能·大模型·llm·多模态
李昊哲小课4 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
万邦科技Lafite4 小时前
天猫商品评论API:评价内容中的用户情感倾向分析
人工智能·api·电商开放平台·淘宝开放平台·api开放接口
遇码4 小时前
认识 LakeMind:一款本地优先的开源 AI 数据探索工作台
人工智能·开源