【Spring AI】Spring AI Alibaba的簡單使用

提示:文章最后有詳細的參考文檔。

前提條件

  • SpringBoot版本為3.x以上
  • JDK為17以上
  • 申請api-key,地址:百煉平臺

引入依賴

說明:我的springboot版本為3.2.4,spring-ai-alibaba-starter版本為1.0.0-M2.1(對應spring-ai版本為1.0.0-M2),jdk版本為17。

1. pom.xml中引入

<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId>
</dependency>

spring-ai-alibaba 基于 spring-ai 開發,由于 spring-ai 相關依賴包還沒有發布到中央倉庫,如出現 spring-ai-core 等相關依賴解析問題,請在您項目的 pom.xml 依賴中加入如下倉庫配置。

<repositories><repository><id>maven2</id><name>maven2</name><url>https://repo1.maven.org/maven2/</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository>
</repositories>

并且在maven的setting.xml中做出如下更改:

<mirror>  <id>alimaven</id>  <name>aliyun maven</name>  <url>https://maven.aliyun.com/repository/public</url> <!-- 表示除了spring-milestones、maven2其它都走阿里云鏡像  --> <mirrorOf>*,!spring-milestones,!maven2</mirrorOf>  
</mirror>

2. application.yml中引入

spring:ai:dashscope:api-key: 申請的api-keychat:client:enabled: true

3. 代碼中引入

    @Resourceprivate ChatModel chatModel;

開發示例

1. 簡單的對話

@GetMapping("/simple")
public String simpleChat(@RequestBody JSONObject param) {// 接收并校驗參數String inputInfo = CommonUtil.getAndCheck(param, "inputInfo", "請輸入內容!");// 構建chatClientChatClient.Builder builder = ChatClient.builder(chatModel);ChatClient chatClient = builder.defaultSystem("你是一個精通Java、Python的程序大佬。").build();return chatClient.prompt().user(inputInfo).call().content();
}

2. 流式對話

使用Server Sent Event(SSE)事件返回,對應前端需要處理SSE事件的數據。

@GetMapping("/stream")
public Flux<ServerSentEvent<String>> streamChat(@RequestBody JSONObject param) {// 接收并校驗參數String inputInfo = CommonUtil.getAndCheck(param, "inputInfo", "請輸入內容!");return chatModel.stream(new Prompt(inputInfo)).map(response -> ServerSentEvent.<String>builder().data(response.getResult().getOutput().getContent()).build()).doOnComplete(() -> log.info("響應完成!")).doOnError(e -> log.error("響應異常:", e));
}

3. 帶記憶對話(原生API存儲)

使用原生的:MessageChatMemoryAdvisor

private final ChatClient chatClient;
public AIChatController(ChatClient.Builder builder) {this.chatClient = builder.defaultSystem("你是一個精通Java、Python的程序大佬。").defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())).build();
}@GetMapping("/memoryStreamWithApi")
public Flux<ServerSentEvent<String>> memoryStreamWithApi(@RequestBody JSONObject param) {// 接收并校驗參數// 對話記憶ID,我是通過前端傳參獲取,你可以獲取一個UUIDString accessKey = CommonUtil.getAndCheck(param, "accessKey", "您沒有改功能訪問權限!");String inputInfo = CommonUtil.getAndCheck(param, "inputInfo", "請輸入內容!");// 請求數據return chatClient.prompt().user(inputInfo).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, accessKey).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 5))    // 從上下文中檢索聊天內存響應大小,具體參數定義可參考文章最后的Spring AI API文檔.stream().chatResponse().map(response -> {return ServerSentEvent.<String>builder().data(response.getResult().getOutput().getContent()).build();}).doOnComplete(() -> {log.info("響應完成!");}).doOnError((e) -> {log.warn("響應異常:", e);});
}

4. 帶記憶對話(Redis存儲)

使用redis存儲:

