在 SAP 中設計資料擷取子系統,以便支援 RAG 的生成式 AI 應用程式

本文件說明參考架構,可用於設計 SAP 中用於支援 RAG 的生成式 AI 應用程式資料擷取子系統。這個子系統會使用 內部部署或任何 Google Cloud ABAP SDK 雲端版本,與建構 RAG 相容生成式 AI 應用程式所需的 Google Cloud 服務整合。

檢索增強生成 (RAG) 技術輔助生成式 AI 應用程式包含各種元件,其中資料擷取子系統負責準備及處理企業資料。這個子系統可協助您準備並儲存企業資料,並將其做為向量資料庫中的嵌入項目,以便進行精確且具洞察力的 AI 互動。

由於許多機構都使用 SAP ERP 系統來儲存企業資料,因此本文件會提供相關指引,說明如何在資料擷取子系統中整合 Google Cloud的資料儲存解決方案和向量搜尋資料庫。這可讓您做出明智的選擇,並有效運用 Google Cloud的服務,為支援 RAG 的生成式 AI 應用程式建構穩健且高效的管道。

本文件的目標對象包括 ABAP 開發人員、SAP 解決方案架構師和雲端架構師。本文件假設您熟悉 Vector Search 術語RAG 概念。

架構

下圖為參考架構,說明 SAP 中資料擷取子系統的元件:

SAP 中的資料擷取子系統

此資料擷取子系統架構包含下列元件:

# 元件 詳細資料
1 資料擷取子系統 準備及處理企業資料,以產生向量嵌入項目。 這些嵌入項目會儲存在 Google Cloud上的適當向量資料庫中。您也可以選擇將企業資料儲存在 Google Cloud上。
2 ABAP SDK for Google Cloud SDK 會處理資料擷取子系統與各種 Google Cloud 服務之間的通訊。
3 資料儲存 選用。 Google Cloud 資料儲存空間解決方案,例如 BigQuery 或 Cloud Storage,用於儲存企業資料 (結構化和非結構化資料)。詳情請參閱「在 Google Cloud中儲存企業資料」。
4 嵌入模型 (Vertex AI) 從各種企業資料來源產生嵌入資料的 AI 模型。
5 Vector Search 產品 將嵌入資料儲存在向量資料庫中,例如 Cloud StorageBigQuery,以便執行語意搜尋。

資料擷取子系統

本節將說明資料擷取子系統,說明如何將企業資料轉換為嵌入資料,並將嵌入資料儲存在向量資料庫中,以便與支援 RAG 的生成式 AI 應用程式搭配使用。這個子系統可處理各式各樣的 SAP 資料,包括文件、圖片、業務規則和提示,以產生嵌入項目。

準備企業資料

第一次部署支援 RAG 的生成式 AI 應用程式前,您必須從 SAP 系統為現有企業資料載入嵌入資料。您可以建立新的批次程式,或重複使用現有的批次程式,以便以可控的區塊讀取企業資料。

完成資料和嵌入項目的初始載入作業後,資料擷取子系統必須隨時追蹤 SAP 資料的任何變更。無論是新增記錄、更新現有記錄或刪除記錄,向量搜尋索引都必須反映這些變更。為此,您可以使用 SAP 應用程式開發架構中的適當位置,例如 Business Add-Ins (BAdIs)RAP 事件處理常式。這可確保嵌入項目保持最新狀態,讓 AI 應用程式隨時取得最新資訊。

將企業資料儲存在 Google Cloud 中(選用)

SAP 系統可同時包含結構化和非結構化的企業資料。您可以選擇將這類企業資料儲存在 Google Cloud 中,以便從服務子系統擷取。

如要儲存企業資料,您可以使用下列 Google Cloud 服務:

從企業資料產生嵌入

如要從企業資料產生文字和多模態嵌入資料,您可以使用 Vertex AI SDK for ABAP 搭配嵌入模型

