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

このドキュメントでは、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 がデータを分析してパターンを特定し、事前定義されたビジネス ロジックに沿って意思決定を行う際に、ガイドとして使用されます。

アーキテクチャ

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

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

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

コンポーネント サブシステム 詳細
1 SAP ERP SAP S/4HANA などの SAP ERP システム。Gemini を活用した BRE を使用して、意思決定を自動化するための分析情報を導き出します。ユースケースに基づき、ルール ID と必要な入力データを BRE モジュールに提供します。
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.

設計上の考慮事項

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

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

セキュリティとコンプライアンスは共有責任です。詳細については、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 エディションを使用して同様の結果を得ることもできます。Vertex AI SDK for ABAP は SAP BTP 環境では使用できませんが、このドキュメントで提供されているコードサンプルを SDK のオンプレミス エディション用に調整して、SAP BTP 環境内で同様のソリューションを構築できます。

次のステップ

寄稿者

著者: Ameya Suvarna 氏 | SAP アプリケーション エンジニア チームリーダー

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