3分鐘 Spring AI 實現對話功能

1.什么是spring AI

Spring AI?是 Spring 官方推出的一個基于 Spring 生態的?AI 應用開發框架,旨在簡化將人工智能(如大語言模型、生成式 AI)集成到 Java 應用中的過程。它提供了統一的 API 和工具,讓開發者能更輕松地調用 AI 模型

2.項目集成Spring ai

本篇文章需使用JDK17 以上的版本 ,spring boot 版本為3.2.5 ,且在通義百煉申請了大模型的api-key請大家務必與我的版本一致

引入spring AI Alibaba的maven坐標

<!--Spring Ai alibaba-->
<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M6.1</version>
</dependency>

application.yml

api-key需要使用自己的我這里是錯誤的api-key演示

spring:ai:dashscope:api-key: "sk-5sadd21dsanbd1321ndsakda"chat:options:model: qwen-plus

3.項目測試

編寫一個類,當spring boot項目啟動時自動會執行一次run方法

package com.example.demo.demos;import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;import jakarta.annotation.Resource;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;/*** 使用springAi框架調用ai*//*** 實現 CommandLineRunner接口的話在,每次項目啟動時就會執行一次他的run方法*/@Component
public class SpringAiInvoke implements CommandLineRunner {@Resourceprivate ChatModel dashscopeChatModel;@Overridepublic void run(String... args) throws Exception {// 調用模型 Prompt是模型輸入AssistantMessage message = dashscopeChatModel.call(new Prompt("你是誰")).getResult().getOutput();System.out.println(message.getText()); // 輸出結果 文本響應}
}

4.構建初始化大模型類

初始化大模型,主要是初始化ChatClient 接口的實現類,給ChatClient 配置一些默認的配置

例如提示詞,對話記憶,及Advisor(顧問,類似于AOP)

為什么有了chatModel還需要chatClient?

CatModel 相較于 ChatClient 更為底層,Catmodel所使用的Api是直接對大模型進行調用,

例如:

  • 處理模型本身的參數(如溫度值?temperature、最大 token 數?maxTokens)。

  • 返回原始響應數據(如?ChatResponse?包含消息、元數據)。

ChatClien主要是與業務交互提供了更高級的抽象方法

例如:

  • 提供更高層次的抽象,隱藏復雜性(如?Prompt?對象構建、響應解析)。

  • 集成 Spring 生態特性(如自動重試、監控)。

