生成 AI アプリケーション用の SAP 内のデータ取り込みサブシステム

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

検索拡張生成(RAG)対応の生成 AI アプリケーションにはさまざまなコンポーネントがあり、そのうちデータ取り込みサブシステムはエンタープライズ データの準備と処理を担当します。このサブシステムは、正確で有益な AI インタラクションのために、エンタープライズ データをベクトル データベースにエンベディングとして準備して保存するのに役立ちます。

多くの組織が SAP ERP システムを使用して企業データを保存しているため、このドキュメントでは、データ取り込みサブシステムの一部として Google Cloud のデータ ストレージ ソリューションとベクトル検索データベースを統合する方法について説明します。これにより、十分な情報に基づいて選択し、Google Cloud のサービスを効果的に使用して、RAG 対応の生成 AI アプリケーション用の堅牢で効率的なパイプラインを構築できます。

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

アーキテクチャ

次の図は、SAP のデータ取り込みサブシステムのコンポーネントを示すリファレンス アーキテクチャを示しています。

SAP のデータ取り込みサブシステム

このデータ取り込みサブシステム アーキテクチャには、次のコンポーネントが含まれています。

# コンポーネント 詳細
1 データ取り込みサブシステム エンタープライズ データを準備して処理し、ベクトル エンベディングを生成します。これらのエンベディングは、Google Cloud の適切なベクトル データベースに保存されます。必要に応じて、エンタープライズ データを Google Cloud に保存できます。
2 ABAP SDK for Google Cloud SDK は、データ取り込みサブシステムとさまざまな Google Cloud サービス間の通信を処理します。
3 データ ストレージ 省略可。BigQuery や Cloud Storage などの Google Cloud データ ストレージ ソリューションは、構造化データと非構造化データの両方のエンタープライズ データを保存するために使用されます。詳細については、Google Cloud にエンタープライズ データを保存するをご覧ください。
4 エンベディング モデル(Vertex AI) さまざまなエンタープライズ データソースからエンベディングを生成する AI モデル。
5 ベクトル検索プロダクト エンベディングを ベクトル データベースCloud StorageBigQuery など)に保存します。ここで、セマンティック 検索を実行できます。

データ取り込みサブシステム

このセクションでは、エンタープライズ データをエンベディングに変換し、RAG 対応の生成 AI アプリケーションで使用するためにエンベディングをベクトル データベースに保存するデータ取り込みサブシステムについて説明します。このサブシステムは、ドキュメント、画像、ビジネスルール、プロンプトなど、さまざまな SAP データを処理してエンベディングを生成できます。

企業データを準備する

RAG 対応の生成 AI アプリケーションを初めてデプロイする前に、SAP システムから既存のエンタープライズ データのエンベディングを読み込む必要があります。この問題に対処するには、新しいバッチ プログラムを構築するか、企業データを管理可能なチャンクで読み取ることができる既存のプログラムを再利用します。

データとエンベディングの初期読み込みを完了したら、データ取り込みサブシステムは SAP データの変更に追いつく必要があります。新しいレコード、既存のレコードの更新、削除など、ベクトル検索インデックスにはこれらの変更を反映する必要があります。これを行うには、ビジネス アドイン(BAdI)RAP イベント ハンドラなど、SAP アプリケーション開発フレームワーク内の適切なスポットを使用します。これにより、エンベディングが最新の状態に保たれ、AI アプリケーションで常に最新の情報が使用されるようになります。

エンタープライズ データを Google Cloud に保存する(省略可)

SAP システムには、構造化データと非構造化データの両方のエンタープライズ データを含めることができます。必要に応じて、このエンタープライズ データを Google Cloud に保存して、サービング サブシステムから取得できます。

企業データを保存するには、次の Google Cloud サービスを使用できます。

  • SAP から BigQuery に構造化データをストリーミングするには、BigQuery Connector for SAP を使用するか、ABAP SDK for Google Cloud の /GOOG/CL_BIGQUERY_V2 クラスの INSERT_ALL_TABLEDATA メソッドを使用します。
  • 画像や PDF ドキュメントなどの非構造化データを Cloud Storage に保存するには、ABAP SDK for Google Cloud の /GOOG/CL_STORAGE_V1 クラスを使用します。Cloud Storage バケットにオブジェクトをアップロードする方法のコードサンプルについては、バケットにファイルをアップロードするをご覧ください。
  • Cloud Storage を SAP のコンテンツ リポジトリとして構成するには、GitHub で入手できるサンプル ソリューション Google Cloud Storage: Content Server for SAP を実装してカスタマイズします。

