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

このページでは、Text Embedding API を使用してテキスト エンベディングを作成する方法について説明します。

Vertex AI は、Text Embedding API を介して Google Distributed Cloud(GDC)エアギャップでテキスト エンベディングをサポートしています。テキスト エンベディングはベクトル表現を使用します。

テキスト エンベディングは、サポートされている任意の言語で記述されたテキストデータを数値ベクトルに変換します。これらのベクトル表現は、対象となる単語の意味論的意味とコンテキストを取り込むように設計されています。テキスト エンベディング モデルは、ドキュメントの検索、質問と回答、分類、テキストの事実確認など、さまざまなタスクタイプに最適化されたエンベディングを生成できます。

テキスト エンベディングで使用される主なコンセプトの詳細については、次のドキュメントをご覧ください。

始める前に

GDC プロジェクトでテキスト エンベディングを使用する前に、次の手順を行います。

  1. Vertex AI 用にプロジェクトを設定します
  2. 言語タスクタイプに応じて、テキスト エンベディングに使用可能なモデルのいずれかを選択します。
  3. 使用するモデルに応じて、Text Embedding API または Text Embedding Multilingual API を有効にします
  4. ユーザーまたはサービス アカウントに、Text Embedding または Text Embedding Multilingual への適切なアクセス権を付与します。詳細については、次のドキュメントをご覧ください。

  5. Vertex AI クライアント ライブラリをインストールします

  6. 認証トークンを取得します

モデル リクエスト、サービス アカウント、IAM ロール バインディングには同じプロジェクトを使用する必要があります。

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

前提条件を満たしたら、Text Embedding モデルまたは Text Embedding Multilingual モデルを使用して、API または SDK for Python でテキスト スニペットのテキスト エンベディングを取得できます。

次の例では、text-embedding-004 モデルを使用します。

Text Embedding API に REST リクエストを送信します。それ以外の場合は、Python スクリプトからモデルを操作してテキスト エンベディングを取得します。

REST

テキスト エンベディングを取得するには、モデル エンドポイントを指定して POST リクエストを送信します。

リクエストを行う手順は次のとおりです。

  1. リクエスト コンテンツを request.json という名前の JSON ファイルに保存します。ファイルは次の例のようになっている必要があります。

    {
      "instances": [
        {
          "content": "What is life?",
          "task_type": "",
          "title": ""
        }
      ]
    }
    
  2. curl ツールを使用してリクエストを行います。

    curl -X POST \
    -H "Authorization: Bearer TOKEN"\
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://ENDPOINT:443/v1/projects/PROJECT/locations/PROJECT/endpoints/MODEL:predict"
    

    次のように置き換えます。

    • TOKEN: 取得した認証トークン
    • ENDPOINT: 組織で使用するテキスト エンベディングまたはテキスト エンベディング多言語エンドポイント。詳細については、サービス ステータスとエンドポイントを表示するをご覧ください。
    • PROJECT: プロジェクト名。
    • MODEL: 使用するモデル。使用可能な値は次のとおりです。

      • テキスト エンベディング モデルの endpoint-text-embedding
      • endpoint-text-embedding-multilingual(Text Embedding Multilingual モデルの場合)。

次のような JSON レスポンスを取得する必要があります。

{"predictions":[[-0.00668720435,3.20804138e-05,-0.0281705819,-0.00954890903,-0.0818724185,0.0150693133,-0.00677698106, …. ,0.0167487375,-0.0534791686,0.00208711182,0.032938987,-0.01491543]],"deployedModelId":"text-embedding","model":"models/text-embedding/1","modelDisplayName":"text-embedding","modelVersionId":"1"}

Python

