SAP용 Gemini 기반 비즈니스 규칙 엔진

이 문서에서는 Gemini와 같은 대규모 언어 모델(LLM)을 기반으로 하는 비즈니스 규칙 엔진을 빌드하여 SAP 비즈니스 애플리케이션 내에서 의사결정을 자동화하기 위한 참조 아키텍처를 설명합니다. ABAP SDK for Google Cloud의 다양한 통합 기능을 사용합니다.

이 문서의 주요 대상에는 ABAP 개발자, SAP 솔루션 설계자, 클라우드 설계자가 포함됩니다. 이 문서에서는 ABAP SDK for Google Cloud, ABAP용 Vertex AI SDK, 기본적인 LLM 소개에 대한 기본적인 이해가 있다고 가정합니다.

비즈니스 규칙 엔진(BRE)이란 무엇인가요?

비즈니스 규칙 엔진(BRE)은 비즈니스 규칙을 정의, 배포, 실행할 수 있는 소프트웨어 시스템입니다. 이러한 규칙은 본질적으로 비즈니스 운영 방식을 지정하는 로직 문입니다. BRE는 비즈니스 규칙을 애플리케이션에 하드코딩하는 대신 로직 문을 외부화하므로 규칙을 효율적으로 관리하고 수정할 수 있습니다.

Gemini 기반 BRE는 Google의 차세대 AI 모델인 Gemini의 고급 언어 처리 및 추론 기능을 사용하여 비즈니스 규칙으로 작동하는 설계된 프롬프트 저장소를 기반으로 의사결정을 자동화합니다. 특정 안내와 예상 출력 형식으로 작성된 이러한 프롬프트는 Gemini가 사전 정의된 비즈니스 로직과 일관된 방식으로 데이터를 분석하고, 패턴을 식별하고, 결정을 내릴 수 있도록 안내합니다.

아키텍처

다음 다이어그램은 SAP 애플리케이션용 Gemini 지원 BRE를 만들기 위한 참조 아키텍처를 보여줍니다.

SAP용 Gemini 기반 비즈니스 규칙 엔진

이 참조 아키텍처에는 다음 구성요소가 포함됩니다.

구성요소 하위 시스템 세부정보
1 SAP ERP Gemini 기반 BRE를 사용하여 자동화된 의사결정을 위한 통계를 도출하는 SAP S/4HANA와 같은 SAP ERP 시스템입니다. 사용 사례에 따라 BRE 모듈에 규칙 ID와 필요한 입력 데이터를 제공합니다.
2 BRE 모듈 BRE 모듈은 ABAP SDK for Google Cloud를 사용하여 Cloud Storage에서 구성된 규칙을 검색하고 ABAP용 Vertex AI SDK를 사용하여 Gemini를 호출하여 규칙을 처리합니다.
3 규칙 저장소 일관된 이름 지정 규칙을 사용하여 .txt 또는 .prompt와 같은 텍스트 파일로 Cloud Storage에 규칙(엔지니어링된 프롬프트)을 저장합니다. 예를 들면 RiskShiftingClause.prompt입니다. 엔지니어링된 프롬프트를 구조적으로 관리하려면 Cloud SQL과 같은 데이터베이스를 사용하는 것도 고려해 볼 수 있습니다.
4 규칙 프로세서 ABAP용 Vertex AI SDK는 입력 데이터(예: 전송 안내)와 검색된 규칙(프롬프트)을 Gemini로 전송합니다. Gemini는 프롬프트와 입력 데이터를 처리하고 분석을 실행한 후 지정된 형식으로 결과를 반환합니다.

사용 제품

이 참조 아키텍처에는 다음과 같은 Google Cloud 제품이 사용됩니다.

  • ABAP SDK for Google Cloud: SAP 시스템을 Cloud Storage와 같은 Google Cloud 서비스에 연결하는 ABAP 애플리케이션을 개발하는 데 도움이 됩니다.

  • ABAP용 Vertex AI SDK: SAP 환경 내에서 Google의 Vertex AI를 사용할 수 있습니다. 이렇게 하면 SAP 애플리케이션에서 AI 기반 기능을 간편하게 빌드할 수 있습니다.

  • Cloud Storage: 온라인에서 원하는 양의 데이터를 저장하고 액세스할 수 있는 클라우드 서비스입니다.

  • Vertex AI: 다양한 애플리케이션을 위한 머신러닝 모델을 빌드, 배포, 확장할 수 있습니다.

사용 사례

