カスタム エンベディングを使用する

データ用に独自のカスタム ベクトル エンベディングをすでに作成している場合は、Vertex AI Search にアップロードして、Vertex AI Search でクエリを実行するときに使用できます。

この機能は、カスタム構造化データまたはメタデータ付き非構造化データを含むデータストアで使用できます。この機能は、メディア検索と医療検索ではご利用いただけません。

デフォルトでは、Vertex AI Search は構成なしでベクトル エンベディングを自動的に生成します。エンベディングの作成に慣れていない場合は、Vertex AI Search にエンベディングの作成と使用を任せることをおすすめします。ただし、データに独自のエンベディングを作成した場合は、Vertex AI Search によって生成されたエンベディングではなく、独自のエンベディングを使用するほうが好ましいかもしれません。特に、カスタム エンベディングに検索の取得とランキングを強化できる追加のコンテキストが含まれている場合はそれが当てはまります。次に例を示します。

  • エンベディングは、公開データでトレーニングしても意味的類似性が捉えられない内部用語などのカスタム単語でトレーニングされています。たとえば、非公開ドキュメントにのみ表示される組織固有の用語などです。
  • ユーザー プロファイルのエンベディングを作成しました。このエンベディングを使用して、セマンティックに関連するパーソナライズされたドキュメントのランキングを作成したいとします。エンベディングを使用してパーソナライズに基づくランキングを取得できます。これにより、関連性に基づくランキング用の Google のドキュメント エンベディングを補強できます。

独自のエンベディングを使用するには:

  1. 始める前に: エンベディングがすべての要件を満たしていることを確認する
  2. エンベディングを含むデータを取り込む: エンベディングを含むドキュメントを取り込みます。
  3. スキーマを更新する: 重要なプロパティ フィールドとディメンション仕様を使用してスキーマを更新する
  4. エンベディングを指定する: エンベディングを、グローバルに指定するか、検索リクエストごとに指定します。

始める前に

始める前に、エンベディングが次の要件を満たしていることを確認してください。

  • エンベディングは、構造化データとメタデータを含む非構造化データでサポートされています
  • エンベディングは 1 次元配列として指定する必要があります
  • エンベディングの次元は 1~768(両端を含む)の整数にする必要があります
  • エンベディングはテキストと画像でサポートされています。動画はサポートされていません
  • エンベディング キー プロパティ フィールドとしてタグ付けできるフィールドは 2 つまでです。エンベディングの A/B テストなどのケースでは、2 つのフィールドを使用する場合があります。
  • 現在、エンべディング フィールドのキー プロパティの指定は、設定後に削除できません

エンベディングを使用してデータを取り込む

ドキュメントのエンベディングは、ドキュメントの取り込み時に、そのドキュメントのデータまたはメタデータの一部として 1~2 つのフィールドに格納できます。

エンベディングを含むデータを取り込むには:

  1. データの種類に応じて、取り込み用のデータを準備します。

    • 構造化データ: データを準備する際は、各ドキュメントのエンベディングを 1 次元配列としてドキュメント内の 1~2 つのフィールドに含めます。最大 2 つのエンベディングを指定できます(エンベディング間の A/B テストを行う場合など)。各エンベディングは、ドキュメント内の独自のフィールドで提供する必要があります。例: "example_embedding_vector": [0.1, 0.2, 0.3 ...]

      取り込み用にデータを準備するのドキュメントの構造化データの準備に関するガイダンスに沿って操作します。

    • メタデータを含む非構造化データ: データを準備する際は、各ドキュメントのエンベディングを 1 次元配列としてドキュメント メタデータのフィールドに含めます。最大 2 つのエンベディングを指定できます(エンベディング間の A/B テストなど)。各エンベディングは、ドキュメント メタデータ内の独自のフィールドで指定する必要があります。例: "example_embedding_vector": [0.1, 0.2, 0.3 ...]

      取り込み用にデータを準備するのドキュメントの取り込み方法(Cloud Storage または BigQuery)の、メタデータを含む非構造化データの準備に関するガイダンスに沿って操作します。

  2. 検索データストアを作成するの、データタイプに応じた手順に沿って、エンベディングを含むドキュメントを取り込みます。

