适用于 SAP 的 Gemini 赋能的业务规则引擎

本文档介绍了一个参考架构,用于构建由 Gemini 等大型语言模型 (LLM) 提供支持的业务规则引擎,以便在 SAP 业务应用中自动做出决策。它使用 ABAP SDK for Google Cloud 的各种集成功能。

本文档的目标受众群体包括 ABAP 开发者、SAP 解决方案架构师和云架构师。本文档假定您对 ABAP SDK for Google CloudVertex AI SDK for ABAP 有基本的了解,并且对 LLM 简介有所了解。

什么是业务规则引擎 (BRE)?

业务规则引擎 (BRE) 是一种软件系统,可让您定义、部署和执行业务规则。这些规则本质上是决定您的商家如何运作的逻辑语句。BRE 会将逻辑语句外部化,而不是将业务规则硬编码到应用中,从而高效地管理和修改规则。

由 Gemini 赋能的 BRE 使用 Google 新一代 AI 模型 Gemini 的先进语言处理和推理功能,根据一组用作业务规则的经过设计的提示库自动做出决策。这些提示包含具体的说明和预期输出格式,可引导 Gemini 以与预定义业务逻辑一致的方式分析数据、识别模式和做出决策。

架构

下图展示了为 SAP 应用创建 Gemini 赋能的 BRE 的参考架构:

适用于 SAP 的 Gemini 赋能的业务规则引擎

此参考架构包括以下组件:

组件 子系统 详细信息
1 SAP ERP SAP ERP 系统(例如 SAP S/4HANA),该系统使用 Gemini 赋能的 BRE 来获取有助于自动决策的数据洞见。根据您的用例,您可以为 BRE 模块提供规则 ID 和必要的输入数据。
2 BRE 模块 BRE 模块使用 ABAP SDK for Google Cloud 从 Cloud Storage 检索已配置的规则,并使用 Vertex AI SDK for ABAP 调用 Gemini 来处理规则。
3 规则仓库 将规则(经过工程优化的提示)存储在 Cloud Storage 中,采用一致的命名惯例,以文本文件(例如 .txt.prompt)的形式存储。例如 RiskShiftingClause.prompt。 如需对生成的问题进行结构化管理,您还可以考虑使用 Cloud SQL 等数据库。
4 规则处理器 Vertex AI SDK for ABAP 会将输入数据(例如送货说明)和检索到的规则(提示)发送到 Gemini。 Gemini 会处理问题和输入数据,执行分析,并以指定格式返回结果。

使用的产品

此参考架构使用以下 Google Cloud 产品:

  • ABAP SDK for Google Cloud:可帮助您开发 ABAP 应用,将 SAP 系统连接到 Google Cloud 服务(例如 Cloud Storage)。

  • Vertex AI SDK for ABAP:可让您在 SAP 环境中使用 Google 的 Vertex AI。这有助于简化在 SAP 应用中构建 AI 赋能的功能。

  • Cloud Storage:一种用于在线存储和访问任意数量数据的云服务。

  • Vertex AI:可让您为各种应用构建、部署和扩缩机器学习模型。

使用场景

假设贵公司以 PDF 格式接收入站采购订单 (PO),并使用自动化流程在 SAP 中生成销售订单。您需要更新此流程,以便在收到的采购订单的送货说明中发现风险转移条款时加以识别和缓解。

合同中的风险转移条款是指将风险从一方转移到另一方的条款。如果未能发现并解决这些条款,贵公司可能会意外承担费用、陷入法律纠纷并遭到声誉损害。

以下是在采购订单文档的提交说明中编写的风险转移条款示例。

“卖方保证,自交货之日起,商品将在十年内不会出现缺陷。”

您需要为以下内容编写规则:

  • 识别和分类风险转移条款。
  • 说明为什么它被视为潜在的红旗。
  • 提供有关如何降低风险的建议。

您可以使用 Gemini 构建 BRE 来生成智能 JSON 响应,从而让 SAP 业务应用能够做出自动决策、触发任何流程拒绝,或发起下游人工验证。

风险转移条款示例

下表列出了可在进口采购订单中找到的风险转移条款示例:

问题类别 子句示例(送货说明) 潜在问题
过度赔偿 卖方应对因产品而产生或与产品相关的所有索赔、损失、损害和费用(包括但不限于律师费用)向买方提供赔偿。 如果免责声明过于宽泛,并要求卖方对意外事件或客户滥用行为承担责任,则可能会出现问题。
过度强调机密性 买方向卖方披露的所有信息(包括但不限于价格、规格和营销计划)均应视为买方的机密和专有信息。 这可能会妨碍卖方运用常规行业知识或与其他客户合作。
管辖法律不明确 本协议适用相应地点(例如伊利诺伊州)的法律。 如果买方和卖方位于不同的管辖区,这可能会导致法律冲突。
不可抗力限制 卖方不得因任何不可抗力事件(包括天灾、战争或恐怖主义事件)而免于履行本协议规定的义务。 这可能会使卖方对其无法控制的事件承担责任。
知识产权模糊性 产品的所有知识产权均归买方所有。 如果卖家来自受制裁的国家/地区或与受制裁国家/地区有联系,这可能是一个危险信号。

