Vertex AI ベクトル検索を使用する

このドキュメントでは、Vertex AI ベクトル検索を使用して、Vertex AI SDK for ABAP を使用したベクトル類似性検索を行う方法について説明します。ベクトル検索では、高次元ベクトルを使用して、大規模なデータセット内の意味的に類似したデータポイントを見つけることができます。画像やテキストの検索などのタスクに優れており、完全一致のキーワードよりも意味を優先します。

ベクトル検索を使用すると、エンタープライズ データを活用して効率を高め、カスタマー エクスペリエンスを向上させ、競争優位性を獲得できます。これにより、SAP 環境に大きな価値をもたらし、次のようなメリットが得られます。

  • 検索機能を強化する: さまざまなシステムに分散している構造化データと非構造化データの両方を含めて、大量の SAP データ全体で検索結果の精度と関連性を高めます。これにより、関連するエンタープライズ データの迅速かつ効果的な情報検索が可能になります。

  • 非構造化データから分析情報を取得する: ベクトル検索を使用して、SAP システム内のこれまで活用されていない非構造化データ(商品データ、顧客データ、購入者レビュー、サポート チケット、内部ドキュメントなど)から有益な分析情報を抽出します。

  • カスタマー エクスペリエンスを改善する: 商品のおすすめ、インテリジェントな chatbot、その他の顧客向けアプリケーションにベクトル検索を使用して、パーソナライズされたコンテキストを認識する顧客とのやり取りを提供します。

  • ビジネス プロセスを効率化する: ベクトル検索を使用して関連情報をすばやく見つけて、パターンを特定し、データドリブンな意思決定を行うことで、内部プロセスを最適化します。

  • イノベーションを加速する: ベクトル検索と生成 AI などの他の Vertex AI 機能を組み合わせて、ビジネスの成長を促す新しい革新的なソリューションを開発します。

Vertex AI ベクトル検索の使用方法

ベクトル検索を使用したセマンティック マッチングのおおまかな手順は次のとおりです。

  1. エンタープライズ データのエンベディング表現を生成します。
  2. エンベディングを Cloud Storage バケットにアップロードします。
  3. ベクトル インデックスを作成し、エンベディングを含む Cloud Storage バケットにベクトル インデックスを関連付けます。最新データでインデックスを更新する方法に応じて、2 種類のインデックスを作成できます。

    • バッチ インデックス: バッチ インデックスは、毎週または毎月処理されるデータなど、一定期間にわたって保存されたデータを使用してインデックスをバッチで更新する場合に適しています。
    • ストリーム インデックス: ストリーミング インデックスは、データストアに新しいデータが追加されたときに、インデックス データをできるだけ早く更新する場合に適しています。
  4. インデックス エンドポイントを作成し、ベクトル インデックスをエンドポイントにデプロイして、クエリを実行し、レコメンデーションや結果を取得します。インデックス エンドポイントは、インデックスに対するクエリ リクエストを受け入れるサーバー インスタンスとして機能します。

  5. エンティティ ID、検索文字列、エンベディングを使用して、インデックス エンドポイントにクエリを実行します。

Vertex AI SDK for ABAP は、Vertex AI ベクトル検索のこれらのすべての側面をカバーしているため、ABAP 環境で Vertex AI を活用したベクトル検索アプリケーションを構築できます。

ベクトル インデックスを作成して管理する

このセクションでは、Vertex AI SDK for ABAP を使用してベクトル インデックスを作成して管理する方法について説明します。

始める前に

自身または管理者によって次の事前準備が完了していることを確認してください。

エンベディングを準備する

エンベディングを準備する必要があります。Vertex AI SDK for ABAP を使用してエンベディングを生成する方法については、エンベディングを生成するをご覧ください。

エンベディングを Cloud Storage にアップロードする

エンベディングを Cloud Storage バケットにアップロードして、エンベディングをベクトル インデックスに関連付けます。エンベディング ファイルを Google Cloud の外部で生成した場合でも、それらのエンベディング ファイルを Cloud Storage バケットにアップロードできます。

Vertex AI SDK for ABAP を使用して生成されたエンベディングを Cloud Storage バケットに送信する方法については、エンベディングを Cloud Storage に保存するをご覧ください。

ベクトル インデックスのクラスをインスタンス化する

ベクトル インデックスを作成して管理するには、/GOOG/CL_VECTOR_INDEX クラスをインスタンス化します。クラスをインスタンス化するには、認証用に構成されたクライアント キーを渡します。

