<二>Sping-AI alibaba 入門-記憶聊天及持久化

請看文檔,流程不再贅述:官網及其示例

簡易聊天

環境變量

引入Spring AI Alibaba
記憶對話還需要我們有數據庫進行存儲,mysql:mysql-connector-java

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dd.ai</groupId><artifactId>spring-ai-alibaba-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-ai-alibaba-demo</name><description>spring-ai-alibaba-demo</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--        引入Spring AI Alibaba相關依賴--><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.0.0.2</version></dependency>
<!--Spring AI Alibaba 提供了 jdbc、redis、elasticsearch 插件可以讓聊天機器人擁有“記憶”。下面以 MySQL 為例,演示如何快速編寫一個帶有記憶的聊天機器人。--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-memory-jdbc</artifactId><version>1.0.0.2</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-bom</artifactId><version>1.0.0.2</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

配置文件

AI_DASHSCOPE_API_KEY: zz
#APP_ID: zzzserver:port: 8080spring:application:name: spring-ai-demoai:dashscope:agent:api-key: ${AI_DASHSCOPE_API_KEY} # 百煉API Key,如未配置環境變量,請在這里替換為實際的值#app-id: ${APP_ID} # 大模型應用ID,,非必須#workspace-id: ${WORKSPACE_ID} # 業務空間ID,可選,未配置時使用主賬號空間datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/ai?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=truejpa:hibernate:ddl-auto: update  # 自動更新數據庫表結構show-sql: true      # 顯示 SQL 語句

controller

package com.dd.ai.springaialibabademo.controller;import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
@RequestMapping("/helloworld")
public class HelloworldController {private static final String DEFAULT_PROMPT = "你是一個博學的智能聊天助手,請根據用戶提問回答!";private final ChatClient dashScopeChatClient;public HelloworldController(ChatClient.Builder chatClientBuilder) {this.dashScopeChatClient = chatClientBuilder.defaultSystem(DEFAULT_PROMPT)// 實現 Logger 的 Advisor.defaultAdvisors(new SimpleLoggerAdvisor())// 設置 ChatClient 中 ChatModel 的 Options 參數.defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build()).build();}/*** ChatClient 簡單調用*/@GetMapping("/simple/chat")public String simpleChat(@RequestParam(value = "query", defaultValue = "你好,很高興認識你,能簡單介紹一下自己嗎?")String query) {return dashScopeChatClient.prompt(query).call().content();}/*** ChatClient 流式調用*/@GetMapping("/stream/chat")public Flux<String> streamChat(@RequestParam(value = "query", defaultValue = "你好,很高興認識你,能簡單介紹一下自己嗎?")String query, HttpServletResponse response) {response.setCharacterEncoding("UTF-8");return dashScopeChatClient.prompt(query).stream().content();}}

記憶聊天

Spring AI Alibaba 提供了 jdbc、redis、elasticsearch 插件可以讓聊天機器人擁有“記憶”。環境變量和配置文件都在上一步加入了,也就是以 MySQL 為例

需要修改的地方

  1. HelloworldController的構造函數
  public HelloworldController(JdbcTemplate jdbcTemplate, ChatClient.Builder chatClientBuilder) {// 構造 ChatMemoryRepository 和 ChatMemory// 創建基于 MySQL 的聊天記憶倉庫,用于持久化存儲對話歷史記錄ChatMemoryRepository chatMemoryRepository = MysqlChatMemoryRepository.mysqlBuilder().jdbcTemplate(jdbcTemplate).build();// 創建消息窗口形式的聊天記憶模塊,使用上述倉庫進行持久化存儲ChatMemory chatMemory = MessageWindowChatMemory.builder().chatMemoryRepository(chatMemoryRepository).build();// 構建 DashScopeChatClient 實例this.dashScopeChatClient = chatClientBuilder// 設置默認系統提示語.defaultSystem(DEFAULT_PROMPT)// 添加日志記錄顧問,用于調試時查看輸入輸出內容.defaultAdvisors(new SimpleLoggerAdvisor())// 注冊記憶管理顧問,用于自動加載和保存會話歷史.defaultAdvisors(MessageChatMemoryAdvisor.builder(chatMemory).build())// 配置模型參數:設置 TopP 采樣策略為 0.7.defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build())// 完成客戶端構建.build();}
  1. 方法參數
    @RequestParam(value = “chat-id”, defaultValue = “1”) String chatId
/*** ChatClient 簡單調用*/@GetMapping("/simple/chat")public String simpleChat(@RequestParam(value = "query", defaultValue = "你好,很高興認識你,能簡單介紹一下自己嗎?")String query,@RequestParam(value = "chat-id", defaultValue = "1") String chatId) {return dashScopeChatClient.prompt(query).advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatId)).call().content();}/*** ChatClient 流式調用*/@GetMapping("/stream/chat")public Flux<String> streamChat(@RequestParam(value = "query", defaultValue = "你好,很高興認識你,能簡單介紹一下自己嗎?")String query, HttpServletResponse response,@RequestParam(value = "chat-id", defaultValue = "1") String chatId) {response.setCharacterEncoding("UTF-8");return dashScopeChatClient.prompt(query).advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatId)).stream().content();}

