使用 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 模型,并使用 Google Cloud 专用 ABAP SDK 接收回答。

2. 要求

  • 一个浏览器,例如 ChromeFirefox
  • 已启用结算功能的 Google Cloud 项目,或为 Google Cloud Platform 创建 90 天免费试用账号
  • 系统中安装了 SAP GUI(Windows 或 Java 版)。如果您的笔记本电脑上已安装 SAP GUI,请使用虚拟机外部 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 for Text:PaLM 2 for Text(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. 激活 Shell 后,请执行以下命令,在您的 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 端进行配置。对于与身份验证和连接相关的配置,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 > 基本设置 > 配置客户端密钥
  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 项目标识符

abap-sdk-poc

授权类

/GOOG/CL_AUTH_GOOGLE

将其他字段留空

Vertex AI 具有特定于区域的端点,因此我们必须为该端点创建 RFC 目标,并在表 /GOOG/SERVIC_MAP 中针对客户端密钥构建 API 映射。(如需了解适用于 Vertex AI 的区域专用服务端点,请参阅 链接)。

以下是创建此 Codelab 的 RFC 的步骤。

  • 前往事务代码 SM59,然后创建类型为“G”的连接。
  • 将目的地的名称设为“ZGOOG_VERTEXAI_V1”。
  • 根据需要提供说明,并将端口设置为“443”。
  • 将“主机”地址设为“us-west4-aiplatform.googleapis.com”,因为我们在本 Codelab 中引用的是位置“us-west4-b”。

下面是 RFC 目标的屏幕截图,供您参考。

54316c5de58624c7.png

如需维护 /GOOG/SERVIC_MAP 表中的配置,请执行以下步骤:

  1. 在 SAP GUI 中,输入事务代码 SPRO
  2. 点击 SAP 参考 IMG
  3. 依次点击 ABAP SDK for Google Cloud > 基本设置 > 配置服务映射
  4. 为以下字段保留以下值:

字段

说明

Google Cloud 密钥名称

VERTEX_AI_DEMO

Google 服务名称

AI Platform v2

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 文本模型的响应,具体请参阅此处的文档。
* 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 文本模型,以使用 ABAP SDK for Google Cloud 解析订单请求。

您也可以考虑使用 ABAP SDK for Google Cloud 从 Gmail 收件箱中获取电子邮件内容,然后将内容传递给 Vertex AI,而不是使用硬编码。如本 Codelab 中所述。

10. 清理

如果您不想继续学习与 ABAP SDK for Google Cloud 相关的其他 Codelab,请继续进行清理。

删除项目

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