在 SAP 中为支持 RAG 的生成式 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 解决方案架构师和云架构师。本文档假定您熟悉向量搜索术语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 向量搜索产品 将嵌入存储在向量数据库(例如 Cloud StorageBigQuery)中,以便您执行语义搜索。

数据注入子系统

本部分介绍了数据注入子系统,该子系统可将企业数据转换为嵌入,并将嵌入存储在向量数据库中,以便与支持 RAG 的生成式 AI 应用搭配使用。此子系统可以处理各种 SAP 数据(包括文档、图片、业务规则和提示),以生成嵌入。

准备企业数据

在首次部署支持 RAG 的生成式 AI 应用之前,您需要从 SAP 系统加载现有企业数据的嵌入。您可以通过构建新的批处理程序或重复使用现有批处理程序来处理此操作,这些批处理程序能够以易于管理的数据块读取企业数据。

在您执行数据和嵌入的初始加载后,数据注入子系统需要与 SAP 数据的任何更改保持同步。无论是新记录、对现有记录的更新还是删除,向量搜索索引都需要反映这些更改。为此,您可以在 SAP 应用开发框架(例如 业务插件 (BAdI)RAP 事件处理脚本)中生成适当的 spot。这样可确保嵌入保持最新状态,并且 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 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 表中的一个或多个文本列生成嵌入。例如,如果您想按供应商的名称、地址或电话号码搜索供应商,可以将这些列的值串联起来,然后生成此组合值的文本嵌入。文本表中的说明、与业务交易关联的长文本等少数其他文本值是文本嵌入的理想候选项。

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