Spring AI 第二講 之 Chat Model API 第二節Ollama Chat

通過 Ollama,您可以在本地運行各種大型語言模型 (LLM),并從中生成文本。Spring AI 通過 OllamaChatModel 支持 Ollama 文本生成。

先決條件

首先需要在本地計算機上運行 Ollama。請參閱官方 Ollama 項目 README,開始在本地計算機上運行模型。
注意:安裝 ollama 運行 llama3 將下載一個 4.7GB 的模型工件。

添加資源庫和 BOM

Spring AI 工件發布在 Spring Milestone 和 Snapshot 資源庫中。請參閱 "資源庫 "部分,將這些資源庫添加到您的構建系統中。

為了幫助進行依賴性管理,Spring AI 提供了一個 BOM(物料清單),以確保在整個項目中使用一致的 Spring AI 版本。請參閱 "依賴關系管理 "部分,將 Spring AI BOM 添加到構建系統中。

自動配置

Spring AI 為 Ollama 聊天客戶端提供了 Spring Boot 自動配置功能。要啟用它,請在項目的 Maven pom.xml 文件中添加以下依賴項:

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

或 Gradle build.gradle 構建文件。

dependencies {implementation 'org.springframework.ai:spring-ai-ollama-spring-boot-starter'
}

請參閱 "依賴關系管理 "部分,將 Spring AI BOM 添加到構建文件中。

聊天屬性

前綴 spring.ai.ollama 是屬性前綴,用于配置與 Ollama 的連接

PropertyDescriptionDefault

spring.ai.ollama.base-url

Base URL where Ollama API server is running.

localhost:11434

前綴 spring.ai.ollama.chat.options 是配置 Ollama 聊天模型的屬性前綴。它包括 Ollama 請求(高級)參數(如模型、keep-alive 和 format)以及 Ollama 模型選項屬性。

以下是 Ollama 聊天模型的高級請求參數:

PropertyDescriptionDefault

spring.ai.ollama.chat.enabled

啟用 Ollama 聊天模式。

true

spring.ai.ollama.chat.options.model

要使用的支持模型名稱。

mistral

spring.ai.ollama.chat.options.format

返回響應的格式。目前唯一可接受的值是 json

-

spring.ai.ollama.chat.options.keep_alive

控制模型在請求后加載到內存中的停留時間

5m

其余選項屬性基于 Ollama 有效參數和值以及 Ollama 類型。默認值基于 Ollama 類型默認值。

Property

Description

Default

spring.ai.ollama.chat.options.numa

是否使用 NUMA。

false

spring.ai.ollama.chat.options.num-ctx

設置用于生成下一個標記的上下文窗口的大小。

2048

spring.ai.ollama.chat.options.num-batch

512

spring.ai.ollama.chat.options.num-gqa

變壓器層中 GQA 組的數量。某些型號需要,例如 llama2:70b 為 8。

1

spring.ai.ollama.chat.options.num-gpu

要發送到 GPU 的層數。在 macOS 上,默認值為 1 表示啟用金屬支持,0 表示禁用。此處的 1 表示應動態設置 NumGPU

-1

spring.ai.ollama.chat.options.main-gpu

-

spring.ai.ollama.chat.options.low-vram

false

spring.ai.ollama.chat.options.f16-kv

true

spring.ai.ollama.chat.options.logits-all

-

spring.ai.ollama.chat.options.vocab-only

-

spring.ai.ollama.chat.options.use-mmap

true

spring.ai.ollama.chat.options.use-mlock

false

spring.ai.ollama.chat.options.num-thread

設置計算時使用的線程數。默認情況下,Ollama 會檢測線程數以獲得最佳性能。建議將此值設置為系統的物理 CPU 內核數(而不是邏輯內核數)。0 = 由運行時決定

0

spring.ai.ollama.chat.options.num-keep

0

spring.ai.ollama.chat.options.seed

設置生成文本時使用的隨機數種子。將其設置為一個特定的數字將使模型為相同的提示生成相同的文本。

-1

spring.ai.ollama.chat.options.num-predict

生成文本時要預測的最大標記數。(-1 = 無限生成,-2 = 填充上下文)

-1

spring.ai.ollama.chat.options.top-k

