SAP 中适用于生成式 AI 应用的数据提取子系统

本文档介绍了一种参考架构,用于在 SAP 中为支持 RAG 的生成式 AI 应用设计数据注入子系统。此子系统使用本地版本或任何云版本的 ABAP SDK for Google Cloud 与构建支持 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 应用开发框架中使用适当的位置,例如业务插件 (BAdI)RAP 事件处理脚本。这样可确保您的嵌入保持最新状态,并确保您的 AI 应用始终拥有最新信息。

在 Google Cloud 中存储企业数据(可选)

SAP 系统可以包含结构化和非结构化企业数据。您可以选择将此企业数据存储在 Google Cloud 中,以便从服务子系统检索。

如需存储企业数据,您可以使用以下 Google Cloud 服务:

从企业数据生成嵌入

如需根据企业数据生成文本和多模态嵌入,您可以将嵌入模型Vertex AI SDK for ABAP 搭配使用。

嵌入本质上是数字代码,用于以捕捉它们之间的关联方式来表示文本、图片或视频。应用使用这些代码来理解和生成语言,甚至可以识别特定内容中最复杂的含义和关系。该过程的工作原理是将文本、图片和视频转换为数字列表(称为向量),这些向量旨在有效捕捉原始内容的含义。

存储嵌入

如需高效存储和搜索从 SAP 企业数据生成的嵌入,您可以使用 Google Cloud 的向量搜索产品,这些产品可用作向量数据库

如需存储 SAP 企业数据的嵌入,请从以下列表中选择一个矢量数据库:

设计考虑事项

以下是选择向量数据库的关键设计注意事项:

  • 性能:新向量的编入索引速度、搜索速度(延迟时间)、可伸缩性,以及在检索所有相关结果(召回率)和仅检索最相关结果(精确率)之间进行权衡等因素。
  • 数据特征:嵌入矢量大小、矢量数据集大小和数据分布会影响费用、性能和索引编制。
  • 功能:支持的距离函数(例如欧几里德算法余弦相似度),能够执行过滤、组合关键字搜索和向量搜索,以及支持近似最近邻 (ANN) 搜索。
  • 集成:现有集成,以及从应用轻松数据注入。
  • 费用:与数据和搜索量对应的定价模型、存储费用和查询费用。

为了实现高效的搜索和分析,请将嵌入和将其关联回源数据的标识符存储在矢量数据库中。

是否在 Google Cloud 存储解决方案中存储企业数据,主要取决于您的服务子系统的位置:

  • 如果您的服务子系统是 SAP,则存储企业数据在 SAP 之外是可选的,因为您已经有权访问 SAP 中的企业数据。

  • 如果您的服务子系统位于 SAP 之外(例如 App Engine),则您可能需要将企业数据存储在适当的 Google Cloud 存储解决方案中,以便高效地检索数据。如果您的服务子系统可以向 SAP 发出远程调用来检索数据,则可以避免这种情况。

探索如何生成和存储嵌入

本部分介绍了如何根据企业数据生成和存储嵌入。生成和存储嵌入的主要模式有两种:

  • 在 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 表中的一个或多个文本列生成嵌入。例如,如果您想按供应商的名称、地址或手机号码进行搜索,则可以串联这些列的值,然后生成此组合值的文本嵌入。很少有其他文本值是文本嵌入的理想候选项,例如文本表格中的说明、与业务交易相关的长文本。

以下代码示例演示了如何生成文本嵌入并将其存储在 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 | 技术文档撰写者