在 SAP 中为支持 RAG 的生成式 AI 应用设计服务子系统

本文档介绍了在 SAP 中设计服务子系统以与具备检索增强生成 (RAG) 功能的生成式 AI 应用搭配使用的参考架构。为了与 Google Cloud 构建具有 RAG 功能的生成式 AI 应用所需的服务集成,此参考架构使用本地版本或任何云版本的 ABAP SDK for Google Cloud

本文档适用于 ABAP 开发者、SAP 解决方案架构师和云架构师。本文假定您熟悉 Vector Search 术语RAG 概念。

服务子系统是支持 RAG 的生成式 AI 应用中的重要组成部分,因为它管理应用与其用户之间的请求和回答流。借助本文档中介绍的服务子系统,您的应用可以访问和使用 SAP 企业数据,为大语言模型 (LLM) 提供上下文,从而帮助生成更准确、更可靠的输出。

通过将 Gemini LLM 与 SAP 企业数据和流程相结合,您可以获得以下优势:

  • 提高准确性:访问更广泛的信息有助于您根据企业数据做出更准确、更明智的决策。
  • 增强的用户体验:通过提供个性化且与情境相关的信息,让用户获得更可靠的模型回答,从而提高用户满意度。

架构

下图显示了 SAP 中服务子系统的组件:

SAP 中的服务子系统

如上图所示,服务子系统架构包含以下组件:

编号 组件 详细信息
1 服务子系统 服务子系统负责从数据源检索相关信息。它会使用提示增强信息,与生成式 AI 模型进行交互,并将最终回答发送回给用户。
2 ABAP SDK for Google Cloud SDK 负责处理服务子系统与各种 Google Cloud 服务之间的通信。
3 SAP 函数模块 如果数据集较小且位于 SAP 系统中,您可以使用 SAP 函数模块构建信息检索流水线。您可以使用 SELECT 查询、BAPI 调用使用 Gemini 进行 SAP 函数调用从 SAP 函数模块检索数据。
4 Vector Search 产品 如果您的企业数据量很大,并且您希望 RAG 应用具有最小的延迟时间,则可以使用 Vector Search 构建检索流水线。您可以对以嵌入形式存储在向量数据库(例如 Cloud StorageVertex AI Feature StoreBigQuery)中的企业数据执行语义搜索。
5 Vertex AI Gemini 模型 Vertex AI Gemini 模型,可根据您的企业数据生成回复。

服务子系统

生成式 AI 解决方案的服务子系统由以下子组件组成:

信息检索

当用户通过前端向生成式 AI 应用提交请求时,服务子系统会从数据源检索信息。如需从数据源检索信息,您可以根据自己的用例选择合适的方法:

  • 使用 Vector Search 检索信息
  • 在不使用 Vector Search 的情况下检索信息

如果您的企业数据量很大(结构化或非结构化数据),并且您希望 RAG 应用具有最小的延迟时间,我们建议您使用 Vector Search 构建检索流水线。Vector Search 可以在几毫秒内对数十亿条记录执行文本和多模搜索。

如需使用 Vector Search 进行信息检索,您需要设置一个向量数据库,以便以向量嵌入的形式存储企业数据。如需了解如何将企业数据注入向量数据库,请参阅在 SAP 中为支持 RAG 的生成式 AI 应用构建数据注入子系统

如果您的数据集较小且位于 SAP 系统中,您可以使用 SELECT 查询、SAP BAPI 调用来检索信息,也可以使用将 SAP 函数与 Gemini 搭配使用来增强模型的上下文。

信息增强

为了向模型提供企业专属的必要背景信息,我们建议您使用 SAP 系统中的相关信息来丰富提示。

获取其他数据后,将数据添加到模型的上下文中。此增强功能可为模型提供所需的上下文,以便使用添加的企业信息做出回应。

如需将检索到的数据添加到模型的上下文中,请将数据附加或串联到模型的输入提示中。在附加数据时,您可以为其添加相关文本前缀或后缀,以表明它是与提示一起提供的附加上下文。

回答生成

如需使用增强型提示调用 Gemini AI 模型,请使用 Vertex AI SDK for ABAP 的生成式模型调用程序组件。

这种方法可确保生成的回答不仅与用户的查询相关,而且基于您的企业专属数据,从而获得更准确、更有洞见的结果。

使用场景

支持 RAG 的生成式 AI 应用可用于使用自然语言查询快速更新仓库中的物料库存。

假设您要为一家制造和运送家具、装饰品和配件的公司的仓库员工实现生成式 AI 应用。

