SpringAI_Chat模型_DeepSeek模型--基礎對話

一、前言

Spring AI 提供跨 AI 供應商(如 OpenAI、Hugging Face 等)的一致性 API, 通過分裝的ChatModelChatClient即可輕松調動LLM進行流式或非流式對話。

本專欄主要圍繞著通過OpenAI方式調用各種大語言模型展開學習(因為95%以上模型都兼容OpenAI方式調用接口),接下來我們先從調用深度求索的DeepSeek模型開始探索吧~

上一篇文章:1. Spring AI概述-CSDN博客

二、術語

2.1 ChatModel 和ChatClient的區分

Spring AI 中的 ChatModel ChatClient 是兩種不同層級的 API 設計,分別針對不同復雜度的 AI 交互場景。以下是兩者的核心差異、典型用法及適用場景分析:

PS : ChatClient是對ChatModel的高級封裝, 是官方推薦的核心API

a. 首次引入版本

    • 里程碑版本:ChatClient 在 1.0.0-M5 中首次出現,但接口設計尚未穩定。
    • 穩定版本:從 1.0.0-M7 開始接口基本定型,并在 1.0.0-M8 中進一步優化。
    • 正式生產版本1.0.0 GA(2025年5月20日發布)是首個穩定且支持生產環境的版本,ChatClient 成為官方推薦的核心 API

b. 當前推薦版本

    • 1.0.0 GA:功能完善,支持同步/流式調用、多模型切換、工具調用等企業級特性,是生產環境首選

2.2 OpenAI標準

OpenAI的API設計已成為行業事實標準,開發者生態龐大。國內絕大部分模型(如通義千問、DeepSeek、文心一言、智譜GLM、Kimi等)均提供與OpenAI兼容的API接口,開發者僅需替換base_urlapi_key model 參數,即可快速調動大模型能力!

主流模型兼容OpenAI接口對比表:

三、DeepSeek開放平臺

注冊開放平臺賬號(DeepSeek),充值5塊錢(開發夠用了),然后創建API KEY

四、代碼

4.1 項目依賴

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.better</groupId><artifactId>spring-ai-parent</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>models/chat/chat-openai-deepseek</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath/></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency></dependencies><!--Spring AI模塊的依賴版本管理--><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><!--正式生產版本:1.0.0 GA(2025年5月20日發布)是首個穩定且支持生產環境的版本,ChatClient 成為官方推薦的核心 API--><version>1.0.0</version> <!-- GA 版本 --><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

4.2 模型配置

server:port: 8321
spring:ai:openai:base-url: https://api.deepseek.comapi-key: ${OPENAI_API_KEY}chat:options:model: deepseek-chat  # 可選模型:deepseek-chat/deepseek-reasonertemperature: 0.6      # 響應隨機性控制,默認值

4.3 ChatClient

