本文概略說明如何在 SAP BTP、ABAP 環境中使用 Vertex AI SDK for ABAP,藉此搭配使用 SAP 函式呼叫與 Gemini。
您可以使用函式呼叫功能定義自訂函式,並將這些函式提供給 Gemini 模型。模型不會直接叫用自訂函式,而是產生結構化資料輸出內容,指定函式名稱和建議的引數。您可以使用這項輸出內容編寫應用程式,以便取用結構化輸出內容並呼叫外部 API。接著,您可以將產生的 API 輸出內容納入進一步的模型提示,以便提供更完整的查詢回應。
ABAP 專用的 Vertex AI SDK 可讓 ABAP 開發人員透過下列方式,在 SAP 函式模組中叫用自訂邏輯,簡化函式呼叫程序:
- 將 SAP 函式模組名稱或 OData (開放資料通訊協定) 服務名稱,以函式宣告的形式傳遞至模型,說明函式或服務的名稱、用途和相關參數。
- 在叫用模型時,隱含設定 SAP 函式模組或 OData 服務的自動叫用功能。
事前準備
使用 Gemini 搭配 ABAP 適用的 Vertex AI SDK 進行 SAP 函式呼叫前,請確認您或管理員已完成下列先決條件:
- 在 Google Cloud 專案中啟用 Vertex AI API。
- 在 SAP 環境中安裝 ABAP 適用的 Vertex AI SDK。
- 設定驗證,以便存取 Vertex AI API。
- 設定模型產生參數。
透過叫用 SAP 函式模組,使用 SAP 資料豐富 Gemini AI 模型內容
本節說明如何叫用 SAP 函式模組,藉此使用 SAP 資料豐富 Gemini AI 模型的背景資訊。
以下是 ABAP 開發人員呼叫 SAP 函式模組的典型流程:
- 使用者提供輸入提示。
- SDK 會將輸入提示和函式宣告傳遞至模型。
- 模型會查看提示和宣告的函式,找出要呼叫的函式,並建議呼叫函式的參數值。
- 如果設定自動叫用,SDK 就會呼叫 SAP 函式模組。
- 接著,SDK 會使用呼叫函式的輸出內容叫用模型。
- 模型會針對最終提示回覆可靠的答案,並加入呼叫函式的輸出內容。
- SDK 會將回應傳回給使用者。
如果您選擇不自動叫用 SAP 函式模組,SDK 就會讓您使用函式呼叫功能,而無需任何 SAP 函式模組叫用。在這種情況下,您可以按照一般函式呼叫工作流程使用外部工具,例如 API 和函式。
將 Gemini 多模態叫用者類別例項化
如要在 SAP 中叫用函式,請使用 /GOOG/CL_GENERATIVE_MODEL
類別。您可以傳遞在模型產生參數中設定的模型鍵,藉此將類別例項化。
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
將 MODEL_KEY
替換為模型鍵名稱,該名稱會在模型產生參數中設定。
建立 SAP 函式模組
如要建立 SAP 函式模組,以便由 SDK 自動叫用,請按照提供的結構定義操作:
類別 | 參數名稱 | 關聯類型 |
---|---|---|
匯入中 | IT_FUNCTION_PARAMETERS |
/GOOG/T_FUNCTION_PARAMETERS |
匯出中 | EV_FUNCTION_RESPONSE |
STRING |
正在進行變更 | CV_PROMPT |
STRING |
例外狀況 | /GOOG/CX_SDK |
Exception Class |
根據匯入參數,在函式模組中編寫自訂邏輯,可透過 SELECT
查詢擷取 SAP 資料,或呼叫外部 API 或模組來取得遺漏的資訊。
設定匯出參數 EV_FUNCTION_RESPONSE
,並將資訊回饋至 LLM 情境。您也可以根據自訂邏輯和業務需求,變更或修改 CV_PROMPT
中的提示文字,進一步根據不同的業務情境指示 LLM。
新增函式宣告
如要在 LLM 上下文中新增函式宣告,您可以使用 ADD_FUNCTION_DECLARATION
方法。每次需要在結構定義中新增函式時,請呼叫 ADD_FUNCTION_DECLARATION
方法。
DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
type = 'PARAMETER_TYPE'
description = 'PARAMETER_DESCRIPTION'
is_required = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
lo_model->add_function_declaration( iv_name = 'FUNCTION_MODULE_NAME'
iv_description = 'FUNCTION_MODULE_DESCRIPTION'
it_parameters = lt_parameters ).
更改下列內容:
PARAMETER_NAME
:參數名稱。PARAMETER_TYPE
:參數的資料類型,例如string
、integer
或boolean
。PARAMETER_DESCRIPTION
:清楚說明參數的用途和預期格式。PARAMETER_IS_REQUIRED
:如果函式必須使用這個參數才能運作,請將值設為ABAP_TRUE
。FUNCTION_MODULE_NAME
:SAP 函式模組的名稱。FUNCTION_MODULE_DESCRIPTION
:SAP 函式模組的說明。
您也可以宣告不含參數的函式,做為備用或備援函式。如果使用者提示未提供足夠資訊來呼叫特定函式,您可以指示 Gemini 選取這個備用函式。
設定自動叫用 SAP 函式模組
如要設定模型所選 SAP 函式的自動叫用,您可以使用 SET_AUTO_INVOKE_SAP_FUNCTION
方法。如果 ABAP_TRUE
是在匯入參數 IV_AUTO_INVOKE
中傳遞,則 SDK 會叫用函式模組,並將其回應納入 LLM 上下文,以產生最終回應。
您必須依循「建立 SAP 函式模組」一節所述的結構定義函式模組。
lo_model->set_auto_invoke_sap_function( abap_true ).
使用函式呼叫產生內容
如要將提示文字傳遞至 Gemini 模型,您可以使用 GENERATE_CONTENT
方法。如要取得 Gemini 透過函式呼叫從 SAP 函式模組新增的額外背景資訊所產生的回應,請使用 GET_TEXT
方法。
DATA(lv_response) = lo_model->generate_content( iv_prompt_text ='PROMPT'
)->get_text( ).
取得所選函式名稱和參數值
如要取得 Gemini 所選函式 (從已宣告的函式中選取) 及其建議參數,請使用 GET_FUNCTION_CALL
方法。
DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
)->generate_content( iv_prompt_text = 'PROMPT' ).
lo_response->get_function_call( IMPORTING ev_function_name = DATA(lv_function_name)
et_function_parameters = DATA(lt_function_parameters) ).
您可以從 LV_FUNCTION_NAME
取得 Gemini 所選函式的名稱,以及 LT_FUNCTION_PARAMETERS
的建議參數。您可以根據企業的安全性資訊和事件管理指南,使用這項資訊驗證、追蹤及記錄 Gemini 動作。
程式碼範例
以下程式碼範例說明如何使用 SAP 函式呼叫,以便接收模型的最終回應。
DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
TRY.
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
type = 'PARAMETER_TYPE'
description = 'PARAMETER_DESCRIPTION'
is_required = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
DATA(lv_response) = lo_model->add_function_declaration(
iv_name = 'FUNCTION_MODULE_NAME'
iv_description = 'FUNCTION_MODULE_DESCRIPTION'
it_parameters = lt_parameters
)->set_auto_invoke_sap_function( abap_true
)->generate_content( iv_prompt_text ='PROMPT'
)->get_text( ).
IF lv_response IS NOT INITIAL.
cl_demo_output=>display( lv_response ).
ENDIF.
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.
更改下列內容:
MODEL_KEY
:模型鍵名稱,會在模型產生參數中設定。PARAMETER_NAME
:參數名稱。PARAMETER_TYPE
:參數的資料類型,例如string
、integer
或boolean
。PARAMETER_DESCRIPTION
:清楚說明參數的用途和預期格式。PARAMETER_IS_REQUIRED
:如果函式必須使用這個參數才能運作,請將值設為ABAP_TRUE
。FUNCTION_MODULE_NAME
:SAP 函式模組的名稱。FUNCTION_MODULE_DESCRIPTION
:SAP 函式模組的說明。PROMPT
:您的文字提示。
透過叫用 OData 服務,使用 SAP 資料豐富 Gemini AI 模型內容
本節說明如何透過叫用 OData 服務,為 Gemini AI 模型內容增添 SAP 資料。
以下是 ABAP 開發人員呼叫 OData 服務的典型流程:
- 使用者提供輸入提示。
- SDK 會將輸入提示和函式宣告傳遞至模型。
- 模型會查看提示和宣告的函式,找出要呼叫的函式,並建議呼叫函式的參數值。
- 如果設定自動叫用功能,SDK 就會呼叫 OData 服務。
- 接著,SDK 會使用所呼叫 OData 服務的輸出內容叫用模型。
- 模型會回覆可靠的答案,針對最終提示提供經過強化的輸出內容,也就是已呼叫的 OData 服務輸出內容。
- SDK 會將回應傳回給使用者。
如果您選擇不自動叫用 OData 服務,SDK 就會讓您使用函式呼叫功能,而無需任何 OData 服務叫用。在這種情況下,您可以按照一般函式呼叫工作流程使用外部工具,例如 API 和函式。
建立 OData 服務
如要建立 OData 服務,讓 SDK 以函式自動叫用,請使用下列結構定義:
{
"UserRequest": "Input Prompt as user request",
"FunctionResponse": null,
"ModifiedUserRequest": null,
"ContextParameters": [
{
"ParameterName": "Parameter 1",
"ParameterValue": "Value 1"
},
{
"ParameterName": "Parameter 2",
"ParameterValue": "Value 2"
}
]
}
下表提供這個結構定義中使用的欄位資訊:
結構定義欄位 | 欄位類型 | 輸入/輸出模式 | 說明 |
---|---|---|---|
UserRequest |
String |
僅限輸入 | 使用者輸入的輸入提示。 |
FunctionResponse |
String |
僅供輸出 | OData 服務的輸出內容。可以是單一值或序列化的 JSON 字串。 |
ModifiedUserRequest |
String |
僅供輸出 | 經過修改的 UserRequest ,會以提示的形式提供給 Gemini。 |
ContextParameters |
Table of parameters |
僅限輸入 | 參數表格,包含參數名稱和值。 |
ParameterName |
String |
僅限輸入 | 函式參數的名稱。 |
ParameterValue |
String |
僅限輸入 | Gemini 建議的函式參數值。 |
建立 OData 服務實體
使用上述結構定義建立實體。
這個實體會將使用者要求視為提示,並將其轉送至 Gemini,並使用 ABAP 專用的 Vertex AI SDK 宣告為函式。這個實體也會將 OData 函式回應從後端 SAP 系統傳回至 BTP,然後將其擴充至 Gemini AI 模型脈絡。
- 為新項目設定適當的名稱。
設定下列屬性的值。保留所有其他屬性的預設值。
名稱 是否為關鍵? EDM 核心類型 ABAP 欄位名稱 UserRequest
是 Edm.String
USER_REQUEST FunctionResponse
否 Edm.String
FUNCTION_RESPONSE ModifiedUserRequest
否 Edm.String
MODIFIED_USER_REQUEST
如果您想在同一個 OData 服務中放置更多實體,請使用相同的結構定義建立實體。
建立另一個名為
ContextParameters
的實體,並加入下列屬性。保留所有其他屬性的預設值。這個實體包含 Gemini 模型提供的函式參數及其值。
名稱 是否為關鍵? EDM 核心類型 ABAP 欄位名稱 ParameterName
是 Edm.String
PARAMETER_NAME ParameterValue
是 Edm.String
PARAMETER_VALUE 為先前步驟中建立的所有實體建立實體組合。
請在步驟 1 中建立的每個實體與步驟 2 中建立的
ContextParameters
實體之間建立關聯,如下所示:- 設定關聯名稱。
- 在「Principal Entity」欄位中,設定您在步驟 1 建立實體的名稱。
- 在「Principal Entity Cardinality」欄位中設定
M
。 - 在「Dependent Entity」欄位中,設定
ContextParameters
。 - 在「Dependent Entity Cardinality」欄位中,設定
M
。 - 儲存並產生 OData 執行階段構件。
在 SAP Gateway 中新增已建立的 OData 服務,並啟用 ICF 節點。
如以下所示,為 OData 中繼資料產生 EDMX 檔案:
- 前往 TCode /iwfnd/maint_services,取得 OData 服務的中繼資料。
- 將產生的 XML 格式化並儲存,並使用
.edmx
副檔名儲存。
編寫 OData 函式邏輯
在產生的
MPC_EXT
類別中,新增及啟用深層實體類型:TYPES: BEGIN OF ts_function_deep_entity, user_request TYPE string, function_response TYPE string, modified_user_request TYPE string, context_parameters TYPE TABLE OF ts_contextparameters WITH DEFAULT KEY, END OF ts_function_deep_entity.
請完成下列步驟,重新定義產生的
DPC_EXT
類別的CREATE_DEEP_ENTITY
方法:- 如果您在「建立 OData 服務實體」一節中建立了多個 OData 實體,請為每個 OData 實體新增
CASE
陳述式。 - 編寫 ABAP 邏輯,以
get
或prepare
回應,藉此在 BTP 應用程式中增強 Gemini 的內容。 - 在 FUNCTION_RESPONSE 欄位中設定回應。
- 在 MODIFIED_USER_REQUEST 欄位中,設定經修改的提示。
- 使用
COPY_DATA_TO_REF
OData 方法,在訊息中繫結整體回應。
以下程式碼片段為 ABAP 邏輯範例:
TRY. DATA: ls_request TYPE <z*_mpc_ext>=>ts_function_deep_entity. CASE io_tech_request_context->get_entity_type_name( ). WHEN <z*_mpc_ext>=>gc_ENTITY_NAME. CALL METHOD io_data_provider->read_entry_data IMPORTING es_data = ls_request. <ABAP logic to formulate OData function response> ls_request-modified_user_request = 'MODIFIED_GEMINI_PROMPT'. ls_request-function_response = 'ODATA_FUNCTION_RESPONSE'. CALL METHOD me->copy_data_to_ref EXPORTING is_data = ls_request CHANGING cr_data = er_deep_entity. ENDCASE. CATCH /iwbep/cx_mgw_busi_exception. CATCH /iwbep/cx_mgw_tech_exception. ENDTRY. ```
- 如果您在「建立 OData 服務實體」一節中建立了多個 OData 實體,請為每個 OData 實體新增
更改下列內容:
ENTITY_TYPE
:您在「建立 OData 服務實體」一節的步驟 1 中建立的 OData 實體名稱MODIFIED_GEMINI_PROMPT
:Gemini 提供的修改過的提示ODATA_FUNCTION_RESPONSE
:OData 服務提供的回應
如果您有一個以上的欄位,或要傳遞做為函式回應的巢狀結構或資料表,則可以使用 SDK /GOOG/CL_JSON_UTIL
類別的 SERIALIZE_JSON
方法,將 ABAP 類型序列化為字串。
將 OData 服務定義為 SAP BTP 上的服務消費模式
建立 OData 服務後,您需要在 SAP BTP 環境中將其定義為服務用量模型。方法是建立服務使用模型、HTTP 外寄服務、通訊情境和通訊安排。
建立服務消費模式
- 在 ABAP 專案中,開啟內容選單,然後依序選取「New」>「Other ABAP Repository Object」>「Business Services」>「Service Consumption Model」。
- 在「New Service Consumption Model」視窗中完成下列步驟:
- 在「Package」欄位中,選取並上傳先前在前一個部分產生的 EDMX 檔案。
- 輸入名稱和說明。
- 在「Remote Consumption Mode」(遠端消費模式) 欄位中,選取「OData」。
- 按一下「完成」。
建立 HTTP 傳出服務
- 在 ABAP 專案中開啟內容選單。
- 選取套件,然後依序點選「New」>「Other ABAP Repository Object」。
- 在「Service Type」(服務類型)欄位中,選取「HTTP Service」(HTTP 服務)。
在「Default Path Prefix」欄位中,輸入後端 SAP 系統中 OData 服務的路徑前置字串。
您可以存取 SAP Gateway Client,找出 OData 路徑前置字串。您在「Request URI」欄位中看到的值,是 OData 服務的路徑前置字串。
點按「Next」。
建立通訊情境
建立 HTTP 外寄服務後,您必須建立通訊情境,並將外寄服務指派給該情境。如要這樣做,請完成下列步驟:
- 在 ABAP 專案中,選取「Communication Scenario」,然後按一下「Next」。
- 在「New Communication Scenario」視窗中,完成下列步驟:
- 輸入名稱和說明。
- 點按「Next」。
- 在「Communication Scenario Type」欄位中,選取「Customer Managed」。
- 前往「Outbound」分頁。
- 在「Allowed Instances」欄位中,選取「One instance per scenario & communication system」。
- 在「Supported Authentication methods」欄位中,選取下列核取方塊:Basic、X.509 和 OAuth 2.0。
- 在「OAuth 2.0 授權類型」欄位中,選取「SAML 2.0 憑證斷言」。
- 在「Outbound Services」(傳出服務) 專區下方,按一下「Add」(新增),然後選取您在前一個部分建立的傳出服務。
- 在「Outbound Service」部分,確認「Default Path Prefix」是否正確。如果沒有,請按一下「同步處理」。
- 儲存通訊情境。
建立通訊安排
- 存取已安裝 ABAP 適用於 Google Cloud 的 SDK 的 BTP ABAP 系統 SAP Fiori 啟動工具。
開啟「通訊安排」應用程式。
- 按一下 [New]。
在隨即顯示的「New Communication Arrangement」對話方塊中,輸入下列欄位的值:
- 情境:選取您在「建立通訊情境」一節中建立的通訊情境。
- 安排名稱:輸入通訊安排的名稱。
按一下 [建立]。
針對顯示的通訊安排,在「Communication System」欄位中,選取您在先前步驟中建立的通訊系統。
按一下 [儲存]。
將 Gemini 多模態叫用者類別例項化
如要在 SAP 中叫用函式,請使用 /GOOG/CL_GENERATIVE_MODEL
類別。您可以傳遞在模型產生參數中設定的模型鍵,藉此將類別例項化。
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
將 MODEL_KEY
替換為模型鍵名稱,該名稱會在模型產生參數中設定。
新增函式宣告
如要將 OData 服務新增為 LLM 背景資訊的函式宣告,您可以使用 ADD_FUNCTION_DECLARATION
方法。每次需要將 OData 服務做為函式新增至結構定義時,請呼叫 ADD_FUNCTION_DECLARATION
方法。
DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
DATA ls_connection_parameters TYPE /goog/cl_generative_model=>ty_connection_parameters.
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
type = 'PARAMETER_TYPE'
description = 'PARAMETER_DESCRIPTION'
is_required = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
ls_connection_parameters-connection_type = 'ODATA'.
ls_connection_parameters-comm_scenario = 'COMMUNICATION_SCENARIO'.
ls_connection_parameters-service_id = 'ODATA_SERVICE_ID'.
ls_connection_parameters-proxy_model_id = 'ODATA_SERVICE_CONSUMPTION_MODEL_ID'.
ls_connection_parameters-relative_service_root = 'ODATA_ROOT_URI'.
ls_connection_parameters-entity_set_name = 'ODATA_ENTITY_SET_NAME'.
lo_model->add_function_declaration( iv_name = 'FUNCTION_NAME'
iv_description = 'FUNCTION_DESCRIPTION'
it_parameters = lt_parameters
is_connection_parameters = ls_connection_parameters ).
更改下列內容:
PARAMETER_NAME
:參數名稱PARAMETER_TYPE
:參數的資料類型,例如string
、integer
或boolean
PARAMETER_DESCRIPTION
:清楚說明參數的用途和預期格式PARAMETER_IS_REQUIRED
:如果函式必須使用這個參數,請將值設為ABAP_TRUE
COMMUNICATION_SCENARIO
:您建立的通訊情境 IDODATA_SERVICE_ID
:您為 OData 服務建立的傳出服務 IDODATA_SERVICE_CONSUMPTION_MODEL_ID
:您為 OData 服務建立的服務使用率模型 IDODATA_ROOT_URI
:後端 SAP 系統中 OData 服務的根 URIODATA_ENTITY_SET_NAME
:要宣告為函式的 OData 服務實體集名稱FUNCTION_NAME
:您為要使用的 OData 服務宣告的函式名稱FUNCTION_DESCRIPTION
:您為要使用的 OData 服務宣告的函式說明
設定 OData 服務的自動叫用
如要設定 Gemini 模型所選 SAP 函式 OData 服務的自動叫用,您可以使用 SET_AUTO_INVOKE_SAP_FUNCTION
方法。如果 ABAP_TRUE
是在匯入參數 IV_AUTO_INVOKE
中傳遞,則 SDK 會叫用函式模組,並將其回應納入 LLM 上下文,以產生最終回應。
您必須依循「建立 SAP 函式模組」一節所述的結構定義函式模組。
lo_model->set_auto_invoke_sap_function( abap_true ).
使用函式呼叫產生內容
如要將提示文字傳遞至 Gemini 模型,您可以使用 GENERATE_CONTENT
方法。如要取得 Gemini 透過函式呼叫從 SAP 函式模組新增的額外背景資訊所產生的回應,請使用 GET_TEXT
方法。
DATA(lv_response) = lo_model->generate_content( iv_prompt_text ='PROMPT'
)->get_text( ).
取得所選函式名稱和參數值
如要取得 Gemini 所選函式 (從已宣告的函式中選取) 及其建議參數,請使用 GET_FUNCTION_CALL
方法。
DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
)->generate_content( iv_prompt_text = 'PROMPT' ).
lo_response->get_function_call( IMPORTING ev_function_name = DATA(lv_function_name)
et_function_parameters = DATA(lt_function_parameters) ).
程式碼範例
以下程式碼範例說明如何使用 SAP 函式呼叫 Odata 服務,以便接收模型的最終回應:
DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
DATA ls_connection_parameters TYPE /goog/cl_generative_model=>ty_connection_parameters.
TRY.
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
type = 'PARAMETER_TYPE'
description = 'PARAMETER_DESCRIPTION'
is_required = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
ls_connection_parameters-connection_type = 'ODATA'.
ls_connection_parameters-comm_scenario = 'COMMUNICATION_SCENARIO'.
ls_connection_parameters-service_id = 'ODATA_SERVICE_ID'.
ls_connection_parameters-proxy_model_id = 'ODATA_SERVICE_CONSUMPTION_MODEL_ID'.
ls_connection_parameters-relative_service_root = 'ODATA_ROOT_URI'.
ls_connection_parameters-entity_set_name = 'ODATA_ENTITY_SET_NAME'.
DATA(lv_response) = lo_model_key->add_function_declaration(
iv_name = 'FUNCTION_NAME'
iv_description = 'FUNCTION_DESCRIPTION'
it_parameters = lt_parameters
is_connection_parameters = ls_connection_parameters
)->set_auto_invoke_sap_function( abap_true
)->generate_content( iv_prompt_text ='PROMPT'
)->get_text( ).
IF lv_response IS NOT INITIAL.
out->write( lv_response ).
ENDIF.
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
out->write( lo_cx_sdk->get_text( ) ).
ENDTRY.
後續步驟
- 瞭解如何使用 ABAP SDK for Google Cloud 的 SAP BTP 版本開發應用程式。
- 歡迎在 Cloud 論壇上提問,並與社群討論 ABAP 專用的 Vertex AI SDK。