DATA(lo_vector_index) = NEW /goog/cl_vector_index( iv_key_name = 'CLIENT_KEY' ).

CLIENT_KEY は、認証用に構成されたクライアント キーに置き換えます。

ベクトル インデックスを作成する

ベクトル インデックスを作成するには、/GOOG/CL_VECTOR_INDEX クラスの CREATE_TREE_AH_INDEX メソッドを使用します。tree-AH アルゴリズムに基づいてインデックスが作成されます。

lo_vector_index->create_tree_ah_index( iv_display_name                = 'INDEX_NAME'
                                       iv_description                 = 'INDEX_DESCRIPTION'
                                       iv_location_id                 = 'LOCATION_ID'
                                       iv_gcs_content_uri             = 'CONTENT_URI'
                                       iv_dimensions                  = 'DIMENSIONS'
                                       iv_approximate_neighbors_count = 'NEIGHBORS_COUNT'
                                       iv_index_update_method         = 'INDEX_UPDATE_METHOD'
                                       iv_distance_measure_type       = 'DISTANCE_MEASURE_TYPE'
                                       iv_shard_size                  = 'SHARD_SIZE'
                                       iv_leaf_node_embedding_count   = 'LEAF_NODE_EMBEDDING_COUNT'
                                       iv_leaf_nodes_to_search        = 'LEAF_NODE_TO_SEARCH'
                                       iv_etag                        = 'ETAG'
                                       iv_cloud_kms_encryption_key     = 'KEY_FOR_ENCRYPTION' ).

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

  • INDEX_NAME: インデックスの表示名。
  • INDEX_DESCRIPTION: インデックスの説明。
  • LOCATION_ID: インデックスを保存する Google Cloud リージョン。利用可能なロケーションについては、Vertex AI のロケーションをご覧ください。
  • CONTENT_URI: インデックスの作成に使用されるエンベディングを含む Cloud Storage バケットの URI。
  • DIMENSIONS: 入力ベクトルの次元数。
  • NEIGHBORS_COUNT: 並べ替えが実行される前に近似検索によって検索される近傍数。
  • INDEX_UPDATE_METHOD: インデックスの更新モード(BATCH_UPDATE または STREAM_UPDATE)。
  • DISTANCE_MEASURE_TYPE: データポイントとクエリベクトルの間の距離の計算に使用するアルゴリズムを決定します。詳細については、距離測定のタイプをご覧ください。
  • SHARD_SIZE: 各シャードのサイズ。インデックスが大きい場合は、指定されたシャードサイズに基づいてシャーディングされます。サービング時に、各シャードは個別のノードでサービングされ、個別にスケーリングされます。
  • LEAF_NODE_EMBEDDING_COUNT: 各リーフノードに対する埋め込みの数。設定しない場合、デフォルト値の 1000 になります。
  • LEAF_NODE_TO_SEARCH: クエリが検索されるリーフノードのデフォルトの割合。すべて含めて 1~100 の範囲にする必要があります。設定されない場合は、デフォルト値の 10(つまり 10%)になります。
  • ETAG: 一貫した読み取り / 修正 / 書き込みの更新を実行する ETag 値。
  • KEY_FOR_ENCRYPTION: 顧客管理の暗号鍵の Cloud KMS リソース ID。

ベクトル インデックス エンドポイントを作成する

ベクトル インデックス エンドポイントを作成するには、/GOOG/CL_VECTOR_INDEX クラスの CREATE_INDEX_ENDPOINT メソッドを使用します。

lo_vector_index->create_index_endpoint( iv_display_name             = 'INDEX_ENDPOINT_NAME'
                                        iv_description              = 'INDEX_ENDPOINT_DESCRIPTION'
                                        iv_location_id              = 'LOCATION_ID'
                                        iv_public_endpoint_enabled  = 'ENABLE_PUBLIC_ENDPOINT'
                                        iv_etag                     = 'ETAG'
                                        iv_cloud_kms_encryption_key = 'KEY_FOR_ENCRYPTION' ).

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

  • INDEX_ENDPOINT_NAME: インデックス エンドポイントの表示名。
  • INDEX_ENDPOINT_DESCRIPTION: インデックス エンドポイントの説明。
  • LOCATION_ID: インデックス エンドポイントを作成する Google Cloud リージョン。利用可能なロケーションについては、Vertex AI のロケーションをご覧ください。
  • ENABLE_PUBLIC_ENDPOINT: デプロイされたインデックスにパブリック エンドポイントからアクセスできる場合は、このパラメータ値を ABAP_TRUE に設定します。
  • ETAG: 一貫した読み取り / 修正 / 書き込みの更新を実行する ETag 値。
  • KEY_FOR_ENCRYPTION: 顧客管理の暗号鍵の Cloud KMS リソース ID。

