SAP 向けの Gemini を活用したビジネスルール エンジン

このドキュメントでは、Gemini などの大規模言語モデル(LLM)を活用したビジネスルール エンジンを構築し、SAP ビジネス アプリケーション内での意思決定を自動化するためのリファレンス アーキテクチャについて説明します。ABAP SDK for Google Cloud のさまざまな統合機能を使用します。

このドキュメントは、ABAP デベロッパー、SAP ソリューション アーキテクト、クラウド アーキテクトを対象としています。このドキュメントは、ABAP SDK for Google CloudVertex AI SDK for ABAP、および LLM の基本的な概要を理解していることを前提としています。

ビジネスルール エンジン(BRE)とは

ビジネスルールエンジン(BRE)は、ビジネスルールの定義、デプロイ、実行を可能にするソフトウェア システムです。これらのルールは、基本的にビジネスの運営方法を指示する論理ステートメントです。BRE は、ビジネスルールをアプリケーションにハードコードするのではなく、ロジック ステートメントを外部化するため、ルールの管理と変更を効率的に行うことができます。

Gemini を活用した BRE は、Google の次世代 AI モデルである Gemini の高度な言語処理機能と推論機能を使用して、ビジネスルールとして機能するエンジニアリングされたプロンプトのリポジトリに基づいて意思決定を自動化します。これらのプロンプトは、特定の手順と想定される出力形式で作成され、事前定義されたビジネス ロジックに沿ってデータを分析し、パターンを特定し、意思決定を行う際に Gemini をガイドします。

アーキテクチャ

次の図は、SAP アプリケーション用の Gemini を搭載した BRE を作成するリファレンス アーキテクチャを示しています。

SAP 向けの Gemini を活用したビジネスルール エンジン

このリファレンス アーキテクチャには、次のコンポーネントが含まれています。

コンポーネント サブシステム 詳細
1 SAP ERP SAP S/4HANA などの SAP ERP システム。Gemini を活用した BRE を使用して、自動意思決定のための分析情報を導き出します。ユースケースに応じて、BRE モジュールにルール ID と必要な入力データを提供します。
2 BRE モジュール BRE モジュールは、ABAP SDK for Google Cloud を使用して Cloud Storage から構成済みのルールを取得し、Vertex AI SDK for ABAP を使用して Gemini を呼び出してルールを処理します。
3 ルール リポジトリ ルール(エンジニアリングされたプロンプト)を、一貫した命名規則で .txt.prompt などのテキスト ファイルとして Cloud Storage に保存します。例: RiskShiftingClause.prompt エンジニアリングされたプロンプトを構造化された方法で管理するには、Cloud SQL などのデータベースの使用も検討してください。
4 ルール プロセッサ Vertex AI SDK for ABAP は、入力データ(配送手順など)と取得したルール(プロンプト)を Gemini に送信します。Gemini はプロンプトと入力データを処理し、分析を実行して、指定された形式で結果を返します。

使用するプロダクト

このリファレンス アーキテクチャでは、次の Google Cloud プロダクトを使用します。

  • ABAP SDK for Google Cloud: SAP システムを Cloud Storage などの Google Cloud サービスに接続する ABAP アプリケーションの開発に役立ちます。

  • Vertex AI SDK for ABAP: SAP 環境内で Google の Vertex AI を使用できます。これにより、SAP アプリケーションに AI を活用した機能を簡単に構築できます。

  • Cloud Storage: 任意の量のデータをオンラインで保存してアクセスするためのクラウド サービス。

  • Vertex AI: さまざまなアプリケーション向けの ML モデルを構築、デプロイ、スケーリングできます。

ユースケース

社内で受信した注文書(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 からプロンプトを取得し、Vertex AI SDK for ABAP を使用して Gemini に渡して実行します。

サンプル JSON レスポンスは、このリスク移転条項の例用に Gemini によって生成されます。

次のサンプルコードは、ルールを取得してコードで使用する方法を示しています。BRE サービスを ABAP クラス(lcl_bre など)として実装していることを前提としています。

 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.

設計上の考慮事項

このセクションでは、このリファレンス アーキテクチャを使用して、セキュリティ、プライバシー、コンプライアンス、費用、パフォーマンスに関する特定の要件を満たす 1 つ以上のアーキテクチャを開発する際に役立つガイダンスを示します。

セキュリティ、プライバシー、コンプライアンス

セキュリティとコンプライアンスは共有責任です。詳細については、Vertex AI の共有責任をご覧ください。

Gemini によるデータの使用方法については、Gemini for Google Cloud によるデータの使用をご覧ください。

費用

Cloud Storage などの Google Cloud リソースの費用を見積もるには、Google Cloud 料金計算ツールを使用します。

Vertex AI と Gemini API の料金については、Vertex AI の料金をご覧ください。

代替案の設計

このドキュメントでは、ABAP SDK for Google Cloud のオンプレミス エディションまたはクラウド エディションに焦点を当てていますが、ABAP SDK for Google Cloud の SAP BTP エディションを使用して同様の結果を得ることができます。Vertex AI SDK for ABAP は SAP BTP 環境では使用できませんが、このドキュメントで提供されている SDK のオンプレミス エディションのサンプルコードを調整して、SAP BTP 環境内で同様のソリューションを構築できます。

次のステップ

寄稿者

作成者: Ameya Suvarna | SAP アプリケーション エンジニア チームリード

その他の寄稿者: Vikash Kumar | テクニカル ライター