为了高效管理仓库库存和供应链,生成式 AI 应用通过 SAP Web 应用使用基于自然语言的查询,快速提供有关物料库存的分析数据。例如,您可以通过此类查询来确定特定素材资源的当前库存数量。

这些信息存储在 SAP 数据库表中的商品数据中,这些数据库表可能是大型家居用品公司的大量商品列表。仓库员工需要从 SAP 应用获取回答,这些回答基于 SAP 系统(单一可信来源)中的信息。借助这些信息,他们可以快速高效地做出决策,例如:

  • 库存状况:特定材料是否有货?
  • 库存数量:某种材料有多少单位可用?
  • 生产计划:要满足下一个入站订单,材料的制造目标应为多少?

部署

本部分简要介绍了仓库用例的服务子系统的实现。该指南详细介绍了如何使用嵌入在最新版 ABAP SDK for Google Cloud 中的 Vertex AI SDK for ABAP 来检索信息和与 Gemini 模型进行交互。

对于仓库用例,请注意,SAP 中的库存信息与每件商品的唯一材料 ID 相关联。每件商品还具有存储在 SAP 中的描述性属性,例如名称、详细说明、类别和其他相关属性。这些文本描述会转换为称为“嵌入”的数值表示法,并存储在向量数据库中。每个嵌入都与其对应的素材 ID 相关联,可用于高效搜索和分析商品信息。

向量数据库更新后,如需执行搜索查询“某个商品的当前商品目录数量是多少”,您可以执行以下操作:

  • 使用查询对向量数据库执行 Vector Search,以检索素材资源 ID。

  • 查询 SAP 表并调用 SAP BAPI 以获取材料 ID 的库存数量。

  • 将库存数量增添到模型的上下文中。

如果您选择的向量数据库是向量索引,则可以使用 Vertex AI SDK for ABAP 直接从 ABAP 调用 Vector Search。如需了解详情,请参阅参考架构适用于智能 SAP 应用的 Vertex AI Vector Search

