本文档介绍了在 SAP 中设计服务子系统以与具备检索增强生成 (RAG) 功能的生成式 AI 应用搭配使用的参考架构。为了与构建具备 RAG 功能的生成式 AI 应用所需的 Google Cloud 服务集成,此参考架构使用了本地版或任何云端版 ABAP SDK for Google Cloud。
本文档适用于 ABAP 开发者、SAP 解决方案架构师和云架构师。本文假定您熟悉 Vector Search 术语和 RAG 概念。
服务子系统是具备 RAG 功能的生成式 AI 应用的重要组成部分,因为它负责管理应用与其用户之间的请求和响应流。借助本文档中介绍的服务子系统,您的应用可以访问和使用 SAP 企业数据,为大语言模型 (LLM) 提供上下文,从而帮助生成更准确、更可靠的输出。
通过将 Gemini LLM 与 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 Storage、Vertex AI Feature Store 或 BigQuery)中的企业数据执行语义搜索。 |
5 | Vertex AI Gemini 模型 | Vertex AI Gemini 模型,可基于您的企业数据生成回答。 |
服务子系统
生成式 AI 解决方案的服务子系统由以下子组件构成:
信息检索
当用户通过前端向生成式 AI 应用提交请求时,服务子系统会从数据源检索信息。如要从数据源检索信息,您可以根据自己的使用场景选择合适的方法:
- 使用 Vector Search 检索信息
- 在不使用 Vector Search 的情况下检索信息
使用 Vector Search 检索信息
如果您的企业数据量很大(结构化或非结构化数据),并且您希望 RAG 应用具有最小的延迟时间,我们建议您使用 Vector Search 构建检索流水线。Vector Search 可以在几毫秒内对数十亿条记录执行文本搜索和多模态搜索。
如需使用 Vector Search 进行信息检索,您需要设置一个向量数据库,以向量嵌入的形式存储企业数据。如需了解如何将企业数据注入向量数据库,请参阅在 SAP 中为具备 RAG 功能的生成式 AI 应用构建数据注入子系统。
在不使用 Vector Search 的情况下检索信息
如果您的数据集较小且位于 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 Vector Search。
以下是服务子系统的实现步骤:
如要检索仓库用例的物料 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.
如要将检索到的数据增添到输入提示中,请将相应物料的可用库存信息与提示串联起来,并添加“可用库存”作为前缀。
以下代码示例展示了如何将检索到的数据增添到输入提示中:
* Augment retrieved data to the input prompt lv_prompt = lv_prompt && 'Additional Context' && lv_available_inventory.
如需使用增强型提示调用 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 信息,那么为了缩短查询大型数据集的延迟时间,不妨考虑在创建索引时选择更大的分片大小,并在部署索引时选择高性能计算机。如需详细了解索引的分片大小,请参阅索引大小。
若想要提高搜索回答的相关性,不妨以更高的维度生成企业数据的嵌入。高性能计算机和更高的嵌入维度均会导致产生更高的费用。您可使用价格计算器根据您的预计使用量来估算费用。
后续步骤
如需了解如何将 Vector Search 用于 SAP 应用的语义搜索,请参阅适用于智能 SAP 应用的 Vertex AI Vector Search。
如需了解如何将 Vector Search 与 Vertex AI SDK for ABAP 搭配使用,请参阅使用 Vertex AI Vector Search。
如需了解如何将企业数据注入向量数据库,请参阅在 SAP 中为具备 RAG 功能的生成式 AI 应用构建数据注入子系统。
如果您在解决 ABAP SDK for Google Cloud 问题时需要帮助,请执行以下操作:
- 参阅 ABAP SDK for Google Cloud 问题排查指南。
- 在 Cloud 论坛上提出问题并与社区讨论 ABAP SDK for Google Cloud。
- 收集所有可用的诊断信息,并与 Cloud Customer Care 联系。 如需了解如何与 Customer Care 联系,请参阅获取 Google Cloud上的 SAP 支持。
贡献者
作者:Devesh Singh | SAP 应用工程师
其他贡献者:Vikash Kumar | 技术文档工程师