テキスト エンベディングを取得する

Vertex AI Text Embeddings API を使用すると、Vertex AI の生成 AI を使用してテキスト エンベディングを作成できます。テキスト エンベディングは、単語とフレーズ間の関係をとらえたテキストの数値表現です。ML モデル(特に生成 AI モデル)は、大規模なテキスト データセット内のパターンを識別してこうしたエンベディングを作成することに適しています。アプリケーションでは、言語を処理および生成するためにテキスト エンベディングを使用して、コンテンツに固有の複雑な意味とセマンティックな関係を認識できます。テキスト エンベディングは、Google 検索が終わるたび、あるいは音楽ストリーミングのおすすめが表示されるたびに操作します。

テキスト エンベディングの一般的なユースケースは次のとおりです。

  • セマンティック検索: 意味的類似性によってランク付けされたテキストを検索します。
  • 分類: 指定されたテキストと類似するテキスト属性を持つアイテムのクラスを返します。
  • クラスタリング: 指定したテキストと類似したテキスト属性を持つアイテムをクラスタ化します。
  • 外れ値検出: テキスト属性が指定されたテキストとの関連性が最も低いアイテムを返します。
  • 会話インターフェース: 会話レベルのエンベディング空間など、類似のレスポンスにつながる可能性のある文グループをクラスタ化します。

テキスト エンベディングは、テキストを浮動小数点数の配列(ベクトル)に変換することで機能します。こうしたベクトルは、テキストの意味を捉えるように設計されています。エンベディング配列の長さは、ベクトルの次元数と呼ばれます。たとえば、テキストの一節は、数百の次元を含むベクトルで表せます。次に、2 つのテキストのベクトル表現間の数値的な距離を計算することで、アプリケーションでオブジェクト間の類似性を判断できます。

Vertex AI Text Embeddings API は、密なベクトル表現を使用し、たとえば、text-embedding-gecko は 768 次元のベクトルを使用します。密なベクトル エンベディング モデルは、大規模言語モデルで使用されるものと同様のディープ ラーニング手法を使用します。単語を直接数値にマッピングする傾向があるスパース ベクトルとは異なり、密なベクトルは、テキストの意味をより適切に表現するように設計されています。生成 AI で密なベクトル エンベディングを使用するメリットは、単語や構文が一致する箇所を直接検索するのではなく、同じ言語を使用していなくても、クエリの意味に一致する文章をより適切に検索できることです。

前提条件

エンベディングを正常に作成するには、特定の前提条件があります。始める前に、クイックスタート: テキスト エンベディングを試すをご覧ください。

この Colab を使用して、新しくリリースされたテキスト エンベディング モデル(textembedding-geckotextembedding-gecko-multilingual)を呼び出します。

Jupyter ノートブック: Colab または Jupyter ノートブックを使用してテキスト エンベディング モデルを呼び出します。
Colab で実行

ユースケースの例: 本をおすすめする chatbot を開発する

本をおすすめする chatbot を開発する場合は、まず、ディープ ニューラル ネットワーク(DNN)を使用して、それぞれの本をエンベディング ベクトルに変換します。1 つのエンベディング ベクトルが 1 冊の本を表します。DNN への入力として本のタイトルだけか、テキストの内容だけを与えることができます。また、この両方とジャンルなど書籍を説明する他のメタデータを併用することもできます。

この例のエンベディングは、何千もの書籍タイトル、その要約とジャンルから構成されています。たとえば、「Wuthering Heights by Emily Brontë」と「Persuasion by Jane Austen」のような書籍の表現は類似した(数値的な表現の距離が近い)表現になりますが、「The Great Gatsby by F. Scott Fitzgerald」という書籍の数値的な表現は、時代やジャンル、要約が似ていないため、距離が遠くなります。

入力は、エンベディング空間の向きに影響を与えます。たとえば、入力が書籍のタイトルのみの場合、タイトルは似ていても要約が大きく異なる 2 つの書籍が近い状態になる可能性があります。ただし、入力にタイトルと要約を含めると、これらの書籍はエンベディング空間では類似性が低くなります。

この chatbot は生成 AI と連携して、クエリに基づいて書籍の要約を生成し、ユーザーが関心を持ちそうな(または好みでないような)書籍を提案します。

サポートされているモデル

利用可能なテキスト エンベディング モデルのバージョンについては、利用可能な安定版モデルをご覧ください。利用可能なテキスト エンベディング モデルの最新バージョンについては、最新モデルをご覧ください。

