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

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

検索拡張生成(RAG)対応の生成 AI アプリケーションにはさまざまなコンポーネントがあります。その 1 つであるデータ取り込みサブシステムはエンタープライズ データの準備と処理を行います。このサブシステムは、正確で有益な 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 functions や 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: 画像を一意に識別する 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: 特定の知識チャンクを一意に識別する 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 氏 | テクニカル ライター