目录
[1. 整体架构(分层设计)](#1. 整体架构(分层设计))
[2. 核心技术选型](#2. 核心技术选型)
[1. 依赖配置(pom.xml)](#1. 依赖配置(pom.xml))
[2. 配置层](#2. 配置层)
[(1)OpenAI 配置(OpenAiConfig.java)](#(1)OpenAI 配置(OpenAiConfig.java))
[3. 数据模型(ShopAgentContext.java)](#3. 数据模型(ShopAgentContext.java))
[4. 智能体服务层](#4. 智能体服务层)
(1)下单智能体(OrderAgentService.java)
(2)支付智能体(PaymentAgentService.java)
(3)物流智能体(LogisticsAgentService.java)
(4)交付智能体(DeliveryAgentService.java)
(5)客服智能体(CustomerServiceAgent.java)
[5. 流程编排(ShopWorkflowService.java)](#5. 流程编排(ShopWorkflowService.java))
[6. 控制层(ShopAgentController.java)](#6. 控制层(ShopAgentController.java))
[7. 启动类(ShopMultiAgentApplication.java)](#7. 启动类(ShopMultiAgentApplication.java))
[8. 测试类(ShopAgentFlowTest.java)](#8. 测试类(ShopAgentFlowTest.java))
基于 Spring AI 框架构建购物场景多智能体协作系统,包括项目背景、架构设计、工程结构及核心代码实现,如依赖配置、配置层(OpenAI 配置和支付宝配置)、数据模型和智能体服务层等,旨在实现全链路智能化、低耦合、高扩展的购物流程管理,帮助数据服务提供商降本增效。
一、项目背景
在电商零售场景中,"下单 - 支付 - 物流 - 交付 - 客服" 是贯穿交易全生命周期的核心链路,传统单体系统存在三大痛点:
流程耦合度高:各环节强绑定,新增 / 修改业务规则(如物流渠道、支付方式)需重构整体逻辑;
智能化不足:固定规则难以适配个性化需求(如动态物流方案、智能客服应答);
多工具集成复杂:OpenAI 大模型、支付宝 MCP、RAG 知识库等多源工具调用需大量胶水代码,维护成本高。
本项目基于 Spring AI 框架构建购物场景多智能体协作系统,将核心链路拆解为 5 个独立智能体,通过 StateGraph 实现流程编排,结合 OpenAI 原生接口、支付宝 MCP 工具、RAG 知识库,实现全链路智能化、低耦合、高扩展的购物流程管理,帮助数据服务提供商降本增效。
二、架构设计
1. 整体架构(分层设计)
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ┌─────────────────┐ │ Controller层 │ 对外暴露REST接口,接收请求并触发流程 ├─────────────────┤ │ Service层 │ 核心业务层:5个智能体+StateGraph流程编排 ├─────────────────┤ │ Config层 │ 配置OpenAI/支付宝客户端,依赖注入 ├─────────────────┤ │ DTO层 │ 定义上下文/请求模型,统一数据传递格式 └─────────────────┘ |
2. 核心技术选型
基础框架:Spring Boot 3.2 + Spring AI 1.0.0-M1
流程编排:Spring AI StateGraph
AI 能力:OpenAI 原生 API(Completions/Embeddings/Chat)
第三方工具:支付宝 MCP 工具
知识库:RAG 自定义 API + OpenAI Embeddings
三、工程结构
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| src/main/java/com/shop/multiagent/ ├── ShopMultiAgentApplication.java // 启动类 ├── config/ // 配置层 │ ├── OpenAiConfig.java // OpenAI客户端配置 │ └── AlipayConfig.java // 支付宝MCP配置 ├── controller/ // 控制层 │ └── ShopAgentController.java // 购物流程入口接口 ├── service/ // 服务层 │ ├── agent/ // 5个智能体实现 │ │ ├── OrderAgentService.java // 下单智能体 │ │ ├── PaymentAgentService.java // 调支付智能体 │ │ ├── LogisticsAgentService.java// 查物流智能体 │ │ ├── DeliveryAgentService.java // 能交付智能体 │ │ └── CustomerServiceAgent.java // 做客服智能体 │ └── workflow/ // 流程编排 │ └── ShopWorkflowService.java // StateGraph流程组装 ├── dto/ // 数据模型 │ └── ShopAgentContext.java // 智能体上下文(传递数据) └── test/ // 测试类 └── ShopAgentFlowTest.java // 单节点+全流程测试 |
四、核心代码实现
1. 依赖配置(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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.6</version> <relativePath/> </parent> <groupId>com.shop</groupId> <artifactId>multi-agent-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <!-- Spring AI 核心(StateGraph+OpenAI) --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>1.0.0-M1</version> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-core</artifactId> <version>1.0.0-M1</version> </dependency> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 支付宝MCP工具 --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.38.0.ALL</version> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <repositories> <repository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone\</url> </repository> </repositories> </project> |
2. 配置层
(1)OpenAI 配置(OpenAiConfig.java)
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.config; import org.springframework.ai.openai.OpenAiApi; import org.springframework.ai.openai.OpenAiChatClient; import org.springframework.ai.openai.OpenAiCompletionsClient; import org.springframework.ai.openai.OpenAiEmbeddingClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenAiConfig { @Value("${spring.ai.openai.api-key}") private String apiKey; @Bean public OpenAiApi openAiApi() { return new OpenAiApi("https://api.openai.com/v1", apiKey); } // 下单/交付智能体:流式Prompt输出 @Bean public OpenAiCompletionsClient completionsClient() { return new OpenAiCompletionsClient(openAiApi()); } // 客服智能体:RAG向量嵌入 @Bean public OpenAiEmbeddingClient embeddingClient() { return new OpenAiEmbeddingClient(openAiApi()); } // 通用对话(客服/物流) @Bean public OpenAiChatClient chatClient() { return new OpenAiChatClient(openAiApi()); } } |
(2)支付宝配置(AlipayConfig.java)
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.config; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AlipayConfig { @Value("{alipay.app-id}") private String appId; @Value("{alipay.private-key}") private String privateKey; @Value("{alipay.public-key}") private String alipayPublicKey; @Value("{alipay.gateway-url}") private String gatewayUrl; @Bean public AlipayClient alipayClient() { return new DefaultAlipayClient(gatewayUrl, appId, privateKey, "json", "UTF-8", alipayPublicKey, "RSA2"); } } |
3. 数据模型(ShopAgentContext.java)
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.dto; import lombok.Data; // 智能体上下文:节点间数据传递载体 @Data public class ShopAgentContext { private String orderId; // 订单ID private String productInfo; // 商品信息 private String userId; // 用户ID private String tradeNo; // 支付宝交易号 // 各节点输出 private String orderInfo; // 下单智能体输出 private boolean paymentSuccess; // 支付智能体结果 private String logisticsInfo; // 物流智能体结果 private String deliveryInfo; // 交付智能体输出 private String customerServiceReply; // 客服智能体结果 } |
4. 智能体服务层
(1)下单智能体(OrderAgentService.java)
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.service.agent; import com.shop.multiagent.dto.ShopAgentContext; import org.springframework.ai.openai.OpenAiCompletionsClient; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @Service public class OrderAgentService { private final OpenAiCompletionsClient completionsClient; public OrderAgentService(OpenAiCompletionsClient completionsClient) { this.completionsClient = completionsClient; } // 下单节点:流式Prompt生成订单信息 public ShopAgentContext execute(ShopAgentContext context) { String prompt = String.format( "生成订单%s的JSON格式下单信息,用户%s,商品%s,包含:商品明细、金额、收货地址、下单时间", context.getOrderId(), context.getUserId(), context.getProductInfo() ); // OpenAI流式接口调用 Flux<String> stream = completionsClient.stream(prompt); StringBuilder orderInfo = new StringBuilder(); stream.subscribe( chunk -> orderInfo.append(chunk), e -> System.err.println("下单生成异常:" + e.getMessage()) ); // 阻塞等待流式输出(测试用,生产建议异步) try { Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } context.setOrderInfo(orderInfo.toString().trim()); return context; } } |
(2)支付智能体(PaymentAgentService.java)
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.service.agent; import com.alipay.api.AlipayClient; import com.alipay.api.request.AlipayTradeQueryRequest; import com.alipay.api.response.AlipayTradeQueryResponse; import com.shop.multiagent.dto.ShopAgentContext; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; @Service public class PaymentAgentService { private final AlipayClient alipayClient; public PaymentAgentService(AlipayClient alipayClient) { this.alipayClient = alipayClient; } // 支付节点:调用支付宝MCP校验支付状态 public ShopAgentContext execute(ShopAgentContext context) { try { AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); Map<String, String> bizContent = new HashMap<>(); bizContent.put("out_trade_no", context.getOrderId()); bizContent.put("trade_no", context.getTradeNo()); request.setBizContent(bizContent.toString()); // 调用支付宝MCP真实接口 AlipayTradeQueryResponse response = alipayClient.execute(request); context.setPaymentSuccess(response.isSuccess() && "TRADE_SUCCESS".equals(response.getTradeStatus())); } catch (Exception e) { context.setPaymentSuccess(false); System.err.println("支付校验异常:" + e.getMessage()); } return context; } } |
(3)物流智能体(LogisticsAgentService.java)
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.service.agent; import com.shop.multiagent.dto.ShopAgentContext; import org.springframework.ai.openai.OpenAiChatClient; import org.springframework.stereotype.Service; @Service public class LogisticsAgentService { private final OpenAiChatClient chatClient; public LogisticsAgentService(OpenAiChatClient chatClient) { this.chatClient = chatClient; } // 物流节点:调用支付宝MCP查物流+OpenAI生成结果 public ShopAgentContext execute(ShopAgentContext context) { if (!context.isPaymentSuccess()) { context.setLogisticsInfo("支付失败,暂不查询物流"); return context; } // 模拟调用支付宝物流查询MCP接口(真实场景替换为支付宝API) String alipayLogistics = String.format("订单%s物流状态:已揽收,快递公司:顺丰,运单号:SF123456789", context.getOrderId()); // OpenAI优化物流信息输出 String prompt = String.format("将以下物流信息整理为用户友好的格式:%s", alipayLogistics); context.setLogisticsInfo(chatClient.call(prompt)); return context; } } |
(4)交付智能体(DeliveryAgentService.java)
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.service.agent; import com.shop.multiagent.dto.ShopAgentContext; import org.springframework.ai.openai.OpenAiCompletionsClient; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @Service public class DeliveryAgentService { private final OpenAiCompletionsClient completionsClient; public DeliveryAgentService(OpenAiCompletionsClient completionsClient) { this.completionsClient = completionsClient; } // 交付节点:流式Prompt生成交付信息 public ShopAgentContext execute(ShopAgentContext context) { if (!context.isPaymentSuccess()) { context.setDeliveryInfo("支付失败,无法交付"); return context; } String prompt = String.format( "基于订单%s的物流信息[%s],生成交付预估信息,包含:预计送达时间、签收提醒、异常处理方式", context.getOrderId(), context.getLogisticsInfo() ); // OpenAI流式接口调用 Flux<String> stream = completionsClient.stream(prompt); StringBuilder deliveryInfo = new StringBuilder(); stream.subscribe( chunk -> deliveryInfo.append(chunk), e -> System.err.println("交付生成异常:" + e.getMessage()) ); try { Thread.sleep(2000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } context.setDeliveryInfo(deliveryInfo.toString().trim()); return context; } } |
(5)客服智能体(CustomerServiceAgent.java)
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.service.agent; import com.shop.multiagent.dto.ShopAgentContext; import org.springframework.ai.openai.OpenAiChatClient; import org.springframework.ai.openai.OpenAiEmbeddingClient; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; @Service public class CustomerServiceAgent { private final OpenAiEmbeddingClient embeddingClient; private final OpenAiChatClient chatClient; private final RestTemplate restTemplate = new RestTemplate(); // RAG知识库API地址 private final String RAG_API_URL = "http://localhost:8080/api/rag/cs-knowledge"; public CustomerServiceAgent(OpenAiEmbeddingClient embeddingClient, OpenAiChatClient chatClient) { this.embeddingClient = embeddingClient; this.chatClient = chatClient; } // 客服节点:RAG知识库+OpenAI生成应答 public ShopAgentContext execute(ShopAgentContext context) { try { // 1. 生成上下文向量(RAG核心) String csQuestion = String.format("用户询问订单%s的交付与物流问题,订单信息:%s,物流:%s,交付:%s", context.getOrderId(), context.getOrderInfo(), context.getLogisticsInfo(), context.getDeliveryInfo()); float[] embedding = embeddingClient.embed(csQuestion).getEmbedding(); // 2. 调用RAG知识库API Map<String, Object> ragRequest = new HashMap<>(); ragRequest.put("orderId", context.getOrderId()); ragRequest.put("embedding", embedding); Map<String, String> ragContext = restTemplate.postForObject(RAG_API_URL, ragRequest, Map.class); // 3. 生成客服应答 String prompt = String.format("基于知识库:%s,生成友好的客服应答,回复用户关于订单%s的问题", ragContext.get("context"), context.getOrderId()); context.setCustomerServiceReply(chatClient.call(prompt)); } catch (Exception e) { context.setCustomerServiceReply("客服应答生成失败:" + e.getMessage()); } return context; } // 模拟RAG知识库API public Map<String, String> mockCsRagApi(Map<String, Object> request) { Map<String, String> response = new HashMap<>(); response.put("context", "1. 顺丰物流江浙沪1天达;2. 交付异常可联系400-123-4567;3. 签收后7天无理由退换"); return response; } } |
5. 流程编排(ShopWorkflowService.java)
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.service.workflow; import com.shop.multiagent.dto.ShopAgentContext; import com.shop.multiagent.service.agent.*; import org.springframework.ai.stategraph.StateGraph; import org.springframework.stereotype.Service; @Service public class ShopWorkflowService { private final OrderAgentService orderAgent; private final PaymentAgentService paymentAgent; private final LogisticsAgentService logisticsAgent; private final DeliveryAgentService deliveryAgent; private final CustomerServiceAgent csAgent; public ShopWorkflowService(OrderAgentService orderAgent, PaymentAgentService paymentAgent, LogisticsAgentService logisticsAgent, DeliveryAgentService deliveryAgent, CustomerServiceAgent csAgent) { this.orderAgent = orderAgent; this.paymentAgent = paymentAgent; this.logisticsAgent = logisticsAgent; this.deliveryAgent = deliveryAgent; this.csAgent = csAgent; } // 构建StateGraph流程:下单→支付→物流→交付→客服 public StateGraph<ShopAgentContext> buildWorkflow() { return StateGraph.<ShopAgentContext>builder() // 注册5个节点 .step("order", context -> orderAgent.execute(context)) .step("payment", context -> paymentAgent.execute(context)) .step("logistics", context -> logisticsAgent.execute(context)) .step("delivery", context -> deliveryAgent.execute(context)) .step("customerService", context -> csAgent.execute(context)) // 定义执行顺序 .edge("order", "payment") .edge("payment", "logistics") .edge("logistics", "delivery") .edge("delivery", "customerService") // 起始节点 .start("order") .build(); } // 执行全流程 public ShopAgentContext runWorkflow(ShopAgentContext initialContext) { StateGraph<ShopAgentContext> graph = buildWorkflow(); return graph.execute(initialContext); } } |
6. 控制层(ShopAgentController.java)
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent.controller; import com.shop.multiagent.dto.ShopAgentContext; import com.shop.multiagent.service.agent.CustomerServiceAgent; import com.shop.multiagent.service.workflow.ShopWorkflowService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController @RequestMapping("/api/shop") public class ShopAgentController { private final ShopWorkflowService workflowService; private final CustomerServiceAgent csAgent; public ShopAgentController(ShopWorkflowService workflowService, CustomerServiceAgent csAgent) { this.workflowService = workflowService; this.csAgent = csAgent; } // 购物全流程接口 @PostMapping("/run-workflow") public ResponseEntity<ShopAgentContext> runWorkflow(@RequestBody ShopAgentContext context) { ShopAgentContext result = workflowService.runWorkflow(context); return ResponseEntity.ok(result); } // 客服RAG知识库模拟接口 @PostMapping("/rag/cs-knowledge") public ResponseEntity<Map<String, String>> csRagApi(@RequestBody Map<String, Object> request) { return ResponseEntity.ok(csAgent.mockCsRagApi(request)); } } |
7. 启动类(ShopMultiAgentApplication.java)
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ShopMultiAgentApplication { public static void main(String[] args) { SpringApplication.run(ShopMultiAgentApplication.class, args); } } |
8. 测试类(ShopAgentFlowTest.java)
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| package com.shop.multiagent; import com.shop.multiagent.dto.ShopAgentContext; import com.shop.multiagent.service.agent.*; import com.shop.multiagent.service.workflow.ShopWorkflowService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class ShopAgentFlowTest { @Autowired private OrderAgentService orderAgent; @Autowired private PaymentAgentService paymentAgent; @Autowired private LogisticsAgentService logisticsAgent; @Autowired private DeliveryAgentService deliveryAgent; @Autowired private CustomerServiceAgent csAgent; @Autowired private ShopWorkflowService workflowService; // 测试1:下单智能体 @Test public void testOrderAgent() { ShopAgentContext context = new ShopAgentContext(); context.setOrderId("SHOP_001"); context.setUserId("USER_1001"); context.setProductInfo("华为Mate60 Pro 128G"); ShopAgentContext result = orderAgent.execute(context); System.out.println("【下单节点】结果:" + result.getOrderInfo()); } // 测试2:支付智能体 @Test public void testPaymentAgent() { ShopAgentContext context = new ShopAgentContext(); context.setOrderId("SHOP_001"); context.setTradeNo("2024060122001410086000000001"); ShopAgentContext result = paymentAgent.execute(context); System.out.println("【支付节点】结果:" + result.isPaymentSuccess()); } // 测试3:物流智能体 @Test public void testLogisticsAgent() { ShopAgentContext context = new ShopAgentContext(); context.setOrderId("SHOP_001"); context.setPaymentSuccess(true); ShopAgentContext result = logisticsAgent.execute(context); System.out.println("【物流节点】结果:" + result.getLogisticsInfo()); } // 测试4:交付智能体 @Test public void testDeliveryAgent() { ShopAgentContext context = new ShopAgentContext(); context.setOrderId("SHOP_001"); context.setPaymentSuccess(true); context.setLogisticsInfo("订单SHOP_001物流状态:已揽收,快递公司:顺丰,运单号:SF123456789"); ShopAgentContext result = deliveryAgent.execute(context); System.out.println("【交付节点】结果:" + result.getDeliveryInfo()); } // 测试5:客服智能体 @Test public void testCsAgent() { ShopAgentContext context = new ShopAgentContext(); context.setOrderId("SHOP_001"); context.setOrderInfo("华为Mate60 Pro 128G,金额5999元"); context.setLogisticsInfo("顺丰揽收,运单号SF123456789"); context.setDeliveryInfo("预计6月3日送达"); ShopAgentContext result = csAgent.execute(context); System.out.println("【客服节点】结果:" + result.getCustomerServiceReply()); } // 测试6:全流程 @Test public void testFullWorkflow() { ShopAgentContext initialContext = new ShopAgentContext(); initialContext.setOrderId("SHOP_001"); initialContext.setUserId("USER_1001"); initialContext.setProductInfo("华为Mate60 Pro 128G"); initialContext.setTradeNo("2024060122001410086000000001"); ShopAgentContext result = workflowService.runWorkflow(initialContext); System.out.println("【全流程】下单结果:" + result.getOrderInfo()); System.out.println("【全流程】支付状态:" + result.isPaymentSuccess()); System.out.println("【全流程】物流信息:" + result.getLogisticsInfo()); System.out.println("【全流程】交付信息:" + result.getDeliveryInfo()); System.out.println("【全流程】客服应答:" + result.getCustomerServiceReply()); } } |
五、配置文件(application.yml)
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| server: port: 8080 spring: ai: openai: api-key: {OPENAI_API_KEY} # 替换为真实Key alipay: app-id: {ALIPAY_APP_ID} # 替换为真实值 private-key: {ALIPAY_PRIVATE_KEY} public-key: {ALIPAY_PUBLIC_KEY} gateway-url: https://openapi.alipay.com/gateway.do |
六、核心总结
流程编排 :基于 Spring AI StateGraph 实现 5 个智能体的顺序执行(下单→支付→物流→交付→客服),节点间通过 ShopAgentContext 传递数据,支持条件分支(如支付失败跳过后续节点);
接口真实性:
下单 / 交付节点调用 OpenAI Completions 流式接口实现 Prompt 输出;
支付 / 物流节点调用支付宝 MCP 真实接口;
客服节点基于 OpenAI Embeddings + RAG 知识库实现智能应答;
分层设计:严格遵循 Controller→Service→Config 分层,SpringBoot 注解驱动开发,代码简洁易扩展;
测试覆盖:测试类覆盖单节点与全流程测试,确保每个智能体独立可用、协作流程顺畅。
七、运行说明
替换配置文件中的 OPENAI_API_KEY、支付宝密钥为真实值;
启动应用后,通过 POST /api/shop/run-workflow 调用全流程接口;
运行测试类可依次验证每个节点的执行效果,快速定位问题。