降低產生無意義答案的概率。數值越大(如 100),答案就越多樣化,而數值越小(如 10),答案就越保守。

40

spring.ai.ollama.chat.options.top-p

與 top-k 一起使用。較高的值(如 0.95)將產生更多樣化的文本,而較低的值(如 0.5)將產生更集中和保守的文本。

0.9

spring.ai.ollama.chat.options.tfs-z

無尾采樣用于減少輸出中可能性較低的標記的影響。數值越大(例如 2.0),影響越小,而數值為 1.0 時,則會禁用此設置。

1.0

spring.ai.ollama.chat.options.typical-p

1.0

spring.ai.ollama.chat.options.repeat-last-n

設置模型回溯多遠以防止重復。(默認值:64,0 = 禁用,-1 = num_ctx)

64

spring.ai.ollama.chat.options.temperature

模型的溫度。溫度越高,模型的答案越有創意。

0.8

spring.ai.ollama.chat.options.repeat-penalty

設置對重復的懲罰力度。數值越大(如 1.5),對重復的懲罰力度就越大,而數值越小(如 0.9),懲罰力度就越寬松。

1.1

spring.ai.ollama.chat.options.presence-penalty

0.0

spring.ai.ollama.chat.options.frequency-penalty

0.0

spring.ai.ollama.chat.options.mirostat

啟用 Mirostat 采樣以控制復雜度。(默認值:0,0 = 禁用,1 = Mirostat,2 = Mirostat 2.0)

0

spring.ai.ollama.chat.options.mirostat-tau

控制輸出的連貫性和多樣性之間的平衡。數值越小,文字越集中、連貫。

5.0

spring.ai.ollama.chat.options.mirostat-eta

影響算法對生成文本的反饋做出反應的速度。學習率越低,算法的調整速度就越慢,而學習率越高,算法的反應速度就越快。

0.1

spring.ai.ollama.chat.options.penalize-newline

true

spring.ai.ollama.chat.options.stop

設置要使用的停止序列。遇到這種模式時,LLM 將停止生成文本并返回。可以通過在模型文件中指定多個單獨的停止參數來設置多個停止模式。

-

所有以 spring.ai.ollama.chat.options 為前綴的屬性都可以通過在提示調用中添加特定于請求的運行時選項在運行時重寫。

運行時選項

OllamaOptions.java 提供了模型配置,如要使用的模型、溫度等。
啟動時,可使用 OllamaChatModel(api, options) 構造函數或 spring.ai.ollama.chat.options.* 屬性配置默認選項。
在運行時,您可以通過在提示調用中添加新的、針對特定請求的選項來覆蓋默認選項。例如,覆蓋特定請求的默認模型和溫度:

ChatResponse response = chatModel.call(new Prompt("Generate the names of 5 famous pirates.",OllamaOptions.create().withModel("llama2").withTemperature(0.4)));

除了特定于模型的 OllamaOptions 外,您還可以使用通過 ChatOptionsBuilder#builder()創建的便攜式 ChatOptions 實例。

多模型

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

目前,LLaVa 和 bakllava?Ollama 模型提供多模態支持。更多詳情,請參閱 LLaVA:大型語言和視覺助手。

Ollama 消息 API 提供了一個 "圖像 "參數,用于將 base64 編碼的圖像列表與消息結合在一起。

Spring AI 的消息通過引入 "媒體"(Media)類型,為多模態 AI 模型提供了便利。該類型包含有關消息中媒體附件的數據和詳細信息,利用 Spring 的 org.springframework.util.MimeType 和 java.lang.Object 來處理原始媒體數據。

下面是從 OllamaChatModelMultimodalIT.java 中摘錄的一個直接代碼示例,說明了用戶文本與圖片的融合。

byte[] imageData = new ClassPathResource("/multimodal.test.png").getContentAsByteArray();var userMessage = new UserMessage("Explain what do you see on this picture?",List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), OllamaOptions.create().withModel("llava")));logger.info(response.getResult().getOutput().getContent());

它的輸入是 multimodal.test.png 圖像:

以及文本信息 "解釋一下您在這張圖片上看到了什么?

