使用 ABAP 適用的 Google Cloud SDK 從 ABAP 環境呼叫 Vertex AI LLM

1. 簡介

在這個程式碼研究室中,我們列出了如何使用 Google Cloud 適用的 ABAP SDK,從 ABAP 環境呼叫 Google Cloud Vertex AIPaLM 2 Text (text-bison) 基礎模型的步驟。

本程式碼研究室會使用下列 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. 總覽

以下簡要介紹您在本程式碼研究室中會用到的部分 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'

上述指令會使用 abap-sdk-poc 做為 Google Cloud 專案的範本名稱。請用您的專案 ID 取代該值。

  1. 如要確認是否已新增角色,請前往 IAM 頁面。您建立的服務帳戶應會列出,並顯示已指派給該帳戶的角色。

7. 在 SAP 中建立 SDK 設定

您已在 Google Cloud 端設定必要條件,現在可以繼續進行 SAP 端的設定。針對驗證和連線相關設定,Google Cloud 適用的 ABAP SDK 會使用 /GOOG/CLIENT_KEY 和 /GOOG/SERVIC_MAP 資料表。

如要維護 /GOOG/CLIENT_KEY 表格中的設定,請執行下列步驟:

  1. 在 SAP GUI 中輸入交易代碼 SPRO
  2. 按一下「SAP Reference IMG」
  3. 依序按一下「ABAP SDK for Google Cloud」>「基本設定」>「設定用戶端金鑰」
  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 的區域專屬服務端點,請參閱這個 連結)。

以下是為程式碼研究室建立 RFC 的步驟。

  • 前往交易代碼 SM59,並建立類型為「G」的連線。
  • 將目的地名稱設為「ZGOOG_VERTEXAI_V1」。
  • 提供說明 (如有必要) 和「443」通訊埠。
  • 請將「主機」位址設為「us-west4-aiplatform.googleapis.com」,因為我們在程式碼研究室中參照的是「us-west4-b」位置。

以下是 RFC 目的地的螢幕截圖,供您參考。

54316c5de58624c7.png

如要維護 /GOOG/SERVIC_MAP 資料表中的設定,請執行下列步驟:

  1. 在 SAP GUI 中輸入交易代碼 SPRO
  2. 按一下「SAP Reference IMG」
  3. 依序按一下「ABAP SDK for Google Cloud」>「基本設定」>「設定服務對應」。
  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

在下一個彈出式視窗中,選取「Local Object」或提供適當的套件名稱。

  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 模型,使用 Google Cloud 適用的 ABAP SDK 剖析訂單要求。

除了硬式編碼之外,您也可以考慮使用 Google Cloud 適用的 ABAP SDK 從 Gmail 收件匣取得電子郵件內容,然後將內容傳遞至 Vertex AI,如本程式碼研究室所述。

10. 清理

如果您不想繼續進行與 Google Cloud 適用的 ABAP SDK 相關的其他程式碼研究室,請繼續進行清理作業。

刪除專案

  • 刪除 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