SpringBoot整合OpenAI
记录一下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-learn ai: openai: # 替换成自己的api-key api-key: 你的key base-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 { @Bean public ChatClient chatClient(ChatClient.Builder builder, Advisor simpleLoggerAdvisor){ return builder.defaultAdvisors(simpleLoggerAdvisor).build(); } /** * 创建一个Advisor,用于记录日志 * @return Advisor */ @Bean public 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注解,等同于通过构造方法声明Bean private 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
基于流式响应返回的结果


浙公网安备 33010602011771号