以下是服务子系统的实现步骤:

  1. 如需检索仓库用例的材料 ID,您可以使用 Vector Search。

    以下代码示例说明了如何使用 Vector Search 检索素材 ID:

    DATA:
    lv_prompt              TYPE string,
    lv_available_quantity  TYPE mng01,
    ls_return              TYPE bapireturn,
    lv_available_inventory TYPE string,
    lt_wmdvsx              TYPE STANDARD TABLE OF bapiwmdvs,
    lt_wmdvex              TYPE STANDARD TABLE OF bapiwmdve.
    
    lv_prompt = 'What is the current inventory count for Cymbal Emerald Flower Vase'.
    
    * Get material id based on the prompt through vector search
    TRY.
      DATA(lo_vector_index) = NEW /goog/cl_vector_search( iv_search_key = 'SEARCH_KEY' ).
      DATA(ls_material) = lo_vector_index->find_neighbors_by_string(
                                              iv_search_string        = lv_prompt
                                              iv_embeddings_model_key = 'EMBEDDINGS_MODEL_KEY'
                                          )->get_nearest_neighbor( ).
    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
      cl_demo_output=>display( 'Search not successful.' && lo_cx_sdk->get_text( ) ).
      EXIT.
    
    ENDTRY.
    
    DATA(lv_material_id) = ls_material-datapoint_id.
    
    * Get base unit of measure for the material
    SELECT SINGLE meinh
    FROM marm
    INTO @DATA(lv_meinh)
    WHERE matnr = @lv_material_id.
    IF sy-subrc = 0.
    * Get available stock for the material
    CALL FUNCTION 'BAPI_MATERIAL_AVAILABILITY'
      EXPORTING
        plant      = <SAP_PLANT_ID>
        material   = CONV matnr18( lv_material_id )
        unit       = lv_meinh
      IMPORTING
        av_qty_plt = lv_available_quantity
        return     = ls_return
      TABLES
        wmdvsx     = lt_wmdvsx
        wmdvex     = lt_wmdvex.
    IF ls_return-type = 'S' OR
        ls_return-type IS INITIAL.
    * Prepare available stock value in base unit of measure
      lv_available_inventory = |{ 'Avaiblable Stock = ' } | &&
                                  lv_available_quantity && | { lv_meinh }|.
    ELSE.
      cl_demo_output=>display( 'Material availability lookup not successful:' && ls_return-message ).
    
    ENDIF.
    
    ENDIF.
    

    如果您的数据集较小且位于 SAP 系统中,要查找仓库用例的物料 ID,您可以使用 SELECT 查询物料说明,然后查询 SAP 表以获取库存数量。

    以下代码示例展示了如何使用 SELECT 查询检索材料库存信息:

    DATA:
    lv_prompt              TYPE string,
    lv_available_quantity  TYPE mng01,
    ls_return              TYPE bapireturn,
    lv_available_inventory TYPE string,
    lt_wmdvsx              TYPE STANDARD TABLE OF  bapiwmdvs,
    lt_wmdvex              TYPE STANDARD TABLE OF  bapiwmdve,
    lr_maktx               TYPE RANGE OF maktx,
    ls_maktx               LIKE LINE OF lr_maktx.
    
    lv_prompt = 'What is the current inventory count for Cymbal Emerald Flower Vase'.
    
    ls_maktx-sign   = 'I'.
    ls_maktx-option = 'CP'.
    ls_maktx-low    = 'Cymbal Emerald Flower Vase'.
    
    APPEND ls_maktx TO lr_maktx.
    
    * Get material id through select statement
    SELECT SINGLE matnr
    FROM makt
    INTO @DATA(lv_material_id)
    WHERE maktx IN @lr_maktx.
    IF sy-subrc <> 0.
    cl_demo_output=>display( 'Material with given description not found' ).
    EXIT.
    
    ENDIF.
    
    * Get base unit of measure for the material
    SELECT SINGLE meinh
    FROM marm
    INTO @DATA(lv_meinh)
    WHERE matnr = @lv_material_id.
    IF sy-subrc = 0.
    * Get available stock for the material
    CALL FUNCTION 'BAPI_MATERIAL_AVAILABILITY'
      EXPORTING
         plant      = <SAP_PLANT_ID>
         material   = CONV matnr18( lv_material_id )
        unit       = lv_meinh
      IMPORTING
         av_qty_plt = lv_available_quantity
        return     = ls_return
       TABLES
        wmdvsx     = lt_wmdvsx
        wmdvex     = lt_wmdvex.
     IF ls_return-type = 'S' OR
        ls_return-type IS INITIAL.
    * Prepare available stock value in base unit of measure
       lv_available_inventory = |{ 'Avaiblable Stock = ' } | &&
                                  lv_available_quantity && | { lv_meinh }|.
    ELSE.
       cl_demo_output=>display( 'Material availability lookup not successful:' && ls_return-message ).
    
    ENDIF.
    
    ENDIF.
    
  2. 如需将检索到的数据添加到输入提示中,请将相应材料的可用库存与提示串联起来,前缀为“可用库存”。

    以下代码示例说明了如何将检索到的数据增补到输入提示中:

    * Augment retrieved data to the input prompt
    lv_prompt = lv_prompt && 'Additional Context' && lv_available_inventory.
    
    
  3. 如需使用增强型提示调用 Gemini AI 模型,请使用 Vertex AI SDK for ABAP 的生成式模型调用程序组件。

    以下代码示例说明了如何使用增强型提示调用模型:

    TRY.
      lv_prompt = lv_prompt && 'Additional Context' && lv_available_inventory.
      DATA(lo_model_key) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
       DATA(lv_model_response) = lo_model_key->generate_content( lv_prompt
                                              )->get_text( ).
      IF lv_model_response IS NOT INITIAL.
          cl_demo_output=>display( lv_model_response ).
    
      ENDIF.
    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
      cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
    
    ENDTRY.
    
    

设计考虑事项

本部分提供的指导可帮助您使用此参考架构开发架构,以满足您在安全性、隐私性、合规性、费用和性能方面的具体要求。

安全性、隐私权和合规性

安全和合规性是共担责任。如需了解详情,请参阅 Vertex AI 共担责任

如需了解 Google Cloud对数据隐私的承诺,请参阅隐私权资源中心

费用优化

如果您使用 Vector Search 检索 RAG 信息,那么为了降低成本,不妨考虑为索引选择较小的分片大小和较低维度的嵌入,这样您就可以使用较小的计算机来部署索引。

Vertex AI 是 Google Cloud的一项可结算服务。如需了解价格信息,请参阅 Vertex AI 价格Vector Search 价格。如需根据您的预计使用量来估算费用,请使用价格计算器

性能优化

如果您使用 Vector Search 检索 RAG 信息,那么为了缩短查询大型数据集的延迟时间,请考虑在创建索引时选择更高的分片大小,并在部署索引时选择高性能计算机。如需详细了解索引的分片大小,请参阅索引大小

为了提高搜索回答的相关性,请在更高的维度生成企业数据的嵌入。计算机和更高的嵌入维度费用较高。如需根据您的预计使用量来估算费用,请使用价格计算器

后续步骤

贡献者

作者:Devesh Singh | SAP 应用工程师

其他贡献者:Vikash Kumar | 技术文档工程师