当前位置: 首页 > news >正文

springboot+langchain4j 实战 Day13 多 Agent 协作(Router + 子 Agent 分流)

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,要求只输出类别名
子 AgentLangChain4jAiServices+@SystemMessage每个 Agent 独立角色设定 + 独立ChatMemory(10 条)
分发Map<String, Object>+instanceof根据 Router 输出匹配到对应 Bean

三、技术栈

  • 框架: Spring Boot 2.7.18 + Tomcat 9.0.83
  • LLM: deepseek-ai/DeepSeek-V3 via 硅基流动(OpenAI 兼容)
  • Agent: LangChain4j 0.36.2(AiServices、@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 分类 Prompt

privatestaticfinalStringROUTER_PROMPT=""" 你是一个路由分发器。根据用户消息,判断属于哪个类别,**只回复类别名称,不要解释,不要加标点**: - 订单查询、物流追踪、商品信息、退换货政策、促销优惠 → CUSTOMER_SERVICE - 投诉、退款、差评、产品质量问题、维修、赔偿 → AFTER_SALES - 技术问题、报错排查、安装配置、API/SDK使用、bug报告 → TECH_SUPPORT - 无法归类或普通闲聊 → GENERAL 用户消息: """;

为什么用裸 LLM?AiServices 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 分类Stringcategory=chatModel.generate(ROUTER_PROMPT+message);category=category.trim().toUpperCase();// 2. 路由匹配ObjectsubAgent=subAgents.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 个场景)# 客服curl"http://localhost:8088/agent/chat?message=我的订单什么时候到"# 售后curl"http://localhost:8088/agent/chat?message=收到的手机屏幕有划痕,我要退款"# 技术支持curl"http://localhost:8088/agent/chat?message=SDK初始化报NullPointerException怎么解决"# 通用curl"http://localhost:8088/agent/chat?message=你好"

测试截图:




七、验证结果(实测)

场景用户消息Router 分类子 Agent响应摘要
客服“我的订单什么时候到”CUSTOMER_SERVICE客服物流追踪建议、正常 3-5 天达
售后“手机屏幕有划痕退款”AFTER_SALES售后先致歉、退款/换货/补偿三方案
技术“SDK NPE 怎么解决”TECH_SUPPORT技术支持4 步排查 + Java 代码示例
通用“你好”GENERAL通用问候并引导到专业部门

4 个场景全部正确路由 + 子 Agent 给出领域相关回答。

九、下一步优化方向

  1. 多轮对话: 当前每个子 Agent 有独立ChatMemory,但 Router 无记忆 — 后续可让 Router 记住上下文
  2. 动态子 Agent 注册: 用 Spring Bean 扫描 + 自定义注解@AgentType("CUSTOMER_SERVICE")替代硬编码 Map
  3. 工具嵌入子 Agent: 客服 Agent 接入订单查询 Tool,技术支持 Agent 接入知识库 Tool
  4. Router 置信度: 让 LLM 同时输出分类 + 置信度,低置信度时反问用户确认

十、与 Day 11/12 的关系

Day主题核心能力
Day 11Agent 自主决策单 Agent + Tool 调用(天气/搜索)
Day 12SSE 流式对话逐 token 推送前端
Day 13多 Agent 协作Router 分流 + 角色分离 + 独立记忆

Day 13 是 Day 11 的架构升级:从「一个 Agent 包揽一切」升级为「多个专业 Agent 各司其职」。

http://www.jsqmd.com/news/1080518/

相关文章:

  • BatteryML深度解析:如何用机器学习技术破解电池寿命预测难题
  • 2026年直播圈首选:如何找到靠谱的直播公会工会?
  • 经销商管理系统能解决渠道库存不透明的问题吗?
  • 08-DeepAgents与生产部署
  • 重构技巧实战
  • RePKG终极指南:深度解析Wallpaper Engine资源提取与TEX转换技术
  • 怎么办驾驶证翻译件?办理驾驶证证翻译件都需要什么资料?
  • DeepSeek API 返回 429:原因分析与 5 种解决方案
  • Rust的#[derive(Clone)]派生与手动实现Clone特质的性能差异分析
  • VMware上安装Docker到底难不难?97%新手踩的3个致命错误,今天一次性说透
  • 如何快速设置游戏自动翻译:XUnity.AutoTranslator新手完整指南
  • 消息队列RabbitMQ实战应用
  • templ:让 Go 模板告别「运行时翻车」的类型安全方案
  • iPaaS架构和组件系列(四):部署模式——iPaaS的多面体
  • 基于Nuclei构建企业级漏洞扫描平台:架构设计与工程实践
  • 梅雨季浑身黏腻、睡不醒、浑身没劲?多喝这碗岭南祛湿汤
  • 深耕内容定位持续产出,高价值原创干货方法论
  • Nginx安全加固:NAXSI WAF模块的完整配置与实战指南
  • STM32停车管理车位收费语音导航APP设计188-3(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 晶创7等滚动码GTU卡原理与实操指南:从动态安全到电梯门禁应用
  • GetQzonehistory终极指南:3步轻松备份你的QQ空间完整历史
  • GetQzonehistory:你的数字记忆保险箱,让QQ空间回忆永不丢失
  • 文件上传漏洞攻防实战:从Webshell攻击到纵深防御体系构建
  • 淘宝API签名机制全解析:从Base64图片处理到MD5签名实战
  • 大模型Skill轻量化设计,一套分层架构彻底搞定Token消耗优化
  • 为什么你的VMware开发环境总比同事慢47%?20年性能调优数据揭示:89%源于这2项BIOS/ESXi底层配置疏漏
  • 2026年想在吉林市做全飞秒手术?哪家专业靠谱这里告诉你!
  • 【EF Core】值转换器
  • 威联通TSh2287XURP食品包装产线数据架构
  • DIY申请用的免费降英文AI工具对比