SpringAI使用總結

SpringAI使用總結

  • 基本使用
      • ChatModel和ChatClient
      • 簡單對話
      • 流式輸出
      • 預設角色
      • prompt(提示詞)
      • function call(工具調用)
      • 參考

基本使用

ChatModel和ChatClient

SpringAi支持非常多的模型,為了統一處理,SpringAi聲明了ChatModel接口,各個模型的starter中有ChatModel對應的實現。

當我們引入ollama的依賴后

        <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>

可以在程序中搜索到OllamaChatModel在這里插入圖片描述

ChatClient是獲取與模型進行對話獲取響應的入口,需要給ChatClient提供ChatModel,ChatClient也是一個接口,不過SpringAi提供了默認的實現。
在這里插入圖片描述
在這里插入圖片描述

簡單對話

這里調用的是本地的ollama中的模型,需要提前下載對應的模型。當然也可以通過api key調用遠程的模型服務。

1、引入ollama starter依賴

        <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency>

2、配置

spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:14b

3、創建ChatClient

@Configuration
public class MyAiConfig {@Beanpublic ChatClient chatClient(ChatModel chatModel) {return ChatClient.builder(chatModel).build();}}

4、對話controller編寫

@RestController
@RequestMapping("/ai-chat")
public class ChatController {@Autowiredprivate ChatClient chatClient;@GetMapping("/chat1")public String chat(@RequestParam String message) {return chatClient.prompt(message).call().content();}
}

5、測試結果,可以看到模型輸出了響應。
在這里插入圖片描述

流式輸出

由于大模型生成響應可能比較慢,為了提高用戶體驗,所以出現了流式輸出,即不等待大模型回答完成后,把輸出一次性傳輸到客戶端,而是將輸出不斷地傳輸到客戶端。

    @GetMapping("/chat2")public Flux<String> chat1(@RequestParam String message) {return chatClient.prompt().user(message).stream().content();}

預設角色

在創建ChatClient的時候,可以給模型設置角色,這樣模型會按照設置的角色來回答問題。
通過defaultSystem方法預設角色。

    @Beanpublic ChatClient chatClient(ChatModel chatModel) {return ChatClient.builder(chatModel).defaultSystem("你是一名醫生,擅長診斷病情并提供對應的治療方案").build();}

prompt(提示詞)

SpringAi中主要有以下幾類提示詞模板:

  1. PromptTemplate:通用的提示詞模板類,用于構建包含占位符的提示語句;適用于需要動態替換變量的任意提示內容;
  2. AssistantPromptTemplate:專門用于生成模型助手角色的提示詞模板,當需要定義 AI 助手的行為或初始指令時使用;
  3. FunctionPromptTemplate:用于生成與函數調用相關的提示詞模板;當需要模型根據特定函數描述進行推理或調用時使用;
  4. SystemPromptTemplate:用于生成系統級別的提示詞模板,通常用于設置模型的整體行為;用于生成系統級別的提示詞模板,通常用于設置模型的整體行為;

示例

通過@Value注解加載提示詞模板

    @Value("classpath:/my-prompt-template.st")private Resource systemResource;@GetMapping("/chat4")public String chat4(@RequestParam String message) {SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);Prompt prompt = systemPromptTemplate.create();return chatClient.prompt(prompt).user(message).call().content();}

提示詞模板內容

你是我的好朋友,請用東北話回答問題,回答問題的時候適當添加表情符號。
今天是 {{current_date}}。

輸出:
在這里插入圖片描述

function call(工具調用)

使用@Tool注解定義工具

public class DateTimeUtil {/*** @Tool注解:*      1、name:工具的名稱。如果未提供,則將使用方法名稱。AI 模型在調用工具時使用此名稱來識別工具。因此,不允許在同一個類中有兩個同名的工具*      2、returnDirect:工具結果是應直接返回給客戶端還是傳遞回模型*      3、description:工具的描述,模型可以使用它來了解何時以及如何調用工具* @return*/@Tool(name = "",description = "Get the current date and time in the user's timezone")public String getCurrentTime() {return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();}/*** @ToolParam注解:*      1、required:參數是必需的還是可選的。默認情況下,所有參數都被視為必需參數*      2、description:description:參數的描述,模型可以使用該描述來更好地了解如何使用它* @param time*/@Tool(name = "setAlarm", description = "Set a user alarm for the given time")void setAlarm(@ToolParam(description = "Time in ISO-8601 format") String time) {LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);System.out.println("Alarm set for " + alarmTime);}}

