SpringAI是Spring生态下的一个全新项目,核心目标是为Java开发者提供一套简单、统一的API,快速集成各类AI大模型能力,无需关注不同厂商API的差异。
核心优势:
统一API:对接不同大模型无需修改核心代码,切换模型像切换数据源一样简单
开箱即用:内置请求重试、超时控制、响应缓存等常用功能,减少重复编码
无缝集成Spring生态:完美兼容SpringBoot、Spring Cloud等,符合Java开发者的使用习惯
支持多场景:涵盖文本对话、图片生成、语音转文字、embedding向量生成等主流AI场景
本次实战我们以“对接OpenAI的ChatGPT模型”为例,开发一个简单的智能对话接口。后续会补充如何切换到国内大模型(如通义千问)。前置准备
JDK 17+(SpringAI部分特性依赖JDK 17)
Maven 3.6+
一个OpenAI API Key(从OpenAI官网申请,注意保存好,后续配置用)
开发工具:IDEA(推荐)
项目创建与依赖配置
使用Spring Initializr创建项目,选择Spring Boot 3.2.5版本,添加spring-boot-starter-web和Lombok依赖。手动在pom.xml中添加SpringAI OpenAI Starter:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>0.8.1</version></dependency>配置文件设置
在application.yml中配置OpenAI参数,建议将API Key存储在环境变量中:
spring:ai:openai:api-key:${OPENAI_API_KEY}chat:model:gpt-3.5-turbotemperature:0.7核心代码实现
DTO层设计
@DatapublicclassChatRequest{@NotBlankprivateStringmessage;}@Data@BuilderpublicclassChatResponse{privateIntegercode;privateStringmsg;privateStringcontent;}服务层实现
@Service@RequiredArgsConstructorpublicclassChatServiceImplimplementsChatService{privatefinalChatClientchatClient;@OverridepublicChatResponsechat(ChatRequestrequest){try{Stringresponse=chatClient.call(request.getMessage());returnChatResponse.builder().code(200).msg("Success").content(response).build();}catch(Exceptione){returnChatResponse.builder().code(500).msg(e.getMessage()).content("").build();}}}控制层优化
@RestController@RequestMapping("/api/ai")@RequiredArgsConstructorpublicclassChatController{privatefinalChatServicechatService;@PostMapping("/chat")publicResponseEntity<ChatResponse>chat(@Valid@RequestBodyChatRequestrequest){returnResponseEntity.ok(chatService.chat(request));}}异常处理增强
添加全局异常处理器:
@ControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(Exception.class)publicResponseEntity<ChatResponse>handleException(Exceptione){returnResponseEntity.status(500).body(ChatResponse.builder().code(500).msg(e.getMessage()).build());}}测试验证
创建测试类验证功能:
@SpringBootTest@AutoConfigureMockMvcclassChatControllerTest{@AutowiredprivateMockMvcmockMvc;@TestvoidtestChatEndpoint()throwsException{Stringrequest="{\"message\":\"Java有哪些特性?\"}";mockMvc.perform(post("/api/ai/chat").contentType(MediaType.APPLICATION_JSON).content(request)).andExpect(status().isOk()).andExpect(jsonPath("$.code").value(200));}}性能优化建议
添加连接池配置提升性能:
spring:ai:openai:client:connect-timeout:5000read-timeout:30000安全增强
建议在Controller添加速率限制:
@RateLimiter(value=10)// 每秒10次请求@PostMapping("/chat")publicResponseEntity<ChatResponse>chat(@Valid@RequestBodyChatRequestrequest){// ...}国内模型切换示例
若要切换至通义千问,只需修改依赖和配置:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-qwen-spring-boot-starter</artifactId><version>0.8.1</version></dependency>对应配置调整为:
spring:ai:qwen:api-key:${QWEN_API_KEY}chat:model:qwen-turbo