エンタープライズ データからエンベディングを生成する

エンタープライズ データからテキストとマルチモーダルのエンベディングを生成するには、Vertex AI SDK for ABAPエンベディング モデルを使用します。

エンベディングは、基本的にテキスト、画像、動画を、それらの関連性を捉える方法で表す数値コードです。アプリケーションは、これらのコードによって言語を理解して生成し、特定のコンテンツ内の最も複雑な意味や関係を認識します。このプロセスでは、テキスト、画像、動画をベクトルと呼ばれる数値のリストに変換します。ベクトルは、元のコンテンツの意味を効果的に捉えるように設計されています。

エンベディングを保存する

SAP エンタープライズ データから生成されたエンベディングを効率的に保存して検索するには、ベクトル データベースとして機能する Google Cloud のベクトル検索プロダクトを使用します。

SAP エンタープライズ データのエンベディングを保存するには、次のリストからベクトル データベースを選択します。

設計上の考慮事項

ベクトル データベースを選択する際の主な設計上の考慮事項は次のとおりです。

  • パフォーマンス: 新しいベクトルのインデックス作成速度、検索速度(レイテンシ)、スケーラビリティ、関連するすべての結果を取得する(再現率)ことと最も関連性の高い結果のみを取得する(精度)ことのトレードオフなどの要素。
  • データの特性: エンベディング ベクトルのサイズ、ベクトル データセットのサイズ、データ分散は、コスト、パフォーマンス、インデックス登録に影響します。
  • 機能: ユークリッド アルゴリズムコサイン類似度などのサポートされている距離関数、フィルタリング機能、キーワード検索とベクトル検索の組み合わせ、近似最近傍(ANN)検索のサポート。
  • 統合: 既存の統合と、アプリケーションからのデータの取り込みが容易。
  • 費用: データと検索ボリュームに対応した料金モデル、ストレージ、クエリ費用。

効率的な検索と分析を可能にするには、エンベディングをベクトル データベースに保存し、エンベディングをソースデータにリンクする ID も保存します。

エンタープライズ データを Google Cloud ストレージ ソリューションに保存するかどうかは、主にサービング サブシステムのロケーションによって決まります。

  • サービング サブシステムが SAP の場合、SAP 内のエンタープライズ データにすでにアクセスできるため、SAP の外部にエンタープライズ データを保存することは任意です。

  • サービング サブシステムが SAP の外部(App Engine など)にある場合は、効率的なデータ取得のために、適切な Google Cloud ストレージ ソリューションにエンタープライズ データを保存する必要があります。サービング サブシステムが SAP にリモート呼び出しを実行してデータを取得できる場合は、この問題を回避できます。

エンベディングを生成し保存する方法を確認する

このセクションでは、エンベディングをエンタープライズ データから生成して保存する方法について説明します。エンベディングの生成と保存には、主に次の 2 つのパターンがあります。

  • SAP でエンベディングを生成する: Vertex AI SDK for ABAP で適切なエンベディング モデルを使用して、SAP ERP システムに存在するエンタープライズ データからエンベディングを生成し、ベクトル データベースに保存します。

  • Google Cloud でエンベディングを生成する: Cloud Run 関数や BigQuery などのサーバーレス アプローチを使用して、Google Cloud のストレージ メディアに存在するエンタープライズ データからエンベディングを生成し、ベクトル データベースに保存します。

SAP でエンベディングを生成する

SAP システム内で SAP エンタープライズ データからエンベディングをローカルに生成するには、Vertex AI SDK for ABAP でさまざまなエンベディング モデルを使用します。生成されたエンベディングは、SDK の組み込み取り込みメカニズムのいずれかを使用して、Google Cloud 上の適切なベクトル データベースに送信できます。

