このドキュメントでは、Vertex AI SDK for ABAP を使用して、次の Vertex AI ホストモデルで SAP 関数呼び出しを使用する方法について説明します。
カスタム関数を定義して、関数呼び出し機能を使用して Gemini モデルと Claude モデルに提供できます。モデルはカスタム関数を直接呼び出すのではなく、関数名と推奨される引数を指定する構造化データ出力を生成します。この出力を使用すると、構造化出力を受け取って外部 API を呼び出すアプリケーションを作成できます。生成された API 出力を別のモデル プロンプトに組み込むことで、より包括的なクエリ レスポンスを実現できます。
Vertex AI SDK for ABAP は、次のように SAP 関数モジュールに記述されたカスタム ロジックを呼び出す機会を提供することで、ABAP の関数呼び出しの開発を簡素化します。
- 関数宣言として SAP 関数モジュール名をモデルに渡し、関数名、その目的、関連するパラメータを記述します。
- モデルを呼び出すときに、SAP 関数モジュールの自動呼び出しを暗黙的に設定します。
以下は、ABAP 開発者が SAP 関数呼び出しを呼び出す一般的な手順です。
- ユーザーが入力プロンプトを入力します。
- SDK が入力プロンプトと関数宣言をモデルに渡します。
- モデルは、プロンプトと宣言された関数を確認して、呼び出す関数を導出し、関数を呼び出すパラメータ値を提案します。
- 自動呼び出しが設定されている場合、SDK は SAP 関数モジュールを呼び出します。
- SDK は、呼び出された関数の出力を使用してモデルを呼び出します。
- モデルは、呼び出された関数の出力で拡充された最終プロンプトに対して信頼できる回答を返します。
- SDK がユーザーに回答を返します。
SAP 関数モジュールを自動的に呼び出さない場合、SDK では SAP 関数モジュールを呼び出すことなく、関数呼び出し機能を使用できます。この場合、一般的な関数呼び出しワークフローに従って API や関数などの外部ツールを使用できます。
始める前に
Gemini で SAP 関数呼び出しを行う Vertex AI SDK for ABAP を使用する前に、自身または管理者が次の前提条件を満たしていることを確認してください。
- Google Cloud プロジェクトで Vertex AI API が有効になっている。
- SAP 環境に Vertex AI SDK for ABAP がインストールされている。
- Vertex AI API にアクセスするための認証が設定されている。
Gemini の場合:
Claude の場合:
- Google Cloud プロジェクトで Model Garden のサポートされる Claude モデルが有効になっている。
- モデル生成パラメータが構成されている。
SAP データを使用して AI モデルのコンテキストを拡充する
このセクションでは、Vertex AI SDK for ABAP を使用して、AI モデルのコンテキストを SAP データで拡充する方法について説明します。
マルチモーダル呼び出し元クラスをインスタンス化する
Gemini モデルを使用して SAP で関数呼び出しを起動するには、/GOOG/CL_GENERATIVE_MODEL
クラスを使用します。
Claude モデルを使用して SAP の関数呼び出しを起動するには、/GOOG/CL_MODEL_CLAUDE
クラスを使用します。
クラスをインスタンス化するには、モデル生成パラメータで構成されたモデルキーを渡します。
Gemini
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
Claude
DATA(lo_model) = NEW /goog/cl_model_claude( 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
メソッドを呼び出します。
Gemini
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 ).
Claude
DATA lt_parameters TYPE /goog/cl_model_claude=>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
: パラメータのデータ型(string
、integer
、boolean
など)。PARAMETER_DESCRIPTION
: パラメータの目的と想定される形式の明確な記述。PARAMETER_IS_REQUIRED
: このパラメータが関数の動作に必須の場合は、値をABAP_TRUE
に設定します。FUNCTION_MODULE_NAME
: SAP 関数モジュールの名前。FUNCTION_MODULE_DESCRIPTION
: SAP 関数モジュールの説明。
パラメータのない関数を宣言することもできます。これは、フォールバック関数またはバックアップ関数として使用できます。ユーザー プロンプトから特定の関数を呼び出すのに十分な情報が提供されない場合は、このフォールバック関数を選択するようにモデルに指示できます。
SAP 関数モジュールの自動呼び出しを設定する
モデルによって選択された SAP 関数の自動呼び出しを設定するには、SET_AUTO_INVOKE_SAP_FUNCTION
メソッドを使用します。インポート パラメータ IV_AUTO_INVOKE
で ABAP_TRUE
が渡されると、SDK によって関数モジュールが呼び出され、そのレスポンスが LLM コンテキストに含まれ、最終的なレスポンスが生成されます。
関数モジュールは、SAP 関数モジュールを作成するで説明されているスキーマに従って定義する必要があります。
lo_model->set_auto_invoke_sap_function( abap_true ).
関数呼び出しでコンテンツを生成する
プロンプト テキストをモデルに渡すには、GENERATE_CONTENT
メソッドを使用します。関数呼び出しを介して SAP 関数モジュールからのコンテキストが追加され、モデルによって生成されたレスポンスを取得するには、GET_TEXT
メソッドを使用します。
DATA(lv_response) = lo_model->generate_content( iv_prompt_text ='PROMPT'
)->get_text( ).
PROMPT
は、テキスト プロンプトに置き換えます。
選択した関数名とパラメータ値を取得する
モデルによって選択された関数(宣言された関数から)とその推奨パラメータを取得するには、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
は、テキスト プロンプトに置き換えます。
選択した関数の名前は LV_FUNCTION_NAME
から、推奨されるパラメータは LT_FUNCTION_PARAMETERS
から取得できます。この情報を使用して、企業のセキュリティ情報およびイベント管理ガイドラインに従ってモデルのアクションを検証、追跡、記録できます。
コードサンプル
次のコードサンプルは、SAP 関数呼び出しを使用してモデルから最終レスポンスを受信する方法を示しています。
Gemini
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.
Claude
DATA lt_parameters TYPE /goog/cl_model_claude=>tt_parameter_properties. TRY. DATA(lo_model) = NEW /goog/cl_model_claude( 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
: パラメータのデータ型(string
、integer
、boolean
など)。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
の場合、モデルはまず関数モジュール Z_GET_CURRENT_LOCATION
を呼び出して経度と緯度の情報を取得し、次に経度と緯度の情報を関数モジュール Z_GET_CURRENT_AIR_QUALITY
に渡して、指定された経度と緯度の大気質を取得します。
Gemini
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.
Claude
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//goog/cl_model_claude( iv_model_key = 'claude' ). 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( ).
次のステップ
- ABAP SDK for Google Cloud のオンプレミスまたはクラウド エディションを使用したアプリケーション開発について学習する。
- Cloud フォーラムのコミュニティで Vertex AI SDK for ABAP について質問したり、ディスカッションに参加したりする。