회사에서 인바운드 구매주문서(PO)를 PDF로 수신하고 자동화된 프로세스를 사용하여 SAP에서 판매 주문을 생성하는 시나리오를 생각해 보세요. 수신 PO의 배송 주석에서 발견된 위험 이전 조항을 식별하고 완화하려면 이 프로세스를 업데이트해야 합니다.

계약의 위험 이전 조항은 한 당사자에서 다른 당사자로 위험을 이전하는 조항입니다. 이러한 조항을 파악하고 해결하지 않으면 예상치 못한 비용, 법적 분쟁, 평판 손상이 발생할 수 있습니다.

다음은 PO 문서의 배송 주석에 작성된 위험 이전 조항의 예입니다.

'판매자는 제품이 배송일로부터 10년간 결함이 없음을 보증합니다.'

다음에 관한 규칙을 작성해야 합니다.

  • 위험 이전 조항을 파악하고 분류합니다.
  • 잠재적인 경고로 간주되는 이유를 설명합니다.
  • 위험을 완화하는 방법에 관한 권장사항을 제공합니다.

Gemini로 BRE를 빌드하여 지능형 JSON 응답을 생성할 수 있습니다. 그러면 SAP 비즈니스 애플리케이션에서 자동 결정을 내리거나 프로세스 거부를 트리거하거나 다운스트림 사용자 검증을 시작할 수 있습니다.

위험 이전 조항 샘플

다음 표에는 인바운드 구매 주문에서 찾을 수 있는 샘플 위험 이전 조항이 나와 있습니다.

문제 카테고리 예시 절(배송 안내) 잠재적 문제
배상 범위 초과 판매자는 제품과 관련하여 발생하거나 이와 관련된 모든 청구, 손실, 손해 및 변호사 수임료를 포함하되 이에 국한되지 않는 비용에 대해 구매자에게 배상해야 합니다. 너무 광범위하여 예상치 못한 사건이나 고객의 오용에 대해 판매자가 책임을 지게 되는 경우 문제가 될 수 있습니다.
과도한 기밀성 확장 가격, 사양, 마케팅 계획을 포함하되 이에 국한되지 않고 구매자가 판매자에게 공개한 모든 정보는 구매자의 독점 및 기밀 정보로 간주됩니다. 이로 인해 판매자가 일반적인 업계 지식을 사용하거나 다른 고객과 협력하는 데 어려움을 겪을 수 있습니다.
준거법이 모호함 본 계약은 해당 위치(예: 일리노이주) 법률의 적용을 받습니다. 이로 인해 구매자와 판매자가 서로 다른 관할권에 있는 경우 법률 충돌이 발생할 수 있습니다.
불가항력 제한 판매자는 천재지변, 전쟁, 테러 등 불가항력적 사유로 인해 본 계약에 따른 이행 책임이 면제되지 않습니다. 이 경우 판매자는 통제할 수 없는 상황에 대해 책임을 져야 할 수 있습니다.
지식 재산 모호성 제품의 모든 지식 재산권은 구매자에게 속합니다. 판매자가 제재 대상 국가 출신이거나 제재 대상 국가와 관련이 있는 경우 위험 신호일 수 있습니다.

엔지니어링된 샘플 프롬프트

이 섹션에서는 RTF 프레임워크를 사용하여 엔지니어링된 샘플 프롬프트를 설명합니다. 프롬프트 엔지니어링의 RTF 프레임워크는 역할, 태스크, 형식을 나타냅니다. 이는 Gemini와 같은 LLM에서 더 나은 일관된 결과를 얻을 수 있도록 프롬프트를 구성하는 효과적인 방법입니다.

  • 역할: LLM이 채택할 페르소나입니다(예: '영업 전문가' 또는 '법률 자문').
  • 작업: '이 텍스트 요약' 또는 '항목 분석'과 같은 LLM에 대한 구체적인 작업입니다.
  • 형식: 목록 또는 JSON과 같은 원하는 출력 구조입니다.

모델의 응답에 영향을 미치는 데 사용할 수 있는 일반적인 프롬프트 전략에 대해 알아보려면 프롬프트 전략 개요를 참고하세요.

다음 프롬프트는 Gemini가 위험 이전 조항과 같은 문제를 식별하는 데 도움이 되는 정의 규칙 역할을 합니다.

RTF 프레임워크
Role

You are a legal advisor for my company.

Task

Analyze the below delivery instruction on a purchase order from my
customer and let me know if it could cause any issues to my company.

Format

Respond to me in plain text JSON format with 4 fields.

Field 1 should be "issue" with possible values Yes or No.

Field 2 should be "issueCategory" with possible values Indemnification
Overreach, Unilateral Termination Clause, Confidentiality Overextension,
Unreasonable Warranty, Ambiguous Governing Law, Unclear Dispute Resolution,
Force Majeure Limitation, Unbalanced Liability,
Intellectual Property Ambiguity, Compliance with Sanctions, Others or None.