運行報錯

在這里插入圖片描述在這里插入圖片描述

原因:由于 MySQL 表的字符集不支持存儲 Unicode 表情符號導致的。表情符號😊的 UTF-8 編碼為F0 9F 98 8A(4 字節),超出了utf8字符集的 3 字節限制

不知道改了啥,又可以了,可能是這個,把數據庫的字符集改了一下

-- 將chat_db數據庫的字符集改為utf8mb4
ALTER DATABASE chat_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

在這里插入圖片描述

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

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

相關文章

【機器學習深度學習】模型參數量、微調效率和硬件資源的平衡點

目錄 一、核心矛盾是什么&#xff1f; 二、微調本質&#xff1a;不是全調&#xff0c;是“挑著調” 三、如何平衡&#xff1f; 3.1 核心策略 3.2 參數量 vs 微調難度 四、主流輕量微調方案盤點 4.1 凍結部分參數 4.2 LoRA&#xff08;低秩微調&#xff09; 4.3 量化訓…

【V13.0 - 戰略篇】從“完播率”到“價值網絡”:訓練能預測商業潛力的AI矩陣

在上一篇 《超越“平均分”&#xff1a;用多目標預測捕捉觀眾的“心跳曲線”》 中&#xff0c;我們成功地讓AI學會了預測觀眾留存曲線&#xff0c;它的診斷能力已經深入到了視頻的“過程”層面&#xff0c;能精確地指出觀眾是在哪個瞬間失去耐心。 我的AI現在像一個頂級的‘心…

java微服務(Springboot篇)——————IDEA搭建第一個Springboot入門項目

在正文開始之前我們先來解決一些概念性的問題 &#x1f355;&#x1f355;&#x1f355; 問題1&#xff1a;Spring&#xff0c;Spring MVC&#xff0c;Spring Boot和Spring Cloud之間的區別與聯系&#xff1f; &#x1f36c;&#x1f36c;&#x1f36c;&#xff08;1&#xff0…

服務器間接口安全問題的全面分析

一、服務器接口安全核心威脅 文章目錄**一、服務器接口安全核心威脅**![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/6f54698b9a22439892f0c213bc0fd1f4.png)**二、六大安全方案深度對比****1. IP白名單機制****2. 雙向TLS認證(mTLS)****3. JWT簽名認證****4. OAuth…

vs code關閉函數形參提示

問題&#xff1a;函數內出現灰色的形參提示 需求/矛盾&#xff1a; 這個提示對老牛來說可能是一種干擾&#xff0c;比如不好對齊控制一行代碼的長度&#xff0c;或者容易看走眼&#xff0c;造成眼花繚亂的體驗。 關閉方法&#xff1a; 進入設置&#xff0c;輸入inlay Hints&…

ESXi 8.0安裝

使用群暉&#xff0c;突然nvme固態壞了 新nvme固態&#xff0c;先在PC上格式化下&#xff0c;不然可能N100可能不認 啟動&#xff0c;等待很長時間 回車 F11 輸入密碼&#xff0c;字母小寫字母大寫數字 拔掉U盤&#xff0c;回車重啟 網絡配置 按F2&#xff0c; 輸入密碼&…

【git學習】第2課:查看歷史與版本回退

好的&#xff0c;我們進入 第2課&#xff1a;版本查看與回退機制&#xff0c;本課你將學會如何查看提交歷史、對比更改&#xff0c;并掌握多種回退版本的方法。&#x1f4d8; 第2課&#xff1a;查看歷史與版本回退&#x1f3af; 本課目標熟練查看 Git 提交記錄掌握差異查看、版…

攝像頭AI智能識別工程車技術及應用前景展望

攝像頭AI自動識別工程車是智能交通系統和工程安全管理領域的一項重要技術。它通過圖像識別技術和深度學習算法&#xff0c;實現對工程車的自動檢測和識別&#xff0c;從而提高了施工現場的安全性和管理效率。以下是對該技術及其應用的詳細介紹&#xff1a;一、技術實現數據收集…

Windows服務器安全配置:組策略與權限管理最佳實踐