嵌入基本上是數字代碼,用來表示文字、圖片或影片,並捕捉它們之間的關聯。應用程式會使用這些程式碼來理解及產生語言,甚至可辨識特定內容中最複雜的意義和關係。這個程序會將文字、圖片和影片轉換為數字清單,也就是向量,以便有效擷取原始內容的意思。

儲存嵌入

如要有效儲存及搜尋由 SAP 企業資料產生的嵌入項目,您可以使用 Google Cloud的向量搜尋產品,做為向量資料庫

如要儲存 SAP 企業資料的嵌入資料,請從下列清單中選擇向量資料庫:

設計須知

以下是選擇向量資料庫時的關鍵設計考量:

  • 效能:新向量索引速度、搜尋速度 (延遲時間)、可擴充性、擷取所有相關結果 (回憶率) 與僅擷取最相關結果 (精確度) 之間的權衡。
  • 資料特性:嵌入向量大小、向量資料集大小和資料分布會影響成本、效能和索引。
  • 功能:支援的距離函式,例如 歐幾里德演算法餘弦相似度,可進行篩選、結合關鍵字和向量搜尋,並支援近似近鄰 (ANN) 搜尋。
  • 整合:現有的整合功能,以及從應用程式輕鬆擷取資料的功能。
  • 費用:根據資料和搜尋量計算的定價模式、儲存空間和查詢費用。

如要進行高效率的搜尋和分析,請將嵌入項目儲存在向量資料庫中,並連結回來源資料的 ID。

您是否應將企業資料儲存在 Google Cloud 儲存空間解決方案中,主要取決於服務子系統的位置:

  • 如果您的服務子系統是 SAP,則可選擇將企業資料儲存在 SAP 以外的位置,因為您已可存取 SAP 中的企業資料。

  • 如果您的服務子系統位於 SAP 之外 (例如 App Engine),您可能需要將企業資料儲存在適當的 Google Cloud 儲存空間解決方案中,以便有效擷取資料。如果服務子系統可以對 SAP 進行遠端呼叫來擷取資料,就能避免這種情況。

瞭解如何產生及儲存嵌入

本節將說明如何從企業資料產生及儲存嵌入資料。產生及儲存嵌入資料的主要模式有兩種:

  • 在 SAP 中產生嵌入資料:使用 ABAP 專用的 Vertex AI SDK 搭配適當的嵌入資料模型,從 SAP ERP 系統中的企業資料產生嵌入資料,並將這些資料儲存在向量資料庫中。

  • 在 Google Cloud中產生嵌入資料:使用無伺服器方法 (例如 Cloud Run 函式或 BigQuery),從 Google Cloud上儲存媒體中的企業資料產生嵌入資料,並儲存在向量資料庫中。

在 SAP 中產生嵌入

如要在 SAP 系統中,從 SAP 企業資料本機產生嵌入資料,您可以使用各種嵌入模型和 ABAP 專用的 Vertex AI SDK。然後,這些產生的嵌入資料可透過 SDK 內建的其中一種攝入機制,傳送至 Google Cloud 上的適當向量資料庫。

您可以根據向量搜尋功能的需求,決定要將哪些資料轉換為嵌入項目。如要瞭解如何使用 ABAP 適用的 Vertex AI SDK 產生嵌入資料,請參閱「產生嵌入資料」。

本節將說明常見的 SAP 資料類型,以及如何使用 ABAP 專用的 Vertex AI SDK 產生嵌入資料。

儲存在 SAP 資料表中的結構化企業資料

您主要為 SAP 資料表中一或多個文字欄產生嵌入資料。舉例來說,如果您想依供應商名稱、地址或電話號碼搜尋供應商,請將這些欄的值連結在一起,然後產生這個組合值的文字嵌入內容。其他文字值很少是適合嵌入文字的候選項目,例如文字表格中的說明,以及與業務交易相關的長文字。

以下程式碼範例說明如何產生文字嵌入資料,並將其儲存在 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 | 技術撰稿人