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

本文档介绍了一个参考架构,用于在 SAP 中设计一个服务子系统,以便与支持检索增强生成 (RAG) 的生成式 AI 应用搭配使用。为了与构建具有 RAG 功能的生成式 AI 应用所需的服务集成,此参考架构使用了本地版本或任何云版本的 ABAP SDK for Google Cloud。 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 应用具有最短的延迟时间,则可以使用向量搜索构建检索流水线。您可以对以嵌入形式存储在向量数据库(例如 Cloud StorageVertex AI Feature StoreBigQuery)中的企业数据执行语义搜索。
5 Vertex AI Gemini 模型 Vertex AI Gemini 模型,可根据您的企业数据生成回答。

服务子系统

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

信息检索

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

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

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

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

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

信息增强

为了向模型提供重要的企业专用上下文,我们建议您使用 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 相关联,以便高效搜索和分析商品信息。

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

  • 使用查询对矢量数据库执行向量搜索,以检索材料 ID。

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

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

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

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

  1. 如需检索仓库用例的材料 ID,您可以使用 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 价格。 如需根据您的预计使用量来估算费用,请使用价格计算器

性能优化

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

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

后续步骤

贡献者

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

其他贡献者: Vikash Kumar | 技术文档撰写者