Windows服務器是企業常用的服務器操作系統&#xff0c;但其開放性和復雜性也使其成為攻擊者的目標。通過正確配置組策略和權限管理&#xff0c;可以有效提高安全性&#xff0c;防止未經授權的訪問和惡意軟件的入侵。以下是詳細的安全配置指南和最佳實踐。 1. 為什么組策略和權限…

Windows部署Rocketmq問題匯總

最近研究了下Rocketmq消息中間件&#xff0c;在Win10上部署時遇到一些問題&#xff0c;做個記錄 部署的是Rocketmq 4.92版本&#xff0c;對應使用的控制臺用的1.0版本 下載地址 1.優化內存占用 修改 runserver.cmd 修改前 set "JAVA_OPT%JAVA_OPT% -server -Xms2g -Xmx…

動手學深度學習-學習筆記(總)

文章目錄 1、概述2、內容2.1、python2.2、動手學深度學習2.2.1、課前準備2.2.2、預備知識2.2.3、線性神經網絡 2.3、深度學習重要概念 3、常見問題3.1、安裝 d2l 失敗3.2、調用 mean() 方法報錯3.3、markdown 常見公式3.4、執行動手學深度學習中的代碼&#xff0c;無法顯示圖片…

springboot3.5 MySQL 自動裝配解析

一、配置環境 1. 配置pom.xml <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency> 2、自動配置圖解 二、相關代碼解析 1、自動配置入口&#xff1a…

使用 Conda 工具鏈創建 Poetry 本地虛擬環境全記錄——基于《Python 多版本與開發環境治理架構設計》

Python 多版本治理理念&#xff08;Windows 平臺 零基礎友好&#xff09;-CSDN博客 Python 多版本與開發環境治理架構設計-CSDN博客 使用命令行創建項目本地的 Poetry 虛擬環境實戰演示 —— 基于《Python 多版本與開發環境治理架構設計》的最佳實踐-CSDN博客 一、Python311 環…

北小菜, python , onvif

第一節&#xff1a; 首先是環境的搭建。 環境的搭建。 roottopeet:/home/topeet/source_code/wang_onvif_python# python -m venv venv Command python not found, did you mean:command python3 from deb python3command python from deb python-is-python3 roottopeet:/ho…

TinyWebserver學習(9)-HTTP

一、相關知識 1、有限狀態機&#xff1a; 有限狀態機&#xff08;Finite State Machine, FSM&#xff09;是一種用于描述對象在其生命周期內可能經歷的不同狀態及其狀態轉換規則的模型。它廣泛應用于游戲開發、網絡協議、詞法解析、UI邏輯控制等領域。以下是C中有限狀態機的簡…

2025最新軟件測試面試八股文

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 Part1 1、你的測試職業發展是什么&#xff1f; 測試經驗越多&#xff0c;測試能力越高。所以我的職業發展是需要時間積累的&#xff0c;一步步向著高級測試工程師…

React 強大的表單驗證庫formik之集成Yup、React Hook Form庫

簡介 Formik 是為 React 開發的開源表單庫&#xff0c;提供狀態管理、驗證和提交處理功能&#xff0c;可簡化復雜表單的開發。 核心優勢 ?- 狀態管理 ?&#xff1a;自動跟蹤輸入值、驗證狀態和提交進度&#xff0c;無需手動編寫狀態邏輯。 ? ?- 驗證功能 ?&#xff1a;…

破解風電運維“百模大戰”困局,機械版ChatGPT誕生?

面對風機87%的非計劃停機&#xff0c;30多個專用模型為何束手無策&#xff1f;一套通用大模型如何實現軸承、齒輪、轉子“一站式”健康管理&#xff1f;一、行業痛點&#xff1a;風機運維深陷“碎片化泥潭”1.1 87%停機故障由多部件引發齒輪斷裂、軸承磨損、電機短路……風電故…

Spring Bean 控制銷毀順序的方法總結

控制Spring Bean銷毀順序的方法 在Spring框架中&#xff0c;有幾種方法可以控制Bean的銷毀順序。以下是主要的幾種方式及其示例代碼&#xff1a; 1. 實現DisposableBean接口 實現DisposableBean接口并重寫destroy()方法&#xff0c;Spring會按照依賴關系的相反順序調用這些方…

Gemini CLI MCP 教程:設置、命令與實際使用

如果你想要為任何 MCP 服務器設置 Gemini CLI,這個快速教程將為你提供指導。 Gemini CLI 結合 MCP(模型上下文協議)服務器,改變了你通過自然語言命令進行編碼的方式。 你可以要求 Gemini 分析你的代碼庫、管理文件、查詢數據庫,或通過對話提示與 API 交互。 MCP 服務器連…