このページでは、Text Embedding API を使用してテキスト エンベディングを作成する方法について説明します。
Vertex AI は、Text Embedding API を介して Google Distributed Cloud(GDC)エアギャップでテキスト エンベディングをサポートしています。テキスト エンベディングはベクトル表現を使用します。
テキスト エンベディングは、サポートされている任意の言語で記述されたテキストデータを数値ベクトルに変換します。これらのベクトル表現は、対象となる単語の意味論的意味とコンテキストを取り込むように設計されています。テキスト エンベディング モデルは、ドキュメントの検索、質問と回答、分類、テキストの事実確認など、さまざまなタスクタイプに最適化されたエンベディングを生成できます。
テキスト エンベディングで使用される主なコンセプトの詳細については、次のドキュメントをご覧ください。
- エンベディングの詳細については、テキスト エンベディングの概要をご覧ください。
- テキスト エンベディング モデルの詳細については、エンベディング モデルをご覧ください。
- タスクタイプが最適化されたエンベディングを生成する方法については、エンベディングのタスクタイプを選択するをご覧ください。
- 各エンベディング モデルでサポートされている言語については、サポートされているテキスト エンベディング言語をご覧ください。
始める前に
GDC プロジェクトでテキスト エンベディングを使用する前に、次の手順を行います。
- Vertex AI 用にプロジェクトを設定します。
- 言語とタスクタイプに応じて、テキスト エンベディングに使用可能なモデルのいずれかを選択します。
- 使用するモデルに応じて、Text Embedding API または Text Embedding Multilingual API を有効にします。
ユーザーまたはサービス アカウントに、Text Embedding または Text Embedding Multilingual への適切なアクセス権を付与します。詳細については、次のドキュメントをご覧ください。
- 必要なロールについては、IAM 権限を準備するをご覧ください。
- サービス アカウントのロール バインディングについては、サービス アカウントを設定するをご覧ください。
モデル リクエスト、サービス アカウント、IAM ロール バインディングには同じプロジェクトを使用する必要があります。
テキストのスニペットに対するテキスト エンベディングを取得する
前提条件を満たしたら、Text Embedding モデルまたは Text Embedding Multilingual モデルを使用して、API または SDK for Python でテキスト スニペットのテキスト エンベディングを取得できます。
次の例では、text-embedding-004
モデルを使用します。
Text Embedding API に REST リクエストを送信します。それ以外の場合は、Python スクリプトからモデルを操作してテキスト エンベディングを取得します。
REST
テキスト エンベディングを取得するには、モデル エンドポイントを指定して POST リクエストを送信します。
リクエストを行う手順は次のとおりです。
リクエスト コンテンツを
request.json
という名前の JSON ファイルに保存します。ファイルは次の例のようになっている必要があります。{ "instances": [ { "content": "What is life?", "task_type": "", "title": "" } ] }
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 スクリプトからテキスト エンベディングを取得する手順は次のとおりです。
リクエスト コンテンツを
request.json
という名前の JSON ファイルに保存します。ファイルは次の例のようになっている必要があります。{ "instances": [ { "content": "What is life?", "task_type": "", "title": "" } ] }
必要な Python ライブラリをインストールします。
pip install absl-py
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
など)。この値は、開発環境にいる場合にのみ必要です。それ以外の場合は省略します。
リクエストを送信します。
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"}