@GetMapping("/memoryStreamWithRedis")
public Flux<ServerSentEvent<String>> memoryStreamWithRedis(@RequestBody JSONObject param) {// 接收并校驗參數// 對話記憶ID,我是通過前端傳參獲取,你可以獲取一個UUIDString accessKey = CommonUtil.getAndCheck(param, "accessKey", "您沒有改功能訪問權限!");String inputInfo = CommonUtil.getAndCheck(param, "inputInfo", "請輸入內容!");List<Message> messageList = new ArrayList<>();// 拼接redis keyString redisKey = CommonConst.MY_ACCESS_KEY_PREFIX + accessKey;// 判斷是否存在聊天記憶,有的話將其帶入本次對話中if (redisService.hasKey(redisKey)) {// 從redis中獲取聊天記憶數據List<String> strList = redisService.getCacheList(redisKey);List<Message> memoryList = new ArrayList<>();if (!CollectionUtils.isEmpty(strList)) {strList.forEach(s -> memoryList.add(new UserMessage(s)));// 反轉聊天記憶數據,我存入List數據時采用頭插法,所以這里需要反轉list,以保證聊天內容的先后順序Collections.reverse(memoryList);messageList.addAll(memoryList);}}messageList.add(new UserMessage(inputInfo));StringBuilder resultStr = new StringBuilder();return chatModel.stream(new Prompt(messageList)).map(response -> {resultStr.append(response.getResult().getOutput().getContent());return ServerSentEvent.<String>builder().data(response.getResult().getOutput().getContent()).build();}).doOnComplete(() -> {// 將LLM返回的文本存入redis,存儲的數據類型是List,enqueue()方法的定義看下文redisService.enqueue(redisKey, resultStr.toString(), MAX_LENGTH);log.info("響應完成!");}).doOnError(e -> log.warn("響應異常:", e));
}

RedisService中部分代碼:

/*** 添加固定長度的隊列,左添加** @param key       key* @param value     value* @param maxLength 最大存儲的聊天記錄長度*/
public void enqueue(String key, String value, int maxLength) {// 使用Redis的LPUSH命令添加元素,然后確保長度不超過最大值redisTemplate.opsForList().leftPush(key, value);// 保持隊列長度不超過指定長度,LTRIM會自動刪除超出長度的舊元素if (redisTemplate.opsForList().size(key) > maxLength) {redisTemplate.opsForList().trim(key, 0, maxLength - 1);}
}/*** 獲得緩存的list對象** @param key 緩存的鍵值* @return 緩存鍵值對應的數據*/
public <T> List<T> getCacheList(final String key) {return redisTemplate.opsForList().range(key, 0, -1);
}/*** 判斷 key 是否存在** @param key 鍵* @return true 存在 false不存在*/
public Boolean hasKey(String key) {return redisTemplate.hasKey(key);
}

參考文檔

?官方參考文檔:Spring AI Alibaba 官方 、Spring AI 官方、Spring AI API 文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64142.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64142.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64142.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Java源力物語》-3.空值獵手

~犬&#x1f4f0;余~ “我欲賤而貴&#xff0c;愚而智&#xff0c;貧而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯學乎” \quad 夜色漸深&#xff0c;在一處偏僻小徑上&#xff0c;月光透過濃密的源力云層&#xff0c;在地面上投下斑駁的光影。String正獨自練習著剛從…

科技云報到:人工智能時代“三大件”:生成式AI、數據、云服務

科技云報到原創。 就像自行車、手表和縫紉機是工業時代的“三大件”。生成式AI、數據、云服務正在成為智能時代的“新三大件”。加之全球人工智能新基建加速建設&#xff0c;成為了人類社會數字化遷徙的助推劑&#xff0c;讓新三大件之間的耦合越來越緊密。從物理世界到數字世…

hiprint結合vue2項目實現靜默打印詳細使用步驟

