Ollama Embeddings

通过 Ollama,您可以在本地运行各种大型语言模型 (LLM) 并从中生成嵌入。

Spring AI 通过 OllamaEmbeddingModel 支持文本嵌入。

嵌入是浮点数的向量(列表)。两个向量之间的距离衡量它们的相关性。距离小表明相关性高,距离大表明相关性低。

前提条件(Prerequisites)

首先,您需要访问 Ollama 实例。有以下几个选择:

你可以从 Ollama 模型库中提取想要在应用程序中使用的模型:

ollama pull <model-name>

你还可以下载数千个免费的 GGUF Hugging Face 模型中的任何一个:

ollama pull hf.co/<username>/<model-repository>

或者,您可以启用自动下载任何所需模型的选项:自动拉取模型。

添加存储库和 BOM

Spring AI 工件发布在 Spring MilestoneSnapshot 存储库中。请参阅存储库部分将这些存储库添加到您的构建系统中。

为了帮助进行依赖管理,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-03 11:53
最后编辑:Jeebiz  更新时间:2025-08-31 23:07