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

image

 访问:http://localhost:8080/chat/askSteam?question=%E4%BD%A0%E5%A5%BD%E5%91%80

基于流式响应返回的结果

image

 

posted @ 2025-12-08 11:27  VivaZzt  阅读(21)  评论(0)    收藏  举报