代碼地址是&#xff1a;vue-plugin-hiprint: hiprint for Vue2/Vue3 ?打印、打印設計、可視化設計器、報表設計、元素編輯、可視化打印編輯 本地安裝包地址&#xff1a;electron-hiprint 發行版 - Gitee.com 1、先安裝hipint安裝包在本地 2、項目運行npm&#xff08;socket.…

CUDA各種內存和使用方法

文章目錄 1、全局內存2、局部內存3、共享內存3.1 靜態共享內存3.2 動態共享內存 4、紋理內存5、常量內存6、寄存器內存7、用CUDA運行時API函數查詢設備CUDA 錯誤檢測 1、全局內存 特點&#xff1a;容量最大&#xff0c;訪問延時最大&#xff0c;所有線程都可以訪問。 線性內存…

Chapter 03 復合數據類型-1

1.列表 Python內置的一種有序、可變的序列數據類型&#xff1b; 列表的定義&#xff1a; [ ]括起來的逗號分隔的多個元素組成的序列 列表對象的創建&#xff1a; &#xff08;1&#xff09;直接賦值 >>> list1 []#創建一個空列表賦值給list1 >>> list…

【后端】LNMP環境搭建

長期更新各種好文&#xff0c;建議關注收藏&#xff01; 本文近期更新完畢。 LNMPlinuxnginxmysqlphp 需要的資源 linux服務器 web服務軟件nginx 對應的語言編譯器代碼文件 數據庫mysql安裝 tar.gz包或者命令行安裝 進入root&#xff1a; sodu 或su mkdir path/{server,soft}…

基于PyQt5的UI界面開發——多界面切換

介紹 最初&#xff0c;因為課設的緣故&#xff0c;我只是想做一個通過按鍵進行切面切換而已&#xff0c;但是我看網上資料里面僅是語焉不詳&#xff0c;讓我困惑的很&#xff0c;但后面我通過摸索才發現這件事實在是太簡單了&#xff0c;因此我想要記錄下來。 本博客將介紹如…

操作002:HelloWorld

文章目錄 操作002&#xff1a;HelloWorld一、目標二、具體操作1、創建Java工程①消息發送端&#xff08;生產者&#xff09;②消息接收端&#xff08;消費者&#xff09;③添加依賴 2、發送消息①Java代碼②查看效果 3、接收消息①Java代碼②控制臺打印③查看后臺管理界面 操作…

機器視覺檢測相機基礎知識 | 顏色 | 光源 | 鏡頭 | 分辨率 / 精度 / 公差

注&#xff1a;本文為 “keyence 視覺沙龍中機器視覺檢測基礎知識” 文章合輯。 機器視覺檢測基礎知識&#xff08;一&#xff09;顏色篇 視覺檢測硬件構成的基本部分包括&#xff1a;處理器、相機、鏡頭、光源。 其中&#xff0c;和光源相關的最重要的兩個參數就是光源顏色和…

【每日學點鴻蒙知識】壓力測試、Web組件攔截器、nfc開關狀態、定位能力、rn支持的三方庫

1、HarmonyOS的wukong 支持運行python腳本進行壓力或者常規測試嗎&#xff1f; Python腳本調用hdc命令&#xff0c;執行hdc shell wukong XXXwukong只支持穩定性壓測&#xff0c;普通測試建議使用arkxtest測試框架 2、Web組件頁面內跳轉時自定義WebHeader問題&#xff1f; 如…

GDPU Vue前端框架開發 期末賽道出勇士篇(更新ing)

記住&#xff0c;年底陪你跨年的不會僅是方便面跟你的閨蜜&#xff0c;還有孑的筆記。 選擇題 1.下列選項用于設置Vue.js頁面視圖的元素是&#xff08;&#xff09;。 A. Template B. script C. style D. title 2.下列選項中能夠定義Vuejs根實例對象的元素是&#xff08;&…

Flutter開發HarmonyOS 鴻蒙App的好處、能力以及把Flutter項目打包成鴻蒙應用

