5.2 Spring AI OpenAI 嵌入模型

Spring AI OpenAI 嵌入模型

前言

Spring AI 支持 OpenAI 的文本嵌入模型。

OpenAI 的文本嵌入用于衡量文本字符串的相关性。嵌入是一个向量(浮点数列表)。两个向量之间的距离衡量它们的相关性。小距离表示高相关性,大距离表示低相关性。

前提条件

您需要创建一个 OpenAI API 来访问 OpenAI 嵌入模型。

OpenAI 注册页面 创建账户,并在 API Keys 页面 生成令牌。

Spring AI 项目定义了一个名为 spring.ai.openai.api-key 的配置属性,您应该将其设置为从 openai.com 获取的 API Key 的值。

您可以在 application.properties 文件中设置此配置属性:

properties 复制代码
spring.ai.openai.api-key=<your-openai-api-key>

为了在处理 API 密钥等敏感信息时增强安全性,您可以使用 Spring Expression Language (SpEL) 来引用环境变量:

yaml 复制代码
# In application.yml
spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
bash 复制代码
# In your environment or .env file
export OPENAI_API_KEY=<your-openai-api-key>

您也可以在应用程序代码中以编程方式设置此配置:

java 复制代码
// Retrieve API key from a secure source or environment variable
String apiKey = System.getenv("OPENAI_API_KEY");

添加仓库和 BOM

Spring AI 构件发布在 Maven Central 和 Spring Snapshot 仓库中。参考构件仓库部分,将这些仓库添加到您的构建系统中。

为了帮助依赖管理,Spring AI 提供了 BOM(物料清单)来确保整个项目中使用一致的 Spring AI 版本。参考依赖管理部分,将 Spring AI BOM 添加到您的构建系统中。

自动配置

注意 Spring AI 自动配置、启动器模块的构件名称发生了重大变化。请参考升级说明了解更多信息。

Spring AI 为 OpenAI 嵌入模型提供了 Spring Boot 自动配置。要启用它,请将以下依赖项添加到您项目的 Maven pom.xml 文件中:

xml 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

或添加到您的 Gradle build.gradle 构建文件中。

groovy 复制代码
dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-openai'
}

提示 参考依赖管理部分,将 Spring AI BOM 添加到您的构建文件中。

嵌入属性

重试属性

前缀 spring.ai.retry 用作属性前缀,让您可以为 OpenAI 嵌入模型配置重试机制。

属性 描述 默认值
spring.ai.retry.max-attempts 最大重试尝试次数。 10
spring.ai.retry.backoff.initial-interval 指数退避策略的初始睡眠持续时间。 2 sec.
spring.ai.retry.backoff.multiplier 退避间隔倍数。 5
spring.ai.retry.backoff.max-interval 最大退避持续时间。 3 min.
spring.ai.retry.on-client-errors 如果为 false,抛出 NonTransientAiException,不尝试对 4xx 客户端错误代码进行重试 false
spring.ai.retry.exclude-on-http-codes 不应触发重试的 HTTP 状态代码列表(例如,抛出 NonTransientAiException)。 empty
spring.ai.retry.on-http-codes 应该触发重试的 HTTP 状态代码列表(例如,抛出 TransientAiException)。 empty
连接属性

前缀 spring.ai.openai 用作连接到 OpenAI 的属性前缀。

属性 描述 默认值
spring.ai.openai.base-url 要连接的 URL api.openai.com
spring.ai.openai.api-key API 密钥 -
spring.ai.openai.organization-id 可选择地,您可以指定用于 API 请求的组织。 -
spring.ai.openai.project-id 可选择地,您可以指定用于 API 请求的项目。 -

提示 对于属于多个组织的用户(或通过其旧版用户 API 密钥访问其项目),可选择地,您可以指定用于 API 请求的组织和项目。这些 API 请求的使用将计为指定组织和项目的使用量。

配置属性

注意 嵌入自动配置的启用和禁用现在通过前缀为 spring.ai.model.embedding 的顶级属性配置。

要启用,设置 spring.ai.model.embedding=openai(默认启用)

要禁用,设置 spring.ai.model.embedding=none(或任何不匹配 openai 的值)

进行此更改是为了允许配置多个模型。

前缀 spring.ai.openai.embedding 是配置 OpenAI 的 EmbeddingModel 实现的属性前缀。