ベクトル インデックスをインデックス エンドポイントにデプロイする

ベクトル インデックスをインデックス エンドポイントにデプロイするには、/GOOG/CL_VECTOR_INDEX クラスの DEPLOY_INDEX メソッドを使用します。

lo_vector_index->deploy_index( iv_deployed_index_id     = 'DEPLOYMENT_ID'
                               iv_location_id           = 'LOCATION_ID'
                               iv_index_id              = 'INDEX_ID'
                               iv_index_endpoint_id     = 'INDEX_ENDPOINT_ID>'
                               iv_min_replica_count     = 'MIN_REPLICA_COUNT'
                               iv_max_replica_count     = 'MAX_REPLICA_COUNT'
                               iv_enable_access_logging = 'ENABLE_ACCESS_LOGGING'
                               iv_deployment_group      = 'DEPLOYMENT_GROUP' ).

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

  • DEPLOYMENT_ID: インデックス デプロイの ID。
  • LOCATION_ID: インデックスをデプロイする Google Cloud リージョン。利用可能なロケーションについては、Vertex AI のロケーションをご覧ください。
  • INDEX_ID: インデックスのリソース名。
  • INDEX_ENDPOINT_ID: デプロイ先のインデックス エンドポイントのリソース名。
  • MIN_REPLICA_COUNT: デプロイされたモデルのマシンレプリカの最小数。
  • MAX_REPLICA_COUNT: デプロイされたモデルのマシンレプリカの最大数。
  • ENABLE_ACCESS_LOGGING: プライベート エンドポイントのアクセスログを Cloud Logging に送信するには、このパラメータ値を ABAP_TRUE に設定します。
  • DEPLOYMENT_GROUP: デプロイ グループの名前(testprod など)。

ベクトル インデックスを更新して再構築する

エンタープライズ AI ソリューションで最も正確なベクトル検索結果を得るには、最新の企業データでインデックスを常に更新する必要があります。

バッチ インデックスを更新する

Cloud Storage バケットにある更新された情報を使用してバッチ インデックスを更新するには、/GOOG/CL_VECTOR_INDEX クラスの PATCH_TREE_AH_INDEX メソッドを使用します。

lo_vector_index->patch_tree_ah_index( iv_index_id              = 'INDEX_ID'
                                      iv_gcs_content_uri       = 'CONTENT_URI'
                                      iv_location_id           = 'LOCATION_ID'
                                      iv_is_complete_overwrite = 'IS_COMPLETE_OVERWRITE' ).

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

  • INDEX_ID: インデックスのリソース名。
  • CONTENT_URI: 最新のエンタープライズ データのエンベディングを含む Cloud Storage バケットの URI。
  • LOCATION_ID: インデックスの Google Cloud リージョン。
  • IS_COMPLETE_OVERWRITE: 指定した Cloud Storage バケットのデータでインデックスを完全に上書きするには、このパラメータ値を ABAP_TRUE に設定します。

次のアーキテクチャ フローの例を使用して、SAP データでバッチ インデックスを更新できます。

  • SAP バックグラウンド ジョブを介して /GOOG/CL_STORAGE_V1 クラスを使用して、最新データのエンベディングで Cloud Storage バケットを更新します。SAP 以外のデータの場合は、SAP の外部のプロセスでこれを行うこともできます。
  • 一定の間隔で実行される SAP のバックグラウンド ジョブを介して、/GOOG/CL_VECTOR_INDEX クラスの PATCH_TREE_AH_INDEX メソッドを使用して、バッチ インデックスの更新をトリガーします。

ストリーム インデックスを更新する

ストリーム インデックスのデータポイントの情報を upsert するには、/GOOG/CL_VECTOR_INDEX クラスの UPSERT_DATAPOINTS メソッドを使用します。

lo_vector_index->upsert_datapoints( iv_index_id     = 'INDEX_ID'
                                    iv_location_id  = 'LOCATION_ID'
                                    iv_datapoint_id = 'ENTITY_ID'
                                    it_embeddings   = 'EMBEDDINGS' ).

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

  • INDEX_ID: インデックスのリソース名。
  • LOCATION_ID: インデックスの Google Cloud リージョン。
  • ENTITY_ID: upsert 先のエンティティ ID。
  • EMBEDDINGS: データポイントに対して upsert するエンベディング。

