寫在前面
- 官方文檔很詳細,有開發需求可以直接看文檔
- https://java2ai.com/docs/1.0.0-M5.1/get-started/
- 博文內容為一個開發Demo,以及API簡單認知
- 理解不足小伙伴幫忙指正 😃,生活加油
我看遠山,遠山悲憫
持續分享技術干貨,感興趣小伙伴可以關注下 _
AI普惠時代的技術革新
在生成式AI技術快速發展的今天,大模型的高效部署與低成本應用成為企業智能化轉型的核心挑戰。國產大模型 DeepSeek LLM
憑借其輕量化設計、開源生態和高性價比優勢,結合 Spring AI Alibaba
框架與 Ollama
本地化部署能力,為開發者提供了一條“平民化”AI應用的可行路徑。
什么是 Spring AI
Spring AI 是由 Spring 官方維護的 AI 開發框架,旨在簡化企業級 AI 應用構建。
Spring AI 借鑒了 Python 生態的 LangChain 等工具的設計理念,但并非直接移植,而是專注于解決 Java 開發者面臨的 AI 集成核心難題——將企業數據/API 與 AI 模型無縫連接
,突破 Python 生態壟斷,推動生成式 AI 應用向多語言生態擴展。
什么是 Spring AI Alibaba?
Spring AI Alibaba
是阿里云
為 Java
開發者打造的開源 AI 開發框架,基于 Spring AI
深度集成通義系列模型,提供標準化接口和高階抽象能力。
Spring AI Alibaba
簡化 AI 應用開發流程,支持以 Spring Boot 開發范式快速接入大模型能力,深度整合阿里云通義系列模型及百煉平臺,提供模型部署到運維的最佳實踐;
?關鍵能力:
- 統一 API 抽象(支持聊天/多模態模型、同步/流式調用、跨模型無縫切換);
- 智能體開發工具集(函數調用、對話記憶、RAG 全鏈路支持);
- 工程化增強(結構化輸出映射 POJO、向量數據庫集成、離線文檔處理工具)。
- 相較于原生 API 調用,該框架通過 Fluent API 設計顯著降低開發復雜度,使開發者聚焦業務邏輯而非底層模型交互細節。
API認知
在 Spring AI Alibaba
框架中, 提供了 ?Chat Client
和 ?Chat Model
兩類不同層次的組件,分別對應不同的開發場景需求。
Chat Model(聊天模型)?
: 直接與 AI 大模型(比如通義系列模型)打交道的“電話聽筒”。你可以把它想象成直接撥通大模型的電話,告訴它你的問題,然后接收它的原始回答。Chat Client(智能體代理客戶端)?
: 封裝好的“智能助手”。它不僅幫你撥通大模型的電話,還會自動幫你處理對話流程、記憶上下文、調用工具函數(比如查機票信息)等復雜操作。
下面我們詳細看看
對話模型(Chat Model)
Chat Model 通過標準化 API 抽象,降低多模態大模型集成復雜度,使開發者聚焦業務邏輯,快速實現智能交互功能。
輸入/輸出形式 支持多模態交互(文本、語音、圖片、視頻),輸入為消息序列(Message
),輸出為聊天消息(ChatMessage
)。
角色區分 消息中可標記角色(如 user
、system
、assistant
),幫助模型理解上下文來源(用戶指令、系統提示或模型回復)。
特點
模型適配 :集成通義系列大模型服務(如通義千問、通義萬象),支持以下功能:
- 文本交互(
ChatModel
):文本輸入 → 格式化文本輸出 - 文生圖(
ImageModel
):文本輸入 → 生成圖片 - 文生語音(
AudioModel
):文本輸入 → 合成語音 - 語音轉文本(如語音輸入解析)。
開發集成
- 復用 Spring AI 的
Model API
,通過spring-ai-alibaba-starter
自動配置默認實例。 - 支持直接注入
ChatModel
、ImageModel
等 Bean,亦可自定義模型實例。
API 核心邏輯
交互流程:Prompt
(輸入) → 模型處理 → ChatResponse
(輸出)
- 輸入:用戶提供的
Prompt
或部分對話上下文。 - 輸出:模型生成的自然語言響應,可呈現給用戶或用于后續處理。
底層原理 模型基于訓練數據解析輸入語義,結合上下文生成連貫、符合邏輯的響應。
對話客戶端(Chat Client)
Chat Client
通過標準化流程和 Fluent API 提升開發效率,適合需快速落地的通用 AI 場景;
作用:提供與 AI 模型交互的 Fluent API,簡化多組件協作流程(如提示詞模板、聊天記憶、模型、解析器等)。
定位:類似應用程序的 服務層,封裝底層復雜性,快速實現端到端 AI 交互流程。
特點
- 編程模型:支持 同步 與 反應式(Reactive) 調用。
- 開發效率:通過鏈式調用(Fluent API)減少樣板代碼,避免手動協調組件(如 RAG、函數調用等)。
- 功能集成:內置輸入輸出處理、參數配置等通用邏輯,開箱即用。
基礎功能
功能 | 說明 |
---|---|
輸入定制(Prompt) | 動態組裝用戶輸入,支持模板化參數填充(如變量替換)。 |
結構化輸出解析 | 將模型返回的非結構化文本轉換為結構化數據(如 JSON、對象)。 |
交互參數調整 | 通過 ChatOptions 動態配置模型參數(如溫度、最大 Token 數、Top-P 等)。 |
- 聊天記憶(Chat Memory) 維護多輪對話上下文,支持短期記憶(內存)和長期記憶(持久化存儲)。
- 工具/函數調用(Function Calling) 模型根據輸入動態調用外部服務或函數(如查詢天氣、調用 API),并整合結果至響應。
- RAG(檢索增強生成) 集成檢索組件,通過向量數據庫增強模型知識,生成基于業務數據的精準回答。
開發Demo
ollama 運行 deepseek-r1
啟動服務
PS C:\Users\liruilong> ollama serve
2025/03/06 10:33:23 routes.go:1186: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL:
................................
運行模型測試
PS C:\Users\liruilong> ollama run deepseek-r1
>>> 1+1=?
<think></think>1 + 1 = **2**>>> Send a message (/? for help)
Spring AI Alibaba AI 應用開發
添加依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency>
配置大模型相關配置
server:port: 10005spring:application:name: spring-ai-alibaba-ollama-demoai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:latest
克隆項目Demo
git clone --depth=1 https://github.com/springaialibaba/spring-ai-alibaba-examples.git
chat model
@RestController
@RequestMapping("/ollama/chat-model")
public class OllamaChatModelController {private static final String DEFAULT_PROMPT = "你好,介紹下你自己吧。請用中文回答。";private final ChatModel ollamaChatModel;public OllamaChatModelController(ChatModel chatModel) {this.ollamaChatModel = chatModel;}/*** 最簡單的使用方式,沒有任何 LLMs 參數注入。** @return String types.*/@GetMapping("/simple/chat")public String simpleChat() {return ollamaChatModel.call(new Prompt(DEFAULT_PROMPT)).getResult().getOutput().getContent();}/*** Stream 流式調用。可以使大模型的輸出信息實現打字機效果。** @return Flux<String> types.*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response) {// 避免返回亂碼response.setCharacterEncoding("UTF-8");Flux<ChatResponse> stream = ollamaChatModel.stream(new Prompt(DEFAULT_PROMPT));return stream.map(resp -> resp.getResult().getOutput().getContent());}/*** 使用編程方式自定義 LLMs ChatOptions 參數, {@link OllamaOptions}。* 優先級高于在 application.yml 中配置的 LLMs 參數!*/@GetMapping("/custom/chat")public String customChat() {OllamaOptions customOptions = OllamaOptions.builder().topP (0.95D).temperature (0.7D).numPredict (1024).build();return ollamaChatModel.call(new Prompt(DEFAULT_PROMPT, customOptions)).getResult().getOutput().getContent();}}
調用接口測試
PS C:\Users\liruilong> curl http://localhost:10005/ollama/chat-model/simple/chat
<think>
您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題,我會盡我所能為您提供幫助。
</think>您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題,我會盡我所能為您提供幫助。
PS C:\Users\liruilong> curl http://localhost:10005/ollama/chat-model/stream/chat
<think>
您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題,我會盡我所能為您提供幫助。
</think>您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題,我會盡我所能為您提供幫助。
下面為自定義模型參數調用
PS C:\Users\liruilong> curl http://localhost:10005/ollama/chat-model/custom/chat
<think>
您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題,我會盡我所能為您提供幫助。
</think>您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題,我會盡我所能為您提供幫助。
PS C:\Users\liruilong>
chat client
@RestController
@RequestMapping("/ollama/chat-client")
public class OllamaClientController {private static final String DEFAULT_PROMPT = "你好,介紹下你自己!請用中文回答。";private final ChatClient ollamaiChatClient;public OllamaClientController(ChatModel chatModel) {this.ollamaiChatClient = ChatClient.builder(chatModel).defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())).defaultAdvisors(new SimpleLoggerAdvisor()).defaultOptions(OllamaOptions.builder ().topP (0.95D).temperature (0.7D).numPredict (1024).build()).build();}/*** ChatClient 簡單調用*/@GetMapping("/simple/chat")public String simpleChat() {return ollamaiChatClient.prompt(DEFAULT_PROMPT).call().content();}/*** ChatClient 流式調用*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response) {response.setCharacterEncoding("UTF-8");return ollamaiChatClient.prompt(DEFAULT_PROMPT).stream().content();}}
Demo 代碼可以看到 chatModel
都是通過自動裝配注入的,不需要顯示 new
,client
在 model
的基礎上重新構造。
博文部分內容參考
? 文中涉及參考鏈接內容版權歸原作者所有,如有侵權請告知 😃
https://sca.aliyun.com/
https://java2ai.com/docs/1.0.0-M5.1/get-started/
? 2018-至今 liruilonger@gmail.com, 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)