安定版のモデル バージョン(textembedding-gecko@003 など)を指定することを強くおすすめします。最新バージョンのモデルはプレビュー版であり、一般提供(GA)版ではありません。最新バージョンはプレビュー版であるため、本番環境への対応が保証されているわけではありません。

下位互換性のあるエンベディングを必要とするアプリケーションには、安定版のモデル バージョン(textembedding-gecko@003 など)を使用することが特に重要です。下位互換性が問題ではなく、最新のモデル バージョンを使用する場合は、@latest を明示的に指定する必要があります。バージョンが指定されていない場合、textembedding-gecko はデフォルトで textembedding-gecko@003 に設定され、textembedding-gecko-multilingual はデフォルトで textembedding-gecko-multilingual@001 に設定されます。

最新モデル

プレビュー版では、次の 2 つのモデルを使用できます。

  • text-embedding-preview-0409
  • text-multilingual-embedding-preview-0409

これらのモデルは、検索や分類といったさまざまな下流のタスクをカバーする確立されたベンチマークで、以前のモデルよりも改善されています。詳細については、Gecko: 大規模言語モデルから抽出した汎用テキスト エンベディングをご覧ください。

これらのモデルは、それぞれ textembedding-gecko@003 モデルや textembedding-gecko-multilingual@001 モデルよりもエンベディングの品質が向上しています。また、どちらのモデルも model-name@version 命名規則から外れています。モデルは、@version サフィックスなしで指定します。以下に例を示します。

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT/locations/us-central1/publishers/google/models/text-embedding-preview-0409:predict -d $'{
  "instances": [
    { "content": "What is life?"}
  ],
}'

新しいモデルは、品質の向上に加え、次の機能をサポートしています。

  • 新しいパラメータ outputDimensionality がサポートされました。このパラメータは、エンベディングのサイズを小さくする(たとえばストレージを最適化する目的で)ために使用できます。

    • QUESTION_ANSWERING
    • FACT_VERIFICATION

    2 つの新しいタスクタイプがサポートされました。他のタスクタイプについては、モデル リファレンスをご覧ください。

次の例では、新しい機能を示します。

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT/locations/us-central1/publishers/google/models/text-embedding-preview-0409:predict -d $'{
  "instances": [
    {
      "task_type": "QUESTION_ANSWERING",
      "content": "What is life?"
    }
  ],
"parameters": {
    "outputDimensionality": 256
  }
}'

これらのモデルを使用する場合は、次の制限事項が適用されます。

  • ミッション クリティカルなシステムや本番環境のシステムでは、これらのプレビュー モデルを使用しないでください。
  • これらのモデルは us-central1 でのみ使用できます。
  • バッチ予測はサポートされていません。
  • カスタマイズはサポートされていません。

テキストのスニペットに対するテキスト エンベディングを取得する

テキストのスニペットのテキスト エンベディングを取得するには、Vertex AI API または Vertex AI SDK for Python を使用します。us-central1 では、入力テキストが 1 つのリクエストにつき 250 個までに制限されています。他のリージョンでは、入力テキストは最大 5 個です。各入力テキストのトークンの上限は 3,072 です。この長さより長い入力は暗黙的に切り捨てられます。autoTruncatefalse に設定して、暗黙的な切り捨てを無効にすることもできます。

これらの例では、textembedding-gecko@003 モデルを使用します。

REST

テキスト エンベディングを取得するには、パブリッシャー モデルのモデル ID を指定して POST リクエストを送信します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: 実際のプロジェクト ID
  • TEXT: エンベディングを生成するテキスト。上限: 5 テキスト(1 テキストあたり最大 3,072 トークン)。
  • AUTO_TRUNCATE: false に設定した場合、テキストがトークンの上限を超えると、リクエストが失敗します。デフォルト値は true です。

HTTP メソッドと URL:

POST https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict

リクエストの本文(JSON):

