Spring AI 快速接入 DeepSeek 大模型
文章目錄
- Spring AI 快速接入 DeepSeek 大模型
- Spring AI 框架概述
- 核心特性
- 適用場景
- 官網與資源
- AI 提供商與模型類型
- 模型類型(Model Type)
- AI提供商(Provider)
- 兩者的關系
- Spring AI 框架支持哪些 AI 提供商的哪些模型
- Spring AI 接入 DeepSeek
- 引入依賴
- 編寫配置文件
- 編寫 service
- 編寫 controller
- 最后:
Spring AI 框架概述
在經歷了八個里程碑式的版本之后(M1~M8),Spring AI 1.0 正式版本,終于在 2025 年 5 月 20 日正式發布了,這是另一個新高度的里程碑式的版本,標志著 Spring 生態系統正式全面擁抱人工智能技術,并且意味著 Spring AI 將會給企業帶來穩定 API 支持。
Spring AI 是 Spring 官方推出的一個人工智能集成框架,旨在簡化 AI 功能在 Spring 應用中的整合。它提供了一套標準化的 API 和工具,讓開發者能夠輕松接入多種主流 AI 服務(如 OpenAI、Azure AI、Hugging Face 等),同時保持 Spring 生態的簡潔性和靈活性。
核心特性
- 統一 API 設計
通過抽象層屏蔽不同 AI 提供商(如 OpenAI、Gemini、Ollama 等)的接口差異,開發者只需使用 Spring AI 的通用接口(如 ChatModel),即可切換底層 AI 服務。
同理就類似于,我們 JDBC 連接數據庫的被統一的連接接口,這里我們的 Spring AI 就類似于我們這里的 JDBC,不同的是 這個 Spring AI 是連接操作其他 LLM(大模型)的被統一的接口。
- 開箱即用的功能支持
- 支持對話模型(Chat)類的大模型:與 ChatGPT 類似的交互。
- 支持嵌入模型(Embedding)類的大模型:嵌入模型是將文本、圖像或其他數據轉換為數值向量(即嵌入向量)的技術。
- 支持圖像生成(Image Generation)類的大模型:圖像生成是指AI根據文本描述或其他輸入創建新圖像的能力。
- 支持函數調用(Function Calling):函數調用功能使AI模型能夠與外部API和服務交互。也就是說,你寫一個函數,AI 也能調用你寫的函數。
- 與 Spring 生態無縫集成
- 支持 Spring Boot 自動配置、依賴注入、Actuator 監控等,與 Spring Security、Spring Data 等組件協同工作。
- Prompt 工程支持
- 提供
PromptTemplate
等工具,方便動態生成提示詞(Prompts),支持上下文管理。 - 模塊化設計
- 開發者可以根據項目需求選擇特定的AI服務模塊
- 例如只需OpenAI功能就只引入
spring-ai-openai
- 如需Google Vertex AI則引入
spring-ai-vertexai
- 每個AI供應商/服務有獨立的Spring Starter模塊
適用場景
- 快速構建 AI 驅動的應用(如智能客服、內容生成工具)。
- 需要靈活切換 AI 后端(如從本地模型切換到云服務)。
- 結合 Spring 生態實現企業級 AI 功能(如權限控制、數據持久化)。
官網與資源
- 官方倉庫:https://github.com/spring-projects/spring-ai
- 文檔:https://spring.io/projects/spring-ai
AI 提供商與模型類型
在SpringAI中,模型類型和AI提供商是兩個不同維度的概念,但它們又相互關聯。讓我用更清晰的方式幫你區分和理解:
模型類型(Model Type)
指的是AI模型的功能類別,即它能完成什么任務。
特點:與具體廠商無關,是通用的能力分類。
常見模型類型:
模型類型 | 功能說明 | 典型應用場景 |
---|---|---|
Chat(對話型) | 對話交互(如ChatGPT) | 客服機器人、聊天助手 |
Embedding(嵌入型) | 將文本轉換為向量(數值數組) | 語義搜索、RAG + 傳統搜索基于關鍵詞匹配(如Google早期的搜索),而語義搜索通過理解查詢的語義(含義)來返回更相關的結果。 + 它利用深度學習模型(如BERT、Embedding模型)將文本轉換為向量(vector),通過向量相似度匹配內容,即使查詢詞和文檔沒有直接的關鍵詞重疊。 |
Image(文生圖型) | 生成/處理圖像(如Stable Diffusion) | 設計輔助、內容生成 |
Text-to-Speech(文轉語音型) | 將文本轉為語音 | 語音助手、有聲內容 |
Function Calling(函數回調型) | 讓AI調用外部函數/API | 實時數據查詢、工作流自動化 |
AI提供商(Provider)
提供具體AI模型服務的公司或平臺。
特點: 同一提供商可能支持多種模型類型
常見提供商:
提供商 | 支持的模型類型 | 具體模型示例 |
---|---|---|
OpenAI | Chat, Embedding, Image | GPT-4o、text-embedding-3、DALL-E |
Google Vertex AI | Chat, Embedding, Image | PaLM 2、Imagen |
Azure OpenAI | Chat, Embedding | 微軟托管的OpenAI服務 |
Hugging Face | Chat, Embedding, Image | 開源模型(如BLOOM、Stable Diffusion) |
Stability AI | Image | Stable Diffusion系列 |
DeepSeek | Chat,代碼專用模型、Embedding、數學專用模型 | DeepSeek-V3、DeepSeek-Coder、DeepSeek-Embedding、DeepSeek-Math |
兩者的關系
- 一個提供商支持多種模型類型
例如:OpenAI同時提供Chat模型(GPT-4)、Embedding模型(text-embedding-3)、Image模型(DALL-E)。 - 一種模型類型可由多個提供商實現
例如:Chat模型既可以用OpenAI的GPT-4,也可以用Google的PaLM 2。
Spring AI 框架支持哪些 AI 提供商的哪些模型
Spring AI 框架支持主流的 AI 提供商的主流模型,并且會隨著 Spring AI 版本的升級而變化。
以下是截至 2024年6月,Spring AI 框架官方及社區支持的 AI 提供商及其對應的 模型類型的詳細列表,包含國內和國外主流廠商。
AI 提供商 | 支持的模型類型 | 具體模型示例 | 是否國內廠商 | Spring AI 模塊名 |
---|---|---|---|---|
OpenAI | Chat, Embedding, Image Generation, Function Calling | GPT-4, GPT-3.5, text-embedding-3, DALL-E 3 | ? | spring-ai-openai |
Azure OpenAI | Chat, Embedding, Image Generation | GPT-4, GPT-3.5, text-embedding-ada-002 | ? | spring-ai-azure-openai |
Google Vertex AI | Chat, Embedding, Code Generation | Gemini 1.5, PaLM 2, textembedding-gecko | ? | spring-ai-vertexai |
Hugging Face | Chat, Embedding, Text Generation, Image Generation | BLOOM, Llama 2, Stable Diffusion, BERT | ? | spring-ai-huggingface |
Stability AI | Image Generation | Stable Diffusion XL, Stable Diffusion 3 | ? | spring-ai-stabilityai |
Anthropic | Chat | Claude 3, Claude 2 | ? | spring-ai-anthropic (社區支持) |
Ollama | Chat, Embedding (本地運行開源模型) | Llama 3, Mistral, Gemma | ? | spring-ai-ollama |
DeepSeek | ? (尚未官方支持,但未來可能集成) | DeepSeek-V3, DeepSeek-Coder | ? | 暫無,雖然沒有給 deepseek 提供專門的 starter,但是由于 deepseek API 接口規范與 OpenAI 保持一致,因此也可以使用 openai 的 starter。 |
百度文心大模型 | ? (尚未官方支持) | ERNIE-Bot 4.0, ERNIE-Embedding | ? | 暫無 |
阿里云通義千問 | ? (尚未官方支持) | Qwen-72B, Qwen-Embedding | ? | 暫無 |
智譜AI (GLM) | ? (尚未官方支持) | ChatGLM3, GLM-Embedding | ? | 暫無 |
訊飛星火 | ? (尚未官方支持) | SparkDesk 3.0 | ? | 暫無 |
MiniMax | ? (尚未官方支持) | ABAB 5.5 | ? | 暫無 |
Spring AI 接入 DeepSeek
DeepSeek 的 API 設計兼容 OpenAI:DeepSeek 的 API 接口規范(如請求/響應格式、鑒權方式)與 OpenAI 保持一致,因此可以直接使用 OpenAI 的客戶端庫調用 DeepSeek。
引入依賴
<dependencies><!-- Spring MVC --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--DeepSeek 的 API 設計兼容 OpenAI:DeepSeek 的 API 接口規范(如請求/響應格式、鑒權方式)與 OpenAI 保持一致,因此可以直接使用 OpenAI 的客戶端庫調用 DeepSeek。--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>
<repositories><!--指向 Spring 官方提供的快照倉庫,為了嘗試 Spring 的最新功能--><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>
編寫配置文件
# Spring AI OpenAI/DeepSeek 配置
spring:ai:openai:api-key: sk-b768607df6cd4xxx0f5aa38 # 設置 DeepSeek API 的訪問密鑰,永遠不要將密鑰提交到代碼倉庫,建議通過環境變量注入。搞不好要花錢的。base-url: https://api.deepseek.com # 指定 DeepSeek API 的基礎地址,格式與OpenAI相同。chat:options:model: deepseek-chat # 選擇要調用的 DeepSeek 模型名稱,必須與 DeepSeek 支持的模型列表匹配(如 deepseek-chat、deepseek-coder 等),不同模型可能有不同的計費標準和能力。temperature: 1.3 # temperature 值越高,AI 回答越隨機和創意;值越低,回答越確定和保守。1.3 屬于高值,適合需要發散性輸出的場景,但可能犧牲準確性。
編寫 service
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.stereotype.Service;import java.util.Map;@RequiredArgsConstructor
@Service
public class AiService {private final ChatModel chatModel;// 簡單的直接調用public String generate(String message) {return chatModel.call(message);}// 使用系統提示模板public String generateWithSystemPrompt(String userMessage) {SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate("""你是一個資深{domain}專家,回答需滿足以下要求:1. 語言風格:{tone}2. 回答長度:{length}3. 用戶問題:{userMessage}""");Prompt prompt = new Prompt(systemPromptTemplate.createMessage(Map.of("domain", "科技","tone", "幽默","length", "不超過100字","userMessage", userMessage)));return chatModel.call(prompt).getResult().getOutput().getText();}
}
編寫 controller
import com.example.demo.service.AiService;
import lombok.RequiredArgsConstructor;
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;@RestController
@RequestMapping("/api/ai")
@RequiredArgsConstructor
public class AiController {private final AiService aiService;@GetMapping("/chat")public String chat(@RequestParam String message) {return aiService.generate(message);}@GetMapping("/chat-with-prompt")public String chatWithPrompt(@RequestParam String message) {return aiService.generateWithSystemPrompt(message);}
}
啟動服務,在瀏覽器地址欄上訪問:
到此,Spring AI 接入 DeepSeek 就完成了。
最后:
“在這個最后的篇章中,我要表達我對每一位讀者的感激之情。你們的關注和回復是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮斗。感謝你們,我們總會在某個時刻再次相遇。”