ABAP SDK for Google Cloud を使用して ABAP 環境から Vertex AI LLM を呼び出す

1. はじめに

この Codelab では、ABAP SDK for Google Cloud を使用して、ABAP 環境から Google Cloud Vertex AIPaLM 2 Text(text-bison)基盤モデルを呼び出す手順について説明します。

この Codelab では、次の Google Cloud サービスを使用します。

  • Vertex AI
  • Cloud Shell

作成するアプリの概要

次のものを作成します。

  • Google Cloud プロジェクトで Vertex AI API を有効にします。
  • Vertex AI の PaLM 2 Text モデルにプロンプトを渡し、ABAP SDK for Google Cloud を使用してレスポンスを受信します。

2. 要件

  • ブラウザ(ChromeFirefox など)
  • 課金が有効になっている Google Cloud プロジェクト、または Google Cloud Platform の90 日間の無料トライアル アカウントを作成します。
  • システムにインストールされている SAP GUI(Windows または Java)。SAP GUI がラップトップにすでにインストールされている場合は、VM の外部 IP アドレスをアプリケーション サーバー IP として使用して SAP に接続します。Mac を使用している場合は、こちらのリンクから SAP GUI for Java をインストールすることもできます。

3. 始める前に

6757b2fb50ddcc2d.png

  • 次のコマンドを実行してアカウントの認証を行い、デフォルトのプロジェクトを abap-sdk-poc に設定します。ゾーン us-west4-b は例として使用されています。必要に応じて、次のコマンドのプロジェクトとゾーンを必要に応じて変更してください。
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. 概要

この Codelab で使用する Vertex AI のエンティティの概要は次のとおりです。

  • テキスト用 PaLM 2: テキスト用 PaLM 2(text-bison、text-unicorn)基盤モデルは、感情分析、エンティティ抽出、コンテンツ作成などのさまざまな自然言語タスク用に最適化されています。
  • Text-bison: Text-bison は、Google AI が開発した大規模言語モデル(LLM)です。これは、言語を理解して生成できる生成 AI の基盤モデルです。

5. Google Cloud プロジェクトで Vertex AI を有効にする

  1. Google Cloud プロジェクトに移動し、右上にある [Cloud Shell をアクティブにする] をクリックします。

8d15f753321c53e6.png

  1. シェルが有効になったら、次のコマンドを実行して Google Cloud プロジェクトで Cloud Secret Manager API を有効にします。
gcloud services enable aiplatform.googleapis.com

Google Cloud プロジェクトで Vertex AI API が有効になっているはずです。

6. ユーザーロールを持つサービス アカウントを作成する

必要なロールを持つサービス アカウントを作成するには、次の操作を行います。

  1. Cloud Shell ターミナルで次のコマンドを実行します。
gcloud iam service-accounts create abap-sdk-vertexai-tester \
--display-name="Service Account for Vertex AI"
  1. 次に、API にアクセスするために、上記の手順で作成したサービス アカウントに必要なロールを追加します。
gcloud endpoints services add-iam-policy-binding aiplatform.googleapis.com \ --member='serviceAccount:abap-sdk-vertexai-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/roles/aiplatform.endpoints.predict'

上記のコマンドでは、Google Cloud プロジェクトのテンプレート名として abap-sdk-poc を使用しています。プロジェクト ID に置き換えます。

  1. ロールが追加されたことを確認するには、[IAM] ページに移動します。作成したサービス アカウントと、そのサービス アカウントに割り当てられたロールが一覧表示されます。

7. SAP で SDK 構成を作成する

Google Cloud 側で前提条件を設定したので、SAP 側の構成に進みます。認証と接続に関連する構成の場合、ABAP SDK for Google Cloud ではテーブル /GOOG/CLIENT_KEY と /GOOG/SERVIC_MAP が使用されます。

テーブル /GOOG/CLIENT_KEY の構成を維持するには、次の操作を行います。

  1. SAP GUI で、トランザクション コード SPRO を入力します。
  2. [SAP 参照 IMG] をクリックします。
  3. [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Client Key] をクリックします。
  4. フィールドに対して次の値を維持します。

フィールド

説明

Google Cloud キー名

VERTEX_AI_DEMO

Google Cloud サービス アカウント名

abap-sdk-vertexai-tester@abap-sdk-poc.iam.gserviceaccount.com

Google Cloud のスコープ

https://www.googleapis.com/auth/cloud-platform

Google Cloud プロジェクト ID

abap-sdk-poc

認可クラス

