spring boot3整合AI組件及使用方法
寫(xiě)在前面
本文介紹了springboot開(kāi)發(fā)后端服務(wù)中,AI組件(Spring AI)的整合與使用。堅(jiān)持看完相信對(duì)你有幫助。
同時(shí)歡迎訂閱springboot系列專欄,持續(xù)分享spring boot的使用經(jīng)驗(yàn)。
spring ai簡(jiǎn)介
先看官網(wǎng)介紹:
翻譯:
Spring AI 是 AI 工程的應(yīng)用框架。其目標(biāo)是將 Spring 生態(tài)系統(tǒng)設(shè)計(jì)原則(如可移植性和模塊化設(shè)計(jì))應(yīng)用于 AI,并推廣使用 POJO 作為 AI 領(lǐng)域應(yīng)用程序的構(gòu)建塊。
翻譯:
特征
跨 AI 提供商的可移植 API 支持,適用于聊天、文本到圖像和嵌入模型。支持同步和流 API 選項(xiàng)。還支持下拉以訪問(wèn)特定于模型的功能。
在spring-ai組件沒(méi)發(fā)布前,我們?cè)趕pring boot中對(duì)接各種ai接口,由于接口規(guī)范格式的不同,我們通常每種接口都得單獨(dú)去寫(xiě)代碼去對(duì)接,最后通過(guò)實(shí)現(xiàn)策略模式來(lái)實(shí)現(xiàn)靈活切換ai接口源。這樣是比較麻煩的。而spring-ai組件就是幫我們做了類似的封裝,使得我們對(duì)接多種ai接口變得十分方便。
單獨(dú)整合al接口
我們先來(lái)看spring boot簡(jiǎn)單整合經(jīng)典的chatGPT 3.5接口
代碼如下:
import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author mijiu * ClassName:OpenAIAPI.java * date:2024-05-06 16:49 * Description: */ public class OpenAIAPI { /** * 聊天端點(diǎn) */ private final static String CHAT_ENDPOINT = "https://api.openai.com/v1/chat/completions";//官網(wǎng)接口地址 private final static String PROXY_ENDPOINT ="https://www.chatgp.fun/v1/chat/completions";//國(guó)內(nèi)代理接口 private final static String API_KEY = "Bearer sk-pbatvlgKeYScAS3kD4820bA1CcE741F996E0BaAb205421D1"; /** * 需要代理服務(wù)器訪問(wèn) * * @param txt 內(nèi)容 * @return {@link String} */ public static String chat(String txt) { Map<String, Object> paramMap = new HashMap<>(); paramMap.put("model", "gpt-3.5-turbo"); List<Map<String, String>> dataList = new ArrayList<>(); dataList.add(new HashMap<String, String>(){{ put("role", "user"); put("content", txt); }}); paramMap.put("messages", dataList); System.out.println(JSONUtil.toJsonStr(paramMap)); JSONObject message = null; try { String body = HttpRequest.post(PROXY_ENDPOINT) .header("Authorization", API_KEY) .header("Content-Type", "application/json") .body(JSONUtil.toJsonStr(paramMap)) .execute() .body(); JSONObject jsonObject = JSONUtil.parseObj(body); System.out.println(jsonObject); JSONArray choices = jsonObject.getJSONArray("choices"); JSONObject result = choices.get(0, JSONObject.class, Boolean.TRUE); message = result.getJSONObject("message"); } catch (Exception e) { return "抱歉,我無(wú)法回答你的問(wèn)題。"; } return message.getStr("content"); } public static void main(String[] args) { System.out.println(chat("你是?")); } }
這段代碼依賴hutool工具包的http工具包
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.22</version> </dependency>
現(xiàn)在運(yùn)行測(cè)試一下:
可以看到目前整合調(diào)用測(cè)試成功了。
代碼里面的api-key有一定量的token新手可以復(fù)制代碼運(yùn)行下試試。言歸正傳下面開(kāi)始介紹核心內(nèi)容。
整合Spring AI組件
起步條件
- jdk不低于17
- spring boot 3x
我們直接新建一個(gè)demo項(xiàng)目
為何直接新建一個(gè)項(xiàng)目的,主要是為了避開(kāi)一些麻煩。如,阿里云maven鏡像沒(méi)有此依賴,需要到中央倉(cāng)庫(kù)下載。
一定要選不低于Java17的jdk
選擇這兩個(gè)依賴就夠了
- Spring Web
- OpenAI
spring boot的版本不要低于3.0
等待依賴下載完成。
進(jìn)行必要配置
這個(gè)api-key需要你去openal官網(wǎng)去申請(qǐng)購(gòu)買(mǎi),或者在一些購(gòu)物軟件直接購(gòu)買(mǎi)現(xiàn)成的用。
共需要配置:
spring.ai.openai.api-key:
這是你的 OpenAI API 密鑰,它是用于通過(guò) API 訪問(wèn) OpenAI 服務(wù)的憑證。密鑰應(yīng)該是一個(gè)長(zhǎng)字符串,用于標(biāo)識(shí)你的賬戶并授權(quán)訪問(wèn)。
spring.ai.openai.chat.options.model
: 這是用于設(shè)置對(duì)話系統(tǒng)所使用的 OpenAI 模型的選項(xiàng)之一。在這種情況下,模型選擇為 GPT-3.5 Turbo,這是 OpenAI 提供的一種強(qiáng)大的自然語(yǔ)言處理模型,適用于生成對(duì)話。
spring.ai.openai.chat.options.temperature:
這是對(duì)話系統(tǒng)生成響應(yīng)時(shí)的溫度參數(shù)。溫度參數(shù)控制著生成文本的多樣性,值越高,生成文本的多樣性越大。在這里,溫度設(shè)置為 0.7,這意味著對(duì)話系統(tǒng)生成的文本會(huì)相對(duì)保守,但仍具有一定的多樣性。
application.properties:
spring.ai.openai.api-key=sk-uVfM7GiD9RIdIKRrF70eT3BlbkyhdHGHGH spring.ai.openai.chat.options.model=gpt-3.5-turbo spring.ai.openai.chat.options.temperature=0.7
代碼里面的api-key是我隨意寫(xiě)的一個(gè),需要換成你自己的且有效的 。
測(cè)試控制器
import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Map; /** * @author mijiupro */ @RestController public class EmbeddingController { private final EmbeddingClient embeddingClient; @Autowired public EmbeddingController(EmbeddingClient embeddingClient) { this.embeddingClient = embeddingClient; } @GetMapping("/ai/embedding") public Map embed(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { EmbeddingResponse embeddingResponse = this.embeddingClient.embedForResponse(List.of(message)); return Map.of("embedding", embeddingResponse); } }
最后啟動(dòng)項(xiàng)目瀏覽器地址欄訪問(wèn)測(cè)試接口即可。
http://localhost:8080/ai/embedding
寫(xiě)在最后
spring boot3整合AI組件到這里就結(jié)束了。任何問(wèn)題評(píng)論區(qū)或私信討論,歡迎指正。
到此這篇關(guān)于spring boot3整合AI組件的文章就介紹到這了,更多相關(guān)spring boot3 AI組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot如何使用@RequestBody進(jìn)行數(shù)據(jù)校驗(yàn)
在Web開(kāi)發(fā)中,前臺(tái)向后臺(tái)發(fā)送數(shù)據(jù)是非常常見(jiàn)的場(chǎng)景,而在SpringBoot框架中,我們通常使用@RequestBody注解來(lái)接收前臺(tái)發(fā)送的?JSON數(shù)據(jù),并將其轉(zhuǎn)化為Java對(duì)象,本文將介紹如何在?SpringBoot?中使用?@RequestBody?進(jìn)行數(shù)據(jù)校驗(yàn)2023-06-06SpringBoot整合log4j2日志的實(shí)現(xiàn)
在項(xiàng)目推進(jìn)中,如果說(shuō)第一件事是搭Spring框架的話,那么第二件事情就是在Sring基礎(chǔ)上搭建日志框架,大家都知道日志對(duì)于一個(gè)項(xiàng)目的重要性,尤其是線上Web項(xiàng)目,因?yàn)槿罩究赡苁俏覀兞私鈶?yīng)用如何執(zhí)行的唯一方式。此篇文章是博主在實(shí)踐中用Springboot整合log4j2日志的總結(jié)2021-06-06java在文件尾部追加內(nèi)容的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇java在文件尾部追加內(nèi)容的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12如何基于SpringWeb?MultipartFile實(shí)現(xiàn)文件上傳、下載功能
在做項(xiàng)目時(shí),后端經(jīng)常采用上傳文件組件MultipartFile,下面這篇文章主要給大家介紹了關(guān)于如何基于SpringWeb?MultipartFile實(shí)現(xiàn)文件上傳、下載功能的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07解讀file.exists(),file.isFile()和file.isDirectory()的區(qū)別
本文介紹了Java中的File類的三個(gè)方法:file.exists()、file.isFile()和file.isDirectory(),并詳細(xì)解釋了它們的區(qū)別和使用場(chǎng)景2025-02-02解決Error:(1,?1)?java:?非法字符:?'\ufeff'問(wèn)題
這篇文章主要介紹了解決Error:(1,?1)?java:?非法字符:?'\ufeff'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解
這篇文章主要為大家介紹了SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05