次に、正しいエンベディング フィールドを使用するようにスキーマを更新します。

スキーマを更新する

Google Cloud コンソールまたは API を使用して、エンベディング フィールドのキー プロパティ マッピングとディメンションでスキーマを更新します。

コンソール

Google Cloud コンソールを使用してスキーマを更新する手順は次のとおりです。

  1. Google Cloud コンソールで、[AI Applications] ページに移動します。

    AI Applications

  2. ナビゲーション メニューで [データストア] をクリックします。

  3. [名前] 列で、更新するスキーマを含むデータストアをクリックします。

  4. [スキーマ] タブをクリックして、データのスキーマを表示します。

  5. [編集] ボタンをクリックします。

  6. スキーマでエンベディング フィールドを見つけ、[キー プロパティ] 列で、そのフィールドのキー プロパティとして embedding_vector を選択します。

    2 つ目のエンベディング フィールドがある場合は、そのフィールドに対してこの手順を繰り返します。

  7. [ディメンション] 列に、そのエンベディング フィールドのディメンション数を入力します。

    2 つ目のエンベディング フィールドがある場合は、そのフィールドに対してこの手順を繰り返します。

  8. [保存] をクリックして、スキーマの変更を適用します。

    スキーマを更新した後、データストアのサイズによっては、インデックスの再作成に最大 24 時間かかることがあります。

REST

API を使用してスキーマを更新する手順は次のとおりです。

  1. スキーマを更新するREST の手順に沿って、各エンベディング フィールドのキー プロパティ マッピングとディメンションの数を指定します。

    • "keyPropertyMapping": "embedding_vector"
    • "dimension": NUMBER_OF_DIMENSIONS

    たとえば、フィールド example_embedding_vector の 768 ディメンションを含む JSON スキーマの形式は次のようになります。

      {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "example_embedding_vector": {
            "type": "array",
            "keyPropertyMapping": 'embedding_vector',
            "dimension": 768,
            "items": {
              "type": "number"
            }
          }
        }
      }
    

    更新スキーマ リクエストでは、上記の形式の JSON が JSON 文字列として含まれます。

      "jsonSchema": "{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"type\":\"object\",\"properties\":{\"example_embedding_vector\":{\"type\":\"array\",\"keyPropertyMapping\":\"embedding_vector\",\"dimension\":768,\"items\":{\"type\":\"number\"}}}}"
    

    スキーマを更新した後、データストアのサイズによっては、インデックスの再作成に最大 24 時間かかることがあります。

次に、エンベディングを指定します。

エンベディングを指定する

スキーマの更新からのインデックス登録作成が完了したら、エンベディング仕様を含む検索リクエストを送信できます。

エンベディングを指定する方法は 2 つあります。

エンベディングをグローバルに指定する

Google Cloud コンソールまたは API を使用して、すべての検索リクエストで同じエンベディングを指定できます。

コンソール

すべての検索リクエストに同じエンベディング仕様を指定するには、エンベディング仕様を使用してサービス提供設定を更新します。

  1. Google Cloud コンソールで、[AI Applications] ページに移動します。

    AI Applications

  2. 更新するスキーマを含むデータストアの [表示] をクリックします。

  3. [構成] ページに移動し、[サービス提供] タブをクリックします。

  4. [エンベディング フィールドのパス] に、エンベディング キー プロパティにマッピングしたフィールドの名前を入力します。

  5. [ランキング式] に、結果のランキングを制御する関数を入力します。変数は、入力した式に従って重み付けされます。ランキング式は、function, { " + ", function } 形式で、+ で結合された単一の関数または複数の関数です。

    サポートされる関数は次のとおりです。

    • DOUBLE * relevance_score
    • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

    次の変数が使用できます。

    • relevance_score: ドキュメントの関連性を測定するために Vertex AI Search から提供される事前定義変数。 スコアの範囲は 0~1.0 です(両端を含みます)。
    • dotProduct(): Vertex AI Search によって提供される事前定義関数。この関数には、embeddingVector.fieldPath と同じフィールド名を指定する必要があります。

    例:

    • 0.3 * relevance_score
    • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)