精心设计的提示词示例

本部分介绍了使用 RTF 框架设计的示例问题。提示工程中的 RTF 框架代表“角色”“任务”和“格式”。这是一种有效的提示构建方式,可让你从 Gemini 等 LLM 中获得更好、更一致的结果。

  • 角色:您希望 LLM 采用的角色,例如“销售专家”或“法律顾问”。
  • 任务:LLM 的特定操作,例如“总结此文本”或“分析某些内容”。
  • 格式:所需的输出结构,例如列表或 JSON。

如需了解可用于影响模型回答的常见提示策略,请参阅提示策略概览

以下提示可用作定义规则,帮助 Gemini 识别风险转移条款等问题:

RTF 框架
Role

You are a legal advisor for my company.

Task

Analyze the below delivery instruction on a purchase order from my
customer and let me know if it could cause any issues to my company.

Format

Respond to me in plain text JSON format with 4 fields.

Field 1 should be "issue" with possible values Yes or No.

Field 2 should be "issueCategory" with possible values Indemnification
Overreach, Unilateral Termination Clause, Confidentiality Overextension,
Unreasonable Warranty, Ambiguous Governing Law, Unclear Dispute Resolution,
Force Majeure Limitation, Unbalanced Liability,
Intellectual Property Ambiguity, Compliance with Sanctions, Others or None.

Field 3 should be "explanation" - use this field to give a short
explanation for your response on Field 1.

Field 4 should be "recommendation" - use this field to give a short
recommendation of how to mitigate such issues.

Do not include backticks in the response.

Delivery Instruction: "Seller warrants that the products will be free
from defects for a period of ten years from the date of delivery."

{
  "issue": "Yes",
  "issueCategory": "Unreasonable Warranty",
  "explanation":   "A ten-year warranty is significantly longer than
  industry standard for most products. This could expose your company to
  substantial financial risk if issues arise with the products years
  down the line.",
  "recommendation": "Negotiate a shorter warranty period that aligns
  with industry standards and your product's expected lifespan.
  Offer extended warranty options at an additional cost if the
  customer requires longer coverage."
}

您可以将此提示存储在 Cloud Storage 等代码库中。输入数据可以由 SAP 事务传递给 BRE 模块。

然后,您可以使用 ABAP SDK for Google Cloud 从 Cloud Storage 检索提示,并使用 Vertex AI SDK for ABAP 将其传递给 Gemini 以进行执行。

此风险转移条款示例的 JSON 响应示例由 Gemini 生成。

以下示例代码展示了如何检索规则并在代码中使用它。 它假定您将 BRE 服务作为 ABAP 类(例如 lcl_bre)实现。

 DATA(lo_bre) = NEW lcl_bre( iv_key_name  = 'CLIENT_KEY'
                             iv_model_key = 'MODEL_KEY' ).

 " Sample delivery text
 DATA(lv_delivery_text) = |Seller warrants that the products will be free from defects for| &&
                          |a period of ten years from the date of delivery.|.

 " Execute the rule for identifying Risk-Shifting clauses.
 DATA(lv_response) = lo_bre->execute_rule( iv_rule_id = 'RiskShiftingClause-Rule-001.prompt'
                                           iv_data    = lv_delivery_text ).
 " JSON response
 cl_demo_output=>display_json( lv_response ).

替换以下内容:

  • CLIENT_KEY:为对 Vertex AI 和 Cloud Storage 进行身份验证而配置的客户端密钥。
  • MODEL_KEY:用于访问 LLM 的模型键名称,在模型生成参数中进行配置。

execute_rule 方法会执行以下操作:

  1. 使用 /GOOG/CL_STORAGE_V1 类从 Cloud Storage 读取规则文件。

  2. 使用 /GOOG/CL_GENERATIVE_MODEL 类将处理规则发送到 Gemini,并将其设置为模型的指令。然后,模型会生成 JSON 响应。

以下是完整的示例代码,供您参考:

REPORT zra_bre_example.

" Local class definition
CLASS lcl_bre DEFINITION FINAL.

  PUBLIC SECTION.
    METHODS constructor
      IMPORTING iv_key_name  TYPE /goog/keyname
                iv_model_key TYPE /goog/model_key
      RAISING   /goog/cx_sdk.

    METHODS convert_xstring_to_string
      IMPORTING iv_xstring       TYPE xstring
      RETURNING VALUE(iv_string) TYPE string.

    METHODS execute_rule
      IMPORTING iv_rule_id              TYPE string
                iv_data                 TYPE string
      RETURNING VALUE(rv_response_text) TYPE string
      RAISING   /goog/cx_sdk.

  PRIVATE SECTION.
    DATA mo_storage TYPE REF TO /goog/cl_storage_v1.
    DATA mo_model   TYPE REF TO /goog/cl_generative_model.
