Spring Boot 集成 Ollama API 使用總結

Spring Boot 中集成 Ollama API 的完整指南,涵蓋基礎配置、API 調用、性能優化及常見問題解決。


一、環境準備

1. 依賴配置

pom.xml 中添加必要的依賴:

<!-- Spring Web (用于 REST 請求) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- Jackson (JSON 序列化/反序列化) -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency><!-- 可選:WebClient (異步非阻塞請求) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2. 配置 Ollama 服務地址

application.properties 中配置 Ollama 服務地址:

# Ollama 默認端口為 11434
ollama.api.url=http://localhost:11434/api

二、基礎 API 調用

1. 同步請求(使用 RestTemplate)

創建 Service 類調用 Ollama 生成接口:

@Service
public class OllamaService {@Value("${ollama.api.url}")private String ollamaApiUrl;private final RestTemplate restTemplate = new RestTemplate();public String generateText(String model, String prompt) {String url = ollamaApiUrl + "/generate";// 構建請求體Map<String, Object> requestBody = new HashMap<>();requestBody.put("model", model);requestBody.put("prompt", prompt);requestBody.put("stream", false); // 關閉流式響應// 發送 POST 請求ResponseEntity<Map> response = restTemplate.postForEntity(url,requestBody,Map.class);// 解析響應return (String) response.getBody().get("response");}
}
2. 異步請求(使用 WebClient)

配置 WebClient 實現非阻塞調用:

@Configuration
public class WebClientConfig {@Value("${ollama.api.url}")private String ollamaApiUrl;@Beanpublic WebClient ollamaWebClient() {return WebClient.builder().baseUrl(ollamaApiUrl).build();}
}// 調用示例
@Service
public class AsyncOllamaService {@Autowiredprivate WebClient ollamaWebClient;public Mono<String> generateTextAsync(String model, String prompt) {return ollamaWebClient.post().uri("/generate").bodyValue(Map.of("model", model,"prompt", prompt,"stream", false)).retrieve().bodyToMono(Map.class).map(response -> (String) response.get("response"));}
}

三、高級功能集成

1. 流式響應處理

處理 Ollama 的流式輸出(逐塊返回結果):

public Flux<String> streamText(String model, String prompt) {return ollamaWebClient.post().uri("/generate").bodyValue(Map.of("model", model,"prompt", prompt,"stream", true  // 啟用流式響應)).retrieve().bodyToFlux(String.class)  // 按字符串塊接收.map(chunk -> {// 解析 JSON 塊(需處理不完整 JSON 情況)try {JsonNode node = new ObjectMapper().readTree(chunk);return node.get("response").asText();} catch (JsonProcessingException e) {return "[解析錯誤]";}});
}
2. 集成 LangChain

結合 LangChain 的 Spring Boot Starter(需添加依賴):

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId><version>0.8.0</version>
</dependency>

配置 application.properties

spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.model=llama3

直接在代碼中調用:

@Autowired
private OllamaChatClient chatClient;public String chat(String message) {return chatClient.call(message);
}

四、性能調優

1. 連接池優化

為同步請求(RestTemplate)配置連接池:

@Bean
public RestTemplate restTemplate() {PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(100); // 最大連接數connectionManager.setDefaultMaxPerRoute(20); // 單路由最大連接數CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));
}
2. 超時設置

配置請求超時時間(避免阻塞):

// RestTemplate 超時配置
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(5000); // 5秒連接超時
factory.setReadTimeout(30000);    // 30秒讀取超時
return new RestTemplate(factory);

五、異常處理

1. 自定義異常類
public class OllamaApiException extends RuntimeException {public OllamaApiException(String message) {super("Ollama API 調用失敗: " + message);}
}
2. 全局異常攔截
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(RestClientException.class)public ResponseEntity<String> handleOllamaError(RestClientException e) {return ResponseEntity.status(500).body("Ollama 服務異常: " + e.getMessage());}
}

六、安全增強

1. 添加 API 密鑰認證

如果 Ollama 服務啟用認證(需手動配置):

// 在請求頭中添加密鑰
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer your-api-key");HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
restTemplate.postForEntity(url, requestEntity, Map.class);
2. 啟用 HTTPS

在 Ollama 服務端配置 HTTPS,Spring Boot 中調用時使用 https:// 地址。


七、測試驗證

1. 單元測試示例
@SpringBootTest
public class OllamaServiceTest {@Autowiredprivate OllamaService ollamaService;@Testvoid testGenerateText() {String response = ollamaService.generateText("llama3", "你好");assertNotNull(response);System.out.println("Ollama 響應: " + response);}
}

八、總結

  • 核心步驟

    1. 添加依賴并配置 Ollama 服務地址。
    2. 使用 RestTemplateWebClient 調用 API。
    3. 處理流式響應和異常。
    4. 優化連接池和超時設置。
  • 推薦實踐

    • 生產環境中啟用 HTTPS 和 API 密鑰認證。
    • 使用異步請求(WebClient)提升并發性能。
    • 結合 LangChain 簡化復雜 AI 任務開發。

完整代碼示例可參考 GitHub 示例倉庫。

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

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

相關文章

SimVG論文精讀

1. 數據集和任務部分 SimVG用的六個數據集&#xff1a;RefCOCO//g, ReferIt, Flickr30K, and GRefCOCO 數據集名稱圖像數量參照表達式數量參照對象實例數語言特性主要任務RefCOCO19,994142,20950,000?基于 MS COCO 圖像&#xff0c;采用 ReferItGame 收集的指代表達數據集。…

VS中回顯109:對‘pthread_create’未定義的引用

VS中解決 用VS2022寫多線性程時需要使用pthread_create()用于創建線程,即使項目里加了所需要的頭文件#include <pthread.h>但編譯卻報對pthread_create未定義的引用的錯誤,這是因為沒有包含所需要的庫 項目右擊屬性 在庫依賴項中添加 pthread Ubuntu中解決 在Ubuntu中…

kotlin與MVVM結合使用總結(一)

一、Kotlin 與 MVVM 結合的核心優勢 代碼簡潔性 數據類&#xff08;data class&#xff09;簡化 Model 層定義&#xff0c;自動生成equals/hashCode/toString擴展函數簡化 View 層邏輯&#xff08;如點擊事件擴展&#xff09;lateinit/by lazy優化 ViewModel 屬性初始化 異步處…

視頻分析設備平臺EasyCVR安防視頻小知識:安防監控常見故障精準排查方法

隨著安防監控技術的飛速發展&#xff0c;監控系統已經成為現代安防體系中不可或缺的核心組成部分&#xff0c;廣泛應用于安防監控、交通管理、工業自動化等多個領域。然而&#xff0c;監控系統的穩定運行高度依賴于設備的正確配置、線路的可靠連接以及電源的穩定供電。在實際應…

【DeepSeek 學習推理】Llumnix: Dynamic Scheduling for Large Language Model Serving實驗部分

6.1 實驗設置 測試平臺。我們使用阿里云上的16-GPU集群&#xff08;包含4個GPU虛擬機&#xff0c;類型為ecs.gn7i-c32g1.32xlarge&#xff09;。每臺虛擬機配備4個NVIDIA A10&#xff08;24 GB&#xff09;GPU&#xff08;通過PCI-e 4.0連接&#xff09;、128個vCPU、752 GB內…

如何利用深度學習進行交通流量預測與疏導

傳統的交通管理方法&#xff0c;諸如固定的信號燈配時方案、基于經驗的警力部署等&#xff0c;在面對現代城市如此復雜多變的交通狀況時&#xff0c;已然顯得捉襟見肘&#xff0c;難以滿足高效交通管理的需求。 在此背景下&#xff0c;準確的交通流量預測便成為了破解交通擁堵難…

LSTM-GAN生成數據技術

1. 項目概述 本項目利用生成對抗網絡&#xff08;GAN&#xff09;技術來填補時間序列數據中的缺失值。項目實現了兩種不同的GAN模型&#xff1a;基于LSTM的GAN&#xff08;LSTM-GAN&#xff09;和基于多層感知機的GAN&#xff08;MLP-GAN&#xff09;&#xff0c;并對兩種模型…

CMake 入門指南:從零開始配置你的第一個項目

目錄 一、CMake 是什么&#xff0c;為什么要使用 CMake 二、CMakeLists.txt 文件結構與簡單示例 三、進階的CMake 四、靜態庫與動態庫生成及其使用 五、注釋的語法 六、 set、list、message 三個常用的 CMake 函數與命令 七、CMake 的控制語句以及自定義宏/函數 八、為S…

多線程出bug不知道如何調試?java線程幾種常見狀態

當你的多線程代碼結構很復雜的時候很難找出bug的原因所在&#xff0c;此時我們可以使用getState()方法獲取該線程當前的狀態&#xff0c;通過觀察其狀態是阻塞了還是因為沒有啟動等原因導致的。 狀態描述NEW安排了工作&#xff0c;還未開始行動RUNNABLE可工作的&#xff0c;又…

Spark(20)spark和Hadoop的區別

Apache Spark 和 Apache Hadoop 都是廣泛使用的開源大數據處理框架&#xff0c;但它們在設計理念、架構、性能和適用場景等方面存在顯著區別。以下是它們的主要區別&#xff1a; ### **1. 架構設計** - **Hadoop**&#xff1a; - **HDFS&#xff08;Hadoop Distributed File…

【redis】哨兵模式

Redis主從模式雖然支持數據備份與讀寫分離&#xff0c;但存在三大核心缺陷&#xff1a;1. 故障切換依賴人工&#xff08;主節點宕機需手動提升從節點&#xff09;&#xff1b;2. 監控能力缺失&#xff08;無法自動檢測節點異常&#xff09;&#xff1b;3. 腦裂風險&#xff08;…

Spark-Streaming

找出所有有效數據&#xff0c;要求電話號碼為11位&#xff0c;但只要列中沒有空值就算有效數據。 按地址分類&#xff0c;輸出條數最多的前20個地址及其數據。 代碼講解&#xff1a; 導包和聲明對象&#xff0c;設置Spark配置對象和SparkContext對象。 使用Spark SQL語言進行數…

Sentinel源碼—9.限流算法的實現對比一

大綱 1.漏桶算法的實現對比 (1)普通思路的漏桶算法實現 (2)節省線程的漏桶算法實現 (3)Sentinel中的漏桶算法實現 (4)Sentinel中的漏桶算法與普通漏桶算法的區別 (5)Sentinel中的漏桶算法存在的問題 2.令牌桶算法的實現對比 (1)普通思路的令牌桶算法實現 (2)節省線程的…

Redis 詳解:安裝、數據類型、事務、配置、持久化、訂閱/發布、主從復制、哨兵機制、緩存

目錄 Redis 安裝與數據類型 安裝指南 Windows Linux 性能測試 基本知識 數據類型 String List&#xff08;雙向列表&#xff09; Set&#xff08;集合&#xff09; Hash&#xff08;哈希&#xff09; Zset&#xff08;有序集合&#xff09; 高級功能 地理位置&am…

Docker配置帶證書的遠程訪問監聽

一、生成證書和密鑰 1、準備證書目錄和生成CA證書 # 創建證書目錄 mkdir -p /etc/docker/tls cd /etc/docker/tls # 生成CA密鑰和證書 openssl req -x509 -newkey rsa:4096 -keyout ca-key.pem \ -out ca-cert.pem -days 365 -nodes -subj "/CNDocker CA" 2、為…

MCP接入方式介紹

上一篇文章&#xff0c;我們介紹了MCP是什么以及MCP的使用。 MCP是什么&#xff0c;MCP的使用 接下來&#xff0c;我們來詳細介紹一下MCP的接入 先看官網的架構圖 上圖的MCP 服務 A、MCP 服務 B、MCP 服務 C是可以運行在你的本地計算機&#xff08;本地服務器方式&#xff…

關于Agent的簡單構建和分享

前言&#xff1a;Agent 具備自主性、環境感知能力和決策執行能力&#xff0c;能夠根據環境的變化自動調整行為&#xff0c;以實現特定的目標。 一、Agent 的原理 Agent(智能體)被提出時&#xff0c;具有四大能力 感知、分析、決策和執行。是一種能夠在特定環境中自主行動、感…

Gitlab runner 安裝和注冊

Gitlab Runner GitLab Runner是一個用于運行GitLab CI/CD流水線作業的軟件包&#xff0c;由GitLab官方開發&#xff0c;完全開源。你可以在很多主流的系統環境或平臺上安裝它&#xff0c;如Linux、macOS、Windows和Kubernetes。如果你熟悉Jenkins 的話&#xff0c;你可以把它…

精益數據分析(18/126):權衡數據運用,精準把握創業方向

精益數據分析&#xff08;18/126&#xff09;&#xff1a;權衡數據運用&#xff0c;精準把握創業方向 大家好&#xff01;一直以來&#xff0c;我都希望能和大家在創業與數據分析的領域共同探索、共同進步。今天&#xff0c;我們繼續深入研讀《精益數據分析》&#xff0c;探討…

Git技術詳解:從核心原理到實際應用

Git技術詳解&#xff1a;從核心原理到實際應用 一、Git的本質與核心價值 Git是由Linux之父Linus Torvalds在2005年開發的分布式版本控制系統&#xff0c;其核心功能是通過記錄文件變更歷史&#xff0c;幫助開發者實現以下目標&#xff1a; 版本回溯&#xff1a;隨時恢復到項…