圖片展示了一個小金屬籃子,里面裝滿了成熟的香蕉和紅蘋果。籃子放在一個平面上、
這似乎是一張桌子或臺面,因為背景中隱約可見一個廚房櫥柜或抽屜。
背景。籃子后面還有一個金色的圓環,這可能表明這張照片是在有金屬的地方拍攝的。
這張照片是在一個有金屬裝飾或裝置的地方拍攝的。從整體環境來看,這是一個家庭環境
擺放水果,可能是為了方便或美觀。

示例Controller

創建一個新的 Spring Boot 項目,并將 spring-ai-ollama-spring-boot-starter 添加到你的 pom(或 gradle)依賴項中。
在 src/main/resources 目錄下添加 application.properties 文件,以啟用和配置 Ollama 聊天模型:

spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.options.model=mistral
spring.ai.ollama.chat.options.temperature=0.7

將 base-url 替換為您的 Ollama 服務器 URL。

這將創建一個 OllamaChatModel 實現,您可以將其注入到您的類中。下面是一個使用聊天模型生成文本的簡單 @Controller 類的示例。

@RestController
public class ChatController {private final OllamaChatModel chatModel;@Autowiredpublic ChatController(OllamaChatModel chatModel) {this.chatModel = chatModel;}@GetMapping("/ai/generate")public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {return Map.of("generation", chatModel.call(message));}@GetMapping("/ai/generateStream")public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {Prompt prompt = new Prompt(new UserMessage(message));return chatModel.stream(prompt);}}

手動配置

如果不想使用 Spring Boot 自動配置,可以在應用程序中手動配置 OllamaChatModel。OllamaChatModel 實現了 ChatModel 和 StreamingChatModel,并使用底層 OllamaApi Client 連接到 Ollama 服務。
要使用它,請在項目的 Maven pom.xml 文件中添加 Spring-ai-ollama 依賴關系:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama</artifactId>
</dependency>

?或 Gradle build.gradle 構建文件。

dependencies {implementation 'org.springframework.ai:spring-ai-ollama'
}

請參閱 "依賴關系管理 "部分,將 Spring AI BOM 添加到構建文件中。

Spring-ai-ollama 依賴關系還提供對 OllamaEmbeddingModel 的訪問。有關 OllamaEmbeddingModel 的更多信息,請參閱 Ollama Embedding Client 部分。

接下來,創建一個 OllamaChatModel 實例,并用它來發送文本生成請求:

var ollamaApi = new OllamaApi();var chatModel = new OllamaChatModel(ollamaApi,OllamaOptions.create().withModel(OllamaOptions.DEFAULT_MODEL).withTemperature(0.9f));ChatResponse response = chatModel.call(new Prompt("Generate the names of 5 famous pirates."));// Or with streaming responses
Flux<ChatResponse> response = chatModel.stream(new Prompt("Generate the names of 5 famous pirates."));

OllamaOptions 為所有聊天請求提供配置信息。

Low-level OllamaApi 客戶端

OllamaApi為 Ollama 聊天完成 API Ollama 聊天完成 API 提供了一個輕量級 Java 客戶端。
以下類圖說明了 OllamaApi 聊天接口和構建模塊:

下面是一個簡單的片段,展示了如何以編程方式使用 API:

OllamaApi 是低級應用程序接口,不建議直接使用。請使用 OllamaChatModel。

OllamaApi ollamaApi =new OllamaApi("YOUR_HOST:YOUR_PORT");// Sync request
var request = ChatRequest.builder("orca-mini").withStream(false) // not streaming.withMessages(List.of(Message.builder(Role.SYSTEM).withContent("You are a geography teacher. You are talking to a student.").build(),Message.builder(Role.USER).withContent("What is the capital of Bulgaria and what is the size? "+ "What is the national anthem?").build())).withOptions(OllamaOptions.create().withTemperature(0.9f)).build();ChatResponse response = ollamaApi.chat(request);// Streaming request
var request2 = ChatRequest.builder("orca-mini").withStream(true) // streaming.withMessages(List.of(Message.builder(Role.USER).withContent("What is the capital of Bulgaria and what is the size? " + "What is the national anthem?").build())).withOptions(OllamaOptions.create().withTemperature(0.9f).toMap()).build();Flux<ChatResponse> streamingResponse = ollamaApi.streamingChat(request2);

下節:Spring AI 第二講 之 Chat Model API 第三節Azure OpenAI Chat

代碼講解后續補充

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

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

