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 Embedding 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 Embedding 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 Embedding API 模型。

true

spring.ai.model.embedding.text

启用 Vertex AI Embedding 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

示例 Controller

创建一个新的 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());