Spring AI聊天功能开发

乄bluefox 2024-07-24 08:01:01 阅读 97

一、引入依赖

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

<code> <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版本

<properties>

<java.version>17</java.version>

</properties>

springAI版本

根据官网:Spring AI

选择稳定版本0.8.1

引入依赖:

<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

aae8a14bf78540c3a18b2617210e996c.png

<code><!--配置本项目的仓库:因为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的信息

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,但是访问的时候却报错,这个是idea需要开启代理。

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

解决:在idea配置里面加上一下下面的信息

-Djava.net.useSystemProxies=true

 

但是还有可能出现下面的报错:

org.springframework.ai.retry.NonTransientAiException: 429 - { "error": { "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.", "type": "insufficient_quota", "param": null, "code": "insufficient_quota" } }

这个原因是你的ChatGPT这个账号里面的key的使用额度用完了。

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

三、写接口

@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是什么



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。