Flutter開發HarmonyOS的好處&#xff1a; Flutter是谷歌公司開發的一款開源、免費的UI框架&#xff0c;可以讓我們快速的在Android和iOS上構建高質量App。它最大的特點就是跨平臺、以及高性能。 目前 Flutter 已經支持 iOS、Android、Web、Windows、macOS、Linux 的跨平臺開發…

Effective C++ 條款 17:以獨立語句將 `newed` 對象置入智能指針

文章目錄 條款 17&#xff1a;以獨立語句將 newed 對象置入智能指針核心思想示例代碼錯誤用法分析推薦設計總結 條款 17&#xff1a;以獨立語句將 newed 對象置入智能指針 核心思想 問題背景 如果在將 newed 對象傳遞給智能指針時&#xff0c;包含了復雜的表達式&#xff0c;一…

【體驗官招募】SoFlu - JavaAI 開發助手:開啟智能開發新時代

你是否有過這樣的經歷&#xff1f;在深夜的辦公室里&#xff0c;面對緊急的 Java 項目&#xff0c;看著厚厚的需求文檔&#xff0c;你是否感到無從下手&#xff1f; 當你嘗試理解客戶那些復雜又模糊的需求時&#xff0c;是否會因為要和產品經理反復溝通確認每一個細節而感到厭…

【Compose multiplatform教程07】多平臺常用組件和重要組件目錄

一、基礎交互與顯示組件 Text 查看示例 功能說明&#xff1a;用于在界面上顯示文本內容&#xff0c;支持設置字體、大小、顏色、樣式&#xff08;如加粗、斜體、下劃線&#xff09;等屬性&#xff0c;滿足不同的文本展示需求&#xff0c;可傳達各種信息給用戶。示例場景&#…

自學記錄HarmonyOS Next DRM API 13:構建安全的數字內容保護系統

在完成了HarmonyOS Camera API的開發之后&#xff0c;我開始關注更復雜的系統級功能。在瀏覽HarmonyOS Next文檔時&#xff0c;我發現了一個非常有趣的領域&#xff1a;數字版權管理&#xff08;DRM&#xff09;。最新的DRM API 13提供了強大的工具&#xff0c;用于保護數字內容…

【HENU】河南大學計院2024 操作系統 簡答題復習

和光同塵_我的個人主頁 一直游到海水變藍。 單項選擇 15x2 30 判斷 10x1 10 簡答 3x10 30 綜合 3x10 30 簡答題 簡述操作系統的四個基本特征。 并發性 共享性 虛擬性 異步性 并發性是最重要特性&#xff0c;其它三種特性以此為前提。 并發 并發(Concurrence)&#…

基于Android的校園導航系統

基于Android的校園導航系統是一種專為校園環境設計的移動應用程序&#xff0c;旨在幫助學生、教職工及訪客快速、準確地找到校園內的目的地。以下是對基于Android的校園導航系統的詳細介紹&#xff1a; 一、系統概述 基于Android的校園導航系統通常包括客戶端&#xff08;移動…

GEE錯誤——PCA系數變換的時候出現的錯誤

目錄 錯誤提示1 錯誤提示2 原始的教程鏈接&#xff1a; 錯誤代碼 修正后的代碼 結果 錯誤提示1 這個是因為原始GEE教程中給的讓我們填入需要進行計算的波段名稱&#xff0c;而且是以list的形式傳入。 錯誤提示2 這里我們雖然傳入了正確的波段名稱&#xff0c;但是發現要…

C#代碼實現把中文錄音文件(.mp3 .wav)轉為文本文字內容

我們有一個中文錄音文件.mp3格式或者是.wav格式&#xff0c;如果我們想要提取錄音文件中的文字內容&#xff0c;我們可以采用以下方法&#xff0c;不需要使用Azure Speech API 密鑰注冊通過離線的方式實現。 1.首先我們先在NuGet中下載兩個包 NAudio 2.2.1、Whisper.net 1.7.3…