Ollama 嵌入
前提條件
首先,你需要能夠訪問一個 Ollama 例項。有幾種選項,包括以下幾種:
-
透過 Kubernetes 服務繫結 連線到 Ollama 例項。
你可以從 Ollama 模型庫 中拉取你想在應用中使用的模型
ollama pull <model-name>
你也可以拉取數千個免費的 GGUF Hugging Face 模型中的任何一個
ollama pull hf.co/<username>/<model-repository>
或者,你可以啟用自動下載所需模型的選項:自動拉取模型。
自動配置
Spring AI 自動配置、starter 模組的 artifact 名稱發生了重大變化。有關詳細資訊,請參閱升級說明。 |
Spring AI 為 Ollama 嵌入模型提供了 Spring Boot 自動配置。要啟用它,請將以下依賴項新增到你的 Maven pom.xml
或 Gradle build.gradle
構建檔案中
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-ollama'
}
請參閱依賴管理部分,將 Spring AI BOM 新增到你的構建檔案中。Spring AI artifact 釋出在 Maven Central 和 Spring Snapshot 倉庫中。請參閱倉庫部分,將這些倉庫新增到你的構建系統中。 |
基礎屬性
spring.ai.ollama
字首是配置連線到 Ollama 的屬性字首
屬性 |
描述 |
預設值 |
spring.ai.ollama.base-url |
Ollama API 伺服器執行的基礎 URL。 |
以下是初始化 Ollama 整合和自動拉取模型的屬性。
屬性 |
描述 |
預設值 |
spring.ai.ollama.init.pull-model-strategy |
是否在啟動時拉取模型以及如何拉取。 |
|
spring.ai.ollama.init.timeout |
等待模型拉取的時間。 |
|
spring.ai.ollama.init.max-retries |
模型拉取操作的最大重試次數。 |
|
spring.ai.ollama.init.embedding.include |
在初始化任務中包含這種型別的模型。 |
|
spring.ai.ollama.init.embedding.additional-models |
除了透過預設屬性配置的模型之外,要初始化的其他模型。 |
|
嵌入屬性
嵌入自動配置的啟用和停用現在透過字首為 要啟用,設定 要停用,設定 進行此更改是為了允許配置多個模型。 |
spring.ai.ollama.embedding.options
字首是配置 Ollama 嵌入模型的屬性字首。它包括 Ollama 請求(高階)引數,例如 model
、keep-alive
和 truncate
,以及 Ollama 模型 options
屬性。
以下是 Ollama 嵌入模型的高階請求引數:
屬性 |
描述 |
預設值 |
spring.ai.ollama.embedding.enabled (已移除且不再有效) |
啟用 Ollama 嵌入模型的自動配置。 |
true |
spring.ai.model.embedding |
啟用 Ollama 嵌入模型的自動配置。 |
ollama |
spring.ai.ollama.embedding.options.model |
mistral |
|
spring.ai.ollama.embedding.options.keep_alive |
控制模型在請求後在記憶體中駐留的時間。 |
5m |
spring.ai.ollama.embedding.options.truncate |
截斷每個輸入的末尾以適應上下文長度。如果為 false 且超出上下文長度,則返回錯誤。 |
true |
剩餘的 options
屬性基於 Ollama 有效引數和值 以及 Ollama 型別。預設值基於:Ollama 型別預設值。
屬性 |
描述 |
預設值 |
spring.ai.ollama.embedding.options.numa |
是否使用 NUMA。 |
false |
spring.ai.ollama.embedding.options.num-ctx |
設定用於生成下一個 token 的上下文視窗大小。 |
2048 |
spring.ai.ollama.embedding.options.num-batch |
提示處理最大批次大小。 |
512 |
spring.ai.ollama.embedding.options.num-gpu |
傳送到 GPU 的層數。在 macOS 上,預設為 1 以啟用 metal 支援,0 以停用。這裡的 1 表示 NumGPU 應動態設定 |
-1 |
spring.ai.ollama.embedding.options.main-gpu |
當使用多個 GPU 時,此選項控制用於小張量的 GPU,對於這些小張量,將計算拆分到所有 GPU 上的開銷不值得。該 GPU 將使用稍微更多的 VRAM 來儲存臨時結果的暫存緩衝區。 |
0 |
spring.ai.ollama.embedding.options.low-vram |
- |
false |
spring.ai.ollama.embedding.options.f16-kv |
- |
true |
spring.ai.ollama.embedding.options.logits-all |
返回所有 token 的 logits,而不僅僅是最後一個。要使 completions 返回 logprobs,此值必須為 true。 |
- |
spring.ai.ollama.embedding.options.vocab-only |
僅載入詞彙表,不載入權重。 |
- |
spring.ai.ollama.embedding.options.use-mmap |
預設情況下,模型會被對映到記憶體中,這使得系統可以按需載入模型的必要部分。但是,如果模型大於你的總 RAM 或系統可用記憶體較低,使用 mmap 可能會增加頁面換出的風險,從而對效能產生負面影響。停用 mmap 會導致載入時間變慢,但如果你不使用 mlock,可能會減少頁面換出。請注意,如果模型大於總 RAM,關閉 mmap 將導致模型根本無法載入。 |
null |
spring.ai.ollama.embedding.options.use-mlock |
將模型鎖定在記憶體中,防止在記憶體對映時被換出。這可以提高效能,但需要更多 RAM 來執行,並且可能隨著模型載入到 RAM 而減慢載入時間,從而犧牲了記憶體對映的一些優勢。 |
false |
spring.ai.ollama.embedding.options.num-thread |
設定計算期間使用的執行緒數。預設情況下,Ollama 會檢測以獲得最佳效能。建議將此值設定為系統物理 CPU 核心數(而不是邏輯核心數)。0 = 讓執行時決定 |
0 |
spring.ai.ollama.embedding.options.num-keep |
- |
4 |
spring.ai.ollama.embedding.options.seed |
設定用於生成文字的隨機數種子。將其設定為特定數字將使模型為相同的提示生成相同的文字。 |
-1 |
spring.ai.ollama.embedding.options.num-predict |
生成文字時預測的最大 token 數。(-1 = 無限生成,-2 = 填充上下文) |
-1 |
spring.ai.ollama.embedding.options.top-k |
降低生成無意義內容的機率。較高的值(例如 100)將產生更多樣的回答,而較低的值(例如 10)將更保守。 |
40 |
spring.ai.ollama.embedding.options.top-p |
與 top-k 協同工作。較高的值(例如 0.95)將產生更多樣化的文字,而較低的值(例如 0.5)將生成更集中和保守的文字。 |
0.9 |
spring.ai.ollama.embedding.options.min-p |
作為 top_p 的替代方案,旨在確保質量和多樣性之間的平衡。引數 p 表示 token 被考慮的最低機率,相對於最有可能的 token 的機率。例如,當 p=0.05 且最有可能的 token 的機率為 0.9 時,值小於 0.045 的 logits 將被過濾掉。 |
0.0 |
spring.ai.ollama.embedding.options.tfs-z |
無尾取樣用於減少輸出中機率較低的 token 的影響。較高的值(例如 2.0)會更多地減少影響,而值為 1.0 則停用此設定。 |
1.0 |
spring.ai.ollama.embedding.options.typical-p |
- |
1.0 |
spring.ai.ollama.embedding.options.repeat-last-n |
設定模型回溯多遠以防止重複。(預設值:64,0 = 停用,-1 = num_ctx) |
64 |
spring.ai.ollama.embedding.options.temperature |
模型的溫度。提高溫度將使模型回答更具創造性。 |
0.8 |
spring.ai.ollama.embedding.options.repeat-penalty |
設定重複懲罰的強度。較高的值(例如 1.5)會更強地懲罰重複,而較低的值(例如 0.9)則更寬鬆。 |
1.1 |
spring.ai.ollama.embedding.options.presence-penalty |
- |
0.0 |
spring.ai.ollama.embedding.options.frequency-penalty |
- |
0.0 |
spring.ai.ollama.embedding.options.mirostat |
啟用 Mirostat 取樣來控制困惑度。(預設值:0,0 = 停用,1 = Mirostat,2 = Mirostat 2.0) |
0 |
spring.ai.ollama.embedding.options.mirostat-tau |
控制輸出的連貫性和多樣性之間的平衡。較低的值將導致更集中和連貫的文字。 |
5.0 |
spring.ai.ollama.embedding.options.mirostat-eta |
影響演算法對生成文字反饋的響應速度。較低的學習率將導致調整較慢,而較高的學習率將使演算法響應更快。 |
0.1 |
spring.ai.ollama.embedding.options.penalize-newline |
- |
true |
spring.ai.ollama.embedding.options.stop |
設定要使用的停止序列。當遇到此模式時,LLM 將停止生成文字並返回。可以在 modelfile 中指定多個單獨的停止引數來設定多個停止模式。 |
- |
spring.ai.ollama.embedding.options.functions |
函式列表,由其名稱標識,用於在單個提示請求中啟用函式呼叫。具有這些名稱的函式必須存在於 functionCallbacks 登錄檔中。 |
- |
所有以 spring.ai.ollama.embedding.options 為字首的屬性都可以在執行時透過向 EmbeddingRequest 呼叫新增請求特定的執行時選項來覆蓋。 |
執行時選項
OllamaOptions.java 提供了 Ollama 配置,例如要使用的模型、底層的 GPU 和 CPU 調優等。
預設選項也可以使用 spring.ai.ollama.embedding.options
屬性進行配置。
在啟動時,使用 OllamaEmbeddingModel(OllamaApi ollamaApi, OllamaOptions defaultOptions)
配置用於所有嵌入請求的預設選項。在執行時,你可以使用 OllamaOptions
例項作為 EmbeddingRequest
的一部分來覆蓋預設選項。
例如,為特定請求覆蓋預設模型名稱:
EmbeddingResponse embeddingResponse = embeddingModel.call(
new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
OllamaOptions.builder()
.model("Different-Embedding-Model-Deployment-Name"))
.truncates(false)
.build());
自動拉取模型
當 Ollama 例項中不存在模型時,Spring AI Ollama 可以自動拉取模型。此功能對於開發、測試以及將應用程式部署到新環境特別有用。
你也可以按名稱拉取數千個免費的 GGUF Hugging Face 模型中的任何一個。 |
拉取模型有三種策略:
-
always
(定義在PullModelStrategy.ALWAYS
中):總是拉取模型,即使模型已存在。有助於確保你使用的是模型的最新版本。 -
when_missing
(定義在PullModelStrategy.WHEN_MISSING
中):僅在模型不存在時拉取模型。這可能會導致使用模型的舊版本。 -
never
(定義在PullModelStrategy.NEVER
中):從不自動拉取模型。
由於下載模型時可能存在延遲,不建議在生產環境中使用自動拉取。相反,請考慮提前評估並預下載所需的模型。 |
透過配置屬性和預設選項定義的所有模型都可以在啟動時自動拉取。你可以使用配置屬性配置拉取策略、超時時間和最大重試次數
spring:
ai:
ollama:
init:
pull-model-strategy: always
timeout: 60s
max-retries: 1
在 Ollama 中所有指定的模型都可用之前,應用程式將不會完成初始化。根據模型大小和網際網路連線速度,這可能會顯著減慢你的應用程式啟動時間。 |
你可以在啟動時初始化額外的模型,這對於在執行時動態使用的模型很有用。
spring:
ai:
ollama:
init:
pull-model-strategy: always
embedding:
additional-models:
- mxbai-embed-large
- nomic-embed-text
如果只想將拉取策略應用於特定型別的模型,可以從初始化任務中排除嵌入模型。
spring:
ai:
ollama:
init:
pull-model-strategy: always
embedding:
include: false
此配置將拉取策略應用於所有模型,除了嵌入模型。
HuggingFace 模型
Ollama 可以直接訪問所有 GGUF Hugging Face 嵌入模型。你可以按名稱拉取這些模型中的任何一個:ollama pull hf.co/<username>/<model-repository>
或配置自動拉取策略:自動拉取模型
spring.ai.ollama.embedding.options.model=hf.co/mixedbread-ai/mxbai-embed-large-v1
spring.ai.ollama.init.pull-model-strategy=always
-
spring.ai.ollama.embedding.options.model
:指定要使用的 Hugging Face GGUF 模型。 -
spring.ai.ollama.init.pull-model-strategy=always
:(可選)啟用啟動時自動模型拉取。對於生產環境,應預下載模型以避免延遲:ollama pull hf.co/mixedbread-ai/mxbai-embed-large-v1
。
示例 Controller
這將建立一個 EmbeddingModel
實現,你可以將其注入到你的類中。這是一個簡單的 @Controller
類使用 EmbeddingModel
實現的示例。
@RestController
public class EmbeddingController {
private final EmbeddingModel embeddingModel;
@Autowired
public EmbeddingController(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
@GetMapping("/ai/embedding")
public Map embed(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
EmbeddingResponse embeddingResponse = this.embeddingModel.embedForResponse(List.of(message));
return Map.of("embedding", embeddingResponse);
}
}
手動配置
如果你不使用 Spring Boot,可以手動配置 OllamaEmbeddingModel
。為此,將 spring-ai-ollama
依賴項新增到你的專案 Maven pom.xml
或 Gradle build.gradle
構建檔案中。
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-ollama'
}
請參閱依賴管理部分,將 Spring AI BOM 新增到你的構建檔案中。 |
spring-ai-ollama 依賴項還提供了對 OllamaChatModel 的訪問。有關 OllamaChatModel 的更多資訊,請參閱 Ollama 聊天客戶端部分。 |
接下來,建立一個 OllamaEmbeddingModel
例項,並使用它計算兩個輸入文字的嵌入,使用專用的 chroma/all-minilm-l6-v2-f32
嵌入模型。
var ollamaApi = OllamaApi.builder().build();
var embeddingModel = new OllamaEmbeddingModel(this.ollamaApi,
OllamaOptions.builder()
.model(OllamaModel.MISTRAL.id())
.build());
EmbeddingResponse embeddingResponse = this.embeddingModel.call(
new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
OllamaOptions.builder()
.model("chroma/all-minilm-l6-v2-f32"))
.truncate(false)
.build());
OllamaOptions
提供了所有嵌入請求的配置資訊。