RAG 対応生成 AI アプリケーション用に SAP でサービング サブシステムを設計する

このドキュメントでは、検索拡張生成(RAG)対応の生成 AI アプリケーションで使用する SAP でサービング サブシステムを設計するためのリファレンス アーキテクチャについて説明します。このリファレンス アーキテクチャでは、RAG 対応生成 AI アプリケーションの構築に必要なサービスと統合するために、オンプレミス版またはクラウド版の ABAP SDK for Google Cloud を使用します。 Google Cloud

このドキュメントは、ABAP デベロッパー、SAP ソリューション アーキテクト、クラウド アーキテクトを対象としています。このドキュメントは、ベクトル検索の用語RAG のコンセプトを理解していることを前提としています。

サービング サブシステムは、アプリケーションとユーザー間のリクエストとレスポンスを管理するため、RAG 対応の生成 AI アプリケーションの重要なコンポーネントです。このドキュメントで説明するサービング サブシステムを使用すると、アプリケーションが SAP エンタープライズ データにアクセスして使用し、大規模言語モデル(LLM)にコンテキストを提供できます。これにより、より正確で信頼性の高い出力の生成に役立ちます。

Gemini LLM を SAP エンタープライズ データとプロセスと組み合わせることで、次のようなメリットが得られます。

  • 精度の向上: 幅広い情報にアクセスすることで、企業データに基づくより正確で情報に基づいた意思決定が可能になります。
  • ユーザー エクスペリエンスの向上: パーソナライズされたコンテキストに応じた関連情報により、信頼性の高いモデル レスポンスでユーザー満足度が向上します。

アーキテクチャ

次の図は、SAP のサービング サブシステムのコンポーネントを示しています。

SAP のサブシステムの提供

上の図に示すように、サービング サブシステム アーキテクチャには次のコンポーネントが含まれています。

数値 コンポーネント 詳細
1 サービング サブシステム サービング サブシステムは、データソースから関連情報を取得します。プロンプトで情報を拡張し、生成 AI モデルとやり取りして、最終的なレスポンスをユーザーに返します。
2 ABAP SDK for Google Cloud SDK は、サービング サブシステムとさまざまな Google Cloud サービス間の通信を処理します。
3 SAP 関数モジュール データセットが小さく、SAP システム内にある場合は、SAP 関数モジュールを使用して情報取得パイプラインを構築できます。SAP 関数モジュールからデータを取得するには、SELECT クエリ、BAPI 呼び出し、または Gemini で SAP 関数呼び出しを使用します。
4 ベクトル検索プロダクト 企業データが大量で、レイテンシを最小限に抑えた RAG アプリケーションが必要な場合は、ベクトル検索を使用して取得パイプラインを構築できます。Cloud StorageVertex AI Feature StoreBigQuery などのベクトル データベースにエンベディング形式で保存されているエンタープライズ データに対してセマンティック検索を実行できます。
5 Vertex AI Gemini モデル エンタープライズ データに基づいてレスポンスを生成する Vertex AI Gemini モデル

サービング サブシステム

生成 AI ソリューションのサブシステムは、次のサブコンポーネントで構成されています。

情報検索

ユーザーがフロントエンドから生成 AI アプリケーションにリクエストを送信すると、サービング サブシステムはデータソースから情報を取得します。データソースから情報を取得するには、ユースケースに適した方法を選択します。

  • ベクトル検索を使用して情報を取得する
  • ベクトル検索を使用せずに情報を取得する

エンタープライズ データが大量(構造化データまたは非構造化データ)で、レイテンシを最小限に抑えた RAG アプリケーションが必要な場合は、ベクトル検索を使用して取得パイプラインを構築することをおすすめします。ベクトル検索では、数十億件のレコードに対してテキスト検索とマルチモーダル検索をミリ秒単位で実行できます。

ベクトル検索を使用して情報の取得を行うには、ベクトル エンベディングの形式で企業データを保存するベクトル データベースを設定する必要があります。エンタープライズ データをベクトル データベースに取り込む方法については、RAG 対応生成 AI アプリケーション用に SAP でデータ取り込みサブシステムを構築するをご覧ください。

データセットが小さく、SAP システム内にある場合は、SELECT クエリや SAP BAPI 呼び出しを使用して情報を取得できます。また、Gemini で SAP 関数呼び出しを使用してモデルのコンテキストを拡充することもできます。

情報の拡張

モデルにエンタープライズ固有の重要なコンテキストを提供するには、SAP システムの関連情報を使用してプロンプトを拡充することをおすすめします。

追加データを取得したら、モデルのコンテキストに合わせてデータを拡張します。この拡張により、追加された企業情報を使用してレスポンスを生成するために必要なコンテキストがモデルに提供されます。

取得したデータをモデルのコンテキストに拡張するには、モデルへの入力プロンプトにデータを追加または連結します。データを追加するときに、関連するテキストを接頭辞または接尾辞として追加して、プロンプトとともに追加のコンテキストであることを示します。

回答の生成

拡張プロンプトを使用して Gemini AI モデルを呼び出すには、Vertex AI SDK for ABAP の生成モデル呼び出し元コンポーネントを使用します。