ストリーム インデックスからデータポイントの情報を削除するには、/GOOG/CL_VECTOR_INDEX クラスの REMOVE_DATAPOINTS メソッドを使用します。

lo_vector_index->remove_datapoints( iv_index_id     = 'INDEX_ID'
                                    iv_location_id  = 'LOCATION_ID'
                                    iv_datapoint_id = 'ENTITY_ID' ).

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

  • INDEX_ID: インデックスのリソース名。
  • LOCATION_ID: インデックスの Google Cloud リージョン。
  • ENTITY_ID: 削除するエンティティ ID。

インデックスに対して upsert オペレーションと削除オペレーションがリアルタイムで実行されます。

次のアーキテクチャ フローの例を使用して、SAP データでストリーム インデックスを更新できます。

  • エンタープライズ SAP ソリューション内のプレースホルダ(BADI、終了、機能強化、カスタム SAP ロジックなど)を特定します。これらは SAP データ変更のポイントです。
  • 特定したプレースホルダから、/GOOG/CL_VECTOR_INDEX クラスの UPSERT_DATAPOINTS メソッドと REMOVE_DATAPOINTS メソッドを使用して、ストリーム インデックスから SAP データの upsert オペレーションまたは削除オペレーションをトリガーします。

ベクトル インデックス オペレーションのステータスを取得する

Google Cloud は、ベクトル インデックスとインデックス エンドポイントの作成、インデックス エンドポイントへのインデックスのデプロイ、ベクトル バッチ インデックスの更新を長時間実行オペレーションとして実行します。

長時間実行オペレーション ID、Vertex AI アーティファクトのリソース ID、エラー メッセージを特定するために、SDK には /GOOG/CL_VECTORINDEX_RESPONSE クラスが用意されています。

/GOOG/CL_VECTORINDEX_RESPONSE クラスによってキャプチャされたレスポンスは、/GOOG/CL_VECTOR_INDEX クラスのメソッドを介して行われたリクエストに連結されるため、中間結果を格納する変数を必要とせずに、1 つのステートメントでレスポンスに直接アクセスできます。

長時間実行オペレーション ID を取得する

各ベクトル検索タスクの長時間実行オペレーション ID を取得するには、/GOOG/CL_VECTORINDEX_RESPONSE クラスの GET_LRO メソッドを使用します。タスクの実行後に、同じインスタンスで GET_LRO メソッドを呼び出して、対応する長時間実行オペレーション ID を取得できます。

次のコードサンプルは、バッチ インデックスの更新タスクの長時間実行オペレーション ID を取得する方法を示しています。

DATA(lv_patch_index_lro) = lo_vector_index->patch_tree_ah_index(
                                              iv_index_id              = 'INDEX_ID'
                                              iv_gcs_content_uri       = 'CONTENT_URI'
                                              iv_location_id           = 'LOCATION_ID'
                                              iv_is_complete_overwrite = 'IS_COMPLETE_OVERWRITE'
                                         )->get_lro( ).

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

  • INDEX_ID: インデックスのリソース名。
  • CONTENT_URI: 最新のエンタープライズ データのエンベディングを含む Cloud Storage バケットの URI。
  • LOCATION_ID: インデックスの Google Cloud リージョン。
  • IS_COMPLETE_OVERWRITE: 指定した Cloud Storage バケットのデータでインデックスを完全に上書きするには、このパラメータ値を ABAP_TRUE に設定します。

長時間実行オペレーションのステータスを取得する

すべての長時間実行オペレーションにはステータスが関連付けられています。長時間実行オペレーションとしてスケジュールされたタスクが成功したかどうかを確認するには、オペレーションのステータスを確認します。

Vertex AI 関連タスクの長時間実行オペレーションのステータスを特定または継続的にモニタリングするには、/GOOG/CL_VERTEX_AI_SDK_UTILITY クラスの GET_LRO_STATUS メソッドを使用します。

/goog/cl_vertex_ai_sdk_utility=>get_lro_status(
    EXPORTING
        iv_key           = 'CLIENY_KEY'
        iv_operations_id = 'LONG_RUNNING_OPERATION_ID'
        iv_location_id   = 'LOCATION_ID'
    IMPORTING
        ev_is_done       = DATA(lv_is_done)          "Is the long-running operation complete
        ev_is_successful = DATA(lv_is_successful)    "Is the long-running operation successful
        ev_error_code    = DATA(lv_error_code)       "Error code in the long-running operation in case of errors
        ev_error_message = DATA(lv_error_message) ). "Error message in the long-running operation in case of errors

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

  • CLIENY_KEY: 認証用のクライアント キー。
  • LONG_RUNNING_OPERATION_ID: 長時間実行オペレーション ID。
  • LOCATION_ID: インデックスの Google Cloud リージョン。