相關文章

curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL

source ~/.bash_profile flutter clean Command exited with code 128: git fetch --tags Standard error: 錯誤&#xff1a;RPC 失敗。curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8) 錯誤&#xff1a;預期仍然需要 2737 個字節的正文 fetch-pack: unexpec…

GPT革命:AI如何重塑我們的未來!

GPT革命&#xff1a;AI如何重塑我們的未來&#xff01; &#x1f604;生命不息&#xff0c;寫作不止 &#x1f525; 繼續踏上學習之路&#xff0c;學之分享筆記 &#x1f44a; 總有一天我也能像各位大佬一樣 &#x1f3c6; 博客首頁 怒放吧德德 To記錄領地 &#x1f31d;分享…

普通人也能弄的 16 個AI搞錢副業,門檻低,易上手!

大家好&#xff0c;我是靈魂畫師向陽 本期給大家分享的是利用AI 做副業的一些方法&#xff0c;大家可以挑選適合自己的賽道去搞錢 現在是人工智能時代&#xff0c;利用好AI 工具&#xff0c;可以降低普通人做副業的門檻&#xff0c;同時也能提高工作效率&#xff0c; 因此AI …

【微機原理與匯編語言】循環程序設計

一、實驗目的 1.熟練掌握8086/8088常用匯編指令的使用方法 2.熟練掌握循環結構程序編程技巧 3.熟練掌握匯編語言程序運行調試方法 二、實驗要求 認真分析實驗題目&#xff0c;設計程序流程圖&#xff0c;獨立完成代碼編寫及運行調試。 三、實驗題目 給出不大于255的十個…

圖片裁剪與上傳處理方案 —— 基于阿里云 OSS 處理用戶資料

目錄 01: 通用組件&#xff1a;input 構建方案分析 02: 通用組件&#xff1a;input 構建方案 03: 構建用戶資料基礎樣式 04: 用戶基本資料修改方案 05: 處理不保存時的同步問題 06: 頭像修改方案流程分析 07: 通用組件&#xff1a;Dialog 構建方案分析 08: 通用組件&…

計算機組成原理·考點知識點整理

根據往年考試題&#xff0c;對考點和知識點的一個整理。 校驗編碼 碼距 一種編碼的最小碼距&#xff0c;其實就是指這種編碼的碼距。碼距有兩種定義&#xff1a; 碼距所描述的對象含義 2 2 2 個特定的碼其二進制表示中不同位的個數一種編碼這種編碼中任意 2 2 2 個合法編碼的…

【linux進程控制(三)】進程程序替換--如何自己實現一個bash解釋器?

&#x1f493;博主CSDN主頁:杭電碼農-NEO&#x1f493; ? ?專欄分類:Linux從入門到精通? ? &#x1f69a;代碼倉庫:NEO的學習日記&#x1f69a; ? &#x1f339;關注我&#x1faf5;帶你學更多操作系統知識 ? &#x1f51d;&#x1f51d; 進程程序替換 1. 前言2. exec…

【JMeter接口自動化】第8講 Fiddler抓包Jmeter

1&#xff09;配置好Fiddler 設置Fiddler-Tools-Options-HTTPS 設置Fiddler-Tools-Options-Connections&#xff0c;設置端口為8888 2&#xff09;查看IP 在CMD中輸入ipconfig 查看IP地址 3&#xff09;配置Jmeter Http請求——基本&#xff0c;設置Http請求&#xff0c;使用…

輕量管理內核復雜級別的項目

在嵌入式開發中&#xff0c;管理大型項目&#xff08;例如Linux內核&#xff09;往往是一個復雜的過程。常規的版本控制系統如Git在處理小型項目時非常高效&#xff0c;但面對龐大的代碼庫時可能會顯得笨重且占用大量存儲空間。本文將介紹幾種輕量級的方法來管理內核級別的項目…

Python 快速入門

1. 語言基礎 1.1 數據類型與變量 Python 是一門動態類型語言&#xff0c;這意味著你不需要顯式聲明變量的類型。Python 解釋器會根據你賦予變量的值自動推斷其類型。這使得 Python 代碼簡潔易懂&#xff0c;但同時也需要注意一些潛在的問題。 1.1.1 Python 數據類型概述 Py…

