
多智能体的出现的必然,是因为单一智能体往往难以应对复杂多变的业务场景。在非AI场景下,路由也是一个非常普世的技术点了,比如常见的负载均衡、nginx的路由转发,他们的思路都是按需将请求分发给目标执行方。
同样的,在多智能体交接策略中,其中路由交接模式也是一种高效的任务分发策略。
本文将基于 Spring AI Alibaba 框架,详细介绍如何实现一个智能客服系统,该系统能够根据用户意图自动路由到不同的专家 Agent。

1.1 什么是多智能体路由模式?
多智能体路由模式(Router Pattern)是一种协作架构,其中:
- Router Agent
:负责分析用户输入,判断意图,选择合适的专家 Agent
- Expert Agents
:各领域的专业智能体,处理特定类型的任务
- 自动切换
:用户无感知地在不同专家间切换,获得专业服务
1.2 适用场景
这种模式特别适合:
- 智能客服系统(销售、技术支持、HR 等)
- 多领域知识问答
- 任务分发和工作流自动化
- 专家系统集成
2.1 技术栈
- 框架
:Spring Boot 3.x + Spring AI Alibaba
- AI 模型
:Qwen2.5-7B-Instruct(通过 SiliconFlow API)
- 前端
:Thymeleaf + 原生 JavaScript
- 通信
:SSE(Server-Sent Events)实现流式响应
2.2 智能体架构
2.3 Agent 角色定义
3.1 项目结构
src/main/java/com/git/hui/springai/ali/├── controller/│ └── CsController.java # 智能客服 REST 控制器(流式接口)├── cs/│ ├── CsRouterAgent.java # 路由 Agent 配置│ ├── SalesAgent.java # 销售 Agent│ ├── HrAgent.java # 人力资源 Agent│ └── TechSupportAgent.java # 技术支持 Agent└── L07Application.java # Spring Boot 启动类src/main/resources/├── templates/│ └── cs-chat.html # 智能客服对话框页面└── application.yml # 应用配置文件
3.2 路由 Agent 配置
路由 Agent 是整个系统的核心,负责意图识别和任务分发:

@Component@RequiredArgsConstructorpublicclassCsRouterAgent { privatefinal ChatModel chatModel; privatefinal SalesAgent salesAgent; privatefinal HrAgent hrAgent; privatefinal TechSupportAgent techSupportAgent; public LlmRoutingAgent routerAgent() { LlmRoutingAgentagent= LlmRoutingAgent.builder() .name("router_agent") .model(chatModel) .description("根据用户输入,将用户问题路由到对应的业务部门") .instruction(""" 根据用户输入,将用户问题路由到对应的业务部门。 【业务部门】 销售部门:处理销售信息、产品介绍、购买渠道、优惠活动等等销售问题 人力资源部门:处理招聘信息、投递简历、面试安排等人力资源问题 技术支持部门:处理技术问题、bug修复、代码优化等等技术问题 """ ).subAgents( List.of(salesAgent.salesAgent(), hrAgent.hrAgent(), techSupportAgent.techSupportAgent()) ).build(); return agent; }}
关键点解析:
- LlmRoutingAgent
:Spring AI Alibaba 提供的路由智能体,自动处理意图识别
- instruction
:定义路由规则的提示词,告诉 LLM 如何分类用户问题
- subAgents
:注册所有可用的专家 Agent
- description
:Agent 的描述,帮助 LLM 做出路由决策
3.3 专家 Agent 实现
每个专家 Agent 使用 ReactAgent 构建,专注于特定领域:

销售 Agent
@Component@RequiredArgsConstructorpublicclassSalesAgent { privatefinal ChatModel chatModel; public ReactAgent salesAgent() { ReactAgentagent= ReactAgent.builder() .name("sales_agent") .model(chatModel) .description("处理销售信息、产品介绍、购买渠道、优惠活动等等销售问题") .instruction("你是一个销售专家,擅长各种销售、产品介绍、购买渠道、优惠活动等等销售问题") .outputKey("sales_response") .enableLogging(true) .build(); return agent; }}
人力资源 Agent
@ComponentpublicclassHrAgent { @Autowired private ChatModel chatModel; public ReactAgent hrAgent() { ReactAgenthrAgent= ReactAgent.builder() .name("hr_agent") .model(chatModel) .description("处理招聘信息、投递简历、面试安排等人力资源问题") .instruction("你是一个专业的人力资源,擅长各种人力相关、招聘、面试、入职等业务流程。请根据用户的提问进行回答。") .outputKey("hr_response") .enableLogging(true) .build(); return hrAgent; }}
技术支持 Agent
@Component@RequiredArgsConstructorpublicclassTechSupportAgent { privatefinal ChatModel chatModel; public ReactAgent techSupportAgent() { ReactAgentagent= ReactAgent.builder() .name("tech_support_agent") .model(chatModel) .description("处理产品故障、使用指导、技术咨询等问题。") .instruction("你是一个专业Tech Support,擅长各种技术问题,包括产品故障处理、使用指导、技术咨询等,请根据用户的提问进行回答") .outputKey("tech_response") .enableLogging(true) .build(); return agent; }}
ReactAgent 配置要点:
- name
:Agent 的唯一标识符,用于路由和日志
- model
:使用的 AI 模型
- description
:简短描述,帮助 Router 识别该 Agent 的职责
- instruction
:详细的角色定义和行为指导
- outputKey
:输出键名,用于在多 Agent 协作中标识响应来源
- enableLogging
:启用日志记录,便于调试
3.4 流式接口实现
控制器使用 SSE 技术实现实时流式响应:
@Slf4j@RestController@RequestMapping("/api/cs")publicclassCsController { privatefinal LlmRoutingAgent routerAgent; privatefinalObjectMapperobjectMapper=newObjectMapper(); publicCsController(CsRouterAgent routerAgent) { this.routerAgent = routerAgent.routerAgent(); } @GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux
> chatStream(@RequestParam String message) { log.info("收到客服消息:{}", message); try } } } data.put("content", contentBuilder.toString()); data.put("hasContent", hasContent); Stringdepartment= determineDepartment(agentName); data.put("department", department); String json; try { json = objectMapper.writeValueAsString(data); } catch (JsonProcessingException e) { log.error("JSON 序列化失败", e); json = "{"error":true,"errorMessage":"JSON 序列化失败"}"; } return ServerSentEvent.
builder() .event("message") .data(json) .build(); }) .onErrorResume(error -> { log.error("流式对话过程中发生错误", error); // 错误处理逻辑 }) .doOnComplete(() -> { log.info("流式对话完成"); }); } catch (Exception e) { log.error("创建流式接口时发生错误", e); // 异常处理逻辑 } } private String determineDepartment(String agentName) elseif (agentName.contains("hr")) { return"hr"; } elseif (agentName.contains("tech")) { return"tech"; } elseif (agentName.contains("router")) { return"router"; } } return"unknown"; }}
流式响应数据结构:
{ "node":"节点名称","agent":"当前处理的 agent","content":"回复内容","hasContent":true,"department":"sales|hr|tech|router"}
4.1 界面设计特点
- 现代化 UI
:渐变色设计,圆角卡片布局
- 实时状态展示
:四个部门的状态指示器,高亮当前服务部门
- 打字机效果
:SSE 流式响应实现逐字显示
- 部门标识
:不同颜**分不同部门的回复
4.2 核心 JavaScript 逻辑
// 发送消息functionsendMessage() `); currentEventSource = eventSource; let lastContentDiv = null; let fullContent = ''; eventSource.onmessage = function(event) ; const headerDiv = document.createElement('div'); headerDiv.className = 'message-header'; headerDiv.innerHTML = `${deptNames[data.department] || data.department}`; msgDiv.appendChild(headerDiv); const contentDiv = document.createElement('div'); contentDiv.className = 'message-content'; contentDiv.textContent = data.content; contentDiv.dataset.agent = data.agent; msgDiv.appendChild(contentDiv); chatMessages.appendChild(msgDiv); lastContentDiv = contentDiv; fullContent = data.content; } else { // 同一个 agent 的连续内容,追加 fullContent += data.content; lastContentDiv.textContent = fullContent; } chatMessages.scrollTop = chatMessages.scrollHeight; } } catch (e) { console.error('解析消息失败:', e); } };}
4.3 Agent 状态更新
// 更新 Agent 状态function updateAgentStatus(department) { // 移除所有激活状态 document.querySelectorAll('.agent-card').forEach(card => { card.classList.remove('active'); }); // 激活当前 agent const activeCard = document.getElementById(`agent-${department}`); if (activeCard) { activeCard.classList.add('active'); }}
5.1 应用配置
在 application.yml 中配置 AI 模型:
spring: ai: openai: api-key:${silicon-api-key} chat: options: model:Qwen/Qwen2.5-7B-Instruct base-url:https://api.siliconflow.cnthymeleaf: cache:falseserver:tomcat: uri-encoding:UTF-8
5.2 启动步骤
- 配置 API Key:
export silicon-api-key=your-api-key-here - 启动应用:
mvn spring-boot:run - 访问界面: 打开浏览器访问
http://localhost:8080/
5.3 测试用例
销售咨询:
- “你们的产品多少钱?”
- “有什么优惠活动吗?”
- “在哪里可以购买?”
人力资源:
- “我想应聘软件工程师岗位”
- “面试流程是怎样的?”
- “什么时候发 offer?”
技术支持:
- “系统登录不上去了怎么办?”
- “这个功能怎么使用?”
- “发现了一个 bug,如何反馈?”
接下来我们通过实现的对话框来演示一下智能客服的自动路由功能

7.1 添加新 Agent
要添加新的专家 Agent,只需:
- 创建新的 Agent 类:
@ComponentpublicclassNewExpertAgent { @Autowired private ChatModel chatModel; public ReactAgent newExpertAgent() { return ReactAgent.builder() .name(“new_expert_agent”) .model(chatModel) .description(“处理特定领域的问题”) .instruction(“你是某某领域的专家…”) .outputKey(“new_expert_response”) .enableLogging(true) .build(); }}
- 在 Router 中注册:
.subAgents(List.of( salesAgent.salesAgent(), hrAgent.hrAgent(), techSupportAgent.techSupportAgent(), newExpertAgent.newExpertAgent() // 添加新 Agent))
- 更新路由提示词和前端显示
7.2 为 Agent 添加工具
Agent 可以装配工具来扩展能力:
public ReactAgent hrAgent() { return ReactAgent.builder() .name(“hr_agent”) .model(chatModel) .tools( newInterviewScheduleTool(), // 面试安排工具 newResumeQueryTool(), // 简历查询工具 newOfferStatusTool() // Offer 状态工具 ) .instruction(“你是人力资源专家…”) .outputKey(“hr_response”) .build();}
7.3 性能优化建议
- 缓存路由决策
:对于常见问题,缓存路由结果
- 模型选择
:根据场景选择合适的模型大小
- 异步处理
:对于耗时操作,使用异步处理
- 限流控制
:防止 API 调用过载
8.1 Spring AI Alibaba 多智能体模式对比
Spring AI Alibaba 提供了多种多智能体协作模式,适用于不同场景:

8.2 快速选型指南
需要的功能 推荐模式─────────────────────────────────────────────────固定流水线 SequentialAgent多角度并行分析 ParallelAgent单次智能分类路由 LlmRoutingAgent多步骤复杂任务编排 SupervisorAgentAgent切换+子Agent工具调用 Handoffs + Agent Tool自定义工作流 FlowAgent
8.3 LlmRoutingAgent vs SupervisorAgent
8.4 **实践
优化路由准确性
// 清晰的Agent描述ReactAgentcodeAgent= ReactAgent.builder() .name(“code_agent”) .description(“专门处理编程问题,擅长Java、Python、JavaScript等主流语言”) .instruction(“你是一个资深软件工程师…”) .build();ReactAgentbusinessAgent= ReactAgent.builder() .name(“business_agent”) .description(“专门处理商业分析、市场研究,不处理技术细节”) .instruction(“你是一个资深商业分析师…”) .build();
使用占位符传递数据
// 前序Agent输出ReactAgentwriterAgent= ReactAgent.builder() .name(“writer_agent”) .instruction(“根据主题创作:{input}”) .outputKey(“article_content”) .build();// 后续Agent引用ReactAgenttranslatorAgent= ReactAgent.builder() .name(“translator_agent”) .instruction(“翻译以下文章:{article_content}”) .build();
9.1 路由不准确
问题:Router 错误地将问题路由到不相关的 Agent。
解决方案:
- 优化 Router 的 instruction 提示词,更清晰地定义各 Agent 职责
- 为每个 Agent 提供更准确的 description
- 考虑使用更强大的模型做路由决策
9.2 响应延迟
问题:用户等待时间过长。
解决方案:
- 使用 SSE 流式响应,实现边生成边显示
- 优化模型选择,平衡速度和质量
- 考虑使用本地部署模型减少网络延迟
9.3 上下文丢失
问题:多轮对话中 Agent 丢失上下文。
解决方案:
- 实现对话历史管理
- 在 Agent 之间传递上下文信息
- 使用 Redis 等缓存对话状态
本文详细介绍了基于 Spring AI Alibaba 框架实现多智能体路由模式的完整流程。

通过构建智能客服系统,我们学习了:
- 路由模式的核心概念
:Router Agent 负责意图识别,Expert Agents 负责专业处理
- Spring AI Alibaba 的关键组件
:LlmRoutingAgent 和 ReactAgent 的使用
- 流式响应的实现
:SSE 技术实现实时对话体验
- 前后端协作
:完整的智能客服系统架构
这种模式具有良好的扩展性,可以轻松添加新的专家 Agent,适用于各种需要智能分发任务的场景。
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/264429.html