Vertex AI アーティファクトのリソース ID を取得する

作成されたインデックス、作成されたインデックス エンドポイント、デプロイされたインデックス、パッチがトリガーされたインデックス ID のリソース ID を確認するには、/GOOG/CL_VECTORINDEX_RESPONSE クラスの GET_ID メソッドを使用します。

タスクの実行後に、同じインスタンスで GET_ID メソッドを呼び出して、対応するリソース ID を取得できます。

次のコードサンプルは、/GOOG/CL_VECTOR_INDEX クラスの CREATE_TREE_AH_INDEX メソッドを呼び出した後に作成されるインデックスの ID を取得する方法を示しています。

DATA(lv_id) = lo_vector_index->create_tree_ah_index(
                                 iv_display_name                = 'INDEX_NAME'
                                 iv_location_id                 = 'LOCATION_ID'
                                 iv_gcs_content_uri             = 'CONTENT_URI'
                                 iv_dimensions                  = 'DIMENSIONS'
                                 iv_approximate_neighbors_count = 'NEIGHBORS_COUNT'
                                 iv_leaf_node_embedding_count   = 'LEAF_NODE_EMBEDDING_COUNT'
                                 iv_leaf_nodes_to_search        = 'LEAF_NODE_TO_SEARCH'
                            )->get_id( ).

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

  • INDEX_NAME: インデックスの表示名。
  • LOCATION_ID: インデックスの Google Cloud リージョン。
  • CONTENT_URI: インデックスの作成に使用されるエンベディングを含む Cloud Storage バケットの URI。
  • DIMENSIONS: 入力ベクトルの次元数。
  • NEIGHBORS_COUNT: 並べ替えが実行される前に近似検索で検索する近傍。
  • LEAF_NODE_EMBEDDING_COUNT: 各リーフノードに対する埋め込みの数。設定しない場合、デフォルト値の 1000 になります。
  • LEAF_NODE_TO_SEARCH: クエリが検索されるリーフノードのデフォルトの割合。すべて含めて 1~100 の範囲にする必要があります。設定されない場合は、デフォルト値の 10(つまり 10%)になります。

エラーコードとエラー メッセージを取得する

Vertex AI SDK for ABAP を介してベクトル インデックス タスクをトリガーするときにエラーが発生することがあります。

タスクのトリガー後にエラーコードとエラー メッセージ(存在する場合)を取得するには、/GOOG/CL_VECTORINDEX_RESPONSE クラスの GET_ERROR_CODE メソッドと GET_ERROR_MESSAGE メソッドを使用します。

タスクの実行後に、同じインスタンスで GET_ERROR_CODE メソッドと GET_ERROR_MESSAGE メソッドを呼び出して、対応するエラーコードまたはエラー メッセージを取得できます。

次のコードサンプルは、インデックスの作成に失敗した場合にエラーコードとエラー メッセージを表示する方法を示しています。

DATA(lo_vectorindex_response) = lo_vector_index->create_tree_ah_index(
                                                   iv_display_name                = 'INDEX_NAME'
                                                   iv_location_id                 = 'LOCATION_ID'
                                                   iv_gcs_content_uri             = 'CONTENT_URI'
                                                   iv_dimensions                  = 'DIMENSIONS'
                                                   iv_approximate_neighbors_count = 'NEIGHBORS_COUNT'
                                                   iv_leaf_node_embedding_count   = 'LEAF_NODE_EMBEDDING_COUNT'
                                                   iv_leaf_nodes_to_search        = 'LEAF_NODE_TO_SEARCH' ).
IF lo_vectorindex_response->get_error_code( ) IS NOT INITIAL.
  cl_demo_output=>display( 'Error Code-' && lo_vectorindex_response->get_error_code( ) &&
                           'Error Message-' && lo_vectorindex_response->get_error_message( ) ).