通過tools方法添加工具,模型會自動調用工具

chatClient.prompt().tools(new DateTimeUtil()).user(message).call().content();

由于我使用的是本地的deepseek-r1不支持tool,報錯了,這里就不放測試結果了。

 [400] Bad Request - {"error":"registry.ollama.ai/library/deepseek-r1:14b does not support tools"}

參考

  1. Spring文檔
  2. Spring Ai視頻教程

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

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

相關文章

歷史交易數據漲跌分級

歷史交易數據漲跌分級 # encoding:utf-8 import sys,traceback from loguru import loggersys.path.append("..") from QhSpiderTool import QhDorpFiled from QhCsvMode import *def QhZhangDieFenJi(QhDfData,QhFangFa"A"):"""歷史交易數…

Kafka入門4.0.0版本(基于Java、SpringBoot操作)

Kafka入門4.0.0版本&#xff08;基于Java、SpringBoot操作&#xff09; 一、kafka概述 Kafka最初是由LinkedIn公司開發的&#xff0c;是一個高可靠、高吞吐量、低延遲的分布式發布訂閱消息系統&#xff0c;它使用Scala語言編寫&#xff0c;并于2010年被貢獻給了Apache基金會&…

react react-router-dom中獲取自定義參數v6.4版本之后

路由配置, AutnToken 組件作為權限、登錄管理 import { createBrowserRouter, Navigate } from react-router-dom; import Layout from /layout/index; import Login from /pages/login; import Page404 from /pages/404;import AutnToken from /components/authToken; import…

AI中的Prompt

1. System 作用&#xff1a;設定 AI 的“角色設定”和“行為準則”。 內容&#xff1a;通常是描述 LLM 的身份、語氣、行為范圍、約束規則。 類似&#xff1a;在大語言模型中是最優先被考慮的提示。 示例&#xff1a; 你是一個專業的商品評價分析助手&#xff0c;請根據用戶…

從人工到智能:IACheck如何重構檢測報告審核工作流?

從人工到智能&#xff1a;IACheck如何重構檢測報告審核工作流&#xff1f; 在當今AI技術迅猛發展的時代&#xff0c;各行各業正經歷從“人工驅動”到“智能驅動”的根本性變革。檢測認證&#xff08;TIC&#xff09;行業作為關乎質量與安全的重要支柱&#xff0c;也不例外。在…

React事件處理:如何給按鈕綁定onClick點擊事件?

系列回顧&#xff1a; 在前幾篇文章中&#xff0c;我們已經學會了如何使用 State 管理組件的內部數據&#xff0c;以及如何通過 Props 實現父子組件之間的通信。我們的組件現在已經有了“數據”和“外觀”。但是&#xff0c;它還像一個只能看的“模型”&#xff0c;無法與用戶進…

【機器學習|學習筆記】粒子群優化(Particle Swarm Optimization, PSO)詳解,附代碼。

【機器學習|學習筆記】粒子群優化&#xff08;Particle Swarm Optimization, PSO&#xff09;詳解&#xff0c;附代碼。 【機器學習|學習筆記】粒子群優化&#xff08;Particle Swarm Optimization, PSO&#xff09;詳解&#xff0c;附代碼。 文章目錄 【機器學習|學習筆記】粒…

深度剖析:AI 社媒矩陣營銷工具,如何高效獲客?

在社交媒體營銷領域&#xff0c;競爭日益激烈&#xff0c;傳統的社媒矩陣運營方式面臨諸多挑戰。而 AI 社媒矩陣營銷工具的出現&#xff0c;正以前所未有的方式重構社媒矩陣的底層架構&#xff0c;為營銷人員帶來了全新的機遇與變革。接下來&#xff0c;我們將從技術破局、實戰…

Spring XML 常用命名空間配置

Spring XML 常用命名空間配置 下面是一個綜合性的Spring XML配置樣例&#xff0c;展示了各種常用命名空間的使用方式&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&quo…

UE5場景漫游——開始界面及關卡跳轉

