Gemini モデルを呼び出す

このドキュメントでは、Vertex AI SDK for ABAP を使用して Gemini モデルを呼び出し、テキストとマルチモーダル入力のレスポンスを生成する方法について説明します。Gemini モデルは、テキスト画像動画音声ドキュメントなど、複数の入力モードを受け入れることができます。Gemini モデルは、次のようなユースケースに使用できます。

  • 自由形式のテキストの要約
  • メディア アセットの説明や解釈
  • 言語間の翻訳

生成モデルを使用して AI 中心の機能を構築する場合、機械学習(ML)の専門知識は必要ありません。大規模なデータセットを収集したり、モデルをトレーニングしたりする必要はありません。最初のプログラムを開始するには、モデルに何をさせたいかを数文で記述するだけです。Vertex AI SDK for ABAP には、SAP 環境から Gemini モデルにアクセスするための ABAP クラスとメソッドが用意されています。まず、こちらのコードサンプルをご覧ください。

始める前に

Gemini モデルで Vertex AI SDK for ABAP を使用する前に、自身または管理者が次の前提条件を満たしていることを確認してください。

Gemini にリクエストを送信する

このセクションでは、Vertex AI SDK for ABAP を使用して Vertex AI API を介して Gemini モデルにリクエストを送信する方法について説明します。

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

テキストまたはマルチモーダル プロンプトを使用して Gemini のテキストモデルとマルチモーダル モデルを呼び出すには、/GOOG/CL_GENERATIVE_MODEL クラスを使用します。クラスをインスタンス化するには、モデル生成パラメータで構成されたモデルキーを渡します。

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

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

プロンプトを使用してコンテンツを生成する

モデルにテキスト プロンプトを指定してコンテンツを生成する場合は、GENERATE_CONTENT メソッドを使用します。

lo_model->generate_content( 'PROMPT' ).

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

モデルにシステム指示を提供する

テキストベースのシステム指示をモデルに渡すには、SET_SYSTEM_INSTRUCTIONS メソッドを使用します。

lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).

SYSTEM_INSTRUCTIONS は、モデルに対するシステム インストラクションに置き換えます。

安全性設定を追加する

モデルの安全性設定を追加してレスポンスを生成するには、ADD_SAFETY_SETTINGS メソッドを使用します。この機能は、安全でないコンテンツをブロックするために、モデルに安全性に関するガイドラインを適用するために使用されます。

lo_model->add_safety_settings( iv_harm_category        = 'HARM_CATEGORY'
                               iv_harm_block_threshold = 'HARM_BLOCK_THRESHOLD'
                               iv_harm_block_method    = 'HARM_BLOCK_METHOD' ).

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

メソッドの呼び出しごとに、ADD_SAFETY_SETTINGS メソッドは指定された安全設定をモデルの入力に追加します。

モデルの生成構成を設定する

モデルの生成構成は、テーブル /GOOG/AI_CONFIG で維持します。特定の呼び出しの生成構成をオーバーライドするには、SET_GENERATION_CONFIG メソッドを使用します。生成プロパティのインポート パラメータが設定されている場合、渡されたパラメータ値が有効になります。

lo_model->set_generation_config( iv_response_mime_type = 'RESPONSE_MIME_TYPE'
                                 iv_temperature        = 'TEMPERATURE'
                                 iv_top_p              = 'TOP_P'
                                 iv_top_k              = 'TOP_K'
                                 iv_candidate_count    = 'CANDIDATE_COUNT'
                                 iv_max_output_tokens  = 'MAX_OUTPUT_TOKENS'
                                 iv_presence_penalty   = 'PRESENCE_PENALTY'
                                 iv_frequency_penalty  = 'FREQUENCY_PENALTY' ).

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

  • RESPONSE_MIME_TYPE: モデルのレスポンス MIME タイプ。
  • TEMPERATURE: ランダム性の温度。
  • TOP_P: Top-P サンプリング。
  • TOP_K: Top-K サンプリング。
  • CANDIDATE_COUNT: 生成する候補の数。
  • MAX_OUTPUT_TOKENS: メッセージあたりの出力トークンの最大数
  • PRESENCE_PENALTY: 正のペナルティ。
  • FREQUENCY_PENALTY: 頻度によるペナルティ。

これらのパラメータの詳細については、モデル生成パラメータを構成するをご覧ください。

マルチモーダル入力をモデルに渡す

Gemini モデルは、マルチモーダル入力を使用して呼び出すことができます。マルチモーダル入力には、テキスト画像動画ドキュメント、またはそれらの組み合わせを使用できます。入力は、元データ形式で渡すか、ファイル オブジェクトの Cloud Storage URI を指定して渡すことができます。

元データを設定する

