Google VertexAI マルチモーダル埋め込み

実験的。実験目的でのみ使用されます。VectorStores とはまだ互換性がありません。

Vertex AI は、テキストとマルチモーダルの 2 種類の埋め込みモデルをサポートしています。このドキュメントでは、Vertex AI マルチモーダル埋め込み API を使用してマルチモーダル埋め込みを作成する方法について説明します。

マルチモーダル埋め込みモデルは、入力に基づいて 1408 次元のベクトルを生成します。入力には、イメージ、テキスト、ビデオデータの組み合わせを含めることができます。埋め込みベクトルは、イメージ分類やビデオコンテンツのモデレーションなどの後続のタスクに使用できます。

イメージ埋め込みベクトルとテキスト埋め込みベクトルは、同じ次元を持つ同じ意味空間にあります。これらのベクトルは、テキストによるイメージの検索やイメージによるビデオの検索などのユースケースで互換的に使用できます。

VertexAI マルチモーダル API には次の制限 があります。
テキストのみの埋め込みの場合は、代わりに Vertex AI テキスト埋め込みモデルを使用することをお勧めします。

前提条件

  • OS に適した 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 アーティファクトは、Spring マイルストーンおよびスナップショットリポジトリで公開されます。これらのリポジトリをビルドシステムに追加するには、リポジトリセクションを参照してください。

依存関係の管理を支援するために、Spring AI は BOM (部品表) を提供し、一貫したバージョンの Spring AI がプロジェクト全体で使用されるようにします。Spring AI BOM をビルドシステムに追加するには、"依存関係管理" セクションを参照してください。

自動構成

Spring AI は、VertexAI 埋め込みモデル用の Spring Boot 自動構成を提供します。これを有効にするには、プロジェクトの Maven pom.xml ファイルに次の依存関係を追加します。

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

または、Gradle build.gradle ビルドファイルに保存します。

dependencies {
    implementation 'org.springframework.ai:spring-ai-vertex-ai-embedding-spring-boot-starter'
}
Spring AI BOM をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。

埋め込みプロパティ

プレフィックス spring.ai.vertex.ai.embedding は、VertexAI Embedding API に接続できるようにするプロパティプレフィックスとして使用されます。

プロパティ 説明 デフォルト

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

Google クラウドプラットフォームプロジェクト ID

-

spring.ai.vertex.ai.embedding.location

領域

-

spring.ai.vertex.ai.embedding.apiEndpoint

Vertex AI Embedding API エンドポイント。

-

プレフィックス spring.ai.vertex.ai.embedding.multimodal は、VertexAI マルチモーダル埋め込みの埋め込みモデルの実装を構成できるプロパティプレフィックスです。

プロパティ 説明 デフォルト

spring.ai.vertex.ai.embedding.multimodal.enabled

Vertex AI Embedding API モデルを有効にします。

true

spring.ai.vertex.ai.embedding.multimodal.options.model

次のモデルを使用すると、マルチモーダル埋め込みを取得できます。

マルチモーダル埋め込み @001

spring.ai.vertex.ai.embedding.multimodal.options.dimensions

低次元の埋め込みを指定します。デフォルトでは、埋め込みリクエストはデータ型に対して 1408 浮動小数点ベクトルを返します。テキストおよびイメージデータに対して低次元の埋め込み (128, 256,, 512 浮動小数点ベクトル) を指定することもできます。

1408

spring.ai.vertex.ai.embedding.multimodal.options.video-start-offset-sec

ビデオセグメントの開始オフセット(秒単位)。指定されていない場合は、max(0, endOffsetSec - 120) で計算されます。

-

spring.ai.vertex.ai.embedding.multimodal.options.video-end-offset-sec

ビデオセグメントの終了オフセット (秒単位)。指定されていない場合は、min(ビデオの長さ、startOffSec + 120) で計算されます。startOffSec と endOffSec の両方が指定されている場合、endOffsetSec は min(startOffsetSec+120、endOffsetSec) に調整されます。

-

spring.ai.vertex.ai.embedding.multimodal.options.video-interval-sec

埋め込みが生成されるビデオの間隔。interval_sec の最小値は 4 です。間隔が 4 未満の場合は、InvalidArgumentError が返されます。間隔の最大値に制限はありません。ただし、間隔が min(ビデオの長さ、120 秒) より大きい場合は、生成される埋め込みの品質に影響します。デフォルト値: 16。

-

手動構成

VertexAiMultimodalEmbeddingModel [GitHub] (英語) は DocumentEmbeddingModel を実装します。

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 をビルドファイルに追加するには、"依存関係管理" セクションを参照してください。

次に、VertexAiMultimodalEmbeddingModel を作成し、埋め込みの生成に使用します。

VertexAiEmbeddigConnectionDetails connectionDetails =
    VertexAiEmbeddigConnectionDetails.builder()
        .withProjectId(System.getenv(<VERTEX_AI_GEMINI_PROJECT_ID>))
        .withLocation(System.getenv(<VERTEX_AI_GEMINI_LOCATION>))
        .build();

VertexAiMultimodalEmbeddingOptions options = VertexAiMultimodalEmbeddingOptions.builder()
    .withModel(VertexAiMultimodalEmbeddingOptions.DEFAULT_MODEL_NAME)
    .build();

var embeddingModel = new VertexAiMultimodalEmbeddingModel(connectionDetails, options);

Media imageMedial = new Media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("/test.image.png"));
Media videoMedial = new Media(new MimeType("video", "mp4"), new ClassPathResource("/test.video.mp4"));

var document = new Document("Explain what do you see on this video?", List.of(imageMedial, videoMedial), Map.of());

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

DocumentEmbeddingRequest embeddingRequest = new DocumentEmbeddingRequest(List.of(document),
        EmbeddingOptions.EMPTY);

EmbeddingResponse embeddingResponse = multiModelEmbeddingModel.call(embeddingRequest);

assertThat(embeddingResponse.getResults()).hasSize(3);