4.3.1 非流式對話

    @GetMapping("/chat")String chat(String question) {return chatClient.prompt(question).call().content();

4.3.2 流式對話

    @GetMapping(value = "/chat/stream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)Flux<String> chatStream(String question) {return chatClient.prompt(question).stream().content();}

4.3.3 通用LLM配置

適用于所有支持的 LLM 提供商,跨平臺兼容性高,適配 OpenAI、DeepSeek等

    @GetMapping("/chat/generic-options")String chatGenericOptions(String question) {return chatClient.prompt(question).options(ChatOptions.builder().model("deepseek-reasoner")  // 指定模型(deepSeek的推理模型).temperature(0.9) // 指定溫度值.build()).call().content();}

4.3.4 OpenAI配置

    @GetMapping("/chat/provider-options")String chatProviderOptions(String question) {return chatClient.prompt(question).options(OpenAiChatOptions.builder().logprobs(true) // 用于請求模型在生成文本時返回每個生成toke的對數概率.build()).call().content();}

4.3.5 完整代碼

package com.better.springai;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;/*** 高級封裝ChatClient*/
@RestController
class ChatClientController {private final ChatClient chatClient;public ChatClientController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}/*** 非流式對話* @param question 問題* return java.lang.String* @author luchuyan* @time 2025/7/19 18:59**/@GetMapping("/chat")String chat(String question) {return chatClient.prompt(question).call().content();}/*** 流式對話* @param question* return reactor.core.publisher.Flux<java.lang.String>* @author luchuyan* @time 2025/7/19 19:00**/@GetMapping(value = "/chat/stream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)Flux<String> chatStream(String question) {return chatClient.prompt(question).stream().content();}/*** 非流式對話-通用LLM配置* PS: 適用于所有支持的 LLM 提供商,跨平臺兼容性高,適配 OpenAI、DeepSeek等* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:09**/@GetMapping("/chat/generic-options")String chatGenericOptions(String question) {return chatClient.prompt(question).options(ChatOptions.builder().model("deepseek-reasoner")  // 指定模型(deepSeek的推理模型).temperature(0.9) // 指定溫度值.build()).call().content();}/*** 非流式對話-OpenAI專屬配置* PS: 僅適用于 OpenAI 或兼容 OpenAI 接口的服務(如 DeepSeek)* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:13**/@GetMapping("/chat/provider-options")String chatProviderOptions(String question) {return chatClient.prompt(question).options(OpenAiChatOptions.builder().logprobs(true) // 用于請求模型在生成文本時返回每個生成toke的對數概率.build()).call().content();}}

4.4 ChatModel

用戶和ChatClient差不多, 不再贅述~

4.4.1 完整代碼

package com.better.springai;import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;/*** 基礎封裝ChatModel*/
@RestController
@RequestMapping("/model")
class ChatModelController {private final ChatModel chatModel;ChatModelController(ChatModel chatModel) {this.chatModel = chatModel;}/*** 非流式對話* @param question 問題* return java.lang.String* @author luchuyan* @time 2025/7/19 20:48**/@GetMapping("/chat")String chat(String question) {return chatModel.call(question);}/*** 流式對話* @param question* return reactor.core.publisher.Flux<java.lang.String>* @author luchuyan* @time 2025/7/19 19:00**/@GetMapping(value = "/chat/stream",produces = MediaType.TEXT_EVENT_STREAM_VALUE)Flux<String> chatStream(String question) {return chatModel.stream(question);}/*** 非流式對話-通用LLM配置* PS: 適用于所有支持的 LLM 提供商,跨平臺兼容性高,適配 OpenAI、DeepSeek等* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:09**/@GetMapping("/chat/generic-options")String chatGenericOptions(String question) {return chatModel.call(new Prompt(question, ChatOptions.builder().model("deepseek-reasoner")  // 指定模型(deepSeek的推理模型).temperature(0.9).build())).getResult().getOutput().getText();}/*** 非流式對話-OpenAI專屬配置* PS: 僅適用于 OpenAI 或兼容 OpenAI 接口的服務(如 DeepSeek)* @param question* return java.lang.String* @author luchuyan* @time 2025/7/19 19:13**/@GetMapping("/chat/provider-options")String chatProviderOptions(String question) {return chatModel.call(new Prompt(question, OpenAiChatOptions.builder().logprobs(true).build())).getResult().getOutput().getText();}}

五、參考資料

5.1 Spring AI官網文檔

    • Chat Client API :: Spring AI Reference 、
    • OpenAI Chat :: Spring AI Reference

5.2 阿里云Maven倉庫

  • 倉庫服務

5.3 Spring AI 依賴倉庫

  • JFrog

5.4 DeepSeek開發文檔

  • 首次調用 API | DeepSeek API Docs

---------------------------如果文章對你有幫助,別忘了點贊支持一下,謝謝~---------------------------

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

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

相關文章

數據結構:字符串(Strings)

目錄 第一性問題&#xff1a;計算機如何表示文字&#xff1f; ASCII&#xff1a;最早的字符編碼標準&#xff08;美國人寫的&#xff09; Unicode&#xff1a;解決全球語言的編碼方案 字符&#xff08;Character&#xff09; ?編輯 為什么字符常量必須加上單引號 &#…

【vue-5】Vue 3 中的 v-model:雙向數據綁定的全面指南

在 Vue 開發中&#xff0c;v-model 是實現表單輸入和應用狀態之間雙向綁定的關鍵指令。Vue 3 對 v-model 進行了重大改進&#xff0c;使其更加靈活和強大。本文將深入探討 Vue 3 中 v-model 的工作原理、新特性以及最佳實踐。 1. v-model 基礎 1.1 什么是 v-model v-model 是 V…

結合自身,制定一套明確的 Web3 學習路線和技術棧建議

目錄 ? 一、結合自身&#xff0c;明確方向和目的 ? 二、技術路線和建議 &#x1f9ed; 技術路線圖&#xff08;按階段劃分&#xff09; 第一階段&#xff1a;鞏固 Web3 基礎&#xff08;1-2 周&#xff09; 第二階段&#xff1a;NFT 平臺開發實戰&#xff08;4-6 周&…

SPARKLE:深度剖析強化學習如何提升語言模型推理能力

摘要&#xff1a;強化學習&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;已經成為賦予語言模型高級推理能力的主導范式。盡管基于 RL 的訓練方法&#xff08;例如 GRPO&#xff09;已經展示了顯著的經驗性收益&#xff0c;但對其優勢的細致理解仍然不足。為了填…

【Linux服務器】-MySQL數據庫參數調優

一、基礎配置 [mysqld] # 聲明以下配置屬于MySQL服務器&#xff08;mysqld&#xff09;[mysqld]&#xff1a;配置文件的模塊標識&#xff0c;表示這是 MySQL 服務器的配置段。 二、路徑與基礎設置 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock pid-file/var/run/mys…

sqli-labs靶場通關筆記:第32-33關 寬字節注入

第32關 寬字節注入查看一下本關的源代碼&#xff1a;function check_addslashes($string) // 定義一個用于過濾特殊字符的函數&#xff0c;目的是轉義可能用于注入的特殊符號 {$string preg_replace(/. preg_quote(\\) ./, "\\\\\\", $string); // 轉義…

基于Eureka和restTemple的負載均衡

在微服務架構中&#xff0c;基于 Eureka&#xff08;服務注冊中心&#xff09;和 RestTemplate&#xff08;HTTP 客戶端&#xff09;實現負載均衡是常見的方案&#xff0c;核心是通過 Eureka 獲取服務實例列表&#xff0c;再結合負載均衡策略選擇具體服務實例進行調用。以下是詳…

子線程不能直接 new Handler(),而主線程可以

在 Android 中&#xff0c;子線程不能直接 new Handler()&#xff0c;而主線程可以&#xff0c;原因在于 Looper 機制。下面詳細解釋&#xff1a;1. 為什么主線程可以直接 new Handler()&#xff1f; 主線程&#xff08;UI 線程&#xff09;在啟動時&#xff0c;系統會自動調用…

Android無需授權直接訪問Android/data目錄漏洞

從android11開始&#xff0c;訪問/sdcard/Android/data目錄需要URI授權&#xff0c;而從更高的版本開始甚至URI權限也被收回&#xff0c;返回“無法使用此文件夾”的提示&#xff0c;這里提供一種方法&#xff0c;可以越權強制訪問data目錄&#xff0c;當然也包括obb、media等目…

本地部署 Kimi K2 全指南(llama.cpp、vLLM、Docker 三法)

Kimi K2 是 Moonshot AI 于2025年7月11日發布的高性能多專家語言模型&#xff08;MoE&#xff09;&#xff0c;支持最大 128K 上下文&#xff0c;激活參數規模為 32B&#xff0c;具備極強的推理、代碼生成與多輪對話能力。自從其權重以多種格式開源以來&#xff0c;許多開發者希…

使用python的pillow模塊將圖片轉化為灰度圖和相關的操作

使用python的pillow模塊可以將圖片轉化為灰度圖&#xff0c; 可以獲取灰度圖的特定點值&#xff0c;區域值&#xff0c; 修改值并保存到圖片 圖片轉換為灰度圖 from PIL import Image# 打開圖片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

【網絡安全】大型語言模型(LLMs)及其應用的紅隊演練指南

未經許可,不得轉載。 文章目錄 什么是紅隊演練? 為什么 RAI 紅隊演練是一項重要實踐? 如何開展和規劃 LLM 的紅隊演練 1.測試前的準備 規劃:由誰負責測試 規劃:測試內容 規劃:測試方式 規劃:數據記錄方式 2.測試過程中 3.每輪測試后 報告數據 區分“識別”與“測量” 本…

ROS2安裝ros-humble-usb-cam 404錯誤導致失敗的解決方法

ROS2安裝ros-humble-usb-cam遇到404錯誤導致安裝失敗&#xff0c;如圖&#xff1a;解決方法&#xff1a; 備份 sources.list sudo cp /etc/apt/sources.list.d/ros2.list /etc/apt/sources.list.d/ros2.list.bak替換為清華源 sudo sed -i s|http://packages.ros.org/ros2/ubunt…

OllyDbg技巧學習

1 嘗試在反匯編代碼中找到一個函數的二進制代碼 有的時候需要一個函數的二進制代碼&#xff0c;注入到另外的一些地方&#xff1b;以此程序為示例&#xff0c; 八叉樹的C實現與原理解析-CSDN博客 Ollydbg打開可執行文件&#xff0c;我想先找到此函數的二進制代碼體&#xff0…

數據分析智能體:讓AI成為你的數據科學家

數據分析智能體&#xff1a;讓AI成為你的數據科學家 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 總有一行代碼&#xff0c;能點亮萬千星辰。 &#x1f50d; 在技術的宇宙中&#xff0c;我愿做永不停歇的探索者。 ? 用代碼丈量世界&#xff0c…

K8s與Helm實戰:從入門到精通

Kubernetes 簡介 Kubernetes(簡稱 K8s)是一個開源的容器編排平臺,用于自動化部署、擴展和管理容器化應用。最初由 Google 設計并捐贈給云原生計算基金會(CNCF),現已成為容器編排領域的事實標準。 核心功能 自動化容器部署:支持聲明式配置和自動化部署,減少人工干預。…

根據ARM手冊,分析ARM架構中,原子操作的軟硬件實現的底層原理

目錄 1.問題背景&#xff1a; 2.原子操作 2.1 硬件操作 2.1.1 LDREX/LDXR指令 2.1.2 STREX/STXR指令 2.2 軟件操作 2.3 軟件硬件操作的各性能對比 3.總結 1.問題背景&#xff1a; 我們知道&#xff0c;RTOS的任務調度算法是搶占式優先級調度算法。 既然是搶占了&…

iOS 抓包工具選擇與配置指南 從零基礎到高效調試的完整流程

iOS 抓包&#xff1a;復雜網絡調試的必要技能 隨著移動端應用越來越依賴網絡交互&#xff0c;iOS 抓包作為核心調試工具之一&#xff0c;變得尤為重要。無論是調試 App 與后端的接口通信、排查 HTTPS 請求加密問題&#xff0c;還是定位網絡連接超時、請求異常&#xff0c;抓包都…

Java使用FastExcel實現Excel文件導入

依賴配置 (Maven pom.xml)<dependencies><!-- FastExcel 核心庫 --><dependency><groupId>cn.idev.excel</groupId><artifactId>fastexcel</artifactId><version>1.0.0</version></dependency><!-- Apache POI…

【60】MFC入門到精通——運行后 button按鍵上不顯示 按鍵名, 控件上的文字不顯示

文章目錄運行后&#xff0c;button按鍵上不顯示 “Test”原因是屬性&#xff0c;圖標–>True&#xff0c;改為False就好了。