Python スクリプトからテキスト エンベディングを取得する手順は次のとおりです。

  1. Vertex AI Platform クライアント ライブラリをインストールします

  2. リクエスト コンテンツを request.json という名前の JSON ファイルに保存します。ファイルは次の例のようになっている必要があります。

    {
      "instances": [
        {
          "content": "What is life?",
          "task_type": "",
          "title": ""
        }
      ]
    }
    
  3. 必要な Python ライブラリをインストールします。

    pip install absl-py
    
  4. client.py という名前の Python ファイルを作成します。ファイルは次の例のようになっている必要があります。

    import json
    import os
    from typing import Sequence
    
    import grpc
    from absl import app
    from absl import flags
    
    from google.protobuf import json_format
    from google.protobuf.struct_pb2 import Value
    from google.cloud.aiplatform_v1.services import prediction_service
    
    _INPUT = flags.DEFINE_string("input", None, "input", required=True)
    _HOST = flags.DEFINE_string("host", None, "Prediction endpoint", required=True)
    _ENDPOINT_ID = flags.DEFINE_string("endpoint_id", None, "endpoint id", required=True)
    _TOKEN = flags.DEFINE_string("token", None, "STS token", required=True)
    
    # ENDPOINT_RESOURCE_NAME is a placeholder value that doesn't affect prediction behavior.
    ENDPOINT_RESOURCE_NAME="projects/PROJECT/locations/PROJECT/endpoints/MODEL"
    
    os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = CERT_NAME
    
    # predict_client_secure builds a client that requires TLS
    def predict_client_secure(host):
      with open(os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"], 'rb') as f:
          creds = grpc.ssl_channel_credentials(f.read())
    
      channel_opts = ()
      channel_opts += (('grpc.ssl_target_name_override', host),)
      client = prediction_service.PredictionServiceClient(
          transport=prediction_service.transports.grpc.PredictionServiceGrpcTransport(
              channel=grpc.secure_channel(target=host+":443", credentials=creds, options=channel_opts)))
      return client
    
    def predict_func(client, instances, token):
      resp = client.predict(
          endpoint=ENDPOINT_RESOURCE_NAME,
          instances=instances,
          metadata=[ ("x-vertex-ai-endpoint-id", _ENDPOINT_ID.value), ("authorization", "Bearer " + token),])
      print(resp)
    
    def main(argv: Sequence[str]):
      del argv  # Unused.
      with open(_INPUT.value) as json_file:
          data = json.load(json_file)
          instances = [json_format.ParseDict(s, Value()) for s in data["instances"]]
    
      client = predict_client_secure(_HOST.value,)
    
      predict_func(client=client, instances=instances, token=_TOKEN.value)
    
    if __name__=="__main__":
      app.run(main)
    

    次のように置き換えます。

    • PROJECT: プロジェクト名。
    • MODEL: 使用するモデル。使用できる値は次のとおりです。
      • テキスト エンベディング モデルの endpoint-text-embedding
      • endpoint-text-embedding-multilingual(Text Embedding Multilingual モデルの場合)。
    • CERT_NAME: 認証局(CA)証明書ファイルの名前(org-1-trust-bundle-ca.cert など)。この値は、開発環境にいる場合にのみ必要です。それ以外の場合は省略します。
  5. リクエストを送信します。

    python client.py --token=TOKEN --host=ENDPOINT --input=request.json --endpoint_id=MODEL
    

    次のように置き換えます。

    • TOKEN: 取得した認証トークン
    • ENDPOINT: 組織で使用するテキスト エンベディングまたはテキスト エンベディング多言語エンドポイント。詳細については、サービス ステータスとエンドポイントを表示するをご覧ください。
    • MODEL: 使用するモデル。使用可能な値は次のとおりです。

      • テキスト エンベディング モデルの endpoint-text-embedding
      • endpoint-text-embedding-multilingual(Text Embedding Multilingual モデルの場合)。

次のような JSON レスポンスを取得する必要があります。

{"predictions":[[-0.00668720435,3.20804138e-05,-0.0281705819,-0.00954890903,-0.0818724185,0.0150693133,-0.00677698106, …. ,0.0167487375,-0.0534791686,0.00208711182,0.032938987,-0.01491543]],"deployedModelId":"text-embedding","model":"models/text-embedding/1","modelDisplayName":"text-embedding","modelVersionId":"1"}