Ollama Embeddings
通过 Ollama,您可以在本地运行各种大型语言模型 (LLM) 并从中生成嵌入。
Spring AI 通过 OllamaEmbeddingModel
支持文本嵌入。
嵌入是浮点数的向量(列表)。两个向量之间的距离衡量它们的相关性。距离小表明相关性高,距离大表明相关性低。
前提条件(Prerequisites)
首先,您需要访问 Ollama 实例。有以下几个选择:
- 在本地机器上下载并安装 Ollama。
- 通过 Testcontainers 配置和运行 Ollama。
- 通过 Kubernetes Service Bindings 绑定到 Ollama 实例。
你可以从 Ollama 模型库中提取想要在应用程序中使用的模型:
ollama pull <model-name>
你还可以下载数千个免费的 GGUF Hugging Face 模型中的任何一个:
ollama pull hf.co/<username>/<model-repository>
或者,您可以启用自动下载任何所需模型的选项:自动拉取模型。
添加存储库和 BOM
Spring AI 工件发布在 Spring Milestone
和 Snapshot
存储库中。请参阅存储库部分将这些存储库添加到您的构建系统中。
为了帮助进行依赖管理,Spring AI 提供了 BOM(物料清单),以确保在整个项目中使用一致的 Spring AI 版本。请参阅依赖管理部分将 Spring AI BOM 添加到您的构建系统。
自动配置(Auto-configuration)
Spring AI 为 Ollama 嵌入模型提供 Spring Boot 自动配置。要启用它,请在项目的 Maven pom.xml
文件中添加以下依赖项:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
或者,在你的 Gradle 构建文件 build.gradle
中添加:
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-ollama'
}
基础属性(Base Properties)
前缀是 spring.ai.ollama
的属性,用于配置 Ollama 的链接。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.ollama.base-url | Ollama API 服务运行的基础URL | http://localhost:11434 |
以下是初始化 Ollama 集成及 自动拉取模型 的属性设置。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.ollama.init.pull-model-strategy | 启动时是否拉取模型及拉取方式 | never |
spring.ai.ollama.init.timeout | 等待模型拉取完成的最长时间 | 5m |
spring.ai.ollama.init.max-retries | 模型拉取操作的最大重试次数 | 0 |
spring.ai.ollama.init.chat.include | 是否在初始化任务中包含此类模型 | true |
spring.ai.ollama.init.chat.additional-models | 除默认配置外需要初始化的额外模型列表 | [] |
嵌入属性(Embedding Properties)
前缀 spring.ai.ollama.embedding.options
是用于配置 Ollama 嵌入模型的属性前缀。它包含 Ollama 请求(高级)参数,如模型、保持连接和截断,以及 Ollama 模型选项属性。
以下是 Ollama 嵌入模型的高级请求参数:
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.ollama.embedding.enabled (已移除且无效) | 启用Ollama嵌入模型自动配置 | true |
spring.ai.model.embedding | 启用Ollama嵌入模型自动配置 | mxbai-embed-large |
spring.ai.ollama.embedding.options.model | 使用的支持模型名称 可使用专用的嵌入模型类型 |
mistral |
spring.ai.ollama.embedding.options.keep_alive | 控制模型在请求后保持在内存中的时长 | 5m |
spring.ai.ollama.embedding.options.truncate | 截断每个输入的末尾以适应上下文长度。如果为false且超出上下文长度则返回错误 | true |
其余选项属性基于 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 | 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 | 默认模型映射到内存,允许系统按需加载必要部分。低内存系统可能增加pageout风险 | null |
spring.ai.ollama.embedding.options.use-mlock | 锁定模型在内存中防止被交换出去,可能提高性能但需要更多RAM | false |
spring.ai.ollama.embedding.options.num-thread | 设置计算使用的线程数(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 | 减少生成无意义内容的概率,值越高结果越多样 | 40 |
spring.ai.ollama.embedding.options.top-p | 与top-k配合使用,值越高文本越多样 | 0.9 |
spring.ai.ollama.embedding.options.min-p | 确保质量和多样性的平衡,表示token被考虑的最小概率 | 0.0 |
spring.ai.ollama.embedding.options.tfs-z | 减少低概率token的影响,值越高影响越小(1.0禁用) | 1.0 |
spring.ai.ollama.embedding.options.typical-p | - | 1.0 |
spring.ai.ollama.embedding.options.repeat-last-n | 设置模型回溯防止重复的距离(0=禁用,-1=num_ctx) | 64 |
spring.ai.ollama.embedding.options.temperature | 模型温度,值越高回答越有创造性 | 0.8 |
spring.ai.ollama.embedding.options.repeat-penalty | 惩罚重复的强度,值越高惩罚越强 | 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=禁用,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将停止生成 | - |
spring.ai.ollama.embedding.options.functions | 函数名称列表,用于在单个提示请求中启用函数调用 | - |
运行时选项(Runtime Options )
OllamaOptions.java 提供了嵌入请求的配置信息,并提供了一个构建器来创建这些选项。
默认选项也可以通过配置 spring.ai.ollama.embedding.options
属性来进行设置。
在启动时,使用 OllamaEmbeddingModel (OllamaApi ollamaApi,OllamaOptions defaultOptions)
构造函数来设置所有嵌入请求默认使用的选项。在运行时,您可以通过在 EmbeddingRequest
中使用 OllamaOptions
实例来覆盖这些默认选项。
例如,要为特定请求覆盖默认模型名称:
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());
自动拉取模型(Auto-pulling Models)
当模型在 Ollama 实例中不可用时,Spring AI Ollama 可以自动拉取模型。这项功能在开发和测试以及将应用程序部署到新环境中时特别有用。
有三种拉取模型的策略:
- always (在 PullModelStrategy.ALWAYS 中定义) :始终拉取模型,即使模型已经可用。这对于确保使用的是最新版本的模型很有用。
- when_missing (在 PullModelStrategy.WHEN_MISSING 中定义): 仅在模型尚未可用时才拉取。这可能导致使用模型的较旧版本。
- never (在 PullModelStrategy.Never 中定义): 永远不要自动拉取模型。
通过配置属性和默认选项定义的所有模型都可以在启动时自动拉取。您可以使用配置属性配置拉取策略、超时和最大重试次数:
spring:
ai:
ollama:
init:
pull-model-strategy: always
timeout: 60s
max-retries: 1
您可以在启动时初始化额外的模型,这对于在运行时动态使用的模型很有用:
spring:
ai:
ollama:
init:
pull-model-strategy: always
chat:
additional-models:
- llama3.2
- qwen2.5
如果你只想将拉动策略应用于特定类型的模型,可以将聊天模型排除在初始化任务之外:
spring:
ai:
ollama:
init:
pull-model-strategy: always
chat:
include: false
这种配置将将拉取策略应用于除聊天模型外的所有模型。
HuggingFace 模型
Ollama 可以直接访问所有 GGUF 拥抱面对面聊天模型。你可以按名称拉取任何模型:ollama pull hf.co/<username>/<model-repository>
或配置自动拉取策略:自动拉取模型:
spring.ai.ollama.chat.options.model=hf.co/bartowski/gemma-2-2b-it-GGUF
spring.ai.ollama.init.pull-model-strategy=always
spring.ai.ollama.chat.options.model
: 指定要使用的 Hugging Face GGUF 模型。spring.ai.ollama.init.pull-model-strategy=always
: (可选) 启用在启动时自动模型拉取功能。对于生产,您应该预先下载模型以避免延迟:ollama pull hf.co/bartowski/gemma-2-2b-it-gguf
。
示例控制器(Sample Controller)
这将创建一个 OllamaEmbeddingModel
实现,你可以将其注入到你的类中。以下是一个使用 OllamaEmbeddingModel
实现的简单 @Controller
类示例。
@RestController
public class EmbeddingController {
private final OllamaEmbeddingModel embeddingModel;
@Autowired
public EmbeddingController(OllamaEmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
@GetMapping("/v1/embedding")
public Map<String, Object> embedding(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
return Map.of("embeddings", embeddingModel.embed(message));
}
}
手动配置(Manual Configuration)
OllamaEmbeddingModel 实现了 EmbeddingModel , 并使用轻量级 GenerativeAiInferenceClient 客户端连接到 OCI GenAI 服务。
要启用它,添加 spring-ai-ollama
依赖到你的项目 Maven pom.xml
文件:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama</artifactId>
</dependency>
或者,在你的 Gradle 构建文件 build.gradle
中添加:
dependencies {
implementation 'org.springframework.ai:spring-ai-ollama'
}
接下来,创建一个 OCIEmbeddingModel
实例,并使用它来计算两个输入文本之间的相似度
final String EMBEDDING_MODEL = "cohere.embed-english-light-v2.0";
final String CONFIG_FILE = Paths.get(System.getProperty("user.home"), ".oci", "config").toString();
final String PROFILE = "DEFAULT";
final String REGION = "us-chicago-1";
final String COMPARTMENT_ID = System.getenv("OCI_COMPARTMENT_ID");
var authProvider = new ConfigFileAuthenticationDetailsProvider(
this.CONFIG_FILE, this.PROFILE);
var aiClient = GenerativeAiInferenceClient.builder()
.region(Region.valueOf(this.REGION))
.build(this.authProvider);
var options = OCIEmbeddingOptions.builder()
.model(this.EMBEDDING_MODEL)
.compartment(this.COMPARTMENT_ID)
.servingMode("on-demand")
.build();
var embeddingModel = new OCIEmbeddingModel(this.aiClient, this.options);
List<Double> embedding = this.embeddingModel.embed(new Document("How many provinces are in Canada?"));
最后编辑:Jeebiz 更新时间:2025-08-31 23:07