{
  "instances": [
    { "content": "TEXT"}
  ],
  "parameters": {
    "autoTruncate": AUTO_TRUNCATE
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。容量を節約するために、values は切り捨てられています。

curl コマンドの例

MODEL_ID="textembedding-gecko@003"
PROJECT_ID=PROJECT_ID

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/${MODEL_ID}:predict -d \
$'{
  "instances": [
    { "content": "What is life?"}
  ],
}'

Python

Python をインストールまたは更新する方法については、Vertex AI SDK for Python をインストールするをご覧ください。詳細については、Python API リファレンス ドキュメントをご覧ください。

from typing import List

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

def embed_text(
    texts: List[str] = ["banana muffins? ", "banana bread? banana muffins?"],
    task: str = "RETRIEVAL_DOCUMENT",
    model_name: str = "textembedding-gecko@003",
) -> List[List[float]]:
    """Embeds texts with a pre-trained, foundational model."""
    model = TextEmbeddingModel.from_pretrained(model_name)
    inputs = [TextEmbeddingInput(text, task) for text in texts]
    embeddings = model.get_embeddings(inputs)
    return [embedding.values for embedding in embeddings]

Go

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Go の設定手順を完了してください。詳細については、Vertex AI Go API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

import (
	"context"
	"fmt"
	"io"

	aiplatform "cloud.google.com/go/aiplatform/apiv1beta1"
	"cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb"
	"google.golang.org/api/option"
	"google.golang.org/protobuf/types/known/structpb"
)

// generateEmbeddings creates embeddings from text provided.
func generateEmbeddings(w io.Writer, prompt, project, location, publisher, model string) error {
	ctx := context.Background()

	apiEndpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location)

	client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(apiEndpoint))
	if err != nil {
		fmt.Fprintf(w, "unable to create prediction client: %v", err)
		return err
	}
	defer client.Close()

	// PredictRequest requires an endpoint, instances, and parameters
	// Endpoint
	base := fmt.Sprintf("projects/%s/locations/%s/publishers/%s/models", project, location, publisher)
	url := fmt.Sprintf("%s/%s", base, model)

	// Instances: the prompt
	promptValue, err := structpb.NewValue(map[string]interface{}{
		"content": prompt,
	})
	if err != nil {
		fmt.Fprintf(w, "unable to convert prompt to Value: %v", err)
		return err
	}

	// PredictRequest: create the model prediction request
	req := &aiplatformpb.PredictRequest{
		Endpoint:  url,
		Instances: []*structpb.Value{promptValue},
	}

	// PredictResponse: receive the response from the model
	resp, err := client.Predict(ctx, req)
	if err != nil {
		fmt.Fprintf(w, "error in prediction: %v", err)
		return err
	}

	fmt.Fprintf(w, "embeddings generated: %v", resp.Predictions[0])
	return nil
}

Java

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Java の設定手順を完了してください。詳細については、Vertex AI Java API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

import static java.util.stream.Collectors.toList;

import com.google.cloud.aiplatform.v1beta1.EndpointName;
import com.google.cloud.aiplatform.v1beta1.PredictRequest;
import com.google.cloud.aiplatform.v1beta1.PredictResponse;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceClient;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceSettings;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PredictTextEmbeddingsSample {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // Details about text embedding request structure and supported models are available in:
    // https://cloud.google.com/vertex-ai/docs/generative-ai/embeddings/get-text-embeddings
    String endpoint = "us-central1-aiplatform.googleapis.com:443";
    String project = "YOUR_PROJECT_ID";
    String model = "textembedding-gecko@003";
    predictTextEmbeddings(
        endpoint,
        project,
        model,
        List.of("banana bread?", "banana muffins?"),
        "RETRIEVAL_DOCUMENT");
  }

  // Gets text embeddings from a pretrained, foundational model.
  public static List<List<Float>> predictTextEmbeddings(
      String endpoint, String project, String model, List<String> texts, String task)
      throws IOException {
    PredictionServiceSettings settings =
        PredictionServiceSettings.newBuilder().setEndpoint(endpoint).build();
    Matcher matcher = Pattern.compile("^(?<Location>\\w+-\\w+)").matcher(endpoint);
    String location = matcher.matches() ? matcher.group("Location") : "us-central1";
    EndpointName endpointName =
        EndpointName.ofProjectLocationPublisherModelName(project, location, "google", model);

    // You can use this prediction service client for multiple requests.
    try (PredictionServiceClient client = PredictionServiceClient.create(settings)) {
      PredictRequest.Builder request =
          PredictRequest.newBuilder().setEndpoint(endpointName.toString());
      for (int i = 0; i < texts.size(); i++) {
        request.addInstances(
            Value.newBuilder()
                .setStructValue(
                    Struct.newBuilder()
                        .putFields("content", valueOf(texts.get(i)))
                        .putFields("taskType", valueOf(task))
                        .build()));
      }
      PredictResponse response = client.predict(request.build());
      List<List<Float>> floats = new ArrayList<>();
      for (Value prediction : response.getPredictionsList()) {
        Value embeddings = prediction.getStructValue().getFieldsOrThrow("embeddings");
        Value values = embeddings.getStructValue().getFieldsOrThrow("values");
        floats.add(
            values.getListValue().getValuesList().stream()
                .map(Value::getNumberValue)
                .map(Double::floatValue)
                .collect(toList()));
      }
      return floats;
    }
  }

  private static Value valueOf(String s) {
    return Value.newBuilder().setStringValue(s).build();
  }
}

