Spring AI Alibaba + Ollama:國產大模型DeepSeek LLM的低成本AI應用開發認知

寫在前面


  • 官方文檔很詳細,有開發需求可以直接看文檔
  • 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)。

角色區分 消息中可標記角色(如 usersystemassistant),幫助模型理解上下文來源(用戶指令、系統提示或模型回復)。

特點

模型適配 :集成通義系列大模型服務(如通義千問、通義萬象),支持以下功能:

  • 文本交互ChatModel):文本輸入 → 格式化文本輸出
  • 文生圖ImageModel):文本輸入 → 生成圖片
  • 文生語音AudioModel):文本輸入 → 合成語音
  • 語音轉文本(如語音輸入解析)。

開發集成

  • 復用 Spring AI 的 Model API,通過 spring-ai-alibaba-starter 自動配置默認實例。
  • 支持直接注入 ChatModelImageModel 等 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 都是通過自動裝配注入的,不需要顯示 newclientmodel 的基礎上重新構造。

博文部分內容參考

? 文中涉及參考鏈接內容版權歸原作者所有,如有侵權請告知 😃


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)

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

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

相關文章

解決:Word 保存文檔失敗,重啟電腦后,Word 在試圖打開文件時遇到錯誤

殺千刀的微軟&#xff0c;設計的 Word 是個幾把&#xff0c;用 LaTex 寫完公式&#xff0c;然后保存&#xff0c;卡的飛起 我看文檔卡了很久&#xff0c;就關閉文檔&#xff0c;然后 TMD 腦抽了重啟電腦 重啟之后&#xff0c;文檔打不開了&#xff0c;顯示 殺千刀的&#xff…

掌握高效大模型任務流搭建術(二):鏈式流程如何賦能 AI 處理能力提升

前言&#xff1a; 在上一篇文章中&#xff0c;我們初步探索了 LangChain 的基礎鏈式操作——LLMChain。它巧妙地將大語言模型&#xff08;LLM&#xff09;與提示模板&#xff08;Prompt Template&#xff09;相結合&#xff0c;為模型交互邏輯的封裝提供了一種簡潔而高效的方式…

虛擬卡 WildCard (野卡) 保姆級開卡教程

本文首發于只抄博客&#xff0c;歡迎點擊原文鏈接了解更多內容。 前言 本篇教程為 WildCard 的介紹以及開卡教學&#xff0c;要了解不同平臺&#xff08;Grok、Talkatone 等&#xff09;的訂閱方式請移步《訂閱教程》分類 當我們想要充值國外平臺會員時&#xff0c;一般都需要使…

計算機數據庫三級刷題總結(博主89分已過,總結的內容分享)

計算機數據庫三級刷題總結&#xff08;博主89分已過&#xff0c;總結的內容分享&#xff09; 文章目錄 計算機數據庫三級刷題總結&#xff08;博主89分已過&#xff0c;總結的內容分享&#xff09;一、 數據庫設計階段二、事務相關三、數據庫設計順序四、數據庫三級模式與二層映…

記錄一些面試遇到的問題

重載和重寫的區別 重載是overload&#xff0c;覆蓋是override 重載屬于編譯時多態&#xff0c;覆蓋屬于運行時多態 運行時多態和編譯時多態 運行時多態指的是在運行的時候才知道要調用哪一個函數&#xff0c;編譯時多態是指在編譯的時候就知道調用哪一個函數。 運行時多態…

HBuilder X 使用 TortoiseSVN 設置快捷鍵方法

HBuilder X 使用 TortoiseSVN 設置快捷鍵方法 單文件&#xff1a;(上鎖&#xff0c;解鎖&#xff0c;提交&#xff0c;更新) 安裝好 TortoiseSVN &#xff0c;或者 按圖操作&#xff1a; 1&#xff0c;工具欄中 【自定義快捷鍵】 2&#xff0c;點擊 默認的快捷鍵設置&…

JmeterHttp請求頭管理出現Unsupported Media Type問題解決

JmeterHttp請求頭管理出現Unsupported Media Type問題解決 大多數的app與pc端壓測的時候都會出現這種情況 當我們在jemter測試當中當中遇見Unsupported Media Type&#xff0c;有一種可能就是我們請求的網頁的content-Type的類型與我們測試的時候的類型不一致 解決方法 可以添…

Spring AI 1.0.0-M6 快速開始(一)

Spring AI 1.0.0-M6 入門一、存儲庫二、依賴管理完整maven 入門 Spring 是JAVA中我們經常使用的框架之一&#xff0c;Spring AI不斷的發展迭代目前已經到M6版本據說上半年會出一個穩定版本。 本節提供了如何開始使用Spring AI的M6。 一、存儲庫 1.0 M6 -添加Spring存儲庫 需…

頂點著色器和片段著色器

