Gemini で SAP 関数呼び出しを使用する

このドキュメントでは、Vertex AI SDK for ABAP を使用して、Gemini で SAP 関数呼び出しを使用する方法について説明します。

カスタム関数を定義して、関数呼び出し機能を使用して Gemini モデルに提供できます。モデルはカスタム関数を直接呼び出すのではなく、関数名と推奨される引数を指定する構造化データ出力を生成します。この出力を使用すると、構造化出力を受け取って外部 API を呼び出すアプリケーションを作成できます。生成された API 出力を別のモデル プロンプトに組み込むことで、より包括的なクエリ レスポンスを実現できます。

Vertex AI SDK for ABAP は、次のように SAP 関数モジュールに記述されたカスタム ロジックを呼び出す機会を提供することで、ABAP の関数呼び出しの開発を簡素化します。

  • 関数宣言として SAP 関数モジュール名をモデルに渡し、関数名、その目的、関連するパラメータを記述します。
  • モデルを呼び出すときに、SAP 関数モジュールの自動呼び出しを暗黙的に設定します。

以下は、ABAP 開発者が SAP 関数呼び出しを呼び出す一般的な手順です。

  1. ユーザーが入力プロンプトを入力します。
  2. SDK が入力プロンプトと関数宣言をモデルに渡します。
  3. モデルは、プロンプトと宣言された関数を確認して、呼び出す関数を導出し、関数を呼び出すパラメータ値を提案します。
  4. 自動呼び出しが設定されている場合、SDK は SAP 関数モジュールを呼び出します。
  5. SDK は、呼び出された関数の出力を使用してモデルを呼び出します。
  6. モデルは、呼び出された関数の出力で拡充された最終プロンプトに対して信頼できる回答を返します。
  7. SDK がユーザーに回答を返します。

Gemini を使用した SAP 関数呼び出し

SAP 関数モジュールを自動的に呼び出さない場合、SDK では SAP 関数モジュールを呼び出すことなく、関数呼び出し機能を使用できます。この場合、一般的な関数呼び出しワークフローに従って API や関数などの外部ツールを使用できます。

始める前に

Gemini で SAP 関数呼び出しを行う Vertex AI SDK for ABAP を使用する前に、自身または管理者が次の前提条件を満たしていることを確認してください。

SAP データを使用して Gemini AI モデルのコンテキストを拡充する

このセクションでは、Vertex AI SDK for ABAP を使用して、Gemini AI モデルのコンテキストを SAP データで拡充する方法について説明します。

Gemini マルチモーダル Invoker クラスをインスタンス化する

SAP で関数呼び出しを呼び出すには、/GOOG/CL_GENERATIVE_MODEL クラスを使用します。クラスをインスタンス化するには、モデル生成パラメータで構成されたモデルキーを渡します。

DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

MODEL_KEY は、モデル生成パラメータで構成されているモデルキー名に置き換えます。

SAP 関数モジュールを作成する

SDK による自動呼び出し用の SAP 関数モジュールを作成するには、次のスキーマを使用します。

カテゴリ パラメータ名 関連付けられた型
インポート IT_FUNCTION_PARAMETERS /GOOG/T_FUNCTION_PARAMETERS
エクスポート EV_FUNCTION_RESPONSE STRING
変更 CV_PROMPT STRING
例外 /GOOG/CX_SDK Exception Class

インポート パラメータに基づいて、関数モジュール内にカスタム ロジックを記述します。これは、SELECT クエリを介して SAP データを取得するか、外部 API またはモジュールを呼び出して不足している情報を取得します。

エクスポート パラメータ EV_FUNCTION_RESPONSE に、LLM コンテキストにフィードバックする情報を設定します。また、カスタム ロジックとビジネス要件に基づいて CV_PROMPT のプロンプト テキストを変更または修正し、さまざまなビジネス シナリオに基づいて LLM にさらに指示することもできます。

関数宣言を追加する

LLM コンテキストに関数宣言を追加するには、ADD_FUNCTION_DECLARATION メソッドを使用します。コンテキストに関数を追加する必要があるたびに、ADD_FUNCTION_DECLARATION メソッドを呼び出します。

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                type           = 'PARAMETER_TYPE'
                description    = 'PARAMETER_DESCRIPTION'
                is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
