Ollama Embeddings

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

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

先决条件

您首先需要在本地计算机上运行 Ollama。请参阅官方 Ollama 项目自述文件,开始在本地计算机上运行模型。

注意: 安装 ollama run llama2 将下载一个 4GB 的 docker 镜像。

添加存储库和 BOM

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

为了帮助进行依赖管理,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.ollama.embedding.options.* 属性用于配置用于所有嵌入请求的默认选项。(它用作OllamaEmbeddingClient#withDefaultOptions()实例)。

Embedding 属性

spring.ai.ollama 前缀的属性,可让您配置 Ollama Chat 客户端的连接。

属性 描述 默认值
spring.ai.ollama.base-url Ollama API 服务器运行的基本 URL. http://localhost:11434

spring.ai.ollama.embedding.options 前缀的属性,可让您配置 Ollama 的 EmbeddingClient 实现。

属性 描述 默认值
spring.ai.ollama.embedding.enabled 启用 Ollama 嵌入客户端。 true
spring.ai.ollama.embedding.model(已弃用) 要使用的模型的名称。已弃用,请使用 spring.ai.ollama.embedding.options.model mistral
spring.ai.ollama.embedding.options.model 要使用的受支持模型的名称。 mistral
spring.ai.ollama.embedding.options.numa 是否使用NUMA。 false
spring.ai.ollama.embedding.options.num-ctx 设置用于生成下一个标记的上下文窗口的大小。 2048
spring.ai.ollama.embedding.options.num-batch ??? -
spring.ai.ollama.embedding.options.num-gqa Transformer 层中 GQA 组的数量。某些型号需要,例如 llama2:70b 为 8。 -
spring.ai.ollama.embedding.options.num-gpu 要发送到 GPU 的层数。在 macOS 上,默认为 1 启用金属支持,0 禁用。 -
spring.ai.ollama.embedding.options.main-gpu ??? -
spring.ai.ollama.embedding.options.low-vram ??? -
spring.ai.ollama.embedding.options.f16-kv ??? -
spring.ai.ollama.embedding.options.logits-all ??? -
spring.ai.ollama.embedding.options.vocab-only ??? -
spring.ai.ollama.embedding.options.use-mmap ??? -
spring.ai.ollama.embedding.options.use-mlock ??? -
spring.ai.ollama.embedding.options.embedding-only ??? -
spring.ai.ollama.embedding.options.rope-frequency-base ??? -
spring.ai.ollama.embedding.options.rope-frequency-scale ??? -
spring.ai.ollama.embedding.options.num-thread 设置计算期间使用的线程数。默认情况下,Ollama 将检测到这一点以获得最佳性能。建议将此值设置为系统具有的物理 CPU 核心数(而不是逻辑核心数)。 -
spring.ai.ollama.embedding.options.num-keep ??? -
spring.ai.ollama.embedding.options.seed 设置用于生成的随机数种子。将其设置为特定数字将使模型为相同的提示生成相同的文本。 0
spring.ai.ollama.embedding.options.num-predict 生成文本时要预测的最大标记数。 (默认值:128,-1 = 无限生成,-2 = 填充上下文) 128
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.tfs-z 无尾采样用于减少输出中不太可能的标记的影响。较高的值(例如,2.0)将更多地减少影响,而值 1.0 将禁用此设置。 1
spring.ai.ollama.embedding.options.typical-p ??? -
spring.ai.ollama.embedding.options.repeat-last-n 设置模型回溯多远以防止重复。 (默认值:64,0 = 禁用,-1 = num_ctx) 64
spring.ai.ollama.embedding.options.temperature 模型的temperature。提高 temperature 将使模型的答案更有创意。 0.8
spring.ai.ollama.embedding.options.repeat-penalty 设置惩罚重复的强度。较高的值(例如,1.5)将更强烈地惩罚重复,而较低的值(例如,0.9)将更宽松。 1.1
spring.ai.ollama.embedding.options.presence-penalty ??? -
spring.ai.ollama.embedding.options.frequency-penalty ??? -
spring.ai.ollama.embedding.options.mirostat 启用 Mirostat 采样以控制困惑度。 (默认值:0、0 = 禁用、1 = Mirostat、2 = Mirostat 2.0) 0
spring.ai.ollama.embedding.options.mirostat-tau 影响算法对生成文本反馈的响应速度。较低的学习率将导致调整速度较慢,而较高的学习率将使算法更具响应性。 0.1
spring.ai.ollama.embedding.options.mirostat-eta 控制输出的一致性和多样性之间的平衡。较低的值将导致文本更加集中和连贯。 5.0
spring.ai.ollama.embedding.options.penalize-newline ??? -
spring.ai.ollama.embedding.options.stop 设置要使用的停止序列。当遇到这种模式时,LLM 将停止生成文本并返回。可以通过在模型文件中指定多个单独的停止参数来设置多个停止模式。 -

NOTE: The spring.ai.ollama.embedding.options.* properties are based on the https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values[Ollama Valid Parameters and Values] and https://github.com/jmorganca/ollama/blob/main/api/types.go[Ollama Types]

提示: 这些spring.ai.ollama.embedding.options.*属性基于 Ollama 有效参数和值以及 Ollama 类型

提示: 通过向 EmbeddingRequest 调用添加请求特定的嵌入选项,可以在运行时覆盖所有 spring.ai.ollama.embedding.options 前缀的属性。

Embedding 选项

OllamaOptions.java 提供 Ollama 配置,例如要使用的模型、低级 GPU 和 CPU 调整等。

spring.ai.ollama.embedding.options 的属性可用作为配置默认选项

在启动时使用 OllamaEmbeddingClient#withDefaultOptions() 配置用于所有嵌入请求的默认选项。在运行时,您可以使用 OllamaOptions 实例作为 EmbeddingRequest 的一部分覆盖默认配置.

例如,要覆盖特定请求的默认模型名称:

EmbeddingResponse embeddingResponse = embeddingClient.call(
    new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
        OllamaOptions.create()
            .withModel("Different-Embedding-Model-Deployment-Name"));

Sample Controller (自动配置)

这将创建一个可以注入到您的类中的 EmbeddingClient 实现。下面是一个@Controller使用 EmbeddingClient 的简单示例。

@RestController
public class EmbeddingController {

    private final EmbeddingClient embeddingClient;

    @Autowired
    public EmbeddingController(EmbeddingClient embeddingClient) {
        this.embeddingClient = embeddingClient;
    }

    @GetMapping("/ai/embedding")
    public Map embed(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        EmbeddingResponse embeddingResponse = this.embeddingClient.embedForResponse(List.of(message));
        return Map.of("embedding", embeddingResponse);
    }
}

手动配置

如果您不使用 Spring Boot,则可以手动配置 OllamaEmbeddingClient。为此,请将 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'
}

接下来,创建一个 OllamaEmbeddingClient实例并使用它来计算两个输入文本之间的相似度:

var ollamaApi = new OllamaApi();

var embeddingClient = new OllamaEmbeddingClient(ollamaApi)
    .withDefaultOptions(OllamaOptions.create()
            .withModel(OllamaOptions.DEFAULT_MODEL)
            .toMap());

EmbeddingResponse embeddingResponse = embeddingClient
    .embedForResponse(List.of("Hello World", "World is big and salvation is near"));
  • OllamaOptions 提供嵌入请求的配置信息.
作者:Jeebiz  创建时间:2024-04-05 23:30
最后编辑:Jeebiz  更新时间:2024-07-06 19:00