记录一下SpringBoot整合OpenAI的过程
要求是jdk17
1、添加pom.xml文件的依赖如下:
<!-- 管理依赖--><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M6</version><scope>import</scope><type>pom</type></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.5.6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement> <!-- 引入openAI依赖--><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2、配置application.yml文件
我使用的是deepseek模型,可以方便获取key,官网地址:https://platform.deepseek.com/
server:port: 8080 spring:application:name: spring-ai-learnai:openai:# 替换成自己的api-keyapi-key: 你的keybase-url: https://api.deepseek.com chat:options:model: deepseek-chat
# 开启日志输出为DEBUG
logging:
level:
org.springframework.ai.chat.client: DEBUG
3、创建配置类,配置ChatClient的基本信息
/*** <p>配置类</p>** @author : zzt* @date : 2025-12-08 10:12**/ @Configuration public class ChatClientConfig {@Beanpublic ChatClient chatClient(ChatClient.Builder builder, Advisor simpleLoggerAdvisor){return builder.defaultAdvisors(simpleLoggerAdvisor).build();}/*** 创建一个Advisor,用于记录日志* @return Advisor*/@Beanpublic Advisor simpleLoggerAdvisor(){return new SimpleLoggerAdvisor();} }
4、最后看开始编写代码
/*** <p>聊天的控制器</p>** @author : zzt* @date : 2025-12-08 10:16**/ @Slf4j @RestController @RequestMapping("/chat") @RequiredArgsConstructor public class ChatController {// 定义final并添加@RequiredArgsConstructor注解,等同于通过构造方法声明Beanprivate final ChatClient chatClient;/*** 根据问题返回答案* @param question 问题* @return 答案*/@GetMapping("/ask")public String ask(@RequestParam("question") String question) {return chatClient.prompt().user(question).call().content();}/*** 根据问题流式返回答案* @param question 问题* @return 答案*/@GetMapping(value = "/askSteam", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> askSteam(@RequestParam("question") String question) {return chatClient.prompt().user(question).stream().content().doOnNext(param -> log.info("Answer: {}", param));} }
注意问题,在SpringBoot高版本中,一个参数接受也必须添加注解,否则会有如下的报错
java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
解决办法在Controller中接受天数添加注解@RequestParam
@GetMapping("/ask")public String ask(@RequestParam("question") String question)
5、最后添加启动类
/*** <p>启动类</p>** @author : zzt* @date : 2025-12-08 10:13**/ @SpringBootApplication public class AIApplication {public static void main(String[] args) {SpringApplicationBuilder builder = new SpringApplicationBuilder(AIApplication.class);ConfigurableEnvironment environment = builder.run(args).getEnvironment();// 当然为了安全也可以将key配置到环境变量中String property = environment.getProperty("ssl.api.key");System.out.println("ssl.api.key: " + property);} }
项目结构如下
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─zzt
│ │ │ │ AIApplication.java
│ │ │ │
│ │ │ ├─config
│ │ │ │ ChatClientConfig.java
│ │ │ │
│ │ │ └─controller
│ │ │ ChatController.java
│ │ │
│ │ └─resources
│ │ application.yml
访问:http://localhost:8080/chat/ask?question=%E4%BD%A0%E5%A5%BD%E5%91%80

访问:http://localhost:8080/chat/askSteam?question=%E4%BD%A0%E5%A5%BD%E5%91%80
基于流式响应返回的结果