ENDCLASS.

" Local class implementation
CLASS lcl_bre IMPLEMENTATION.
  METHOD constructor.
    mo_storage = NEW /goog/cl_storage_v1( iv_key_name = iv_key_name ).
    mo_model = NEW /goog/cl_generative_model( iv_model_key = iv_model_key ).
  ENDMETHOD.

  METHOD convert_xstring_to_string.
DATA lv_file_length TYPE i.
    DATA lt_bin_data    TYPE STANDARD TABLE OF char1024.

    " Call function module to convert xstring to binary format
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING buffer        = iv_xstring
      IMPORTING output_length = lv_file_length
      TABLES    binary_tab    = lt_bin_data.
    IF sy-subrc <> 0.
      " Handle error
    ENDIF.

    " Call function module to convert from binary to string format
    CALL FUNCTION 'SCMS_BINARY_TO_STRING'
      EXPORTING input_length = lv_file_length
      IMPORTING text_buffer  = iv_string
      TABLES    binary_tab   = lt_bin_data.
    IF sy-subrc <> 0.
      " Handle error
    ENDIF.
  ENDMETHOD.

  METHOD execute_rule.
    DATA lv_xdata       TYPE xstring.
    DATA lv_instruction TYPE string.

    " Get the rule file from rule repository(cloud storage)
    mo_storage->add_common_qparam( iv_name  = 'alt'
                                   iv_value = 'media' ).

    mo_storage->get_objects( EXPORTING iv_p_bucket = 'gemini-bre-repo'
                                       iv_p_object = iv_rule_id
                             IMPORTING es_output   = DATA(ls_output)
                                       ev_ret_code = DATA(lv_ret_code)
                                       ev_err_text = DATA(lv_err_text)
                                       es_err_resp = DATA(ls_err_resp)
                                       es_raw      = lv_xdata ).

    IF mo_storage->is_success( lv_ret_code ) = abap_true.
      " Set the instruction for Gemini as per the configured rule
      lv_instruction = convert_xstring_to_string( iv_xstring = lv_xdata ).
    ELSE.
      " Handle error
    ENDIF.

    " Set the text to be analyzed
    DATA(lv_prompt) = |Please analyze the Delivery Instruction:{ cl_abap_char_utilities=>newline }{ iv_data }|.

    " Call Gemini to process the rule and identify Risk-Shifting clauses
    rv_response_text = mo_model->set_system_instructions( iv_text = lv_instruction
                      )->add_safety_settings( iv_harm_category        = 'HARM_CATEGORY_DANGEROUS_CONTENT'
                                              iv_harm_block_threshold = 'BLOCK_NONE'
                      )->generate_content( iv_prompt_text = lv_prompt
                      )->get_text( ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY.
      DATA(lo_bre) = NEW lcl_bre( iv_key_name  = 'DEMO_AIPLATFORM'
                                  iv_model_key = 'gemini-flash' ).

      " Sample delivery text
 DATA(lv_delivery_text) = |Seller warrants that the products will be free from defects for| &&
                             |a period of ten years from the date of delivery.|.

      " Execute the rule for identifying Risk-Shifting clauses.
      DATA(lv_response) = lo_bre->execute_rule( iv_rule_id = 'RiskShiftingClause-Rule-001.prompt'
                                                iv_data    = lv_delivery_text ).
      " JSON response
      cl_demo_output=>display_json( lv_response ).

    CATCH /goog/cx_sdk INTO DATA(lo_exception).
      DATA(lv_msg) = lo_exception->get_text( ).
      " Handle error
  ENDTRY.

设计考虑事项

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

安全性、隐私权和合规性

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

如需了解 Gemini 如何使用您的数据,请参阅 适用于 Google Cloud 的 Gemini 如何使用您的数据

费用

如需估算 Cloud Storage 等 Google Cloud 资源的费用,请使用 Google Cloud 价格计算器

如需了解 Vertex AI 和 Gemini API 相关的价格,请参阅 Vertex AI 价格

设计替代方案

虽然本文档重点介绍的是本地版本或任何云版本的 ABAP SDK for Google Cloud,但您也可以使用 SAP BTP 版本的 ABAP SDK for Google Cloud 实现类似的结果。Vertex AI SDK for ABAP 不适用于 SAP BTP 环境,但您可以将本文档中针对 SDK 的本地版本提供的代码示例进行调整,并在 SAP BTP 环境中构建类似的解决方案。

后续步骤

贡献者

作者: Ameya Suvarna | SAP 应用工程师团队主管

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