/GOOG/CL_AUTH_GOOGLE

その他のフィールドは空白のままにします

Vertex AI にはリージョン固有のエンドポイントがあるため、エンドポイントの RFC 宛先を作成し、テーブル /GOOG/SERVIC_MAP で API のマッピングをクライアント キーに対して構築する必要があります。(Vertex AI のリージョン固有のサービス エンドポイントについては、こちらリンクをご覧ください)。

Codelab の RFC を作成する手順は次のとおりです。

  • トランザクション コード SM59 に移動し、タイプ「G」の接続を作成します。
  • 宛先の名前を「ZGOOG_VERTEXAI_V1」にします。
  • 必要に応じて説明を入力し、ポートを「443」にします。
  • Codelab ではロケーション「us-west4-b」を参照しているため、「Host」アドレスを「us-west4-aiplatform.googleapis.com」にします。

以下のスクリーンショットは、RFC 宛先を示しています。

54316c5de58624c7.png

テーブル /GOOG/SERVIC_MAP の構成を維持するには、次の操作を行います。

  1. SAP GUI で、トランザクション コード SPRO を入力します。
  2. [SAP 参照 IMG] をクリックします。
  3. [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Service Mapping] をクリックします。
  4. フィールドに対して次の値を維持します。

フィールド

説明

Google Cloud キー名

VERTEX_AI_DEMO

Google サービス名

aiplatform:v1

RFC 宛先

ZGOOG_VERTEXAI_V1

8. SDK を使用して PaLM 2 Text を呼び出す

  1. SAP システムにログインします。
  2. トランザクション コード SE38 に移動し、「ZDEMO_VERTEX_AI」という名前のレポートを作成します。
  3. 表示されたポップアップで、次のように詳細を入力し、[保存] をクリックします。

b06fda1a879290f7.png

次のポップアップで、[ローカル オブジェクト] を選択するか、必要に応じてパッケージ名を指定します。

  1. ABAP エディタで、次のコード スニペットを追加します。
  • このスニペットでは、緊急の注文リクエストのメール コンテンツをプロンプトとして渡し、解析して注文属性(お客様の名前、会社名、お客様の役職、商品名、注文数量、配送先住所、配達日など)を抽出する手順も渡しています。
  • ABAP 型の宣言は、こちらのドキュメントに沿って、Vertex AI PaLM 2 Text モデルに対するリクエストを準備し、そのモデルからのレスポンスをキャプチャするためのものです。
* Types declarations
TYPES:
  BEGIN OF ty_instances,
    content TYPE string,
  END OF ty_instances.

TYPES:
     tt_instances TYPE STANDARD TABLE OF ty_instances WITH DEFAULT KEY .

TYPES:
  BEGIN OF ty_parameters,
    max_output_tokens TYPE i,
    temperature       TYPE f,
    top_k             TYPE i,
    top_p             TYPE f,
  END OF ty_parameters.

TYPES ty_categories TYPE string .
TYPES:
  BEGIN OF ty_scores,
    scores TYPE string,
  END OF ty_scores .
TYPES:
  tt_categories TYPE STANDARD TABLE OF ty_categories WITH DEFAULT KEY .
TYPES:
  tt_scores TYPE STANDARD TABLE OF ty_scores WITH DEFAULT KEY .

TYPES:
  BEGIN OF ty_safety_attributes,
    blocked    TYPE abap_bool,
    categories TYPE tt_categories,
    scores     TYPE tt_scores,
  END OF ty_safety_attributes .

TYPES:
  BEGIN OF ty_predictions,
    content           TYPE string,
    safety_attributes TYPE ty_safety_attributes,
  END OF ty_predictions .
TYPES:
  tt_predictions TYPE STANDARD TABLE OF ty_predictions WITH DEFAULT KEY .

TYPES:
  BEGIN OF ty_output,
    deployed_model_id  TYPE string,
    metadata           TYPE REF TO data,
    model              TYPE string,
    model_display_name TYPE string,
    model_version_id   TYPE string,
    predictions        TYPE tt_predictions,
  END OF ty_output.

* Data declarations
DATA:
  lv_p_projects_id   TYPE string,
  lv_p_locations_id  TYPE string,
  lv_p_publishers_id TYPE string,
  lv_p_models_id     TYPE string,
  ls_input           TYPE /goog/cl_aiplatform_v1=>ty_001.

DATA:
      lv_email_text TYPE string.

CONSTANTS: lc_ob TYPE c VALUE '{',
           lc_cb TYPE c VALUE '}'.