408鏈表的創建和初始化

首先第一個頭文件&#xff0c;定義結構體類型 typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //可能作為第一次寫c語言的小伙伴看不懂這一段typedef是如何定義的 //基本的解釋如下所示 //typedef struct LNode LNode; //typedef struct LNode* LinkL…

apex代碼發送郵件時進行抄送

在 Salesforce 中使用 Apex 代碼發送電子郵件時&#xff0c;可以通過 ccAddresses 屬性來添加抄送&#xff08;CC&#xff09;收件人。以下是一個示例代碼&#xff0c;展示了如何使用 Messaging.SingleEmailMessage 類來發送帶有抄送的電子郵件。 示例代碼 public class Emai…

北航數據結構與程序設計第四次作業選填題復習

首先都是線性的&#xff0c;線性包括順序和鏈式&#xff0c;棧和隊都可以用兩種方式實現。棧只能存于棧頂取于棧頂&#xff0c;隊列先進先出&#xff0c;因此存取點是固定的。 函數棧幀創建原理 畫圖即可。 A.顯然不行&#xff0c;5如果第一個出來說明5是最后一個進的&#xf…

Lambda表達式與函數式工具在Python中的應用詳解

目錄 一、引言 二、Lambda表達式 Lambda表達式的定義 Lambda表達式的使用場景 Lambda表達式的示例 三、函數式工具 map()函數 filter()函數 reduce()函數 itertools模塊 functools模塊 四、Lambda表達式與函數式工具的結合使用 五、Lambda表達式與函數式工具的注意…

C語言面試題(拓展)

1、字符串中獲取最長無重復字符子串。 要在字符串中找到最長的無重復字符的子串&#xff0c;可以使用滑動窗口技術。滑動窗口通過兩個指針來表示當前窗口的起始和結束位置&#xff0c;并且維護一個哈希表來記錄字符及其最后出現的位置&#xff0c;以此來確保字符不重復。 以下…

【云嵐家政】-day00-開發環境配置

文章目錄 1 開發工具版本2 IDEA環境配置2.1 編碼配置2.2 自動導包設置2.3 提示忽略大小寫2.4 設置 Java 編譯級別 3 Maven環境3.1 安裝Maven3.2 配置倉庫3.3 IDEA中配置maven 4 配置虛擬機4.1 導入虛擬機4.2 問題 5 配置數據庫環境5.1 啟動mysql容器5.2 使用MySQL客戶端連接數據…

Java Socket 網絡編程實例(阻塞IO、非阻塞IO、多路復用Selector、AIO)

文章目錄 1. 概述2. TCP 阻塞式IO 網絡編程實例2.1 TCP網絡編程服務端2.2 ByteBufferUtil2.3 客戶端代碼2.4 運行截圖 3. TCP 非阻塞式IO 網絡編程實例3.1 服務端3.2 客戶端3.3 運行截圖 4. 多路復用4.1 服務器端4.2 客戶端4.3 運行截圖 5. AIO5.1 AIO 服務端5.2 客戶端5.3 運行…

C++筆試強訓day39

目錄 1.神奇的字母&#xff08;二&#xff09; 2.字符編碼 3.最少的完全平方數 1.神奇的字母&#xff08;二&#xff09; 鏈接https://ac.nowcoder.com/acm/problem/205832 看輸出描述即可知輸出次數最多的那個字母即可。 哈希表直接秒了&#xff1a; #include <iostre…

一維時間序列突變檢測方法(小波等,MATLAB R2021B)

信號的突變點檢測問題是指在生產實踐中&#xff0c;反映各種系統工作狀態的信號&#xff0c;可能因為受到不同類型的噪聲或外界干擾而發生了信號突變&#xff0c;導致嚴重失真的信號出現&#xff0c;因此必須探測突變出現的起點和終點。研究目的在于設計出檢測方案&#xff0c;…

CPU內部結構窺探·「2」

從一條匯編加法指令出發&#xff0c;分析cpu內部發生了什么&#xff1f; 本文將詳細剖析ARMv8架構中加法指令的執行過程&#xff0c;深入理解其在CPU上的運行機制。 ARMv8匯編基礎 在ARMv8匯編語言中&#xff0c;加法指令ADD的基本格式如下&#xff1a; ADD destination, s…