ベクトル検索機能のニーズに基づいて、エンベディングに変換するデータを決定できます。Vertex AI SDK for ABAP でエンベディングを生成する方法については、エンベディングを生成するをご覧ください。

このセクションでは、一般的な SAP データ型と、Vertex AI SDK for ABAP を使用してエンベディングを生成する方法について説明します。

SAP テーブルに保存されている構造化エンタープライズ データ

主に、SAP テーブル内の 1 つ以上のテキスト列のエンベディングを生成します。たとえば、サプライヤーの名前、住所、電話番号で検索する場合は、これらの列の値を連結し、この結合値のテキスト エンベディングを生成します。テキスト エンベディングの候補となるテキスト値は他にほとんどありません。テキスト テーブルの説明や、ビジネス トランザクションに関連する長いテキストなどです。

次のコードサンプルは、テキスト エンベディングを生成し、Cloud Storage バケットに保存する方法を示しています。


DATA(lv_supplier) = CONV i_supplier-supplier( 'SUPPLIER' ).

SELECT SINGLE
     concat_with_space( supplierfullname, phonenumber1, 1 )
       AS line
       FROM i_supplier
       WHERE supplier = @lv_supplier
       INTO @DATA(lv_search_string).

DATA(ls_embedding_template) =
  VALUE /goog/cl_embeddings_model=>ty_embeddings_template(
         id = lv_supplier
         content = lv_search_string ).

NEW /goog/cl_embeddings_model(
        iv_model_key = 'EMBEDDING_MODEL_KEY'
        )->gen_text_embeddings_by_struct(
        is_input = ls_embedding_template
        )->send_struct_to_gcs( iv_bucket_name = 'BUCKET_NAME' ).

次のように置き換えます。

  • SUPPLIER: サプライヤーを識別する一意の英数字コード。
  • EMBEDDING_MODEL_KEY: エンベディングの生成に使用するモデルキー。モデル生成パラメータで構成されます。
  • BUCKET_NAME: ターゲット Cloud Storage バケットの名前。

画像

製造業や小売業など、多くの業界では、原材料、完成品、さまざまな機器などの重要なビジネス オブジェクトの画像をキャプチャして保存しています。テキスト記述または視覚的な類似性を使用してこれらのビジネス オブジェクトを効率的に検索するには、マルチモーダル エンベディングを使用します。

次のコードサンプルは、画像のマルチモーダル エンベディングを生成し、Pub/Sub トピックにパブリッシュする方法を示しています。

"Populate image data in XSTRING format
DATA(lv_image_xstring) = VALUE xstring( ).

DATA(lv_image_base64) =
   xco_cp=>xstring( lv_image_xstring
    )->as_string( xco_cp_binary=>text_encoding->base64
    )->value.

DATA(ls_image) =
  VALUE /goog/cl_embeddings_model=>ty_image(
     bytes_base64_encoded = lv_image_base64 ).

DATA(ls_embedding_template) =
  VALUE /goog/cl_embeddings_model=>ty_embeddings_template(
         id = 'UNIQUE_ID'
         content = 'CONTEXTUAL_TEXT' ).

NEW /goog/cl_embeddings_model(
        iv_model_key = 'EMBEDDING_MODEL_KEY'
        )->gen_image_embeddings_by_struct(
        iv_image = ls_image
        is_input = ls_embedding_template
        )->send_struct_to_pubsub( iv_topic_id = 'PUBSUB_TOPIC_ID' ).

次のように置き換えます。

  • UNIQUE_ID: 画像を一意に識別する識別子。たとえば、ファイル名と画像作成日を組み合わせることができます。
  • CONTEXTUAL_TEXT: 省略可。エンベディング モデルに渡される入力コンテンツの追加のコンテキストと意味。
  • EMBEDDING_MODEL_KEY: エンベディングの生成に使用するモデルキー。モデル生成パラメータで構成されます。
  • PUBSUB_TOPIC_ID: エンベディングを公開する Pub/Sub トピック ID。

ドキュメント

