Spring?AI聊天功能開(kāi)發(fā)步驟
一、引入依賴
繼承父版本的springboot依賴,最好是比較新的依賴。
<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版本
根據(jù)官網(wǎng):Spring AI
選擇穩(wěn)定版本0.8.1
引入依賴:
<properties>
<java.version>17</java.version>
<spring-ai.version>0.8.1</spring-ai.version>
</properties>
<dependencies>
<!--spring ai的starter依賴,啟動(dòng)依賴,起步依賴-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<!--相當(dāng)于是繼承一個(gè)父項(xiàng)目:spring-ai-bom父項(xiàng)目-->
<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>由于阿里云的倉(cāng)庫(kù)還沒(méi)更新springai的maven坐標(biāo),所以需要配置其他倉(cāng)庫(kù),加入下面的依賴
快照版本是如果你使用下面這種先行版則選擇這個(gè)版本的倉(cāng)庫(kù),一般我們使用穩(wěn)定版本的maven

<!--配置本項(xiàng)目的倉(cāng)庫(kù):因?yàn)閙aven中心倉(cāng)庫(kù)還沒(méi)有更新spring ai的jar包-->
<repositories>
<!-- <!–快照版本的倉(cāng)庫(kù)–>-->
<!-- <repository>-->
<!-- <id>spring-snapshot</id>-->
<!-- <name>Spring Snapshots</name>-->
<!-- <url>https://repo.spring.io/snapshot</url>-->
<!-- <releases>-->
<!-- <enabled>false</enabled>-->
<!-- </releases>-->
<!-- </repository>-->
<!--里程碑版本的倉(cāng)庫(kù)-->
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>二、寫(xiě)配置
在自己的yml文件里面配置springAI的信息
server:
port: 8080
spring:
application:
name: #寫(xiě)自己的項(xiàng)目名
ai:
openai:
# api-key: sk-xxx #寫(xiě)自己的key
## 可以寫(xiě)直接地址,也可以寫(xiě)中轉(zhuǎn)地址(鏡像地址)
# base-url: https://api.openai.com
api-key: sk-xxx #寫(xiě)自己的key #這個(gè)是我在淘寶買的key,一般配上中轉(zhuǎn)地址
base-url: https://apikeyplus.com/ #這個(gè)是我買的淘寶中轉(zhuǎn)地址
chat:
options:
model: gpt-3.5-turbo #版本
temperature: 0.3F #溫度
mvc:
async:
request-timeout: -1這里提示一下用買的中轉(zhuǎn)地址不用科學(xué)上網(wǎng)也可以使用。
在這里我遇到了一個(gè)問(wèn)題,不知道為什么我用自己的chatgpt3賬號(hào)去官網(wǎng)申請(qǐng)了一個(gè)key,但是卻用不了那個(gè)key,加上魔法也訪問(wèn)不了會(huì)超時(shí),有大佬會(huì)解決可以留言一下!??!
報(bào)錯(cuò)信息部分如下:I/O error on POST request for "https://api.openai.com/v1/chat/completions": Connection timed out: connect] with root cause
申請(qǐng)地址的官方網(wǎng)址:https://platform.openai.com/api-keys
三、寫(xiě)接口
@Slf4j
@RestController
public class ChatController {
/**
* spring-ai 自動(dòng)裝配的,可以直接注入使用
*/
@Resource
private OpenAiChatClient openAiChatClient;
/**
* 調(diào)用OpenAI的接口
*
* @param msg 我們提的問(wèn)題
* @return
*/
@RequestMapping(value = "/ai/chat")
public String chat(@RequestParam(value = "msg",defaultValue = "給我講一個(gè)笑話") String msg) {
log.info("發(fā)送的消息是:{}",msg);
String call = openAiChatClient.call(msg);
log.info("返回的消息是:{}",call);
return call;
}
/**
* 調(diào)用OpenAI的接口
*
* @param msg 我們提的問(wèn)題
* @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();
}
/**
* 調(diào)用OpenAI的接口
*
* @param msg 我們提的問(wèn)題
* @return
*/
@RequestMapping(value = "/ai/chat3")
public Object chat3(@RequestParam(value = "msg") String msg) {
//可選參數(shù)在配置文件中配置了,在代碼中也配置了,那么以代碼的配置為準(zhǔn),也就是代碼的配置會(huì)覆蓋掉配置文件中的配置
ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
//.withModel("gpt-4-32k") //gpt的版本,32k是參數(shù)量,參數(shù)量越大回答的問(wèn)題質(zhì)量會(huì)越好,準(zhǔn)確率會(huì)越高
.withTemperature(0.4F) //溫度越高,回答得比較有創(chuàng)新性,但是準(zhǔn)確率會(huì)下降,溫度越低,回答的準(zhǔn)確率會(huì)更好
.build()));
return chatResponse.getResult().getOutput().getContent();
}
/**
* 調(diào)用OpenAI的接口
* 流式訪問(wèn),一個(gè)一個(gè)字的輸出
* @param msg 我們提的問(wèn)題
* @return
*/
@RequestMapping(value = "/ai/chat4")
public Object chat4(@RequestParam(value = "msg") String msg) {
//可選參數(shù)在配置文件中配置了,在代碼中也配置了,那么以代碼的配置為準(zhǔn),也就是代碼的配置會(huì)覆蓋掉配置文件中的配置
Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
//.withModel("gpt-4-32k") //gpt的版本,32k是參數(shù)量
.withTemperature(0.4F) //溫度越高,回答得比較有創(chuàng)新性,但是準(zhǔn)確率會(huì)下降,溫度越低,回答的準(zhǔn)確率會(huì)更好
.build()));
flux.toStream().forEach(chatResponse -> {
System.out.println(chatResponse.getResult().getOutput().getContent());
});
return flux.collectList(); //數(shù)據(jù)的序列,一序列的數(shù)據(jù),一個(gè)一個(gè)的數(shù)據(jù)返回
}
}測(cè)試:http://localhost:8080/ai/chat3?msg=java是什么
四、問(wèn)題
最后還是希望有大佬能解決我上面寫(xiě)配置那邊的問(wèn)題(自己搞的key科學(xué)上網(wǎng)也會(huì)報(bào)錯(cuò))?。?!
到此這篇關(guān)于Spring AI聊天功能開(kāi)發(fā)的文章就介紹到這了,更多相關(guān)Spring AI聊天功能開(kāi)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java wait和notifyAll實(shí)現(xiàn)簡(jiǎn)單的阻塞隊(duì)列
這篇文章主要介紹了Java wait和notifyAll實(shí)現(xiàn)簡(jiǎn)單的阻塞隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Classloader隔離技術(shù)在業(yè)務(wù)監(jiān)控中的應(yīng)用詳解
這篇文章主要為大家介紹了Classloader隔離技術(shù)在業(yè)務(wù)監(jiān)控中的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
詳解Spring Boot Oauth2緩存UserDetails到Ehcache
這篇文章主要介紹了詳解Spring Boot Oauth2緩存UserDetails到Ehcache,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
如何利用 Either 和 Option 進(jìn)行函數(shù)式錯(cuò)誤處理
這篇文章主要介紹了如何利用 Either 和 Option 進(jìn)行函數(shù)式錯(cuò)誤處理。在 Java 中,錯(cuò)誤的處理在傳統(tǒng)上由異常以及創(chuàng)建和傳播異常的語(yǔ)言支持進(jìn)行。但是,如果不存在結(jié)構(gòu)化異常處理又如何呢?,需要的朋友可以參考下2019-06-06