属性 描述 默认值
spring.ai.openai.embedding.enabled (必需且不再有效) 启用 OpenAI 嵌入模型。 true
spring.ai.model.embedding 启用 OpenAI 嵌入模型。 openai
spring.ai.openai.embedding.base-url 可选择地覆盖 spring.ai.openai.base-url 以提供特定的嵌入 URL -
spring.ai.openai.embedding.embeddings-path 要附加到 base-url 的路径 /v1/embeddings
spring.ai.openai.embedding.api-key 可选择地覆盖 spring.ai.openai.api-key 以提供特定的嵌入 API 密钥 -
spring.ai.openai.embedding.organization-id 可选择地,您可以指定用于 API 请求的组织。 -
spring.ai.openai.embedding.project-id 可选择地,您可以指定用于 API 请求的项目。 -
spring.ai.openai.embedding.metadata-mode 文档内容提取模式。 EMBED
spring.ai.openai.embedding.options.model 要使用的模型 text-embedding-ada-002(其他选项:text-embedding-3-large, text-embedding-3-small)
spring.ai.openai.embedding.options.encodingFormat 返回嵌入的格式。可以是 float 或 base64。 -
spring.ai.openai.embedding.options.user 代表您的最终用户的唯一标识符,可以帮助 OpenAI 监控和检测滥用。 -
spring.ai.openai.embedding.options.dimensions 生成的输出嵌入应该具有的维度数。仅在 text-embedding-3 及更高版本模型中支持。 -

注意 您可以为 ChatModelEmbeddingModel 实现覆盖通用的 spring.ai.openai.base-urlspring.ai.openai.api-key。如果设置了 spring.ai.openai.embedding.base-urlspring.ai.openai.embedding.api-key 属性,它们将优先于通用属性。类似地,如果设置了 spring.ai.openai.chat.base-urlspring.ai.openai.chat.api-key 属性,它们将优先于通用属性。如果您想为不同的模型和不同的模型端点使用不同的 OpenAI 账户,这很有用。
提示 所有以 spring.ai.openai.embedding.options 为前缀的属性都可以通过在 EmbeddingRequest 调用中添加请求特定的运行时选项来在运行时覆盖。

运行时选项

OpenAiEmbeddingOptions.java 提供 OpenAI 配置,如要使用的模型等。

默认选项也可以使用 spring.ai.openai.embedding.options 属性进行配置。

在启动时,使用 OpenAiEmbeddingModel 构造函数设置所有嵌入请求使用的默认选项。在运行时,您可以使用 OpenAiEmbeddingOptions 实例作为 EmbeddingRequest 的一部分来覆盖默认选项。

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

java 复制代码
EmbeddingResponse embeddingResponse = embeddingModel.call(
    new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"),
        OpenAiEmbeddingOptions.builder()
            .model("Different-Embedding-Model-Deployment-Name")
        .build()));

示例控制器

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

properties 复制代码
spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.embedding.options.model=text-embedding-ada-002
java 复制代码
@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,可以手动配置 OpenAI 嵌入模型。为此,将 spring-ai-openai 依赖项添加到您项目的 Maven pom.xml 文件中:

xml 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai</artifactId>
</dependency>

或添加到您的 Gradle build.gradle 构建文件中。

groovy 复制代码
dependencies {
    implementation 'org.springframework.ai:spring-ai-openai'
}

提示 参考依赖管理部分,将 Spring AI BOM 添加到您的构建文件中。
注意 spring-ai-openai 依赖项也提供对 OpenAiChatModel 的访问。有关 OpenAiChatModel 的更多信息,请参考 OpenAI 聊天客户端 部分。

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

java 复制代码
var openAiApi = OpenAiApi.builder()
                .apiKey(System.getenv("OPENAI_API_KEY"))
                .build();

var embeddingModel = new OpenAiEmbeddingModel(
		this.openAiApi,
        MetadataMode.EMBED,
        OpenAiEmbeddingOptions.builder()
                .model("text-embedding-ada-002")
                .user("user-6")
                .build(),
        RetryUtils.DEFAULT_RETRY_TEMPLATE);

EmbeddingResponse embeddingResponse = this.embeddingModel
        .embedForResponse(List.of("Hello World", "World is big and salvation is near"));

OpenAiEmbeddingOptions 提供嵌入请求的配置信息。api 和选项类提供 builder() 以便于选项创建。


相关推荐
架构师沉默2 分钟前
为什么一个视频能让全国人民同时秒开?
java·后端·架构
掘金码甲哥35 分钟前
同样都是九年义务教育,他知道的AI算力科普好像比我多耶
后端
sthnyph43 分钟前
SpringBoot Test详解
spring boot·后端·log4j
饼干哥哥1 小时前
搭建一个云端Skills系统,随时随地记录TikTok爆款
前端·后端
IT 行者1 小时前
LangChain4j 集成 Redis 向量存储:我踩过的坑和选型建议
java·人工智能·redis·后端
brucelee1861 小时前
Spring Boot 测试最佳实践
spring boot·后端·log4j
派星2 小时前
如何分享自己写的 Go 包
后端
snakeshe10102 小时前
从零理解 Spring 核心:IoC 容器与依赖注入,以及手写一个迷你版
后端
148612 小时前
Redis 删除缓存失败怎么办?重试、死信、补偿的工程化方案
后端
None3212 小时前
NestJS 流式文件上传实践:从 Multer 到 Busboy 的进阶之路
前端·后端