ENDIF.

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

  • INDEX_NAME: インデックスの表示名。
  • LOCATION_ID: インデックスの Google Cloud リージョン。
  • CONTENT_URI: インデックスの作成に使用されるエンベディングを含む Cloud Storage バケットの URI。
  • DIMENSIONS: 入力ベクトルの次元数。
  • NEIGHBORS_COUNT: 並べ替えが実行される前に近似検索で検索する近傍。
  • LEAF_NODE_EMBEDDING_COUNT: 各リーフノードに対する埋め込みの数。設定しない場合、デフォルト値の 1000 になります。
  • LEAF_NODE_TO_SEARCH: クエリが検索されるリーフノードのデフォルトの割合。すべて含めて 1~100 の範囲にする必要があります。設定されない場合は、デフォルト値の 10(つまり 10%)になります。

最近傍を検索する

このセクションでは、Vertex AI SDK for ABAP を使用して最近傍を検索する方法について説明します。

始める前に

自身または管理者によって次の事前準備が完了していることを確認してください。

RFC 宛先を作成する

エンベディング ファイル形式のエンタープライズ データを含むインデックスをデプロイしたインデックス エンドポイントの RFC 宛先を作成する必要があります。

  1. インデックス エンドポイントのホスト名を取得します。

    1. SAP GUI で、トランザクション コード /GOOG/SDK_IMG を実行します。

      または、トランザクション コード SPRO を実行して、[SAP Reference IMG] をクリックします。

    2. [ABAP SDK for Google Cloud] > [Utilities] > [Vertex AI SDK: Get RFC information for Feature Store and Vector Search] をクリックします。
    3. [Get Vector Search Details] を選択します。
    4. 次のオプションのいずれかを選択します。

      • Search key
      • Vector index endpoint ID
    5. [Search key] オプションを選択した場合は、ベクトル検索パラメータで構成した検索キーを入力します。

    6. [Vector index endpoint ID] オプションを選択した場合は、次のパラメータを入力します。

      • Google Cloud Key Name: Google Cloud に対する認証用のクライアント キー。
      • Location: インデックス エンドポイントが配置されているリージョン。
      • Index Endpoint ID: インデックス エンドポイントの名前。
    7. [Execute] をクリックして詳細情報を表示します。[Host] ラベルの横にエンドポイントをメモします。

  2. インデックス エンドポイントの RFC 宛先を作成します。

    1. SAP GUI で、トランザクション コード SM59 を実行します。

    2. 新しい RFC 宛先を作成します。作成した RFC 宛先で [Connection Type] が G - HTTP connection to external server に設定されていることを確認します。

    3. [Technical Settings] タブに移動して、次の詳細情報を入力します。

      • Target Host: インデックス エンドポイントのホスト名を指定します。

      • Service No.: 「443」と入力します。これは安全な通信に使用されるポート番号です。

    4. [Logon & Security] タブに移動し、[SSL Certificate] フィールドで [DFAULT SSL Client (Standard)] オプションが設定されていることを確認します。

    5. 変更を保存します。

  3. Vertex AI API のサービス マッピング テーブルを構成します。

    1. SAP GUI で、トランザクション コード /GOOG/SDK_IMG を実行します。

      または、トランザクション コード SPRO を実行して、[SAP Reference IMG] をクリックします。

    2. [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Service Mapping] をクリックします。

    3. [New Entries] をクリックします。

    4. Vertex AI API の RFC 宛先を指定します。

      名前 サービス名 RFC 宛先
      認証用のクライアント キー。 apiinvoker:v1 RFC 宛先の名前。
    5. 新しいエントリを保存します。

ベクトル検索を呼び出すには、/GOOG/CL_VECTOR_SEARCH クラスをインスタンス化します。クラスをインスタンス化するには、ベクトル検索パラメータで構成された検索キーを渡します。

DATA(lo_vector_search) = NEW /goog/cl_vector_search( iv_search_name = 'SEARCH_KEY' ).

SEARCH_KEY は、ベクトル検索パラメータで構成されている検索キーに置き換えます。

エンティティ ID を使用して検索する

特定のエンティティ ID に関してベクトル インデックスをクエリするには、/GOOG/CL_VECTOR_SEARCH クラスの FIND_NEIGHBORS_BY_ENTITY_ID メソッドを使用します。エンティティ ID は、ベクトル インデックスに保存されているデータポイントに対応しています。

lo_vector_search->find_neighbors_by_entity_id( iv_entity_id             = 'ENTITY_ID'
                                               iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                               iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).

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

  • ENTITY_ID: 検索するエンティティ ID。
  • NEIGHBOR_COUNT: クエリに対して取得する最近傍の数。
  • RETURN_FULL_DATAPOINT: 取得したデータポイントのベクトル エンベディングを返すには、このパラメータ値を ABAP_TRUE に設定します。