このアプローチにより、生成された回答はユーザーのクエリに関連しているだけでなく、企業固有のデータに基づいているため、より正確で有益な結果が得られます。

ユースケース

RAG 対応の生成 AI アプリケーションを使用すると、自然言語クエリを使用して倉庫内の資材在庫の最新情報をすばやく生成できます。

家具、装飾品、アクセサリーを製造して発送する会社の倉庫従業員向けに生成 AI アプリケーションを実装するシナリオについて考えてみましょう。

倉庫の在庫とサプライ チェーンを効率的に管理するために、生成 AI アプリケーションは、SAP ウェブ アプリケーションを介して自然言語ベースのクエリを使用して、資材在庫に関する分析情報をすばやく提供します。このようなクエリの例としては、特定の材料の現在の在庫数を特定することがあります。

この情報は、SAP データベース テーブルの製品データ内に保存されます。これは、大規模なホーム ファニシング カンパニーの膨大な商品リストの場合があります。倉庫の従業員は、SAP システム(信頼できる単一の情報源)の情報に基づく SAP アプリケーションからのレスポンスを取得する必要があります。この情報により、次のような迅速で効率的な意思決定が可能になります。

  • 在庫状況: 特定の素材は在庫にありますか?
  • 在庫レベル: 材料の在庫数
  • 生産計画: 次の受注を処理するために、材料の製造目標はどのくらいに設定すればよいですか?

デプロイ

このセクションでは、倉庫のユースケースのサビング サブシステムの実装について概説します。最新バージョンの ABAP SDK for Google Cloud に埋め込まれている Vertex AI SDK for ABAP を使用して、情報を取得し、Gemini モデルを操作する方法について説明します。

倉庫のユースケースでは、SAP の在庫情報は、商品ごとに一意の材料 ID にリンクされています。各商品には、名前、詳細な説明、カテゴリ、その他の関連プロパティなど、記述的な属性も SAP に保存されています。これらのテキスト記述は「エンベディング」と呼ばれる数値表現に変換され、ベクトル データベースに保存されます。各エンベディングは対応するマテリアル ID にリンクされているため、商品情報の効率的な検索と分析が可能です。

ベクトル データベースが更新されたら、検索クエリ「商品の現在の在庫数」を実行するには、次の操作を行います。

  • クエリを使用してベクトル データベースでベクトル検索を行い、マテリアル ID を取得します。

  • SAP テーブルに対してクエリを実行し、SAP BAPI を呼び出して、マテリアル ID の在庫数量を取得します。

  • 在庫数をモデルのコンテキストに拡張します。

選択したベクトル データベースがベクトル インデックスの場合は、Vertex AI SDK for ABAP を使用して ABAP から直接ベクトル検索を呼び出すことができます。詳細については、リファレンス アーキテクチャの インテリジェントな SAP アプリケーション向けの Vertex AI ベクトル検索をご覧ください。