lo_model->add_function_declaration( iv_name        = 'FUNCTION_MODULE_NAME'
                                    iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                    it_parameters  = lt_parameters ).

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

  • PARAMETER_NAME: パラメータの名前。
  • PARAMETER_TYPE: パラメータのデータ型(stringintegerboolean など)。
  • PARAMETER_DESCRIPTION: パラメータの目的と想定される形式の明確な記述。
  • PARAMETER_IS_REQUIRED: このパラメータが関数の動作に必須の場合は、値を ABAP_TRUE に設定します。
  • FUNCTION_MODULE_NAME: SAP 関数モジュールの名前。
  • FUNCTION_MODULE_DESCRIPTION: SAP 関数モジュールの説明。

パラメータのない関数を宣言することもできます。これは、フォールバック関数またはバックアップ関数として使用できます。ユーザー プロンプトから特定の関数を呼び出すのに十分な情報が提供されない場合は、このフォールバック関数を選択するように Gemini に指示できます。

SAP 関数モジュールの自動呼び出しを設定する

モデルによって選択された SAP 関数の自動呼び出しを設定するには、SET_AUTO_INVOKE_SAP_FUNCTION メソッドを使用します。インポート パラメータ IV_AUTO_INVOKEABAP_TRUE が渡されると、SDK によって関数モジュールが呼び出され、そのレスポンスが LLM コンテキストに含まれ、最終的なレスポンスが生成されます。

関数モジュールは、SAP 関数モジュールを作成するで説明されているスキーマに従って定義する必要があります。

lo_model->set_auto_invoke_sap_function( abap_true ).

関数呼び出しでコンテンツを生成する

プロンプト テキストを Gemini モデルに渡すには、GENERATE_CONTENT メソッドを使用します。関数呼び出しを介して SAP 関数モジュールからのコンテキストが追加され、Gemini によって生成されたレスポンスを取得するには、GET_TEXT メソッドを使用します。

DATA(lv_response) = lo_model->generate_content( iv_prompt_text ='PROMPT'
                           )->get_text( ).

PROMPT は、テキスト プロンプトに置き換えます。

選択した関数名とパラメータ値を取得する

Gemini によって選択された関数(宣言された関数から)とその推奨パラメータを取得するには、GET_FUNCTION_CALL メソッドを使用します。

DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                               )->generate_content( iv_prompt_text = 'PROMPT' ).
lo_response->get_function_call( IMPORTING ev_function_name       = DATA(lv_function_name)
                                          et_function_parameters = DATA(lt_function_parameters) ).

PROMPT は、テキスト プロンプトに置き換えます。

Gemini が選択した関数の名前は LV_FUNCTION_NAME から、推奨されるパラメータは LT_FUNCTION_PARAMETERS から取得できます。この情報を使用して、企業のセキュリティ情報およびイベント管理ガイドラインに沿って Gemini アクションを検証、追跡、記録できます。

コードサンプル

次のコードサンプルは、SAP 関数呼び出しを使用してモデルから最終レスポンスを受信する方法を示しています。

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
TRY.
  DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
  APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                  type           = 'PARAMETER_TYPE'
                  description    = 'PARAMETER_DESCRIPTION'
                  is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
  DATA(lv_response) = lo_model->add_function_declaration(
                                    iv_name        = 'FUNCTION_MODULE_NAME'
                                    iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                    it_parameters  = lt_parameters
                              )->set_auto_invoke_sap_function( abap_true
                              )->generate_content( iv_prompt_text ='PROMPT'
                              )->get_text( ).
  IF lv_response IS NOT INITIAL.
      cl_demo_output=>display( lv_response ).

  ENDIF.
 CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
  cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

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

  • MODEL_KEY: モデルキー名。モデル生成パラメータで構成されます。
  • PARAMETER_NAME: パラメータの名前。
  • PARAMETER_TYPE: パラメータのデータ型(stringintegerboolean など)。
  • PARAMETER_DESCRIPTION: パラメータの目的と想定される形式の明確な記述。
  • PARAMETER_IS_REQUIRED: このパラメータが関数の動作に必須の場合は、値を ABAP_TRUE に設定します。
  • FUNCTION_MODULE_NAME: SAP 関数モジュールの名前。
  • FUNCTION_MODULE_DESCRIPTION: SAP 関数モジュールの説明。
  • PROMPT: テキスト プロンプト

