借助 Ollama,你可以在本地运行各类人工智能模型并生成对应的嵌入向量。嵌入向量是由浮点数组成的向量(列表),两个向量之间的距离可衡量二者的关联度:距离越小代表关联度越高,距离越大代表关联度越低。
OllamaEmbeddingModel 实现类基于 Ollama 嵌入向量 API 接口实现功能。
前提条件
首先你需要连接到一个 Ollama 实例,支持以下几种方式:
在本地设备下载并安装 Ollama
通过 Testcontainers 配置并运行 Ollama
通过 Kubernetes 服务绑定连接到 Ollama 实例
你可以从 Ollama 模型库拉取应用所需的模型:
ollama pull <model-name>
你也可以拉取 Hugging Face 上数千个免费的 GGUF 模型:
ollama pull hf.co/<username>/<model-repository>
此外,你还可以开启模型自动下载功能:自动拉取模型。
自动配置
Spring AI 自动配置、启动器模块的构件名称发生了重大变更。更多信息请参考升级说明。
Spring AI 为 Ollama 嵌入模型提供了 Spring Boot 自动配置。启用该功能需在项目的 Maven pom.xml 或 Gradle build.gradle 文件中添加以下依赖:
Maven 依赖
org.springframework.aispring-ai-starter-model-ollama
参考「依赖管理」章节,将 Spring AI 物料清单添加到构建文件中。Spring AI 构件已发布至 Maven 中央仓库和 Spring 快照仓库,参考「仓库」章节将对应仓库添加到构建系统中。
基础配置属性
配置前缀 spring.ai.ollama 用于配置 Ollama 连接参数:
| 配置属性 | 说明 | 默认值 |
|---|---|---|
| spring.ai.ollama.base-url | Ollama API 服务的基础地址 | 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.embedding.include | 是否将嵌入向量模型纳入初始化任务 | true |
| spring.ai.ollama.init.embedding.additional-models | 除默认配置外,需要初始化的额外模型 | 空数组 |
嵌入向量配置属性
嵌入向量自动配置的启用与禁用,现已通过顶级前缀 spring.ai.model.embedding 配置:
启用:spring.ai.model.embedding=ollama(默认已启用)
禁用:spring.ai.model.embedding=none(或任意非 ollama 的值)
该变更用于支持多模型的配置管理。
配置前缀 spring.ai.ollama.embedding.options 用于配置 Ollama 嵌入模型,包含模型名称、keep-alive、truncate 等 Ollama 请求高级参数,以及模型配置属性。
Ollama 嵌入模型高级请求参数:
| 配置属性 | 说明 | 默认值 |
|---|---|---|
| spring.ai.ollama.embedding.enabled(已移除,不再生效) | 启用 Ollama 嵌入模型自动配置 | true |
| spring.ai.model.embedding | 启用 Ollama 嵌入模型自动配置 | ollama |
| spring.ai.ollama.embedding.options.model | 使用的模型名称,支持专用嵌入模型 | mxbai-embed-large |
| spring.ai.ollama.embedding.options.keep_alive | 请求完成后,模型保留在内存中的时长 | 5m |
| spring.ai.ollama.embedding.options.truncate | 自动截断输入文本以适配上下文长度;若为 false,超出长度则返回错误 | true |
其余配置属性基于 Ollama 官方有效参数和类型定义,默认值遵循 Ollama 类型默认配置:
| 配置属性 | 说明 | 默认值 |
|---|---|---|
| spring.ai.ollama.embedding.options.numa | 是否启用 NUMA | false |
| spring.ai.ollama.embedding.options.num-ctx | 上下文窗口大小 | 2048 |
| spring.ai.ollama.embedding.options.num-batch | 提示词处理最大批次大小 | 512 |
| spring.ai.ollama.embedding.options.num-gpu | 上传至 GPU 的模型层数;macOS 默认1(启用Metal),0为禁用;-1 为动态设置 | -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 | F16 键值缓存 | true |
| spring.ai.ollama.embedding.options.logits-all | 返回所有令牌的逻辑值,而非仅最后一个 | - |
| spring.ai.ollama.embedding.options.vocab-only | 仅加载词汇表,不加载权重 | - |
| spring.ai.ollama.embedding.options.use-mmap | 是否使用内存映射加载模型 | null |
| spring.ai.ollama.embedding.options.use-mlock | 将模型锁定在内存中,防止交换 | 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 | 最大预测令牌数;-1=无限,-2=填充上下文 | -1 |
| spring.ai.ollama.embedding.options.top-k | Top-K 采样,值越高结果越多样 | 40 |
| spring.ai.ollama.embedding.options.top-p | Top-P 采样,值越高结果越多样 | 0.9 |
| spring.ai.ollama.embedding.options.min-p | 最小概率采样阈值 | 0.0 |
| spring.ai.ollama.embedding.options.tfs-z | 无尾采样系数,1.0为禁用 | 1.0 |
| spring.ai.ollama.embedding.options.typical-p | 典型采样 | 1.0 |
| spring.ai.ollama.embedding.options.repeat-last-n | 防止重复的回溯长度;0=禁用,-1=上下文全长 | 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/2为对应版本 | 0 |
| spring.ai.ollama.embedding.options.mirostat-tau | Mirostat 目标困惑度 | 5.0 |
| spring.ai.ollama.embedding.options.mirostat-eta | Mirostat 学习率 | 0.1 |
| spring.ai.ollama.embedding.options.penalize-newline | 惩罚换行符 | true |
| spring.ai.ollama.embedding.options.stop | 停止序列,匹配后停止生成 | - |
| spring.ai.ollama.embedding.options.functions | 启用的函数调用列表 | - |
所有以 spring.ai.ollama.embedding.options 为前缀的属性,都可以在运行时通过向 EmbeddingRequest 请求添加特定的运行时选项来覆盖。
运行时选项
OllamaEmbeddingOptions.java 提供 Ollama 完整配置项,包括使用模型、GPU/CPU 底层调优等。
OllamaOptions 类已废弃,聊天模型使用 OllamaChatOptions,嵌入模型使用 OllamaEmbeddingOptions,新类提供类型安全的模型专属配置。
默认选项可通过 spring.ai.ollama.embedding.options 配置。启动时通过 OllamaEmbeddingModel 构造函数设置全局默认选项,运行时可在 EmbeddingRequest 中传入 OllamaEmbeddingOptions 实例覆盖配置。
示例:为单个请求覆盖默认模型名称
EmbeddingResponse embeddingResponse = embeddingModel.call(
new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
OllamaEmbeddingOptions.builder()
.model("Different-Embedding-Model-Deployment-Name")
.truncate(false)
.build()));模型自动拉取
Spring AI Ollama 支持在模型不存在时自动拉取,该功能适用于开发、测试和新环境部署场景。
你可以按名称拉取 Hugging Face 上任意免费 GGUF 模型,支持三种拉取策略:
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 embedding: additional-models: - mxbai-embed-large - nomic-embed-text
若仅对特定类型模型应用拉取策略,可排除嵌入向量模型:
spring: ai: ollama: init: pull-model-strategy: always embedding: include: false
HuggingFace 模型
Ollama 原生支持所有 Hugging Face GGUF 嵌入模型,可通过命令拉取或配置自动拉取:
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
示例控制器
配置完成后会自动创建 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。在项目中添加以下依赖:
Maven 依赖
org.springframework.aispring-ai-ollama
参考「依赖管理」章节添加 Spring AI 物料清单。
spring-ai-ollama 依赖同时提供 OllamaChatModel 支持,更多信息参考 Ollama 聊天客户端章节。
创建 OllamaEmbeddingModel 实例并生成嵌入向量:
var ollamaApi = OllamaApi.builder().build();
var embeddingModel = new OllamaEmbeddingModel(this.ollamaApi,
OllamaEmbeddingOptions.builder()
.model(OllamaModel.MISTRAL.id())
.build());
EmbeddingResponse embeddingResponse = this.embeddingModel.call(
new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
OllamaEmbeddingOptions.builder()
.model("chroma/all-minilm-l6-v2-f32")
.truncate(false)
.build()));OllamaEmbeddingOptions 提供所有嵌入向量请求的配置信息,支持构建器模式快速创建。