  • 標準化輸入輸出(如直接返回?String?而非?ChatResponse

但是本質上ChatClient也是在調用CatModel,只不過提供了更多便捷的方法

總結:

ChatClient?本質上是對?ChatModel?的封裝,提供更高層次的便捷方法,而初始化?ChatClient?時通常需要傳入?ChatModel。這種設計看似冗余,但背后有明確的架構意圖和實際價值。

演示:

當前是初始化了大模型和配置

package com.example.demo.app;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.stereotype.Component;@Component
public class AiApp {ChatClient chatClient;// 構造函數 初始化大模型時會注入對象 (根據使用的名稱注入,例如阿里的就注入dashscopeChatClient)public AiApp(ChatModel dashscopeChatModel) {//創建一個基于內存的會話歷史記錄ChatMemory memory = new InMemoryChatMemory();chatClient= ChatClient.builder(dashscopeChatModel) //傳入大模型對象.defaultSystem("你當前的角色是i桂航小助手,解決學生在學校的各種疑問") //設置系統提示詞 例如當前aiapp是一個學校客服系統,角色是i桂航小助手.defaultAdvisors(new MessageChatMemoryAdvisor(memory)//設置一個advisor (顧問) 當前設置的是處理對話上下文的advisor//也設置多個advsior 和自定義的advisor).build();}}

5.ChatClien實現對話

給AiApp類中添加新的對話方法

//Chatclien對話public String dochat(String message,String sessionId){ChatResponse chatResponse = chatClient.prompt().user(message)//傳入用戶輸入信息.advisors(advisorSpec -> advisorSpec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId)//對話的會話id 用于查看是否是當前上下文.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 3) //檢索上下文的長度 如果長度過長所消耗的Token數量會過大).call().chatResponse();log.info("chatResponse: {}", chatResponse.getResult().getOutput().getText());//輸出模型返回的結果return chatResponse.getResult().getOutput().getText();}

測試調用對話


@SpringBootTest
class DemoApplicationTests {@AutowiredAiApp app;@Testvoid contextLoads() {app.dochat("你好,請記住我的朋友叫Java", "1");app.dochat("你是誰? 回復不超過10個字","1");app.dochat("我的朋友叫什么?還有幫忙回憶一下回復不超過幾個字?","1");}}

輸出的結果為

說明實現了對話,且具有了對話記憶功能

6.結構化輸出(將大模型輸出轉為JAVA對象)

引入maven

<!--springAi結構化輸出-->
<dependency><groupId>com.github.victools</groupId><artifactId>jsonschema-generator</artifactId><version>4.38.0</version>
</dependency>

在AiApp類中編寫一個用于返回,一個Java對象的聊天 方法

其中創建了一個Tmplate類 與一個 聊天方法

 //JDK14提供的語法 用于創建一個對象public  record Template(String title, List<String> mesages){}public Template dochatTemplate(String message, String sessionId){Template template = chatClient.prompt("現在你需要根據用戶的需求給出建議標題為: 給{xxx}的建議,內容列出列表").user(message).advisors(advisorSpec -> advisorSpec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 3)).call().entity(Template.class);//輸出成為一個Java對象log.info("結果:{}", template);return template;}

測試 :

    @Testvoid dochatTemplate() {AiApp.Template template = app.dochatTemplate("你好,我叫小明,在學校我有些困惑,請給我3條建議", "1");}

輸出結果

大模型給出的返回值變成了Taplate對象 ,建議也變成了List集合

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

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

相關文章

CMake筆記:配置(Configure)、生成(Generate)和構建(Build)

以下為AI生成的內容&#xff1a; 一、配置階段&#xff08;Configure&#xff09; 本質&#xff1a;解析項目邏輯&#xff0c;構建內存模型 觸發命令&#xff1a;cmake -S <源碼路徑> -B <構建路徑> 關鍵操作與輸出&#xff1a;操作類型典型案例輸出產物變量定義se…

直接編輯pdf文件教程

工具下載地址&#xff1a;https://pan.quark.cn/s/4befbe5f4a77 一、下載并安裝軟件二、打開軟件&#xff0c;并打開一個pdf文件三、編輯PDF文件&#xff0c;并保存四、關閉軟件&#xff0c;打開源文件查看效果。

javaswing json格式化工具

效果展示代碼 package com.example.springbootdemo;import javax.swing.*; import javax.swing.border.TitledBorder; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; import java.…

真實案例 | 如何用iFlyCode開發Webpack插件?

01案例背景在項目中&#xff0c;我們經常需要存檔前端每次打包的版本&#xff0c;方便線上快速切換不同版本使用。經過思考&#xff0c;我們可以在打包時&#xff0c;將本次打包結果另存為zip壓縮包&#xff0c;方便后續使用。于是我準備開發一個Webpack插件實現此功能&#xf…

19day-人工智能-機器學習-分類算法-決策樹

1. 什么是決策樹學過數據結構與算法的小伙伴應該對樹不陌生吧&#xff0c;這里的決策樹也是大同小異的&#xff0c;只是每次反之都有一個條件來決定流向的。1.1 決策節點通過條件判斷而進行分支選擇的節點。如&#xff1a;將某個樣本中的屬性值(特征值)與決策節點上的值進行比較…

地球磁層全球MHD模型中模擬Dst指數的半經驗方法

A semi-empirical approach to simulating the Dst index in global MHD models of Earth’s magnetosphere pdf 1 Introduction Dst指數 (Disturbance storm time index, 地磁暴時擾動指數) 是描述磁暴活動強度應用最廣泛的指數&#xff0c;對于研究地磁擾動和磁暴具有重要意…

什么是臟讀、幻讀、不可重復讀?

臟讀、幻讀和不可重復讀是數據庫事務隔離級別中常見的三種數據一致性問題。它們描述了在并發事務環境下可能出現的異常現象。下面通過對比表格和具體示例進行清晰解析&#xff1a;核心概念對比表問題類型觸發場景本質原因示例臟讀 (Dirty Read)事務A讀取了事務B未提交的修改讀取…

騰訊位置商業授權微信小程序關鍵詞輸入提示

微信小程序JavaScript SDK 開發指南 關鍵詞輸入提示 getSuggestion(options:Object) 用于獲取輸入關鍵字的補完與提示&#xff0c;幫助用戶快速輸入 注&#xff1a;坐標系采用gcj02坐標系 options屬性說明 屬性類型必填說明keywordString是用戶輸入的關鍵詞&#xff08;希望…

LabVIEW菜單操控

該程序圍繞運行時菜單欄操作&#xff0c;實現從初始化構建菜單結構&#xff08;含菜單項、快捷鍵 &#xff09;&#xff0c;到響應交互刪除特定菜單項&#xff0c;再到監控界面事件驅動邏輯&#xff0c;完成自定義菜單交互全流程&#xff0c;適配需靈活菜單控制的程序開發場景。…

Web 服務詳解:HTTP 與 HTTPS 配置

Web 服務詳解&#xff1a;HTTP 與 HTTPS 配置 一、HTTP 服務概述 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是用于在網絡上傳輸網頁數據的基礎協議&#xff0c;默認使用80 端口&#xff0c;以明文形式傳輸數據。常見的 HTTP 服務軟…

YOLO-v2-tiny 20種物體檢測模型

一、簡介 YOLO-v2-tiny是基于YOLO(You Only Look Once)實時目標檢測算法的輕量級版本&#xff0c;專門為嵌入式設備和資源受限環境優化。本模型能夠檢測20種常見物體類別&#xff0c;在保持較高檢測精度的同時大幅減少了計算量和模型大小。 20種物體檢測模型&#xff0c; 使用…

heterophilic graph和hetergeneous graph區別(附帶homophilic graph 和homoegeneous graph)

Heterophilic Graph&#xff08;異配圖&#xff09;連接的節點在屬性上不相似,但是所有節點和邊的類別都是同一種類型&#xff0c;數據集如squirrel / chameleon&#xff0c;它們是 heterogeneous graph&#xff08;異質圖&#xff09;而不是Heterophilic Graph&#xff08;異配…

Thinkphp(GUI)漏洞利用工具,支持各版本TP漏洞檢測,命令執行,Getshell

工具介紹 Thinkphp(GUI)漏洞利用工具&#xff0c;支持各版本TP漏洞檢測&#xff0c;命令執行&#xff0c;Getshell。JAVAFX可視化編寫&#xff0c;博主第一次用javafx來寫界面&#xff0c;第一次學習嘗試&#xff0c;僅僅只用于學習嘗試如果缺少什么payload&#xff0c;歡迎提交…

GitHub分支保護介紹(Branch Protection)(git分支保護)(通過設置規則和權限來限制對特定分支的操作的功能)

文章目錄**1. 核心功能****a. 防止誤操作****b. 強制代碼審查****c. 狀態檢查&#xff08;Status Checks&#xff09;****d. 權限控制****2. 如何設置分支保護&#xff1f;**1. **進入倉庫設置**2. **添加分支保護規則**3. **配置保護規則**4. **保存設置****3. 常見應用場景**…

怎么理解On-Premises

On-Premises 指的是—— 軟件、系統、數據中心等部署并運行在企業自己管理的本地硬件或機房里&#xff0c;而不是放在云端或第三方托管環境中。 你可以把它理解成&#xff1a;“服務器在你自己家里&#xff08;公司機房&#xff09;&#xff0c;而不是寄放在別人家&#xff08;…

UserController類講解

用戶管理控制器&#xff0c;實現了用戶CRUD操作的RESTful API&#xff1a; 1. 類結構與核心注解 1.1 控制器聲明 RestController RequestMapping("/api/users") public class UserControllerRestController 深度解析&#xff1a; 組合注解&#xff1a;Controller Re…

【劍指offer】搜索算法

目錄 &#x1f4c1; JZ53 數字在升序數組中出現的次數?編輯 &#x1f4c1; JZ4 二維數組中的查找?編輯 &#x1f4c1; JZ11 旋轉數組的最小數字 &#x1f4c1; JZ38 字符串的排列?編輯 &#x1f4c1; JZ53 數字在升序數組中出現的次數 這就是一道簡單的模板題&#xff0…

ETLCloud批流一體化體現在哪

ETLCloud批流一體化體現在哪 企業對數據處理的實時性、高效性和準確性的要求越來越高。批流一體化作為一種先進的數據處理理念&#xff0c;逐漸被企業所采用。 目前許多國產化ETL工具也裝配了十分強大的批流一體化能力&#xff0c;ETLCoud就是一個很好的代表&#xff0c;它能夠…

Mybatis學習之緩存(九)

這里寫目錄標題一、MyBatis的一級緩存1.1、工作原理1.2、一級緩存失效的四種情況1.3、不同的SqlSession對應不同的一級緩存1.4、同一個SqlSession但是查詢條件不同1.5、同一個SqlSession兩次查詢期間執行了任何一次增刪改操作1.6、同一個SqlSession兩次查詢期間手動清空了&…

windows10裝Ubuntu22.04系統(雙系統)

參考鏈接&#xff1a;Windows和Linux雙系統的保姆級安裝教程&#xff0c;新手小白跟著也能裝_windows安裝linux雙系統-CSDN博客 1 前期準備 1.下載Ubuntu22.04.5 的iso鏡像文件&#xff1a;Download Ubuntu Desktop | Ubuntu 2.準備一個U盤&#xff08;空&#xff0c;已有文…