ファイルの元データを MIME タイプとともにモデルへの入力として提供するには、SET_INLINE_DATA メソッドを使用します。動画入力で動画の特定の部分のみを考慮するには、オプションのインポート パラメータ IV_VIDEO_START_OFFSETIV_VIDEO_END_OFFSET を使用して、開始時間と終了時間を設定します。

lo_model->set_inline_data( iv_mime_type = 'MIME_TYPE'
                           iv_data      = 'RAW_DATA' ).

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

  • MIME_TYPE: 元データの IANA 標準 MIME タイプ。デフォルトでは、MIME タイプは application/pdf に設定されます。
  • RAW_DATA: プロンプトにインラインで含める画像、PDF、または動画の Base64 エンコードされた未加工データ。

/GOOG/CL_GENERATIVE_MODEL クラスの同じインスタンスを使用してモデルの入力からファイルの元データを消去するには、CLEAR_INLINE_DATA メソッドを使用します。

lo_model->clear_inline_data( ).

Cloud Storage からオブジェクトを設定する

Cloud Storage バケットに保存されているファイル オブジェクトの URI と MIME タイプをモデルへの入力として指定するには、SET_FILE_DATA メソッドを使用します。動画入力で動画の特定の部分のみを考慮するには、オプションのインポート パラメータ IV_VIDEO_START_OFFSETIV_VIDEO_END_OFFSET を使用して、開始時間と終了時間を設定します。

lo_model->set_file_data( iv_mime_type = 'MIME_TYPE'
                         iv_file_uri  = 'FILE_URI' ).

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

  • MIME_TYPE: ファイルデータの IANA 標準 MIME タイプ。デフォルトでは、MIME タイプは application/pdf に設定されます。
  • FILE_URI: Cloud Storage バケットに保存されているファイルの URI。

Cloud Storage バケット内のすべてのファイルをモデルへの入力として渡す場合は、メソッド SET_FILES_FROM_GCS を使用して、ターゲットの Cloud Storage バケット名を指定します。

lo_model->set_files_from_gcs( iv_storage_bucket_name = 'STORAGE_BUCKET_NAME').

STORAGE_BUCKET_NAME は、ファイルを含む Cloud Storage バケットの名前に置き換えます。

ABAP SDK for Google Cloud を介して Cloud Storage API を呼び出すための別のクライアント キーがある場合は、インポート パラメータ IV_KEY_NAME でクライアント キー名を渡します。

/GOOG/CL_GENERATIVE_MODEL クラスの同じインスタンスを使用して、Cloud Storage URI で設定されたオブジェクトをモデルの入力から消去するには、CLEAR_FILE_DATA メソッドを使用します。

lo_model->clear_file_data( ).

レスポンスの MIME タイプを設定する

モデルが返すレスポンスの MIME タイプを設定するには、SET_RESPONSE_MIME_TYPE メソッドを使用します。設定しない場合、デフォルトではモデルはレスポンスの MIME タイプとして text/plain を使用します。

lo_model->set_response_mime_type( iv_mime_type = 'RESPONSE_MIME_TYPE' ).

RESPONSE_MIME_TYPE は、生成されたコンテンツのレスポンスの MIME タイプに置き換えます。

テキスト プロンプト内のトークン数をカウントする

プロンプトを使用してモデルを呼び出す前に、テキスト プロンプト内のトークン数をカウントするには、COUNT_TOKENS メソッドを使用します。

DATA(lv_total_tokens) = lo_model->count_tokens( iv_prompt_text         = 'PROMPT'
                                                iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
                               )->get_total_tokens( ).

DATA(lv_total_billable_characters) = lo_model->count_tokens(
                                                 iv_prompt_text         = 'PROMPT'
                                                 iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
                                            )->get_total_billable_characters( ).

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

Gemini からの回答を受け取る

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

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

テキスト レスポンスを取得する

モデルからテキスト レスポンスを受け取るには、GET_TEXT メソッドを使用します。

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

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

安全性評価を取得する

モデルのレスポンスの安全性に関する評価のリストを取得するには、GET_SAFETY_RATING メソッドを使用します。

DATA(lt_safety_ratings) = lo_model->generate_content( 'PROMPT'
                                 )->get_safety_rating( ).

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

リクエスト プロンプト内のトークン数を取得する

モデルへの入力プロンプト内のトークン数を受け取るには、GET_PROMPT_TOKEN_COUNT メソッドを使用します。

DATA(lv_prompt_token_count) = lo_model->generate_content( 'PROMPT'
                                     )->get_prompt_token_count( ).

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

モデルのレスポンス内のトークン数を取得する

モデルからレスポンス内のトークン数を受け取るには、GET_CANDIDATES_TOKEN_COUNT メソッドを使用します。

DATA(lv_candidates_token_count) = lo_model->generate_content( 'PROMPT'
                                         )->get_candidates_token_count( ).

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

ブロックの理由を取得する

モデルがレスポンスの生成をブロックした理由を取得するには、GET_BLOCK_REASON メソッドを使用します。