在Unity渲染中&#xff0c;**頂點著色器&#xff08;Vertex Shader&#xff09;和片段著色器&#xff08;Fragment Shader&#xff09;**是圖形渲染管線中的兩個核心階段。我們可以通過一個比喻來理解它們的分工&#xff1a;想象你要畫一幅由三角形組成的3D模型&#xff0c;頂點…

Impacket工具中的橫向滲透利器及其使用場景對比詳解

在滲透測試中&#xff0c;橫向移動&#xff08;Lateral Movement&#xff09;是指攻擊者在獲得一個系統的控制權限后&#xff0c;通過網絡進一步滲透到其他系統的過程。Impacket 是一款強大的滲透測試工具集&#xff0c;提供了多種實現橫向滲透的腳本&#xff0c;常見的工具包括…

設計模式|策略模式 Strategy Pattern 詳解

目錄 一、策略模式概述二、策略模式的實現2.1 策略接口2.2 具體策略類2.3 上下文類2.4 客戶端代碼2.5 UML類圖2.6 UML時序圖 三、優缺點3.1 ?優點3.2 ? 缺點 四、最佳實踐場景4.1 適合場景描述4.2 具體場景 五、擴展5.1 繼承復用機制和復合策略5.2 對象管理&#xff1a;優化策…

迷你世界腳本顯示板管理接口:DisPlayBoard

顯示板管理接口&#xff1a;DisPlayBoard 迷你世界 更新時間: 2023-04-26 10:21:14 具體函數名及描述如下: 序號 函數名 函數描述 1 showBoard(...) 對玩家顯示顯示板 2 hideBoard(...) 對玩家隱藏顯示板 3 setBoardPicture 對玩家設置顯示板的圖片…

尚硅谷爬蟲note14

一、scrapy scrapy&#xff1a;為爬取網站數據是&#xff0c;提取結構性數據而編寫的應用框架 1. 安裝 pip install scrapy 或者&#xff0c;國內源安裝 pip install scrapy -i https&#xff1a;//pypi.douban.com/simple 2. 報錯 報錯1&#xff09;building ‘twisted.te…

merge函數

merge函數 今天在刷lc&#xff0c;從靈神題解中學到的 來源&#xff1a;560. 和為 K 的子數組 - 力扣&#xff08;LeetCode&#xff09; java8 merge()方法被引入到HashMap類中&#xff0c;用于簡化鍵值對操作&#xff0c;在處理鍵值對時&#xff0c;提供一個重新映射函數來決…

Notepad++ 8.6.7 安裝與配置全攻略(Windows平臺)

一、軟件定位與核心優勢 Notepad 是開源免費的代碼/文本編輯器&#xff0c;支持超過80種編程語言的高亮顯示&#xff0c;相比系統自帶記事本具有以下優勢&#xff1a; 輕量高效&#xff1a;啟動速度比同類軟件快30%插件擴展&#xff1a;支持NppExec、JSON Viewer等200插件跨文…

建筑兔零基礎自學python記錄39|實戰詞云可視化項目——章節分布10(上)

這次我們來制作《紅樓夢》各章節的分布情況&#xff1a; 源代碼&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…

C++:#ifndef 頭文件保護機制詳解

在C開發中&#xff0c;頭文件可能會被多個源文件包含&#xff0c;導致編譯錯誤。為了避免這種情況&#xff0c;我們使用了頭文件保護機制&#xff08;防止重復包含&#xff09;。 頭文件保護的原理 通過預處理指令#ifndef&#xff08;如果沒有定義&#xff09;和#define&…

利用MQ自動取消未支付超時訂單最佳實踐

一、利用MQ自動取消未支付超時訂單最佳實踐 1、基于 RocketMQ 延遲消息 1.1&#xff1a;延遲消息 當消息寫入到 Broker 后&#xff0c;不會立刻被消費者消費&#xff0c;需要等待指定的時長后才可被消費處理的消息&#xff0c;稱為延時消息。 1.2&#xff1a;實現流程 &am…

基于 ChatGPT 創建專屬 GPTs

文章目錄 基于 ChatGPT 創建專屬 GPTs一、效果展示1.1 中文命名專家1.2 行程小助手 二、核心配置2.1 Instructions2.3 Actions 三、Agent 簡介3.1 功能框架3.2 工作流程3.3 意圖識別 四、數據流程 基于 ChatGPT 創建專屬 GPTs ChatGPT 具備定制 GPTs 的能力&#xff0c;能夠通…

Spring Boot WebFlux 中 WebSocket 生命周期解析

Spring Boot WebFlux 中的 WebSocket 提供了一種高效、異步的方式來處理客戶端與服務器之間的雙向通信。WebSocket 連接的生命周期包括連接建立、消息傳輸、連接關閉以及資源清理等過程。此外&#xff0c;為了確保 WebSocket 連接的穩定性和可靠性&#xff0c;我們可以加入重試…