UE中實現UMG游戲界面搭建及藍圖控制&#xff0c;點擊游戲界面中的按鈕實現關卡的跳轉效果。 一、游戲界面顯示。1.創建UMG&#xff0c;2.搭建UI。3.關卡藍圖控制顯示 二、點擊按鈕之后實現關卡跳轉

CSS 外邊距合并(Margin Collapsing)問題研究

在 CSS 中&#xff0c;margin-top 屬性會導致外部 DIV 移動的現象主要是由于 外邊距合并&#xff08;Margin Collapsing&#xff09; 造成的。這是 CSS 盒模型的一個特性&#xff0c;可能會與直覺相悖。 外邊距合并的原理 當一個元素&#xff08;如內部 DIV&#xff09;的 ma…

清理電腦C磁盤,方法N:使用【360軟件】中的【清理C盤空間】

1、先下載并打開【360安全衛士】&#xff0c;點擊如下位置&#xff1a; 之后&#xff0c;可以把這個東西&#xff0c;創建快捷方式到電腦桌面&#xff0c;方便以后使用&#xff1a;

微服務集成seata分布式事務 at模式快速驗證

微服務集成Seata分布式事務 本次demo代碼地址業務場景&#xff1a;一般用于以下場景&#xff1a;使用 AT 模式的優勢&#xff08;適用于快速驗證&#xff09;&#xff1a;快速驗證建議步驟&#xff1a;注意事項&#xff1a; 工具環境微服務版本選擇Nacos 環境搭建與啟動nacos 下…

LLM基礎5_從零開始實現 GPT 模型

基于GitHub項目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 設計 LLM 的架構 GPT 模型基于 Transformer 的 decoder-only 架構&#xff0c;其主要特點包括&#xff1a; 順序生成文本 參數數量龐大&#xff08;而非代碼量復雜&#xff09; 大量重復…

Android 中 linux 命令查詢設備信息

一、getprop 命令 在 Linux 系統中&#xff0c; getprop 命令通常用于獲取 Android 設備的系統屬性&#xff0c;這些屬性包括設備型號、Android 版本、電池狀態等。 1、獲取 Android 版本號 adb shell getprop ro.build.version.release2、獲取設備型號 adb shell getprop …

26考研 | 王道 | 計算機組成原理 | 六、總線

26考研 | 王道 | 計算機組成原理 | 六、總線 文章目錄 26考研 | 王道 | 計算機組成原理 | 六、總線6.1 總線概述1. 總線概述2. 總線的性能指標 6.2 總線仲裁&#xff08;考綱沒有&#xff0c;看了留個印象&#xff09;6.3 總線操作和定時6.4 總線標準&#xff08;考綱沒有&…

SE(Secure Element)加密芯片與MCU協同工作的典型流程

以下是SE&#xff08;Secure Element&#xff09;加密芯片與MCU協同工作的典型流程&#xff0c;綜合安全認證、數據保護及防篡改機制&#xff1a; 一、基礎認證流程&#xff08;參數保護方案&#xff09; 密鑰預置? SE芯片與MCU分別預置相同的3DES密鑰&#xff08;Key1、Key2…

數據庫——MongoDB

一、介紹 1. MongoDB 概述 MongoDB 是一款由 C 語言編寫的開源 NoSQL 數據庫&#xff0c;采用分布式文件存儲設計。作為介于關系型和非關系型數據庫之間的產品&#xff0c;它是 NoSQL 數據庫中最接近傳統關系數據庫的解決方案&#xff0c;同時保留了 NoSQL 的靈活性和擴展性。…

WebSocket 前端斷連原因與檢測方法

文章目錄 前言WebSocket 前端斷連原因與檢測方法常見 WebSocket 斷連原因及檢測方式聊天系統場景下的斷連問題與影響行情推送場景下的斷連問題與影響React 前端應對斷連的穩健策略自動重連機制的設計與節流控制心跳機制的實現與保持連接存活連接狀態管理與 React 集成錯誤提示與…

2025年真實面試問題匯總(三)

線上數據庫數據丟失如何恢復 線上數據庫數據丟失的恢復方法需要根據數據丟失原因、備份情況及數據庫類型&#xff08;如MySQL、SQL Server、PostgreSQL等&#xff09;綜合處理&#xff0c;以下是通用的分步指南&#xff1a; 一、緊急止損&#xff1a;暫停寫入&#xff0c;防止…