ABAP SDK for Google Cloud를 사용하여 ABAP 환경에서 Vertex AI LLM 호출

1. 소개

이 Codelab에서는 Google Cloud용 ABAP SDK를 사용하여 ABAP 환경에서 Google Cloud Vertex AIPaLM 2 텍스트 (text-bison) 기반 모델을 호출하는 방법을 설명합니다.

이 Codelab에서는 다음 Google Cloud 서비스를 사용합니다.

  • Vertex AI
  • Cloud Shell

빌드할 항목

다음을 만듭니다.

  • Google Cloud 프로젝트에서 Vertex AI API를 사용 설정합니다.
  • Vertex AI의 PaLM 2 텍스트 모델에 프롬프트를 전달하고 Google Cloud용 ABAP SDK를 사용하여 응답을 수신합니다.

2. 요구사항

  • 브라우저(Chrome, Firefox 등)
  • 결제가 사용 설정된 Google Cloud 프로젝트 또는 Google Cloud Platform용 90일 무료 체험판 계정 만들기
  • 시스템에 설치된 SAP GUI (Windows 또는 Java) 노트북에 SAP GUI가 이미 설치되어 있는 경우 VM 외부 IP 주소를 애플리케이션 서버 IP로 사용하여 SAP에 연결합니다. Mac을 사용하는 경우 링크에서 Java용 SAP GUI를 설치할 수도 있습니다.

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'

위 명령어는 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'으로 지정합니다.
  • Codelab에서 'us-west4-b' 위치를 참조하므로 '호스트' 주소를 'us-west4-aiplatform.googleapis.com'으로 지정합니다.

다음은 참고하실 수 있도록 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 텍스트 모델을 호출하여 Google Cloud용 ABAP SDK를 사용하여 주문 요청을 파싱했습니다.

하드 코딩하는 대신 Google Cloud용 ABAP SDK를 사용하여 Gmail 받은편지함에서 이메일 콘텐츠를 가져온 다음 이 Codelab에 설명된 대로 콘텐츠를 Vertex AI에 전달할 수도 있습니다.

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