BigQuery データに関する Gemini の分析情報を取得する

BigQuery AI and ML SDK for ABAP を使用すると、BigQuery に保存されているエンタープライズ データに対して Gemini クエリを実行し、ABAP ベースのエージェントまたはアプリケーションから結果を取得できます。SDK では、Gemini モデルを使用して次のことができます。

  • BigQuery でテキストデータから分析情報を生成する
  • BigQuery で画像または動画データから分析情報を生成する

BigQuery 関数 ML.GENERATE_TEXT を使用して、BigQuery データセットに保存されているエンタープライズ データに対して Gemini ベースの分析を行うことができます。

Vertex AI の Gemini モデルにアクセスするには、Vertex AI モデルのエンドポイントを表すリモートモデルを BigQuery ML で作成します。使用する Vertex AI モデルでリモートモデルを作成したら、リモートモデルに対して BigQuery ML 関数を実行して、そのモデルの機能にアクセスできます。

始める前に

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

料金

BigQuery AI and ML SDK for ABAP は無料で提供されています。ただし、BigQuery と Vertex AI プラットフォームの料金については、次のようにお客様の負担となります。

  • BigQuery ML: BigQuery で処理するデータに対して料金が発生します。
  • Vertex AI: リモートモデルで表される Vertex AI サービスの呼び出しに対して料金が発生します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを算出できます。

BigQuery の料金の詳細については、BigQuery の料金ページをご覧ください。

Vertex AI の料金の詳細については、Vertex AI の料金のページをご覧ください。

BigQuery で Gemini クエリを実行する

このセクションでは、BigQuery AI and ML SDK for ABAP を使用して、BigQuery のエンタープライズ データから Gemini ベースの分析情報を生成する方法について説明します。

SDK に付属の ABAP クラス /GOOG/CL_BQ_GENERATIVE_MODEL を使用すると、BigQuery 関数 ML.GENERATE_TEXT を使用して Gemini クエリを実行できます。

Gemini クエリを設定する

SDK を使用して Gemini クエリを実行する方法は次のとおりです。

  • クエリを保存して、Gemini in BigQuery を実行します。アプリケーション ロジックからクラスをインスタンス化するときに、クラス /GOOG/CL_BQ_QUERY を使用して、保存したクエリ名を指定します。

    TRY.
        DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                                  iv_location_id = 'QUERY_LOCATION_ID'
          iv_query_name  = 'SAVED_QUERY_NAME' ).
    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
        cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
    
    ENDTRY.
    

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

    • CLIENT_KEY: 認証の設定時に Google Cloud への認証用に構成したクライアント キー。
    • QUERY_LOCATION_ID: クエリが保存される Google Cloud のロケーション。
    • SAVED_QUERY_NAME: BigQuery にクエリを保存するクエリの名前。
  • アプリケーション ロジックからクラス /GOOG/CL_BQ_QUERY をインスタンス化するときに、クエリテキストを渡して Gemini を呼び出します。

    TRY.
        DATA(lo_bq_query) = NEW /goog/cl_bq_query( iv_key         = 'CLIENT_KEY'
                                                  iv_location_id = 'QUERY_LOCATION_ID'
          iv_query_text  = 'QUERY_TEXT' ).
    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
        cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
    
    ENDTRY.
    

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

    • CLIENT_KEY: 認証の設定時に Google Cloud への認証用に構成したクライアント キー。
    • QUERY_LOCATION_ID: クエリが保存される Google Cloud のロケーション。
    • QUERY_TEXT: Gemini で実行するクエリテキスト。

保存したクエリ名または直接クエリテキストを使用して /GOOG/CL_BQ_QUERY クラスをインスタンス化すると、クラス内にクエリが設定されます。次に、クラス参照を入力として /GOOG/CL_BQ_GENERATIVE_MODEL ABAP クラスに渡して、クエリを呼び出します。

BigQuery Gemini 呼び出し元クラスをインスタンス化する

BigQuery データセットで Gemini のテキストモデルとマルチモーダル モデルを呼び出すには、クラス /GOOG/CL_BQ_GENERATIVE_MODEL を使用します。