検索文字列を使用して検索する

検索文字列に関してベクトル インデックスをクエリするには、/GOOG/CL_VECTOR_SEARCH クラスの FIND_NEIGHBORS_BY_STRING メソッドを使用します。

SDK はまず検索文字列をエンベディングに変換し、次にクエリの最近傍を取得します。

DATA(lo_response) = lo_vector_search->find_neighbors_by_string(
                                        iv_search_string         = 'SEARCH_STRING'
                                        iv_embeddings_model_key  = 'MODEL_KEY'
                                        iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                        iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).

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

  • SEARCH_STRING: 検索文字列を入力します。
  • MODEL_KEY: エンベディングの生成に使用するモデルキー。このキーはモデル生成パラメータで構成されています。
  • NEIGHBOR_COUNT: クエリに対して取得する最近傍の数。
  • RETURN_FULL_DATAPOINT: 取得したデータポイントのベクトル エンベディングを返すには、このパラメータ値を ABAP_TRUE に設定します。

エンベディングを使用して検索する

エンベディングに関してベクトル インデックスをクエリするには、/GOOG/CL_VECTOR_SEARCH クラスの FIND_NEIGHBORS_BY_EMBEDDING メソッドを使用します。

DATA(lo_response) = lo_vector_search->find_neighbors_by_embeddings(
                                        iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                        iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT'
                                        it_embeddings            = 'EMBEDDINGS' ).

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

  • NEIGHBOR_COUNT: クエリに対して取得する最近傍の数。
  • RETURN_FULL_DATAPOINT: 取得したデータポイントのベクトル エンベディングを返すには、このパラメータ値を ABAP_TRUE に設定します。
  • EMBEDDINGS: 入力エンベディング。

検索レスポンスを取得する

モデルから処理済みのレスポンスを受け取り、意味のある方法で提示するために、SDK には ABAP クラス /GOOG/CL_VECTORSEARCH_RESPONSE が用意されています。

/GOOG/CL_VECTORSEARCH_RESPONSE クラスによってキャプチャされたレスポンスは、/GOOG/CL_VECTOR_SEARCH クラスのメソッドを介して行われたリクエストに連結されるため、中間結果を格納する変数を必要とせずに、1 つのステートメントでレスポンスに直接アクセスできます。

検索クエリの最近傍を取得する

データポイント、検索文字列、エンベディングに関して、実行された検索クエリで見つかった最近傍を特定するには、/GOOG/CL_VECTORSEARCH_RESPONSE クラスの GET_NEAREST_NEIGHBOR メソッドと GET_NEAREST_NEIGHBORS メソッドを使用します。

これらのメソッドは、/GOOG/CL_VECTOR_SEARCH クラスの FIND_NEIGHBORS_BY_STRING メソッド、FIND_NEIGHBORS_BY_EMBEDDING メソッド、FIND_NEIGHBORS_BY_ENTITY_ID メソッドを使用して、検索クエリの実行後に順に呼び出すことができます。

  • 検索されたデータポイント、文字列、エンベディングに最も近い最近傍を取得するには、GET_NEAREST_NEIGHBOR メソッドを呼び出します。このメソッドのレスポンスには、最も近いデータポイントの ID、検索クエリからの距離、インデックスに関連付けられている特徴ベクトルが一覧表示されます。

    次のコードサンプルは、検索文字列の最近傍を取得する方法を示しています。

    DATA(ls_nearest_neighbor) = lo_vector_search->find_neighbors_by_string(
                                                    iv_search_string         = 'SEARCH_STRING'
                                                    iv_embeddings_model_key  = 'MODEL_KEY'
                                                    iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                    iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT'
                                               )->get_nearest_neighbor( ).
    

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

    • SEARCH_STRING: 検索文字列を入力します。
    • MODEL_KEY: エンベディングの生成に使用するモデルキー。このキーはモデル生成パラメータで構成されています。
    • NEIGHBOR_COUNT: クエリに対して取得する最近傍の数。
    • RETURN_FULL_DATAPOINT: 取得したデータポイントのベクトル エンベディングを返すには、このパラメータ値を ABAP_TRUE に設定します。
  • 検索されたデータポイント、文字列、エンベディングに最も近い最近傍のセットを取得するには、GET_NEAREST_NEIGHBORS メソッドを呼び出します。このメソッドのレスポンスは、最も近いデータポイントのテーブルです。データポイント ID、検索クエリからの距離、インデックスに関連付けられている特徴ベクトルが一覧表示されます。

    次のコードサンプルは、検索文字列の最近傍を取得する方法を示しています。

    DATA(lt_nearest_neighbors) = lo_vector_search->find_neighbors_by_string(
                                                     iv_search_string         = 'SEARCH_STRING'
                                                     iv_embeddings_model_key  = 'MODEL_KEY'
                                                     iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                     iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT'
                                                )->get_nearest_neighbors( ).
    

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

    • SEARCH_STRING: 検索文字列を入力します。
    • MODEL_KEY: エンベディングの生成に使用するモデルキー。このキーはモデル生成パラメータで構成されています。
    • NEIGHBOR_COUNT: クエリに対して取得する最近傍の数。
    • RETURN_FULL_DATAPOINT: 取得したデータポイントのベクトル エンベディングを返すには、このパラメータ値を ABAP_TRUE に設定します。