* Email content having order request
lv_email_text = |'Hello, We are running low on Dark Chocolates, please ship 20 units of "Lindt 90% Dark Chocolates"'| &&
                |' and 10 units of "Toblerone Dark Bar 100g" to "Google Cloud, 1 East 2'| &&
                |'4th St, Kearney NE" by as early as possible. Thanks and Regards, John Doe, Procurement Manager, Google Cloud'|.

TRY.
    DATA(lv_raw) = VALUE string( ).
* Open HTTP Connection
    DATA(lo_client) = NEW /goog/cl_aiplatform_v1( iv_key_name = 'VERTEX_AI_DEMO' ).

* Populate relevant parameters
    lv_p_projects_id = lo_client->gv_project_id.
    lv_p_locations_id = 'us-west4-b'.
    lv_p_publishers_id = 'google'.
    lv_p_models_id = 'text-bison'.

* Call API method: aiplatform.projects.locations.publishers.models.predict
    CALL METHOD lo_client->predict_models
      EXPORTING
        iv_p_projects_id   = lv_p_projects_id
        iv_p_locations_id  = lv_p_locations_id
        iv_p_publishers_id = lv_p_publishers_id
        iv_p_models_id     = lv_p_models_id
        is_input           = VALUE #(
     parameters = NEW ty_parameters(
           max_output_tokens  = 256
           temperature = '0.2'
           top_k = '40'
           top_p  = '0.8' )
* Pass the prompt with email content and instructions to get order attributes
     instances = NEW tt_instances( ( content =
      |'Give me the Customer Name, Company Name, Customer Designation, Item Name, Order Quantity, Shipping address, Delivery Date'| &&
      |'from an email context. Structure the response in JSON camelcase format with fields corresponding to each entities. Place the ordered items in a JSON nest'| &&
      |'Default the delivery date to a future date in DD.MM.YYYY format. Here is the email content:'| && lv_email_text ) ) )
      IMPORTING
        es_raw             = lv_raw
        ev_ret_code        = DATA(lv_ret_code)
        ev_err_text        = DATA(lv_err_text)
        es_err_resp        = DATA(ls_err_resp).

    IF lo_client->is_success( lv_ret_code ).
      DATA(ls_output_llm) = VALUE ty_output( ).
* Deserializing API response to get model response
      /goog/cl_json_util=>deserialize_json( EXPORTING iv_json        = lv_raw
                                                      iv_pretty_name = /ui2/cl_json=>pretty_mode-extended
                                            IMPORTING es_data        = ls_output_llm ).
      cl_demo_output=>new(
        )->begin_section( 'API Call Successful:'
        )->write_text( 'Respose from model:'
        )->write_text( ls_output_llm-predictions[ 1 ]-content
        )->display( ).
    ELSE.
      cl_demo_output=>new(
        )->begin_section( 'API Call Unsuccessful:'
        )->write_text( 'Error Message:'
        )->write_text( lv_err_text
        )->display( ).

    ENDIF.

* Close HTTP Connection
    lo_client->close( ).

  CATCH /goog/cx_sdk INTO DATA(lo_exception).
    DATA(lv_error) = lo_exception->get_text( ).
    cl_demo_output=>new(
     )->begin_section( 'Exception Occured:'
     )->write_text( lv_error
     )->display( ).

ENDTRY.
  1. レポート プログラムを保存して有効にします。
  2. レポートを実行します(F8)。

実行が成功すると、プロンプトに従って抽出された注文属性を含む、次のようなレポート出力が表示されます。

c40839b43b8ac44f.png

9. 完了

これで、ABAP プログラムから Vertex AI PaLM 2 Text モデルを呼び出し、ABAP SDK for Google Cloud を使用して注文リクエストを解析できました。

ハードコードする代わりに、ABAP SDK for Google Cloud を使用して Gmail 受信トレイからメール コンテンツを取得し、この Codelab で説明するようにコンテンツを Vertex AI に渡すこともできます。

10. クリーンアップ

ABAP SDK for Google Cloud に関連する追加の Codelabs を続行しない場合は、クリーンアップに進んでください。

プロジェクトを削除する

  • Google Cloud プロジェクトを削除します。
gcloud projects delete abap-sdk-poc

個々のリソースを削除する

  1. コンピューティング インスタンスを削除します。
gcloud compute instances delete abap-trial-docker
  1. ファイアウォール ルールを削除します。
gcloud compute firewall-rules delete sapmachine
  1. サービス アカウントを削除します。
gcloud iam service-accounts delete \
    abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com