TRY.
    DATA(lo_bq_generative_model) = NEW /goog/cl_bq_generative_model( iv_key = 'CLIENT_KEY' ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

CLIENT_KEY は、認証の設定時に Google Cloud の認証用に構成したクライアント キーに置き換えます。

Gemini クエリを実行する

BigQuery 関数 ML.GENERATE_TEXT で Gemini クエリを実行するには、クラス /GOOG/CL_BQ_GENERATIVE_MODEL のメソッド EXECUTE_QUERY を使用します。クエリで設定されたクラス /GOOG/CL_BQ_QUERY のオブジェクトが、メソッドへの入力として渡されます。

lo_bq_generative_model->execute_query( io_query = lo_bq_query ).

LO_BQ_QUERY は、クエリを設定した後のクラス /GOOG/CL_BQ_QUERY の参照です。

モデル生成パラメータをオーバーライドする

Gemini モデルの生成パラメータは、BigQuery で保存したクエリまたは渡されたクエリテキストで定義できます。ただし、ABAP アプリケーション ロジックから同じクエリのパラメータをオーバーライドする必要がある場合は、/GOOG/CL_BQ_GENERATIVE_MODEL クラスのメソッド SET_GENERATION_CONFIG を使用できます。最初のクエリの生成パラメータは、このメソッドを介して渡されたパラメータでオーバーライドされます。

DATA lt_stop_sequences TYPE /goog/cl_bigquery_v2=>ty_t_string.
DATA lt_safety_settings TYPE /goog/cl_bq_generative_model=>ty_t_safety_settings.
DATA ls_safety_settings TYPE /goog/cl_bq_generative_model=>ty_safety_setting.

APPEND 'STOP_SEQUENCE' TO lt_stop_sequences.

ls_safety_settings-category = 'CATEGORY'.
ls_safety_settings-threshold = 'THRESHOLD'.

APPEND ls_safety_settings TO lt_safety_settings.

lo_bq_generative_model->set_generation_config( iv_temperature               = 'TEMPERATURE'
                               iv_top_p                     = 'TOP_P'
       iv_top_k                     = 'TOP_K'
       iv_max_output_tokens         = 'MAX_OUTPUT_TOKENS'
       iv_flatten_json_output       = 'IS_FLATTEN_JSON_OUTPUT'
       iv_ground_with_google_search = 'IS_GROUND_WITH_GOOGLE_SEARCH'
it_stop_sequences            = lt_stop_sequences
it_safety_settings           = lt_safety_settings ).

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

  • STOP_SEQUENCE: 指定された文字列がモデルからのレスポンスに含まれている場合にその文字列を削除する値。
  • CATEGORY: レスポンスのフィルタリングに使用するコンテンツの安全性カテゴリ。ML.GENERATE_TEXT入力構文で、安全性設定引数の推定値を探します。
  • THRESHOLD: レスポンスのフィルタリングに使用するブロックしきい値。ML.GENERATE_TEXT入力構文で、安全性設定引数の推定値を探します。
  • TEMPERATURE: トークン選択のランダム性の度合いを制御する値。
  • TOP_P: モデルが出力用のトークンを選択する方法を変更する値。
  • TOP_K: モデルが出力用のトークンを選択する方法を変更する値。
  • MAX_OUTPUT_TOKENS: レスポンスで生成できるトークンの最大数を設定する値。
  • IS_FLATTEN_JSON_OUTPUT: 関数から返された JSON コンテンツを別の列に解析するかどうかを決定するブール値。
  • IS_GROUND_WITH_GOOGLE_SEARCH: Vertex AI モデルがレスポンスを生成するときに Google 検索でグラウンディングを使用するかどうかを決定する値。

Gemini クエリのクエリ結果を取得する

BigQuery ML for Gemini クエリから処理されたレスポンスを受信し、意味のある方法で表示するには、クラス /GOOG/CL_BQ_MODEL_RESPONSE を使用します。

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

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

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

DATA(lt_bq_response) = lo_bq_generative_model->execute_query( io_query = lo_bq_query
                                            )->get_text_response( ).

クエリジョブのステータスを取得する

BigQuery 内の各クエリは、クエリジョブとして実行されます。クエリジョブのステータスを取得するには、GET_QUERY_JOB_STATUS メソッドを使用します。

lo_bq_generative_model->execute_query( io_query = lo_bq_query
                     )->get_query_job_status(
IMPORTING ev_job_complete          = DATA(lv_job_complete)
  ev_job_creation_reason   = DATA(lv_job_creation_reason)
  ev_job_id                = DATA(lv_job_id)
  ev_query_id              = DATA(lv_query_id)
  ev_total_bytes_processed = DATA(lv_total_bytes_processed)
  ev_total_rows            = DATA(lv_total_rows) ).

このメソッドは、次のジョブ ステータス指標を返します。

  • クエリが完了したかどうか
  • Job が作成された理由
  • クエリを実行するために作成された Job への参照
  • クエリの自動生成 ID
  • このクエリで処理された合計バイト数
  • 完全なクエリ結果セットの行の合計数

クエリジョブのエラーを取得する

エラーが存在する場合にそのエラーを取得するには、メソッド GET_QUERY_JOB_ERRORS を使用します。

DATA(lt_query_job_errors) = lo_bq_generative_model->execute_query( io_query = lo_bq_query
                                                 )->get_query_job_errors( ).

終了理由を取得する

モデルが各行のトークンの生成を停止した理由を取得するには、メソッド GET_FINISH_REASON を使用します。

DATA(lt_finish_reason) = lo_bq_generative_model->execute_query( io_query = lo_bq_query
                                              )->get_finish_reason( ).

使用状況のメタデータを取得する

各行に対して生成されたレスポンスに関する使用状況メタデータを取得するには、GET_USAGE_METADATA メソッドを使用します。

DATA(lt_usage_metadata) = lo_bq_generative_model->execute_query( io_query = lo_bq_query
                                               )->get_usage_metadata( ).

使用状況のメタデータは、次の指標で構成されます。

  • レスポンスに含まれる行のトークンの合計数
  • 入力プロンプトのトークン数
  • トークンの合計数

安全性評価を取得する

レスポンスの安全性評価を取得するには、GET_SAFETY_RATING メソッドを使用します。レスポンスの安全性評価を取得するには、入力クエリでモデル生成パラメータとして安全性評価を設定する必要があります。

DATA(lt_safety_ratings) = lo_bq_generative_model->execute_query( io_query = lo_bq_query
                                               )->get_safety_rating( ).

全体的なレスポンス テーブルを取得する

実行した Gemini クエリの全体的なレスポンス テーブルを取得するには、GET_RESPONSE_TABLE メソッドを使用します。

lo_bq_model_response->get_response_table(
IMPORTING et_bqml_response              = DATA(lt_bqml_response)
                  et_bqml_response_flatten_json = DATA(lt_bqml_response_flatten_json)
                  et_bqml_response_grounding    = DATA(lt_bqml_response_grounding) ).

クエリで設定された生成パラメータに基づいて作成されるレスポンス テーブルは 1 つのみです。

  • 入力クエリでパラメータ FLATTEN_JSON_OUTPUTTRUE に設定されていない場合、ET_BQML_RESPONSE に値が入力されます。
  • ET_BQML_RESPONSE_FLATTEN_JSON は、入力クエリでパラメータ FLATTEN_JSON_OUTPUTTRUE に設定されている場合に入力されます。
  • ET_BQML_RESPONSE_GROUNDING は、入力クエリでパラメータ FLATTEN_JSON_OUTPUTTRUE に設定され、入力クエリでパラメータ GROUNDING_WITH_GOOGLE_SEARCHTRUE に設定されている場合に入力されます。

グラウンディング ソースを取得する

モデルがレスポンスの生成に使用したグラウンディング ソースを一覧表示するには、メソッド GET_GROUNDING_SOURCE を使用します。

DATA(lt_query_grounding_sources) = lo_bq_generative_model->execute_query( io_query = lo_bq_query
                                                        )->get_grounding_source( ).