一、前言
Spring AI 提供跨 AI 供應商(如 OpenAI、Hugging Face 等)的一致性 API, 通過分裝的ChatModel或ChatClient即可輕松調動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_url
、api_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
---------------------------如果文章對你有幫助,別忘了點贊支持一下,謝謝~---------------------------