Day 13 — 多 Agent 协作Router 子 Agent 分流源代码:源代码一、目标实现Router 路由分发 子 Agent 专业处理的多 Agent 协作架构。用户消息先经过 Router 意图分类再自动转发给对应领域的子 Agent每个子 Agent 有独立的角色设定System Prompt和对话记忆。二、架构图用户消息任意话题 ↓ Router裸 LLM 分类 ├── CUSTOMER_SERVICE → 客服 Agent ├── AFTER_SALES → 售后 Agent ├── TECH_SUPPORT → 技术支持 Agent └── GENERAL → 通用 Agent ↓ 子 Agent 回答 → 返回给用户关键设计层次实现方式说明RouterchatModel.generate()裸 LLM 调用无 Tools纯文本分类 prompt要求只输出类别名子 AgentLangChain4jAiServicesSystemMessage每个 Agent 独立角色设定 独立ChatMemory10 条分发MapString, Objectinstanceof根据 Router 输出匹配到对应 Bean三、技术栈框架: Spring Boot 2.7.18 Tomcat 9.0.83LLM: deepseek-ai/DeepSeek-V3 via 硅基流动OpenAI 兼容Agent: LangChain4j 0.36.2AiServices、SystemMessage、UserMessage语言: Java 17四、项目结构day13/ ├── pom.xml ├── src/main/java/com/day13/demo/ │ ├── Day13Application.java # 启动类 │ ├── config/ChatModelConfig.java # LLM Bean 配置 │ ├── controller/ │ │ └── MultiAgentController.java # REST API: GET /agent/chat │ ├── service/ │ │ └── MultiAgentService.java # 核心Router 4 个子 Agent │ ├── dto/Result.java # 统一响应体 │ └── tool/WeatherTool.java # 华风爱科天气 Tool备用 └── src/main/resources/ └── application.yml # 硅基流动 API Key明文五、核心代码5.1 Router 分类 PromptprivatestaticfinalStringROUTER_PROMPT 你是一个路由分发器。根据用户消息判断属于哪个类别**只回复类别名称不要解释不要加标点** - 订单查询、物流追踪、商品信息、退换货政策、促销优惠 → CUSTOMER_SERVICE - 投诉、退款、差评、产品质量问题、维修、赔偿 → AFTER_SALES - 技术问题、报错排查、安装配置、API/SDK使用、bug报告 → TECH_SUPPORT - 无法归类或普通闲聊 → GENERAL 用户消息 ;为什么用裸 LLMAiServices Router 模式需要template非空SystemMessage但 Router 只需要做一次分类无需多轮对话直接用chatModel.generate()更轻量。5.2 子 Agent 接口4 个独立角色// 客服interfaceCustomerServiceAgent{SystemMessage(你是客服专员负责订单查询、物流追踪、商品咨询、退换货政策。请友好热情地回复。)Stringchat(UserMessageStringuserMessage);}// 售后interfaceAfterSalesAgent{SystemMessage(你是售后专员处理投诉退款维修。请先致歉给出具体方案。)Stringchat(UserMessageStringuserMessage);}// 技术支持interfaceTechSupportAgent{SystemMessage(你是技术支持工程师负责技术排查。请专业但易懂地回复。)Stringchat(UserMessageStringuserMessage);}// 通用interfaceGeneralAgent{SystemMessage(你是通用 AI 助手回答各类问题。)Stringchat(UserMessageStringuserMessage);}每个子 Agent 通过AiServices.builder()构建拥有独立的MessageWindowChatMemory.withMaxMessages(10)。5.3 分发逻辑publicStringchat(Stringmessage){// 1. Router 分类StringcategorychatModel.generate(ROUTER_PROMPTmessage);categorycategory.trim().toUpperCase();// 2. 路由匹配ObjectsubAgentsubAgents.getOrDefault(category,subAgents.get(GENERAL));// 3. 调用子 Agentif(subAgentinstanceofCustomerServiceAgentagent){return[客服] agent.chat(message);}elseif(subAgentinstanceofAfterSalesAgentagent){return[售后] agent.chat(message);}// ... TechSupport / General}六、启动与测试cdday13 mvn spring-boot:run-DskipTests# 测试4 个场景# 客服curlhttp://localhost:8088/agent/chat?message我的订单什么时候到# 售后curlhttp://localhost:8088/agent/chat?message收到的手机屏幕有划痕我要退款# 技术支持curlhttp://localhost:8088/agent/chat?messageSDK初始化报NullPointerException怎么解决# 通用curlhttp://localhost:8088/agent/chat?message你好测试截图七、验证结果实测场景用户消息Router 分类子 Agent响应摘要客服“我的订单什么时候到”CUSTOMER_SERVICE客服物流追踪建议、正常 3-5 天达售后“手机屏幕有划痕退款”AFTER_SALES售后先致歉、退款/换货/补偿三方案技术“SDK NPE 怎么解决”TECH_SUPPORT技术支持4 步排查 Java 代码示例通用“你好”GENERAL通用问候并引导到专业部门✅4 个场景全部正确路由 子 Agent 给出领域相关回答。九、下一步优化方向多轮对话: 当前每个子 Agent 有独立ChatMemory但 Router 无记忆 — 后续可让 Router 记住上下文动态子 Agent 注册: 用 Spring Bean 扫描 自定义注解AgentType(CUSTOMER_SERVICE)替代硬编码 Map工具嵌入子 Agent: 客服 Agent 接入订单查询 Tool技术支持 Agent 接入知识库 ToolRouter 置信度: 让 LLM 同时输出分类 置信度低置信度时反问用户确认十、与 Day 11/12 的关系Day主题核心能力Day 11Agent 自主决策单 Agent Tool 调用天气/搜索Day 12SSE 流式对话逐 token 推送前端Day 13多 Agent 协作Router 分流 角色分离 独立记忆Day 13 是 Day 11 的架构升级从「一个 Agent 包揽一切」升级为「多个专业 Agent 各司其职」。
springboot+langchain4j 实战 Day13 多 Agent 协作(Router + 子 Agent 分流)
发布时间:2026/6/26 9:27:01
Day 13 — 多 Agent 协作Router 子 Agent 分流源代码:源代码一、目标实现Router 路由分发 子 Agent 专业处理的多 Agent 协作架构。用户消息先经过 Router 意图分类再自动转发给对应领域的子 Agent每个子 Agent 有独立的角色设定System Prompt和对话记忆。二、架构图用户消息任意话题 ↓ Router裸 LLM 分类 ├── CUSTOMER_SERVICE → 客服 Agent ├── AFTER_SALES → 售后 Agent ├── TECH_SUPPORT → 技术支持 Agent └── GENERAL → 通用 Agent ↓ 子 Agent 回答 → 返回给用户关键设计层次实现方式说明RouterchatModel.generate()裸 LLM 调用无 Tools纯文本分类 prompt要求只输出类别名子 AgentLangChain4jAiServicesSystemMessage每个 Agent 独立角色设定 独立ChatMemory10 条分发MapString, Objectinstanceof根据 Router 输出匹配到对应 Bean三、技术栈框架: Spring Boot 2.7.18 Tomcat 9.0.83LLM: deepseek-ai/DeepSeek-V3 via 硅基流动OpenAI 兼容Agent: LangChain4j 0.36.2AiServices、SystemMessage、UserMessage语言: Java 17四、项目结构day13/ ├── pom.xml ├── src/main/java/com/day13/demo/ │ ├── Day13Application.java # 启动类 │ ├── config/ChatModelConfig.java # LLM Bean 配置 │ ├── controller/ │ │ └── MultiAgentController.java # REST API: GET /agent/chat │ ├── service/ │ │ └── MultiAgentService.java # 核心Router 4 个子 Agent │ ├── dto/Result.java # 统一响应体 │ └── tool/WeatherTool.java # 华风爱科天气 Tool备用 └── src/main/resources/ └── application.yml # 硅基流动 API Key明文五、核心代码5.1 Router 分类 PromptprivatestaticfinalStringROUTER_PROMPT 你是一个路由分发器。根据用户消息判断属于哪个类别**只回复类别名称不要解释不要加标点** - 订单查询、物流追踪、商品信息、退换货政策、促销优惠 → CUSTOMER_SERVICE - 投诉、退款、差评、产品质量问题、维修、赔偿 → AFTER_SALES - 技术问题、报错排查、安装配置、API/SDK使用、bug报告 → TECH_SUPPORT - 无法归类或普通闲聊 → GENERAL 用户消息 ;为什么用裸 LLMAiServices Router 模式需要template非空SystemMessage但 Router 只需要做一次分类无需多轮对话直接用chatModel.generate()更轻量。5.2 子 Agent 接口4 个独立角色// 客服interfaceCustomerServiceAgent{SystemMessage(你是客服专员负责订单查询、物流追踪、商品咨询、退换货政策。请友好热情地回复。)Stringchat(UserMessageStringuserMessage);}// 售后interfaceAfterSalesAgent{SystemMessage(你是售后专员处理投诉退款维修。请先致歉给出具体方案。)Stringchat(UserMessageStringuserMessage);}// 技术支持interfaceTechSupportAgent{SystemMessage(你是技术支持工程师负责技术排查。请专业但易懂地回复。)Stringchat(UserMessageStringuserMessage);}// 通用interfaceGeneralAgent{SystemMessage(你是通用 AI 助手回答各类问题。)Stringchat(UserMessageStringuserMessage);}每个子 Agent 通过AiServices.builder()构建拥有独立的MessageWindowChatMemory.withMaxMessages(10)。5.3 分发逻辑publicStringchat(Stringmessage){// 1. Router 分类StringcategorychatModel.generate(ROUTER_PROMPTmessage);categorycategory.trim().toUpperCase();// 2. 路由匹配ObjectsubAgentsubAgents.getOrDefault(category,subAgents.get(GENERAL));// 3. 调用子 Agentif(subAgentinstanceofCustomerServiceAgentagent){return[客服] agent.chat(message);}elseif(subAgentinstanceofAfterSalesAgentagent){return[售后] agent.chat(message);}// ... TechSupport / General}六、启动与测试cdday13 mvn spring-boot:run-DskipTests# 测试4 个场景# 客服curlhttp://localhost:8088/agent/chat?message我的订单什么时候到# 售后curlhttp://localhost:8088/agent/chat?message收到的手机屏幕有划痕我要退款# 技术支持curlhttp://localhost:8088/agent/chat?messageSDK初始化报NullPointerException怎么解决# 通用curlhttp://localhost:8088/agent/chat?message你好测试截图七、验证结果实测场景用户消息Router 分类子 Agent响应摘要客服“我的订单什么时候到”CUSTOMER_SERVICE客服物流追踪建议、正常 3-5 天达售后“手机屏幕有划痕退款”AFTER_SALES售后先致歉、退款/换货/补偿三方案技术“SDK NPE 怎么解决”TECH_SUPPORT技术支持4 步排查 Java 代码示例通用“你好”GENERAL通用问候并引导到专业部门✅4 个场景全部正确路由 子 Agent 给出领域相关回答。九、下一步优化方向多轮对话: 当前每个子 Agent 有独立ChatMemory但 Router 无记忆 — 后续可让 Router 记住上下文动态子 Agent 注册: 用 Spring Bean 扫描 自定义注解AgentType(CUSTOMER_SERVICE)替代硬编码 Map工具嵌入子 Agent: 客服 Agent 接入订单查询 Tool技术支持 Agent 接入知识库 ToolRouter 置信度: 让 LLM 同时输出分类 置信度低置信度时反问用户确认十、与 Day 11/12 的关系Day主题核心能力Day 11Agent 自主决策单 Agent Tool 调用天气/搜索Day 12SSE 流式对话逐 token 推送前端Day 13多 Agent 协作Router 分流 角色分离 独立记忆Day 13 是 Day 11 的架构升级从「一个 Agent 包揽一切」升级为「多个专业 Agent 各司其职」。