Field 3 should be "explanation" - use this field to give a short
explanation for your response on Field 1.

Field 4 should be "recommendation" - use this field to give a short
recommendation of how to mitigate such issues.

Do not include backticks in the response.

Delivery Instruction: "Seller warrants that the products will be free
from defects for a period of ten years from the date of delivery."

{
  "issue": "Yes",
  "issueCategory": "Unreasonable Warranty",
  "explanation":   "A ten-year warranty is significantly longer than
  industry standard for most products. This could expose your company to
  substantial financial risk if issues arise with the products years
  down the line.",
  "recommendation": "Negotiate a shorter warranty period that aligns
  with industry standards and your product's expected lifespan.
  Offer extended warranty options at an additional cost if the
  customer requires longer coverage."
}

이 프롬프트를 Cloud Storage와 같은 저장소에 저장할 수 있습니다. 입력 데이터는 SAP 트랜잭션에서 BRE 모듈로 전달할 수 있습니다.

그런 다음 ABAP SDK for Google Cloud를 사용하여 Cloud Storage에서 프롬프트를 가져오고 ABAP용 Vertex AI SDK를 사용하여 실행을 위해 Gemini에 전달합니다.

샘플 JSON 응답은 이 위험 이전 조항 예시를 위해 Gemini에서 생성합니다.

다음 샘플 코드는 규칙을 검색하여 코드에서 사용하는 방법을 보여줍니다. BRE 서비스를 lcl_bre와 같은 ABAP 클래스로 구현한다고 가정합니다.

 DATA(lo_bre) = NEW lcl_bre( iv_key_name  = 'CLIENT_KEY'
                             iv_model_key = 'MODEL_KEY' ).

 " Sample delivery text
 DATA(lv_delivery_text) = |Seller warrants that the products will be free from defects for| &&
                          |a period of ten years from the date of delivery.|.

 " Execute the rule for identifying Risk-Shifting clauses.
 DATA(lv_response) = lo_bre->execute_rule( iv_rule_id = 'RiskShiftingClause-Rule-001.prompt'
                                           iv_data    = lv_delivery_text ).
 " JSON response
 cl_demo_output=>display_json( lv_response ).

다음을 바꿉니다.

  • CLIENT_KEY: Vertex AI 및 Cloud Storage에 대한 인증을 위해 구성된 클라이언트 키입니다.
  • MODEL_KEY: 모델 생성 매개변수에 구성된 LLM에 액세스하기 위한 모델 키 이름입니다.

execute_rule 메서드는 다음을 실행합니다.

  1. /GOOG/CL_STORAGE_V1 클래스를 사용하여 Cloud Storage에서 규칙 파일을 읽습니다.

  2. /GOOG/CL_GENERATIVE_MODEL 클래스를 사용하여 모델에 대한 안내로 설정된 처리 규칙을 Gemini로 전송합니다. 그러면 모델이 JSON 응답을 생성합니다.

다음은 참고용 전체 샘플 코드입니다.

REPORT zra_bre_example.

" Local class definition
CLASS lcl_bre DEFINITION FINAL.

  PUBLIC SECTION.
    METHODS constructor
      IMPORTING iv_key_name  TYPE /goog/keyname
                iv_model_key TYPE /goog/model_key
      RAISING   /goog/cx_sdk.

    METHODS convert_xstring_to_string
      IMPORTING iv_xstring       TYPE xstring
      RETURNING VALUE(iv_string) TYPE string.

    METHODS execute_rule
      IMPORTING iv_rule_id              TYPE string
                iv_data                 TYPE string
      RETURNING VALUE(rv_response_text) TYPE string
      RAISING   /goog/cx_sdk.

  PRIVATE SECTION.
    DATA mo_storage TYPE REF TO /goog/cl_storage_v1.
    DATA mo_model   TYPE REF TO /goog/cl_generative_model.
ENDCLASS.

" Local class implementation
CLASS lcl_bre IMPLEMENTATION.
  METHOD constructor.
    mo_storage = NEW /goog/cl_storage_v1( iv_key_name = iv_key_name ).
    mo_model = NEW /goog/cl_generative_model( iv_model_key = iv_model_key ).
  ENDMETHOD.

  METHOD convert_xstring_to_string.