サービング サブシステムの実装手順は次のとおりです。

  1. 倉庫のユースケースのマテリアル ID を取得するには、ベクトル検索を使用します。

    次のコードサンプルは、ベクトル検索を使用してマテリアル ID を取得する方法を示しています。

    DATA:
    lv_prompt              TYPE string,
    lv_available_quantity  TYPE mng01,
    ls_return              TYPE bapireturn,
    lv_available_inventory TYPE string,
    lt_wmdvsx              TYPE STANDARD TABLE OF bapiwmdvs,
    lt_wmdvex              TYPE STANDARD TABLE OF bapiwmdve.
    
    lv_prompt = 'What is the current inventory count for Cymbal Emerald Flower Vase'.
    
    * Get material id based on the prompt through vector search
    TRY.
      DATA(lo_vector_index) = NEW /goog/cl_vector_search( iv_search_key = 'SEARCH_KEY' ).
      DATA(ls_material) = lo_vector_index->find_neighbors_by_string(
                                              iv_search_string        = lv_prompt
                                              iv_embeddings_model_key = 'EMBEDDINGS_MODEL_KEY'
                                          )->get_nearest_neighbor( ).
    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
      cl_demo_output=>display( 'Search not successful.' && lo_cx_sdk->get_text( ) ).
      EXIT.
    
    ENDTRY.
    
    DATA(lv_material_id) = ls_material-datapoint_id.
    
    * Get base unit of measure for the material
    SELECT SINGLE meinh
    FROM marm
    INTO @DATA(lv_meinh)
    WHERE matnr = @lv_material_id.
    IF sy-subrc = 0.
    * Get available stock for the material
    CALL FUNCTION 'BAPI_MATERIAL_AVAILABILITY'
      EXPORTING
        plant      = <SAP_PLANT_ID>
        material   = CONV matnr18( lv_material_id )
        unit       = lv_meinh
      IMPORTING
        av_qty_plt = lv_available_quantity
        return     = ls_return
      TABLES
        wmdvsx     = lt_wmdvsx
        wmdvex     = lt_wmdvex.
    IF ls_return-type = 'S' OR
        ls_return-type IS INITIAL.
    * Prepare available stock value in base unit of measure
      lv_available_inventory = |{ 'Avaiblable Stock = ' } | &&
                                  lv_available_quantity && | { lv_meinh }|.
    ELSE.
      cl_demo_output=>display( 'Material availability lookup not successful:' && ls_return-message ).
    
    ENDIF.
    
    ENDIF.
    

    データセットが小さく、SAP システム内にある場合は、倉庫のユースケースのマテリアル ID を見つけるために、マテリアルの説明で SELECT クエリを使用し、SAP テーブルをクエリして在庫数量を取得できます。

    次のコードサンプルは、SELECT クエリを使用してマテリアルの在庫情報を取得する方法を示しています。

    DATA:
    lv_prompt              TYPE string,
    lv_available_quantity  TYPE mng01,
    ls_return              TYPE bapireturn,
    lv_available_inventory TYPE string,
    lt_wmdvsx              TYPE STANDARD TABLE OF  bapiwmdvs,
    lt_wmdvex              TYPE STANDARD TABLE OF  bapiwmdve,
    lr_maktx               TYPE RANGE OF maktx,
    ls_maktx               LIKE LINE OF lr_maktx.
    
    lv_prompt = 'What is the current inventory count for Cymbal Emerald Flower Vase'.
    
    ls_maktx-sign   = 'I'.
    ls_maktx-option = 'CP'.
    ls_maktx-low    = 'Cymbal Emerald Flower Vase'.
    
    APPEND ls_maktx TO lr_maktx.
    
    * Get material id through select statement
    SELECT SINGLE matnr
    FROM makt
    INTO @DATA(lv_material_id)
    WHERE maktx IN @lr_maktx.
    IF sy-subrc <> 0.
    cl_demo_output=>display( 'Material with given description not found' ).
    EXIT.
    
    ENDIF.
    
    * Get base unit of measure for the material
    SELECT SINGLE meinh
    FROM marm
    INTO @DATA(lv_meinh)
    WHERE matnr = @lv_material_id.
    IF sy-subrc = 0.
    * Get available stock for the material
    CALL FUNCTION 'BAPI_MATERIAL_AVAILABILITY'
      EXPORTING
         plant      = <SAP_PLANT_ID>
         material   = CONV matnr18( lv_material_id )
        unit       = lv_meinh
      IMPORTING
         av_qty_plt = lv_available_quantity
        return     = ls_return
       TABLES
        wmdvsx     = lt_wmdvsx
        wmdvex     = lt_wmdvex.
     IF ls_return-type = 'S' OR
        ls_return-type IS INITIAL.
    * Prepare available stock value in base unit of measure
       lv_available_inventory = |{ 'Avaiblable Stock = ' } | &&
                                  lv_available_quantity && | { lv_meinh }|.
    ELSE.
       cl_demo_output=>display( 'Material availability lookup not successful:' && ls_return-message ).
    
    ENDIF.
    
    ENDIF.
    
  2. 取得したデータを入力プロンプトに追加するには、素材の在庫状況を「在庫状況」という接頭辞でプロンプトに連結します。

    次のコードサンプルは、取得したデータを入力プロンプトに拡張する方法を示しています。

    * Augment retrieved data to the input prompt
    lv_prompt = lv_prompt && 'Additional Context' && lv_available_inventory.
    
    
  3. 拡張プロンプトを使用して Gemini AI モデルを呼び出すには、Vertex AI SDK for ABAP の生成モデル呼び出し元コンポーネントを使用します。

    次のコードサンプルは、拡張プロンプトを使用してモデルを呼び出す方法を示しています。

    TRY.
      lv_prompt = lv_prompt && 'Additional Context' && lv_available_inventory.
      DATA(lo_model_key) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
       DATA(lv_model_response) = lo_model_key->generate_content( lv_prompt
                                              )->get_text( ).
      IF lv_model_response IS NOT INITIAL.
          cl_demo_output=>display( lv_model_response ).
    
      ENDIF.
    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
      cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
    
    ENDTRY.
    
    

設計上の考慮事項

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

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

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

Google Cloudのデータ プライバシーに対する取り組みについては、プライバシー リソース センターをご覧ください。

費用の最適化

ベクトル検索を使用して RAG の情報を取得している場合は、費用を削減するために、インデックスに小さいシャードサイズと低次元エンベディングを選択することを検討してください。これにより、インデックスのデプロイに小さいコンピューティング マシンを使用できます。

Vertex AI は Google Cloudの有料サービスです。料金については、Vertex AI の料金ベクトル検索の料金をご覧ください。料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

パフォーマンスの最適化

ベクトル検索を使用して RAG の情報を取得している場合は、大規模なデータセットの検索レイテンシを改善するために、インデックスの作成時にシャードサイズを大きくし、インデックスのデプロイ時に高性能のコンピューティング マシンを選択することを検討してください。インデックスのシャードサイズの詳細については、インデックスのサイズをご覧ください。

検索レスポンスの関連性を高めるには、より高いディメンションでエンベディングを生成します。コンピューティング マシンとエンベディングの次元が大きいほど、費用が増加します。料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。

次のステップ

寄稿者

著者: Devesh Singh 氏 | SAP アプリケーション エンジニア

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