DATA(lv_block_reason) = lo_model->generate_content( 'PROMPT'
                               )->get_block_reason( ).

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

ブロック理由のメッセージを取得する

モデルによるレスポンスの生成をブロックする理由を読み取れるメッセージを受信するには、GET_BLOCK_REASON_MESSAGE メソッドを使用します。

DATA(lv_block_reason_message) = lo_model->generate_content( 'PROMPT'
                                       )->get_block_reason_message( ).

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

コードサンプル

次のコードサンプルは、Gemini モデルを呼び出して、さまざまな種類の入力のレスポンスを生成する方法を示しています。

テキストベースの生成

次のコードサンプルは、システム インストラクションとともにテキスト プロンプトからレスポンスを生成する方法を示しています。システム命令は省略可能です。プロンプトとともに渡して、モデルに特定の動作を指示できます。

コードサンプル

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

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

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                               )->generate_content( lv_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.

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

マルチモーダル生成

次のコードサンプルは、テキストや画像などのマルチモーダル入力からレスポンスを生成する方法を示しています。テキスト プロンプトとともに、画像、動画、ドキュメントの Cloud Storage URI または元のファイルデータを指定できます。システム指示は省略可能です。プロンプトとともに渡して、モデルに特定の動作を指示できます。

コードサンプル

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

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

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                               )->set_file_data( iv_mime_type = 'MIME_TYPE'
                                                 iv_file_uri  = 'FILE_URI'
                               )->set_inline_data( iv_mime_type = 'MIME_TYPE'
                                                   iv_data      = 'INLINE_DATA'
                               )->generate_content( lv_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: モデルキー名。モデル生成パラメータで構成されます。
  • PROMPT: テキスト プロンプト
  • SYSTEM_INSTRUCTIONS: モデルに対するシステム指示
  • MIME_TYPE: ファイルデータの IANA 標準 MIME タイプ。デフォルトでは、MIME タイプは application/pdf に設定されています。
  • FILE_URI: Cloud Storage バケットに保存されているファイルの URI。
  • INLINE_DATA: プロンプトにインラインで含める画像、PDF、または動画の Base64 エンコードされた未加工データ。

モデルの安全設定を追加する

次のコードサンプルは、モデルに安全性設定を追加してレスポンスを生成する方法を示しています。

コードサンプル

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

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

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                               )->set_file_data( iv_mime_type = 'MIME_TYPE'
                                                 iv_file_uri  = 'FILE_URI'
                               )->set_inline_data( iv_mime_type = 'MIME_TYPE'
                                                   iv_data      = 'INLINE_DATA'
                               )->add_safety_settings( iv_harm_category        = 'HARM_CATEGORY'
                                                       iv_harm_block_threshold = 'HARM_BLOCK_THRESHOLD'
                                                       iv_harm_block_method    = 'HARM_BLOCK_METHOD'
                               )->generate_content( lv_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: モデルキー名。モデル生成パラメータで構成されます。
  • PROMPT: テキスト プロンプト
  • SYSTEM_INSTRUCTIONS: モデルに対するシステム指示
  • MIME_TYPE: ファイルデータの IANA 標準 MIME タイプ。デフォルトでは、MIME タイプは application/pdf に設定されています。
  • FILE_URI: Cloud Storage バケットに保存されているファイルの URI。
  • INLINE_DATA: プロンプトにインラインで含める画像、PDF、または動画の Base64 エンコードされた未加工データ。
  • HARM_CATEGORY: 適用する有害カテゴリ
  • HARM_BLOCK_THRESHOLD: 適用する確率ベースのしきい値レベル
  • HARM_BLOCK_METHOD: 適用する有害なコンテンツのブロック方法

プロンプト内のトークン数と課金対象文字数を確認する

プロンプトを使用してモデルを呼び出す前に、プロンプト内のトークン数とトークン内の課金対象文字数を確認して、Google Cloud プロジェクトの課金を計画することをおすすめします。次のコードサンプルは、これらの数値を見つけて、同様のモデル呼び出しの課金を評価する方法を示しています。

コードサンプル

DATA:
  lv_prompt      TYPE string.

lv_prompt      = 'PROMPT'.

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

    DATA(lv_total_tokens) = lo_model->count_tokens( lv_prompt
                                   )->get_total_tokens( ).

    DATA(lv_total_billable_characters) = lo_model->count_tokens( lv_prompt
                                                )->get_total_billable_characters( ).
    IF lv_total_tokens IS NOT INITIAL.
      cl_demo_output=>display( 'Total Tokens -' && lv_total_tokens ).

    ENDIF.

    IF lv_total_billable_characters IS NOT INITIAL.
      cl_demo_output=>display( 'Total Billable Characters -' && lv_total_billable_characters ).

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

ENDTRY.

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

次のステップ