Google VertexAI 文本嵌入

Vertex AI 支持两种类型的嵌入模型:文本型和多模态型。 本文档介绍了如何使用 Vertex AI 文本嵌入 API 创建文本嵌入。 Vertex AI 文本嵌入 API 使用密集向量表示。 与倾向于将词语直接映射到数字的稀疏向量不同,密集向量旨在更好地表示一段文本的含义。 在生成式 AI 中使用密集向量嵌入的好处是,您无需搜索直接的词语或语法匹配,而是可以更好地搜索与查询含义对齐的段落,即使这些段落没有使用相同的语言。

先决条件

  • 安装适用于您操作系统的 gcloud CLI。

  • 运行以下命令进行身份验证。 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID,将 ACCOUNT 替换为您的 Google Cloud 用户名。

gcloud config set project <PROJECT_ID> &&
gcloud auth application-default login <ACCOUNT>

添加仓库和 BOM

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

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

自动配置

Spring AI 自动配置、启动器模块的工件名称发生了重大变化。 有关更多信息,请参阅 升级说明

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

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-vertex-ai-embedding</artifactId>
</dependency>

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-vertex-ai-embedding'
}

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

嵌入属性

前缀 spring.ai.vertex.ai.embedding 用作属性前缀,让您可以连接到 VertexAI 嵌入 API。

属性 描述 默认

spring.ai.vertex.ai.embedding.project-id

Google Cloud Platform 项目 ID

-

spring.ai.vertex.ai.embedding.location

区域

-

spring.ai.vertex.ai.embedding.apiEndpoint

Vertex AI 嵌入 API 端点。

-

嵌入自动配置的启用和禁用现在通过前缀为 spring.ai.model.embedding 的顶级属性进行配置。 要启用,spring.ai.model.embedding.text=vertexai(默认启用) 要禁用,spring.ai.model.embedding.text=none(或任何不匹配 vertexai 的值) 此更改是为了允许配置多个模型。

前缀 spring.ai.vertex.ai.embedding.text 是属性前缀,用于配置 VertexAI 文本嵌入的模型实现。

属性 描述 默认

spring.ai.vertex.ai.embedding.text.enabled (已移除且不再有效)

启用 Vertex AI 嵌入 API 模型。

true

spring.ai.model.embedding.text

启用 Vertex AI 嵌入 API 模型。

vertexai

spring.ai.vertex.ai.embedding.text.options.model

这是要使用的 Vertex 文本嵌入模型

text-embedding-004

spring.ai.vertex.ai.embedding.text.options.task-type

旨在帮助模型生成更高质量嵌入的下游应用程序。可用的 任务类型

RETRIEVAL_DOCUMENT

spring.ai.vertex.ai.embedding.text.options.title

可选标题,仅在 task_type=RETRIEVAL_DOCUMENT 时有效。

-

spring.ai.vertex.ai.embedding.text.options.dimensions

结果输出嵌入的维度数量。支持模型版本 004 及更高版本。您可以使用此参数来减小嵌入大小,例如,用于存储优化。

-

spring.ai.vertex.ai.embedding.text.options.auto-truncate

设置为 true 时,输入文本将被截断。设置为 false 时,如果输入文本的长度超过模型支持的最大长度,则返回错误。

true

示例控制器

创建一个新的 Spring Boot 项目,并将 spring-ai-starter-model-vertex-ai-embedding 添加到您的 pom(或 gradle)依赖项中。

src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 VertexAi 聊天模型:

spring.ai.vertex.ai.embedding.project-id=<YOUR_PROJECT_ID>
spring.ai.vertex.ai.embedding.location=<YOUR_PROJECT_LOCATION>
spring.ai.vertex.ai.embedding.text.options.model=text-embedding-004

这将创建一个 VertexAiTextEmbeddingModel 实现,您可以将其注入到您的类中。 以下是一个使用嵌入模型生成嵌入的简单 @Controller 类示例。

@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);
    }
}

手动配置

VertexAiTextEmbeddingModel 实现了 EmbeddingModel 接口。

spring-ai-vertex-ai-embedding 依赖项添加到您项目的 Maven pom.xml 文件中:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-vertex-ai-embedding</artifactId>
</dependency>

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-vertex-ai-embedding'
}

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

接下来,创建一个 VertexAiTextEmbeddingModel 并将其用于文本生成:

VertexAiEmbeddingConnectionDetails connectionDetails =
    VertexAiEmbeddingConnectionDetails.builder()
        .projectId(System.getenv(<VERTEX_AI_GEMINI_PROJECT_ID>))
        .location(System.getenv(<VERTEX_AI_GEMINI_LOCATION>))
        .build();

VertexAiTextEmbeddingOptions options = VertexAiTextEmbeddingOptions.builder()
    .model(VertexAiTextEmbeddingOptions.DEFAULT_MODEL_NAME)
    .build();

var embeddingModel = new VertexAiTextEmbeddingModel(this.connectionDetails, this.options);

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

从 Google 服务帐户加载凭据

要以编程方式从服务帐户 JSON 文件加载 GoogleCredentials,您可以使用以下代码:

GoogleCredentials credentials = GoogleCredentials.fromStream(<INPUT_STREAM_TO_CREDENTIALS_JSON>)
        .createScoped("https://www.googleapis.com/auth/cloud-platform");
credentials.refreshIfExpired();

VertexAiEmbeddingConnectionDetails connectionDetails =
    VertexAiEmbeddingConnectionDetails.builder()
        .projectId(System.getenv(<VERTEX_AI_GEMINI_PROJECT_ID>))
        .location(System.getenv(<VERTEX_AI_GEMINI_LOCATION>))
        .apiEndpoint(endpoint)
        .predictionServiceSettings(
            PredictionServiceSettings.newBuilder()
                .setEndpoint(endpoint)
                .setCredentialsProvider(FixedCredentialsProvider.create(credentials))
                .build());