SAP ビジネス プロセスでは、契約書、マニュアル、ガイド、安全データシートなど、さまざまな種類のドキュメントを処理します。これらのドキュメントには、ビジネス上の意思決定に必要な重要な情報が含まれている場合があります。ドキュメント内に保存されているこのようなデータをシームレスに見つけるには、マルチモーダル エンベディングを使用します。長いドキュメント内で効果的に検索するには、チャンク処理メカニズムを実装する必要があります。ドキュメントをページやセクションなどの小さな単位に分割し、特定の領域内の検索結果のコンテキスト化を可能にします。

次のコードサンプルは、PDF ドキュメントからデータを抽出し、各ページのマルチモーダル エンベディングを生成し、それらのエンベディングを BigQuery テーブルに送信する方法を示しています。

"Populate PDF data in XSTRING format
DATA(lv_pdf_xstring) = VALUE xstring( ).

DATA(lv_pdf_base64) =
   xco_cp=>xstring( lv_pdf_xstring
    )->as_string( xco_cp_binary=>text_encoding->base64
    )->value.

DATA(ls_document_input) = VALUE /goog/cl_documentai_v1=>ty_084(
   raw_document-content   = lv_pdf_base64
   raw_document-mime_type = 'application/pdf' ).

NEW /goog/cl_documentai_v1( iv_key_name = 'DOC_AI_CLIENT_KEY'
    )->process_processors(
      EXPORTING
       iv_p_projects_id   = 'PROJECT_ID'
       iv_p_locations_id  = 'LOCATION_ID'
       iv_p_processors_id = 'PROCESSOR_ID'
       is_input           = ls_document_input
      IMPORTING
       es_output          = DATA(ls_docai_output) ).

LOOP AT ls_docai_output-document-pages REFERENCE INTO DATA(ls_pages).

  DATA(ls_image) =
    VALUE /goog/cl_embeddings_model=>ty_image(
       bytes_base64_encoded = ls_pages->image-content ).

  DATA(ls_embedding_template) =
    VALUE /goog/cl_embeddings_model=>ty_embeddings_template(
           id = 'UNIQUE_ID'                 "Document Name + Page #
           content = 'CONTEXTUAL_TEXT' ).   "Optional Text

  NEW /goog/cl_embeddings_model(
          iv_model_key = 'EMBEDDING_MODEL_KEY'
          )->gen_image_embeddings_by_struct(
          iv_image = ls_image
          is_input = ls_embedding_template
          )->send_struct_to_bq(
          iv_dataset_id = 'BIGQUERY_DATASET_ID'
          iv_table_id   = 'BIGQUERY_TABLE_ID' ).

ENDLOOP.

次のように置き換えます。

  • DOC_AI_CLIENT_KEY: 認証用のクライアント キー。
  • PROJECT_ID: プロセッサが作成される Google Cloud プロジェクトの ID。
  • LOCATION_ID: プロセッサのロケーション。プロセッサの詳細を表示する方法については、プロセッサの詳細を表示するをご覧ください。
  • PROCESSOR_ID: プロセッサの ID。決済代行業者の詳細を表示する方法については、決済代行業者の詳細を表示するをご覧ください。
  • UNIQUE_ID: 特定の知識のチャンクを一意に識別する識別子。たとえば、ドキュメント名とページ番号を組み合わせることができます。
  • CONTEXTUAL_TEXT: 省略可。エンベディング モデルに渡される入力コンテンツの追加のコンテキストと意味。
  • EMBEDDING_MODEL_KEY: エンベディングの生成に使用するモデルキー。モデル生成パラメータで構成されます。
  • BIGQUERY_DATASET_ID: BigQuery データセット ID。
  • BIGQUERY_TABLE_ID: BigQuery テーブル ID。

Google Cloud でエンベディングを生成する

SAP でエンベディングを生成する代わりに、Google Cloud でエンベディングをネイティブに生成できます。コードは最小限に抑えることができます。このアプローチでは、エンベディングを生成する前に、エンタープライズ データを Google Cloud に保存する必要があります。

企業データが BigQuery に読み込まれている場合は、SQL コマンドを実行してテキスト エンベディングを直接生成できます。詳細については、ML.GENERATE_EMBEDDING 関数を使用してテキスト エンベディングを生成するをご覧ください。

エンタープライズ データが Cloud Storage バケットにアップロードされている場合は、次のいずれかの方法でエンベディングを生成します。

次のステップ

寄稿者

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

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