Spring AI聊天功能开发

一、引入依赖

继承父版本的springboot依赖,最好是比较新的依赖。

XML 复制代码
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


        <dependency>
            <!--            热部署插件-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

jdk版本

XML 复制代码
    <properties>
        <java.version>17</java.version>
    </properties>

springAI版本

根据官网:Spring AI

选择稳定版本0.8.1

引入依赖:

XML 复制代码
    <properties>
        <java.version>17</java.version>
        <spring-ai.version>0.8.1</spring-ai.version>
    </properties>        

    <dependencies>
        <!--spring ai的starter依赖,启动依赖,起步依赖-->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

<!--相当于是继承一个父项目:spring-ai-bom父项目-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

由于阿里云的仓库还没更新springai的maven坐标,所以需要配置其他仓库,加入下面的依赖

快照版本是如果你使用下面这种先行版则选择这个版本的仓库,一般我们使用稳定版本的maven

XML 复制代码
<!--配置本项目的仓库:因为maven中心仓库还没有更新spring ai的jar包-->
    <repositories>
<!--        &lt;!&ndash;快照版本的仓库&ndash;&gt;-->
<!--        <repository>-->
<!--            <id>spring-snapshot</id>-->
<!--            <name>Spring Snapshots</name>-->
<!--            <url>https://repo.spring.io/snapshot</url>-->
<!--            <releases>-->
<!--                <enabled>false</enabled>-->
<!--            </releases>-->
<!--        </repository>-->

        <!--里程碑版本的仓库-->
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

二、写配置

在自己的yml文件里面配置springAI的信息

XML 复制代码
server:
  port: 8080

spring:
  application:
    name:  #写自己的项目名

  ai:
    openai:
#      api-key: sk-xxx #写自己的key
##      可以写直接地址,也可以写中转地址(镜像地址)
#      base-url: https://api.openai.com
      api-key: sk-xxx #写自己的key #这个是我在淘宝买的key,一般配上中转地址
      base-url: https://apikeyplus.com/ #这个是我买的淘宝中转地址

      chat:
        options:
          model: gpt-3.5-turbo #版本
          temperature: 0.3F #温度
  mvc:
    async:
      request-timeout: -1

这里提示一下用买的中转地址不用科学上网也可以使用。

在这里我遇到了一个问题,不知道为什么我用自己的chatgpt3账号去官网申请了一个key,但是却用不了那个key,加上魔法也访问不了会超时,有大佬会解决可以留言一下!!!

**报错信息部分如下:**I/O error on POST request for "https://api.openai.com/v1/chat/completions": Connection timed out: connect] with root cause

申请地址的官方网址:https://platform.openai.com/api-keys

三、写接口

java 复制代码
@Slf4j
@RestController
public class ChatController {

    /**
     * spring-ai 自动装配的,可以直接注入使用
     */
    @Resource
    private OpenAiChatClient openAiChatClient;

    /**
     * 调用OpenAI的接口
     *
     * @param msg 我们提的问题
     * @return
     */
    @RequestMapping(value = "/ai/chat")
    public String chat(@RequestParam(value = "msg",defaultValue = "给我讲一个笑话") String msg) {
        log.info("发送的消息是:{}",msg);
        String call = openAiChatClient.call(msg);
        log.info("返回的消息是:{}",call);
        return call;
    }

    /**
     * 调用OpenAI的接口
     *
     * @param msg 我们提的问题
     * @return
     */
    @RequestMapping(value = "/ai/chat2")
    public Object chat2(@RequestParam(value = "msg") String msg) {
        ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg));
        return chatResponse.getResult().getOutput().getContent();
    }


    /**
     * 调用OpenAI的接口
     *
     * @param msg 我们提的问题
     * @return
     */
    @RequestMapping(value = "/ai/chat3")
    public Object chat3(@RequestParam(value = "msg") String msg) {
        //可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
        ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
                //.withModel("gpt-4-32k") //gpt的版本,32k是参数量,参数量越大回答的问题质量会越好,准确率会越高
                .withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
                .build()));
        return chatResponse.getResult().getOutput().getContent();
    }

    /**
     * 调用OpenAI的接口
     * 流式访问,一个一个字的输出
     * @param msg 我们提的问题
     * @return
     */
    @RequestMapping(value = "/ai/chat4")
    public Object chat4(@RequestParam(value = "msg") String msg) {
        //可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
        Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
                //.withModel("gpt-4-32k") //gpt的版本,32k是参数量
                .withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
                .build()));

        flux.toStream().forEach(chatResponse -> {
            System.out.println(chatResponse.getResult().getOutput().getContent());
        });
        return flux.collectList(); //数据的序列,一序列的数据,一个一个的数据返回
    }

}

测试:http://localhost:8080/ai/chat3?msg=java是什么

四、问题

最后还是希望有大佬能解决我上面写配置那边的问题(自己搞的key科学上网也会报错)!!!

相关推荐
2402_8575893618 分钟前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰42 分钟前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没1 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥2 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程3 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇3 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码3 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
郭二哈4 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃4 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23074 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端