取得された近傍の距離を取得する

取得したレスポンスと検索されたクエリの距離を判断するには、/GOOG/CL_VECTORSEARCH_RESPONSE クラスの GET_DATAPOINT_DISTANCE メソッドを使用します。

検索レスポンスの距離は、クエリ(文字列、エンベディング、エンティティ ID)と取得された結果ベクトルの類似性の測定を表します。距離の具体的な意味は、インデックスの作成時に使用される「距離尺度」によって異なります。

距離の値は、各検索結果がクエリとの関連性をどの程度持っているかを把握するのに役立ちます。一般的に、距離が短い結果は類似性や関連性が高く、距離が長い結果は類似性や関連性が低いと見なされます。

次のコードサンプルは、検索文字列の最寄りの近傍の距離を取得する方法を示しています。

DATA(lo_vectorsearch_response) = lo_vector_search->find_neighbors_by_string(
                                                     iv_search_string         = 'SEARCH_STRING'
                                                     iv_embeddings_model_key  = 'MODEL_KEY'
                                                     iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                     iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).
DATA(ls_nearest_neighbor) = lo_vectorsearch_response->get_nearest_neighbor( ).
DATA(lv_distance) = lo_vectorsearch_response->get_datapoint_distance( iv_datapoint_id = ls_nearest_neighbor-datapoint_id ).

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

  • SEARCH_STRING: 検索文字列を入力します。
  • MODEL_KEY: エンベディングの生成に使用するモデルキー。このキーはモデル生成パラメータで構成されています。
  • NEIGHBOR_COUNT: クエリに対して取得する最近傍の数。
  • RETURN_FULL_DATAPOINT: 取得したデータポイントのベクトル エンベディングを返すには、このパラメータ値を ABAP_TRUE に設定します。

取得された近傍のエンベディング ベクトルを取得する

検索されたクエリから取得したレスポンスのエンベディング ベクトルを特定するには、/GOOG/CL_VECTORSEARCH_RESPONSE クラスの GET_DATAPOINT_FEATURE_VECTOR メソッドを使用します。

エンベディング ベクトルを取得するには、FIND_NEIGHBORS_BY_STRING メソッド、FIND_NEIGHBORS_BY_EMBEDDING メソッド、FIND_NEIGHBORS_BY_ENTITY_ID メソッドの IV_RETURN_FULL_DATAPOINT パラメータを ABAP_TRUE に設定する必要があります。

次のコードサンプルは、検索文字列の最寄りの近傍の特徴ベクトルを取得する方法を示しています。

DATA(lo_vectorsearch_response) = lo_vector_search->find_neighbors_by_string(
                                                     iv_search_string         = 'SEARCH_STRING'
                                                     iv_embeddings_model_key  = 'MODEL_KEY'
                                                     iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                     iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).
DATA(ls_nearest_neighbor) = lo_vectorsearch_response->get_nearest_neighbor( ).
DATA(lt_feature_vector) = lo_vectorsearch_response->get_datapoint_feature_vector( iv_datapoint_id = ls_nearest_neighbor-datapoint_id ).

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

  • SEARCH_STRING: 検索文字列を入力します。
  • MODEL_KEY: エンベディングの生成に使用するモデルキー。このキーはモデル生成パラメータで構成されています。
  • NEIGHBOR_COUNT: クエリに対して取得する最近傍の数。
  • RETURN_FULL_DATAPOINT: 取得したデータポイントのベクトル エンベディングを返すには、このパラメータ値を ABAP_TRUE に設定します。

次のステップ