Spring Boot 深度集成 Ollama 指南:從聊天模型配置到生產級應用開發

Spring Boot 深度集成 Ollama 指南:從聊天模型配置到生產級應用開發

前言

在人工智能應用開發中,大語言模型(LLM)的本地化部署需求日益增長。Ollama 作為開源的本地LLM運行平臺,支持Mistral、LLaMA等主流模型,并提供與OpenAI兼容的API接口,而 Spring AI 則為Java開發者提供了便捷的集成工具鏈。本文將結合Spring Boot框架,詳細講解如何通過Spring AI實現Ollama聊天模型的全生命周期管理,涵蓋基礎配置、高級功能開發及生產環境優化,幫助開發者構建高效、可控的本地化智能應用。

一、Ollama 環境搭建與 Spring Boot 集成

1. 安裝與啟動 Ollama
  • 本地安裝
    從 Ollama 官網 下載對應系統的二進制文件(如Windows、macOS或Linux),啟動后默認監聽端口 11434
    # 啟動命令(示例)
    ./ollama server
    
  • 模型拉取
    通過命令行預拉取模型,避免運行時延遲:
    ollama pull mistral       # 拉取默認聊天模型
    ollama pull hf.co/llama3 # 拉取Hugging Face GGUF格式模型
    
2. Spring Boot 依賴配置

pom.xml 中引入Spring AI對Ollama的支持模塊:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>3.2.0</version> <!-- 替換為最新版本 --><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

二、核心配置:聊天模型參數與自動管理

1. 基礎連接與模型初始化

application.yaml 中配置Ollama服務地址及模型拉取策略:

spring:ai:ollama:base-url: http://localhost:11434  # Ollama API地址init:pull-model-strategy: when_missing  # 自動拉取策略(always/never/when_missing)timeout: 10m                      # 拉取超時時間max-retries: 2                    # 拉取失敗重試次數chat:include: true                   # 是否初始化聊天模型additional-models: ["llama3-13b"] # 額外預拉取的模型列表
2. 聊天模型參數詳解

通過 spring.ai.ollama.chat.options 前綴配置模型行為,關鍵參數如下:

屬性描述示例配置
model目標模型名稱(如mistralllavamodel: mistral
temperature生成隨機性(0.0保守,1.0創意)temperature: 0.7
num-ctx上下文窗口大小(影響歷史對話記憶,單位:Token)num-ctx: 4096
stop終止生成的字符序列(如["###", "\nEND"]stop: ["###"]
keep-alive模型在內存中保持加載的時間(避免頻繁重新加載)keep-alive: 10m
num-gpuGPU加速層數(macOS設為1啟用Metal,-1自動檢測)num-gpu: 1

完整配置示例

spring:ai:ollama:chat:options:model: mistraltemperature: 0.8num-ctx: 2048stop: ["用戶:", "###"]top-k: 50

三、高級功能開發:從函數調用到多模態支持

1. 函數調用(Tool Calling)

通過Ollama的函數調用能力,實現LLM與外部工具的聯動(需Ollama ≥0.2.8):

@RestController
public class ToolController {private final OllamaChatModel chatModel;@Autowiredpublic ToolController(OllamaChatModel chatModel) {this.chatModel = chatModel;}@PostMapping("/tool/call")public ChatResponse toolCall(@RequestBody String prompt) {// 注冊可調用的函數列表List<String> functions = Arrays.asList("searchWeather", "calculate");return chatModel.call(new Prompt(prompt, OllamaOptions.builder().functions(functions).build()));}
}

LLM將返回包含函數名和參數的JSON,例如:

{"function_call": {"name": "searchWeather","parameters": { "city": "北京", "date": "2023-10-01" }}
}
2. 多模態支持(文本+圖像)

利用LLaVA等多模態模型處理圖像輸入(需Ollama支持多模態模型):

@GetMapping("/multimodal")
public ChatResponse multimodalQuery() throws IOException {// 加載圖像資源ClassPathResource imageResource = new ClassPathResource("cat.jpg");Media imageMedia = new Media(MimeTypeUtils.IMAGE_JPEG, imageResource);// 構造包含圖像的用戶消息UserMessage userMessage = new UserMessage("描述圖片中的動物", imageMedia);return chatModel.call(new Prompt(userMessage, OllamaOptions.builder().model("llava").build()));
}

多模態是指模型同時理解和處理來自各種來源的信息(包括文本、圖像、音頻和其他數據格式)的能力。

Ollama 中支持多模態的一些模型是 LLaVA 和 BakLLaVA(請參閱完整列表)。 有關更多詳細信息,請參閱 LLaVA:大型語言和視覺助手。

Ollama 消息 API 提供了一個 “images” 參數,用于將 base64 編碼的圖像列表與消息合并。

Spring AI 的 Message 接口通過引入 Media 類型來促進多模態 AI 模型。 此類型包含有關消息中媒體附件的數據和詳細信息,使用 Spring 的org.springframework.util.MimeType以及org.springframework.core.io.Resource對于原始媒體數據。

下面是一個摘自 OllamaChatModelMultimodalIT.java 的簡單代碼示例,說明了用戶文本與圖像的融合。

var imageResource = new ClassPathResource("/multimodal.test.png");var userMessage = new UserMessage("Explain what do you see on this picture?",new Media(MimeTypeUtils.IMAGE_PNG, this.imageResource));ChatResponse response = chatModel.call(new Prompt(this.userMessage,OllamaOptions.builder().model(OllamaModel.LLAVA)).build());

該示例顯示了一個模型,將multimodal.test.png圖像:
多模態測試圖像
以及文本消息 “Explain what do you see on this picture?”,并生成如下響應:

The image shows a small metal basket filled with ripe bananas and red apples. The basket is placed on a surface,
which appears to be a table or countertop, as there's a hint of what seems like a kitchen cabinet or drawer in
the background. There's also a gold-colored ring visible behind the basket, which could indicate that this
photo was taken in an area with metallic decorations or fixtures. The overall setting suggests a home environment
where fruits are being displayed, possibly for convenience or aesthetic purposes.
3. 結構化輸出與JSON Schema

強制模型返回符合指定格式的結構化數據,便于后續解析:

// 定義JSON Schema
String schema = """{"type": "object","properties": {"steps": {"type": "array","items": { "type": "string" }},"result": { "type": "number" }},"required": ["steps", "result"]}
""";// 在請求中指定格式
ChatResponse response = chatModel.call(new Prompt("計算1+2+3的步驟", OllamaOptions.builder().format(new ObjectMapper().readValue(schema, Map.class)).build()
));

四、生產環境優化與最佳實踐

1. 模型管理策略
  • 禁用自動拉取:生產環境中通過 pull-model-strategy: never 關閉自動拉取,提前通過 ollama pull 預下載模型。
  • 模型版本控制:固定模型版本(如mistral:latest),避免因模型更新導致的行為變化。
2. 資源性能調優
  • GPU加速:設置 num-gpu: -1 自動檢測GPU,或根據硬件指定層數(如num-gpu: 8)。
  • 內存優化:啟用 low-vram: true 減少顯存占用,或 use-mlock: true 鎖定模型內存防止交換。
3. 連接與容錯
  • 連接池配置:通過 OllamaApi 配置連接超時(如connectTimeout(5000))和重試機制。
  • 監控與日志:集成Micrometer監控Ollama請求延遲、錯誤率,或通過SLF4J記錄模型調用日志。

五、OpenAI API 兼容模式:無縫遷移現有應用

Ollama提供與OpenAI API兼容的端點,允許直接復用Spring AI的OpenAI客戶端:

spring:ai:openai:chat:base-url: http://localhost:11434  # 指向Ollama服務options:model: mistral                  # 使用Ollama模型temperature: 0.9

此模式下,原有基于OpenAI的代碼(如函數調用、流式響應)無需修改即可運行,示例:

@Autowired
private OpenAIAsyncChatClient openAiClient;public String openAICompatQuery() {return openAiClient.chat(Collections.singletonList(new ChatMessage(ChatMessageRole.USER, "推薦一本技術書籍"))).block();
}

在這里插入圖片描述

六、手動配置與低級API使用

若需自定義Bean或繞過自動配置,可手動構建OllamaChatModel

@Configuration
public class OllamaConfig {@Beanpublic OllamaChatModel ollamaChatModel() {OllamaApi ollamaApi = OllamaApi.builder().baseUrl("http://remote-ollama-server:11434").build();return OllamaChatModel.builder().ollamaApi(ollamaApi).defaultOptions(OllamaOptions.builder().model("mistral").temperature(0.6).build()).build();}
}

下面的類圖說明了OllamaApi聊天界面和構建塊:
在這里插入圖片描述

總結

本文全面展示了如何通過Spring AI在Spring Boot中集成Ollama,實現從基礎聊天功能到多模態交互、函數調用的全場景支持。核心優勢包括:

  1. 本地化部署:保障數據隱私,降低網絡延遲;
  2. 靈活配置:通過豐富的參數調優模型行為,適應不同業務場景;
  3. 兼容性強:支持OpenAI API兼容模式,簡化遷移成本;
  4. 生產就緒:提供模型預拉取、資源優化等最佳實踐,確保穩定性。

隨著Ollama持續支持更多模型(如代碼生成模型、多語言模型),結合Spring生態的工程化能力,本地化AI應用將在企業服務、智能客服、數據分析等領域釋放更大價值。未來可進一步探索模型微調、分布式部署等高級場景,構建更強大的智能系統。

參考資料

  • Ollama 官方文檔
  • Spring AI GitHub 倉庫
  • GGUF 模型庫

標簽:#SpringBoot #Ollama #LLM #本地化部署 #智能聊天機器人

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

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

相關文章

查詢oracle進程數和會話數進行優化

查看當前參數配置 首先需要查詢當前的 processes 和 sessions 參數值&#xff0c;以確定是否需要調整。 SQL SHOW PARAMETER processes; SHOW PARAMETER sessions; 這些命令可以顯示當前實例中允許的最大進程數和會話數 查詢當前連接數&#xff0c;查詢并發會話 SELECT COUNT…

頂會新方向:卡爾曼濾波+目標檢測

卡爾曼慮波&#xff0b;目標檢測創新結合&#xff0c;新作準確率突破100%! 一個有前景且好發論文的方向:卡爾曼濾波&#xff0b;目標檢測! 這種創新結合&#xff0c;得到學術界的廣泛認可&#xff0c;多篇成果陸續登上頂會頂刊。例如無人機競速系統 Swift&#xff0c;登上nat…

運維自動化工具 ansible 知識點總結

1.Ansible 基礎 1.1 Ansible簡介 Ansible 是一個開源軟件&#xff0c;提供配置管理和應用程序部署等項目通用的管理功能。它主要運行在類 Unix 系統上&#xff0c;通過特性語言來描述各種資源對象&#xff0c;進而管理類 Unix 系統和 Microsoft Windows 系統等系統資源。 官網…

基于python,html,flask,echart,ids/ips,VMware,mysql,在線sdn防御ddos系統

詳細視頻:【基于python,html,flask,echart,ids/ips,VMware,mysql,在線sdn防御ddos系統-嗶哩嗶哩】 https://b23.tv/azUqQXe

C語言進階--數據的存儲

1.數據類型介紹 內置類型 char //字符數據類型 1字節 short //短整型 2字節 int //整型 4字節 long //長整型 4/8字節 long long //更長的整型 8字節 (C99中引入的) float //單精度浮點數 4字節 double //雙精度浮點數 8字節sizeof(long…

C++學習細節回顧(匯總三)

一.多態概念 同樣是動物叫的?個?為(函數)&#xff0c;傳貓對象過去&#xff0c;就是”(>ω<)喵“&#xff0c;傳狗對象過去&#xff0c;就是"汪汪"。 1.根據對象不同類型&#xff0c;調用不同函數&#xff0c;這就叫做運行時多態(動態多態) 2.編譯時多態(靜態…

SpringAI+MCPServer+MCPClient快速入門

SpringAI MCPServer MCPClient 快速入門編寫大綱 源代碼地址&#xff1a;https://download.csdn.net/download/user_admin_god/90926893 1. 介紹 本文通過使用免費的智普AI的glm-4-flash模型&#xff0c;設計并實現了一個智能問答系統。在該系統中&#xff0c;我們編寫了一…

Linux `vi/vim` 編輯器深度解析與高階應用指南

Linux `vi/vim` 編輯器深度解析與高階應用指南 一、核心功能解析1. 模式系統2. 與主流編輯器對比二、核心操作體系1. 高效導航命令2. 文本操作矩陣三、高階配置體系1. .vimrc 配置示例2. 插件管理系統四、企業級開發實踐1. 代碼編輯技巧2. 宏錄制與批量處理五、可視化與多窗口1…

Java五種方法批量處理List元素全解

Java:如何優雅批量處理List中的每個元素 一、場景分析&#xff1a;為什么需要批量處理List&#xff1f;二、核心方法&#xff1a;五種實現方式對比2.1 普通for循環&#xff08;最直接的方式&#xff09;代碼示例&#xff1a;優缺點&#xff1a; 2.2 Java 8 replaceAll&#xff…

【Elasticsearch】`_refresh`和`_flush`的區別

在Elasticsearch中&#xff0c;_refresh和_flush操作雖然看似都與“刷新”有關&#xff0c;但它們的功能和作用范圍有顯著區別&#xff1a; _refresh操作 - 目的&#xff1a;使索引操作&#xff08;如新增、更新、刪除文檔&#xff09;后的更改能夠立即被搜索到。 - 工作原理…

Java核心數據類型:String深度解析(JDK 8+)

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 問題驅動&#xff1a;從用戶注冊場景說起 場景描述&#xff1a;開發一個用戶注冊功能時&#xff0c;需要處理用戶名的校驗、格式化和存儲。你可能會遇到…

人員睡崗檢測算法AI智能分析網關V4打造工業/安防/交通等多場景應用方案

一、引言? 在工業生產、安防監控等多領域&#xff0c;眾多崗位需員工長時間值守&#xff0c;如流水線工人、監控值班員等。但高強度工作易引發睡崗問題&#xff0c;導致生產效率下降&#xff0c;甚至造成安全事故與財產損失。傳統人工巡檢響應慢、成本高&#xff0c;難以滿足…

自動生成提示技術突破:AUTOPROMPT重塑語言模型應用

AUTOPROMPT 預訓練語言模型的顯著成功促使人們研究這些模型在預訓練期間學習了哪些類型的知識。將任務重新表述為填空題(例如,完形填空測試)是衡量此類知識的自然方法 但是,它的使用受到編寫合適提示所需的手動工作和猜測的限制。為了解決這個問題,我們開發了 AUTOPROMP…

6個月Python學習計劃 Day 7 - 復盤 + 測試日

第一周 Day 1 - Python 基礎入門 & 開發環境搭建 Day 2 - 條件判斷、用戶輸入、格式化輸出 Day 3 - 循環語句 range 函數 Day 4 - 列表 & 元組基礎 Day 5 - 字典&#xff08;dict&#xff09;與集合&#xff08;set&#xff09; Day 6 - 綜合實戰&#xff1a;學生信息…

Pycharm and Flask 的學習心得(9)

request對象&#xff1a; 1. request包含前端發送過來的所有請求數據 將from表單里的內容CV到request里面&#xff0c;可以添加if語句來做判斷出請求類型后的操作 在網頁上的表單上input的數據&#xff0c;后端如何獲取呢&#xff1f; request對象獲取前端發送來的數據 // …

設計模式-依賴倒轉原則

依賴倒轉原則 依賴倒轉原則 (Dependency Inversion Principle, DIP) 是面向對象設計中 SOLID 原則的第五個原則。 它包含兩條核心思想&#xff1a; 高層模塊不應該依賴于低層模塊。兩者都應該依賴于抽象。 高層模塊 (High-level modules): 通常包含復雜的業務邏輯和策略&…

AI賦能引爆短劇全球化風潮,騰訊云媒體處理助力短劇平臺出海吸金

2023年&#xff0c;中國短劇市場以全平臺8000萬日投放、近500億規模的爆發式增長震驚行業。緊湊的內容、爽快的劇情令國內觀眾迅速愛上了幾分鐘一集的微短劇。然而在平臺內卷、監管收緊、巨頭入場等因素的沖擊下&#xff0c;不到兩年時間&#xff0c;這條賽道就已陷入紅海。但與…

開源第三方庫發展現狀

摘要&#xff1a;當前&#xff0c;開源第三方庫生態正呈現爆發式增長趨勢。GitHub 目前已托管超過 4.2 億個代碼倉庫&#xff0c;遠超早期統計的 1 億規模&#xff0c;顯示出開發者社區的活躍度持續攀升。同時&#xff0c;37 個主流包管理器所維護的開源組件數量可能已達到數千…

服務器開機自啟動服務

前言&#xff1a; 將服務器中腳本開啟自啟動執行 步驟&#xff1a; 1.創建一個 systemd 服務文件: /etc/systemd/system/ 目錄下創建一個新的服務文件。例如&#xff0c;命名為 myapp.service&#xff1a; sudo nano /etc/systemd/system/myapp.service2.編寫 [Unit] Descri…

采用Bright Data+n8n+AI打造自動化新聞助手:每天5分鐘實現內容日更

一、引言 在信息爆炸的時代&#xff0c;作為科技領域的內容創作者&#xff0c;我每天都要花費2-3小時手動收集行業新聞、撰寫摘要并發布到各個社群。直到我發現Bright Datan8nAI這套"黃金組合"&#xff0c;才真正實現了從"人工搬運"到"智能自動化&qu…