関数の自動チェーン

関数の自動チェーン機能を使用すると、複数のユーザー定義関数モジュールを呼び出してレスポンスを生成できます。この機能は、SAP 関数モジュールの自動呼び出しが有効になっている場合にのみサポートされます。

次のコードサンプルは、関数の自動チェーンを示しています。プロンプト Get the air quality in my current location の場合、Gemini API はまず関数モジュール Z_GET_CURRENT_LOCATION を呼び出して経度と緯度の情報を取得し、次に経度と緯度の情報を関数モジュール Z_GET_CURRENT_AIR_QUALITY に渡して、指定された経度と緯度の大気質を取得します。

gv_prompt = 'Get the air quality in my current location'.

  gv_system_instruction = 'You are a helpful weather assistant bot. You can turn find my location and get the weather information like temperature' &&
  'You can also alert me about EarthQuakes and Storm.' &&
  'You can also provide me information on Air Quality based on a location' &&
  'Do not perform any other tasks.'.

  TRY.

      DATA(lo_model_key) = NEW /goog/cl_generative_model( iv_model_key = 'gemini-flash-2' ).

      gv_final_op = lo_model_key->gs_ai_config-model_id.

      lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_LOCATION'
                                              iv_description = 'Get the current location'
                                              it_parameters  = gt_parameters ).
      CLEAR gt_parameters.

      gs_parameter-parameter_name = |Latitude|.
      gs_parameter-type = 'string'.
      gs_parameter-description = |Latitude|.
      gs_parameter-is_required = abap_true.

      APPEND gs_parameter TO gt_parameters.
      CLEAR gs_parameter.

      gs_parameter-parameter_name = |Longitude|.
      gs_parameter-type = 'string'.
      gs_parameter-description = |Longitude|.
      gs_parameter-is_required = abap_true.

      APPEND gs_parameter TO gt_parameters.
      CLEAR gs_parameter.

      lo_model_key->add_function_declaration( iv_name        = 'Z_GET_WEATHER_INFORMATION'
                                              iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).


      lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_AIR_QUALITY'
                                              iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).


      lo_model_key->add_function_declaration( iv_name        = 'GET_EARTHQUAKE_POSSIBILITY'
                                              iv_description = 'Gets possibility of Earthquake for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).


      lo_model_key->add_function_declaration( iv_name        = 'GET_STORM_POSSIBILITY'
                                              iv_description = 'Gets possibility of a STORM for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).

      lo_model_key->set_system_instructions(
        EXPORTING
          iv_text = gv_system_instruction
      ).

      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

      DATA(ls_response) = lo_response->get_response( ).
      /ui2/cl_json=>serialize(
        EXPORTING
          data   = ls_response-candidates[ 1 ]-content-parts           " Data to serialize
        RECEIVING
          r_json = DATA(lv_json_string)                 " JSON string
      ).
      IF lv_json_string IS NOT INITIAL.
        CLEAR gv_output.
        gv_output = lv_json_string.

      ENDIF.

    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
      cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
  ENDTRY.

  lo_model_key->close( ).
  CLEAR lo_model_key.
  CLEAR lo_response.
  CLEAR ls_response.

関数の自動チェーンを無効にして、LLM から最初の関数のレスポンスのみを取得するには、SET_FUNCTION_CALLING_CONFIG メソッドを使用して IV_DISABLE_FUNCTION_CHAINING パラメータを ABAP_TRUE に設定します。例:


      lo_model_key->set_function_calling_config( iv_disable_function_chaining = abap_true ).
      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

SDK によって呼び出されたすべての関数モジュールと、それらに渡されたパラメータを取得するには、メソッド GET_ALL_FUNCTION_CALLS を呼び出します。

      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

      DATA(ls_response) = lo_response->get_all_function_calls( ).

次のステップ