Node.js

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Node.js の設定手順を完了してください。詳細については、Vertex AI Node.js API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

async function main(
  project,
  model = 'textembedding-gecko@003',
  texts = 'banana bread?;banana muffins?',
  task = 'RETRIEVAL_DOCUMENT',
  apiEndpoint = 'us-central1-aiplatform.googleapis.com'
) {
  const aiplatform = require('@google-cloud/aiplatform');
  const {PredictionServiceClient} = aiplatform.v1;
  const {helpers} = aiplatform; // helps construct protobuf.Value objects.
  const clientOptions = {apiEndpoint: apiEndpoint};
  const match = apiEndpoint.match(/(?<Location>\w+-\w+)/);
  const location = match ? match.groups.Location : 'us-centra11';
  const endpoint = `projects/${project}/locations/${location}/publishers/google/models/${model}`;

  async function callPredict() {
    const instances = texts
      .split(';')
      .map(e => helpers.toValue({content: e, taskType: task}));
    const request = {endpoint, instances};
    const client = new PredictionServiceClient(clientOptions);
    const [response] = await client.predict(request);
    console.log('Got predict response');
    const predictions = response.predictions;
    for (const prediction of predictions) {
      const embeddings = prediction.structValue.fields.embeddings;
      const values = embeddings.structValue.fields.values.listValue.values;
      console.log('Got prediction: ' + JSON.stringify(values));
    }
  }

  callPredict();
}

ベクトル データベースにエンベディングを追加する

エンベディングを生成すると、Vector Search のようなベクトル データベースにエンベディングを追加できます。これにより低レイテンシでの検索が可能になり、データサイズが大きくなるほどそれが重要になります。

ベクトル検索の詳細については、ベクトル検索の概要をご覧ください。

2023 年 8 月以降にリリースされたモデルの API の変更

textembedding-gecko@003textembedding-gecko-multilingual@001 など、2023 年 8 月以降にリリースされたモデル バージョンを使用する場合、新しいタスク タイプ パラメータとオプションのタイトルがあります(task_type=RETRIEVAL_DOCUMENT でのみ有効)。

これらの新しいパラメータは、これらの公開プレビュー モデルと、今後のすべての安定版のモデルに適用されます。

{
  "instances": [
    {
      "task_type": "RETRIEVAL_DOCUMENT",
      "title": "document title",
      "content": "I would like embeddings for this text!"
    },
  ]
}

task_type パラメータは、モデルが質の高いエンベディングを生成できるように、対象となるダウンストリーム アプリケーションとして定義されます。これは次のいずれかの値を取る文字列です。

task_type 説明
RETRIEVAL_QUERY 指定したテキストが検索または取得設定のクエリであることを指定します。
RETRIEVAL_DOCUMENT 指定したテキストが検索または取得設定のドキュメントであることを指定します。
SEMANTIC_SIMILARITY 指定したテキストが意味的テキスト類似性(STS)で使用されることを指定します。
CLASSIFICATION エンベディングが分類に使用されることを指定します。
CLUSTERING エンベディングがクラスタリングに使用されることを指定します。
QUESTION_ANSWERING クエリ エンベディングが質問への回答に使用されることを指定します。ドキュメント側には RETRIEVAL_DOCUMENT を使用します。
FACT_VERIFICATION クエリ エンベディングが事実確認に使用されることを指定します。

textembedding-gecko-multilingual モデルの言語対応

textembedding-gecko-multilingual@001 モデルは、Arabic (ar)Bengali (bn)English (en)Spanish (es)German (de)Persian (fa)Finnish (fi)French (fr)Hindi (hi)Indonesian (id)Japanese (ja)Korean (ko)Russian (ru)Swahili (sw)Telugu (te)Thai (th)Yoruba (yo)Chinese (zh) で評価されています。

サポートされている言語は、AfrikaansAlbanianAmharicArabicArmenianAzerbaijaniBasqueBelarusianBengaliBulgarianBurmeseCatalanCebuanoChichewaChineseCorsicanCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHawaiianHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanKurdishKyrgyzLaoLatinLatvianLithuanianLuxembourgishMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianNepaliNorwegianPashtoPersianPolishPortuguesePunjabiRomanianRussianSamoanScottish GaelicSerbianShonaSindhiSinhalaSlovakSlovenianSomaliSothoSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshWest FrisianXhosaYiddishYorubaZulu です。

次のステップ