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

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

ベクトル検索を使用すると、企業データを活用して効率を高め、カスタマー エクスペリエンスを向上させ、競争優位性を獲得できます。これにより、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 の範囲にする必要があります。設定しない場合、デフォルト値は 1010% を意味します)になります。
  • 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 メソッドを使用して、バッチ インデックスの更新をトリガーします。

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

ストリーム インデックスのデータポイントの情報をアップサートするには、/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: アップサートするエンティティ ID。
  • EMBEDDINGS: データポイントに対してアップサートするエンベディング。

ストリーム インデックスからデータポイントの情報を削除するには、/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。

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

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

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

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

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 の範囲にする必要があります。設定しない場合、デフォルト値は 1010% を意味)です。

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

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 の範囲にする必要があります。設定しない場合、デフォルト値は 1010% を意味)です。

最近傍を検索する

このセクションでは、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. [ベクトル検索の詳細を取得] を選択します。
    4. 次のオプションのいずれかを選択します。

      • 検索キー
      • ベクトル インデックス エンドポイント ID
    5. [検索キー] オプションを選択した場合は、ベクトル検索パラメータで構成した検索キーを入力します。

    6. [ベクトル インデックス エンドポイント ID] オプションを選択した場合は、次のパラメータを入力します。

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

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

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

    2. 新しい RFC 宛先を作成します。作成した RFC 宛先で接続タイプG - HTTP connection to external server に設定されていることを確認します。

    3. [技術的な設定] タブに移動して、次の詳細情報を入力します。

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

      • サービス番号: 「443」と入力します。このポート番号は安全な通信に使用されます。

    4. [ログオンとセキュリティ] タブに移動し、[SSL 証明書] フィールドで [デフォルトの SSL クライアント(標準)] のオプションが設定されていることを確認します。

    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_STRINGFIND_NEIGHBORS_BY_EMBEDDINGFIND_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_STRINGFIND_NEIGHBORS_BY_EMBEDDINGFIND_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 に設定します。

次のステップ