REST

すべての検索リクエストに同じエンベディング仕様を指定するには、embeddingConfig を使用して servingConfig を更新します。

  1. 更新するフィールドを使用して servingConfig エンティティをパッチ適用します。updateMask を使用して、更新するフィールドを指定します。

    次の例では、embeddingConfigexample_embedding_field フィールドのエンベディングを使用し、relevance_score に 0.5 の重みを付与します。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d '{
          "name": "projects/PROJECT_ID/locations/LOCATION/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search",
          "embeddingConfig": {
            "fieldPath": "example_embedding_field"
          },
          "ranking_expression": "0.5 * relevance_score"
        }' \
    'https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/LOCATION/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search?updateMask=embeddingConfig,rankingExpression'
    
    • fieldPath: エンベディング キー プロパティにマッピングしたフィールドの名前。
    • ranking_expression: 結果のランキングを制御します。変数は、入力した式に従って重み付けされます。ランキング式は、function, { " + ", function } 形式で、+ で結合された単一の関数または複数の関数です。

    サポートされる関数は次のとおりです。

    • DOUBLE * relevance_score
    • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

    次の変数が使用できます。

    • relevance_score: Vertex AI Search から提供される事前定義変数。
    • dotProduct(): Vertex AI Search によって提供される事前定義関数。ドット積は正規化されます。この関数には、embeddingVector.fieldPath と同じフィールド名を指定する必要があります。

    例:

    • 0.3 * relevance_score
    • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)
  2. 検索リクエストを送信すると、servingConfig.embeddingConfig が自動的に含まれます。

    別の embeddingSpec を明示的に含む検索リクエストを送信すると、servingConfig.embeddingConfig がオーバーライドされます。単一の検索リクエストにエンベディング仕様を指定する方法については、リクエストごとの手順をご覧ください。

検索リクエストごとにエンベディングを指定する

API を使用して、1 回の検索リクエストのエンベディング仕様を指定できます。リクエストごとのエンベディング仕様は、グローバル エンベディング仕様よりも優先されます。

  1. embeddingSpec を含む検索リクエストを送信します。

    次の embeddingSpec の例では、フィールド example_embedding_field でエンベディングを使用し、「Example query」を入力ベクトルとして指定し、ランキングの計算時に relevance_score に 0.5、example_embedding_field に 0.3 の重みを付けています。

      "embeddingSpec": {
        "embeddingVectors": [{
          "fieldPath": "example_embedding_field",
          "vector": [
            0.96241474,
            -0.45999944,
            0.108588696
          ]
        }]
      },
      "ranking_expression": "0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)"
    
    • fieldPath: エンベディング キー プロパティにマッピングしたフィールドの名前。
    • vector: 配列として提供される入力ベクトル。
    • ranking_expression: 結果のランキングを制御します。変数は、入力した式に従って重み付けされます。ランキング式は、function, { " + ", function } 形式で、+ で結合された単一の関数または複数の関数です。

      サポートされる関数は次のとおりです。

      • DOUBLE * relevance_score
      • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

      次の変数が使用できます。

      • relevance_score: ドキュメントの関連性を測定するために Vertex AI Search から提供される事前定義変数。スコアの範囲は 0~1.0 です(両端を含みます)。
      • dotProduct(): Vertex AI Search によって提供される事前定義関数。この関数には、embeddingVector.fieldPath と同じフィールド名を指定する必要があります。

      例:

      • 0.3 * relevance_score
      • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)
  2. 検索レスポンスで結果を取得します。各検索結果には、関連性スコアと内積値が含まれます。例:

    "modelScores": {
      "dotProduct(example_embedding_field)": [0.02150772698223591],
      "relevance_score": [ 0.8828125 ]
    }
    
    • dotProduct(): 検索結果ドキュメントの計算されたドット積。
    • relevance_score: 検索結果ドキュメントの計算された関連性スコア。

次のステップ