DATA lv_file_length TYPE i.
    DATA lt_bin_data    TYPE STANDARD TABLE OF char1024.

    " Call function module to convert xstring to binary format
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING buffer        = iv_xstring
      IMPORTING output_length = lv_file_length
      TABLES    binary_tab    = lt_bin_data.
    IF sy-subrc <> 0.
      " Handle error
    ENDIF.

    " Call function module to convert from binary to string format
    CALL FUNCTION 'SCMS_BINARY_TO_STRING'
      EXPORTING input_length = lv_file_length
      IMPORTING text_buffer  = iv_string
      TABLES    binary_tab   = lt_bin_data.
    IF sy-subrc <> 0.
      " Handle error
    ENDIF.
  ENDMETHOD.

  METHOD execute_rule.
    DATA lv_xdata       TYPE xstring.
    DATA lv_instruction TYPE string.

    " Get the rule file from rule repository(cloud storage)
    mo_storage->add_common_qparam( iv_name  = 'alt'
                                   iv_value = 'media' ).

    mo_storage->get_objects( EXPORTING iv_p_bucket = 'gemini-bre-repo'
                                       iv_p_object = iv_rule_id
                             IMPORTING es_output   = DATA(ls_output)
                                       ev_ret_code = DATA(lv_ret_code)
                                       ev_err_text = DATA(lv_err_text)
                                       es_err_resp = DATA(ls_err_resp)
                                       es_raw      = lv_xdata ).

    IF mo_storage->is_success( lv_ret_code ) = abap_true.
      " Set the instruction for Gemini as per the configured rule
      lv_instruction = convert_xstring_to_string( iv_xstring = lv_xdata ).
    ELSE.
      " Handle error
    ENDIF.

    " Set the text to be analyzed
    DATA(lv_prompt) = |Please analyze the Delivery Instruction:{ cl_abap_char_utilities=>newline }{ iv_data }|.

    " Call Gemini to process the rule and identify Risk-Shifting clauses
    rv_response_text = mo_model->set_system_instructions( iv_text = lv_instruction
                      )->add_safety_settings( iv_harm_category        = 'HARM_CATEGORY_DANGEROUS_CONTENT'
                                              iv_harm_block_threshold = 'BLOCK_NONE'
                      )->generate_content( iv_prompt_text = lv_prompt
                      )->get_text( ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY.
      DATA(lo_bre) = NEW lcl_bre( iv_key_name  = 'DEMO_AIPLATFORM'
                                  iv_model_key = 'gemini-flash' ).

      " Sample delivery text
 DATA(lv_delivery_text) = |Seller warrants that the products will be free from defects for| &&
                             |a period of ten years from the date of delivery.|.

      " Execute the rule for identifying Risk-Shifting clauses.
      DATA(lv_response) = lo_bre->execute_rule( iv_rule_id = 'RiskShiftingClause-Rule-001.prompt'
                                                iv_data    = lv_delivery_text ).
      " JSON response
      cl_demo_output=>display_json( lv_response ).

    CATCH /goog/cx_sdk INTO DATA(lo_exception).
      DATA(lv_msg) = lo_exception->get_text( ).
      " Handle error
  ENDTRY.

설계 고려사항

이 섹션에서는 이 참조 아키텍처를 사용하여 보안, 개인 정보 보호, 규정 준수, 비용, 성능에 대한 특정 요구사항을 충족하는 하나 이상의 아키텍처를 개발하는 데 도움이 되는 안내를 제공합니다.

보안, 개인정보 보호, 규정 준수

보안 및 규정 준수는 공동의 책임입니다. 자세한 내용은 Vertex AI 공동 책임을 참고하세요.

Gemini에서 데이터를 사용하는 방법에 대한 자세한 내용은 Google Cloud용 Gemini에서 데이터를 사용하는 방법을 참고하세요.

비용

Cloud Storage와 같은 Google Cloud 리소스의 비용을 예상하려면 Google Cloud 가격 계산기를 사용하세요.

Vertex AI 및 Gemini API 관련 가격 책정은 Vertex AI 가격 책정을 참고하세요.

설계 대안

이 문서에서는 ABAP SDK for Google Cloud의 온프레미스 또는 모든 클라우드 버전에 중점을 두고 있지만 ABAP SDK for Google Cloud의 SAP BTP 버전을 사용하여 유사한 결과를 얻을 수 있습니다. ABAP용 Vertex AI SDK는 SAP BTP 환경에서 사용할 수 없지만 온프레미스 SDK용으로 이 문서에 제공된 코드 샘플을 사용하여 조정하고 SAP BTP 환경 내에서 유사한 솔루션을 빌드할 수 있습니다.

다음 단계

참여자

작성자: Ameya Suvarna | SAP 애플리케이션 엔지니어 팀장

기타 참여자: Vikash Kumar | 기술 문서 작성자