本文說明如何使用 ABAP 專用的 Vertex AI SDK,叫用 Gemini 模型,為文字和多模態輸入內容產生回應。Gemini 模型可接受多種輸入模式,包括文字、圖片、影片、音訊和文件。您可以將 Gemini 模型用於下列用途:
- 摘要任意形式的文字
- 說明或解釋媒體素材資源
- 翻譯不同語言
使用生成式模型建構以 AI 為中心的功能,不需要任何機器學習 (ML) 專業知識。您不需要收集大量資料集或訓練模型。只要在幾個句子中描述您希望模型執行的操作,即可開始撰寫第一個程式。ABAP 適用的 Vertex AI SDK 提供 ABAP 類別和方法,可從 SAP 環境存取 Gemini 模型。如要開始,請查看這些程式碼範例。
事前準備
在使用 Vertex AI SDK for ABAP 搭配 Gemini 模型之前,請確認您或管理員已完成下列必要條件:
- 在 Google Cloud 專案中啟用 Vertex AI API。
- 在 SAP 環境中安裝 ABAP 適用的 Vertex AI SDK。
- 設定驗證,以便存取 Vertex AI API。
- 設定模型產生參數。
傳送要求給 Gemini
本節說明如何使用 ABAP 適用的 Vertex AI SDK,透過 Vertex AI API 將要求傳送至 Gemini 模型。
將 Gemini 多模態叫用者類別例項化
如要使用文字或多模態提示來叫用 Gemini 文字和多模態模型,您可以使用 /GOOG/CL_GENERATIVE_MODEL
類別。您可以傳遞在模型產生參數中設定的模型鍵,藉此將類別例項化。
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
將 MODEL_KEY
替換為模型鍵名稱,該名稱會在模型產生參數中設定。
使用提示生成內容
如要透過向模型提供文字提示來產生內容,您可以使用 GENERATE_CONTENT
方法。
lo_model->generate_content( 'PROMPT' ).
為模型提供系統指令
如要將文字型系統指示傳遞至模型,您可以使用 SET_SYSTEM_INSTRUCTIONS
方法。
lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).
將 SYSTEM_INSTRUCTIONS
替換為模型的系統指示。
新增安全性設定
如要為模型新增安全性設定,以便產生回應,您可以使用 ADD_SAFETY_SETTINGS
方法。這項功能可用於對模型強制執行安全指南,以便封鎖不安全的內容。
lo_model->add_safety_settings( iv_harm_category = 'HARM_CATEGORY'
iv_harm_block_threshold = 'HARM_BLOCK_THRESHOLD'
iv_harm_block_method = 'HARM_BLOCK_METHOD' ).
更改下列內容:
每次呼叫方法時,ADD_SAFETY_SETTINGS
方法會將指定的安全設定新增至模型的輸入內容。
設定模型的產生設定
您會在 /GOOG/AI_CONFIG
資料表中維護模型的產生設定。如要覆寫特定呼叫的產生設定,您可以使用 SET_GENERATION_CONFIG
方法。如果已設定產生屬性的匯入參數,則會套用傳遞的參數值。
lo_model->set_generation_config( iv_response_mime_type = 'RESPONSE_MIME_TYPE'
iv_temperature = 'TEMPERATURE'
iv_top_p = 'TOP_P'
iv_top_k = 'TOP_K'
iv_candidate_count = 'CANDIDATE_COUNT'
iv_max_output_tokens = 'MAX_OUTPUT_TOKENS'
iv_presence_penalty = 'PRESENCE_PENALTY'
iv_frequency_penalty = 'FREQUENCY_PENALTY' ).
更改下列內容:
RESPONSE_MIME_TYPE
:模型的回應 MIME 類型。TEMPERATURE
:隨機性溫度。TOP_P
:Top-P 取樣。TOP_K
:前 K 個取樣。CANDIDATE_COUNT
:要產生的候選項目數量。MAX_OUTPUT_TOKENS
:每則訊息的輸出符記數量上限PRESENCE_PENALTY
:正面懲罰。FREQUENCY_PENALTY
:頻率處罰。
如要進一步瞭解這些參數,請參閱「設定模型產生參數」。
將多模態輸入內容傳遞至模型
您可以使用多模態輸入來叫用 Gemini 模型,輸入內容可以是文字、圖片、影片、文件,或上述內容的組合。您可以以原始資料形式傳遞輸入內容,也可以提供檔案物件的 Cloud Storage URI。
設定原始資料
如要將檔案的原始資料和 MIME 類型,做為模型的輸入內容,您可以使用 SET_INLINE_DATA
方法。針對影片輸入內容,如要只考量影片的特定部分,您可以分別使用選用的匯入參數 IV_VIDEO_START_OFFSET
和 IV_VIDEO_END_OFFSET
設定開始時間和結束時間。
lo_model->set_inline_data( iv_mime_type = 'MIME_TYPE'
iv_data = 'RAW_DATA' ).
更改下列內容:
MIME_TYPE
:原始資料的 IANA 標準 MIME 類型。根據預設,MIME 類型設為application/pdf
。RAW_DATA
:圖片、PDF 或影片的 Base64 編碼原始資料,可在提示中內嵌。
如要使用相同的 /GOOG/CL_GENERATIVE_MODEL
類別例項,從模型輸入內容中清除檔案的原始資料,您可以使用 CLEAR_INLINE_DATA
方法。
lo_model->clear_inline_data( ).
設定 Cloud Storage 中的物件
如要提供儲存在 Cloud Storage 值區中的檔案物件 URI 做為模型的輸入內容,以及其 MIME 類型,您可以使用 SET_FILE_DATA
方法。針對影片輸入內容,如要只考量影片的特定部分,您可以分別使用選用的匯入參數 IV_VIDEO_START_OFFSET
和 IV_VIDEO_END_OFFSET
設定開始時間和結束時間。
lo_model->set_file_data( iv_mime_type = 'MIME_TYPE'
iv_file_uri = 'FILE_URI' ).
更改下列內容:
MIME_TYPE
:檔案資料的 IANA 標準 MIME 類型。根據預設,MIME 類型設為application/pdf
。FILE_URI
:儲存在 Cloud Storage 值區中的檔案 URI。
如果您想將 Cloud Storage 值區中的所有檔案,做為模型的輸入內容,請使用 SET_FILES_FROM_GCS
方法指定目標 Cloud Storage 值區名稱。
lo_model->set_files_from_gcs( iv_storage_bucket_name = 'STORAGE_BUCKET_NAME').
將 STORAGE_BUCKET_NAME
替換為包含檔案的 Cloud Storage 值區名稱。
如果您有專用的用戶端金鑰,可透過 ABAP SDK for Google Cloud 叫用 Cloud Storage API,請在匯入參數 IV_KEY_NAME
中傳遞用戶端金鑰名稱。
如要透過相同的 /GOOG/CL_GENERATIVE_MODEL
類別例項,從模型輸入內容中清除透過 Cloud Storage URI 設定的物件,您可以使用 CLEAR_FILE_DATA
方法。
lo_model->clear_file_data( ).
設定回應 MIME 類型
如要設定模型回應的回應 MIME 類型,您可以使用 SET_RESPONSE_MIME_TYPE
方法。如果未設定,則模型會預設使用 text/plain
做為回應 MIME 類型。
lo_model->set_response_mime_type( iv_mime_type = 'RESPONSE_MIME_TYPE' ).
將 RESPONSE_MIME_TYPE
替換為產生內容的回應 MIME 類型。
計算文字提示中的符記數
如要在使用文字提示呼叫模型前,計算文字提示中的符記數,可以使用 COUNT_TOKENS
方法。
DATA(lv_total_tokens) = lo_model->count_tokens( iv_prompt_text = 'PROMPT'
iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
)->get_total_tokens( ).
DATA(lv_total_billable_characters) = lo_model->count_tokens(
iv_prompt_text = 'PROMPT'
iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
)->get_total_billable_characters( ).
更改下列內容:
接收 Gemini 的回覆
為接收模型的已處理回應,並以有意義的方式向 ABAP 開發人員呈現,SDK 會提供 /GOOG/CL_MODEL_RESPONSE
類別。
/GOOG/CL_MODEL_RESPONSE
類別擷取的回應會鏈結至透過 /GOOG/CL_GENERATIVE_MODEL
類別方法提出的要求,因此您可以在單一陳述式中直接存取回應,而不需要變數來儲存中間結果。
取得文字回應
如要接收模型的文字回應,您可以使用 GET_TEXT
方法。
DATA(lv_response_text) = lo_model->generate_content( 'PROMPT'
)->get_text( ).
取得安全評分
如要取得模型回應安全性的評分清單,您可以使用 GET_SAFETY_RATING
方法。
DATA(lt_safety_ratings) = lo_model->generate_content( 'PROMPT'
)->get_safety_rating( ).
取得要求提示中的符記數
如要接收模型輸入提示中的符記數量,您可以使用 GET_PROMPT_TOKEN_COUNT
方法。
DATA(lv_prompt_token_count) = lo_model->generate_content( 'PROMPT'
)->get_prompt_token_count( ).
取得模型回覆中的符記數量
如要從模型的回應中接收符號數量,您可以使用 GET_CANDIDATES_TOKEN_COUNT
方法。
DATA(lv_candidates_token_count) = lo_model->generate_content( 'PROMPT'
)->get_candidates_token_count( ).
取得封鎖原因
如要接收模型封鎖回應產生作業的原因,您可以使用 GET_BLOCK_REASON
方法。
DATA(lv_block_reason) = lo_model->generate_content( 'PROMPT'
)->get_block_reason( ).
取得封鎖原因訊息
如要接收模型封鎖回應產生作業的可讀原因訊息,您可以使用 GET_BLOCK_REASON_MESSAGE
方法。
DATA(lv_block_reason_message) = lo_model->generate_content( 'PROMPT'
)->get_block_reason_message( ).
程式碼範例
以下程式碼範例示範如何叫用 Gemini 模型,為不同類型的輸入內容產生回應。
以文字為主的產生
以下程式碼範例說明如何從文字提示和系統指示產生回應。系統指示為選用項目,可與提示一起傳遞,以便指示模型以特定方式運作。
程式碼範例
DATA:
lv_instruction TYPE string,
lv_prompt TYPE string.
lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt = 'PROMPT'.
TRY.
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
)->generate_content( lv_prompt
)out->write( lv_response ).
IF lv_response IS NOT INITIAL.
out->write( lv_response ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
out->write( lo_cx_sdk->get_text( ) ).
ENDTRY.
更改下列內容:
多模態生成
以下程式碼範例說明如何從多模態輸入內容 (例如文字和圖片) 產生回應。您可以提及圖片、影片或文件的 Cloud Storage URI 或原始檔案資料,並附上文字提示。系統指令為選用項目,可與提示一起傳遞,用於指示模型以特定方式運作。
程式碼範例
DATA:
lv_instruction TYPE string,
lv_prompt TYPE string.
lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt = 'PROMPT'.
TRY.
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
)->set_file_data( iv_mime_type = 'MIME_TYPE'
iv_file_uri = 'FILE_URI'
)->set_inline_data( iv_mime_type = 'MIME_TYPE'
iv_data = 'INLINE_DATA'
)->generate_content( lv_prompt
)out->write( lv_response ).
IF lv_response IS NOT INITIAL.
out->write( lv_response ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
out->write( lo_cx_sdk->get_text( ) ).
ENDTRY.
更改下列內容:
MODEL_KEY
:模型鍵名稱,會在模型產生參數中設定。PROMPT
:您的文字提示。SYSTEM_INSTRUCTIONS
:您對模型的系統指示。MIME_TYPE
:檔案資料的 IANA 標準 MIME 類型。根據預設,MIME 類型設為application/pdf
。FILE_URI
:儲存在 Cloud Storage 值區中的檔案 URI。INLINE_DATA
:圖片、PDF 或影片的 Base64 編碼原始資料,可在提示中內嵌。
為模型新增安全性設定
以下程式碼範例說明如何為模型新增安全設定,以便產生回應。
程式碼範例
DATA:
lv_instruction TYPE string,
lv_prompt TYPE string.
lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt = 'PROMPT'.
TRY.
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
)->set_file_data( iv_mime_type = 'MIME_TYPE'
iv_file_uri = 'FILE_URI'
)->set_inline_data( iv_mime_type = 'MIME_TYPE'
iv_data = 'INLINE_DATA'
)->add_safety_settings( iv_harm_category = 'HARM_CATEGORY'
iv_harm_block_threshold = 'HARM_BLOCK_THRESHOLD'
iv_harm_block_method = 'HARM_BLOCK_METHOD'
)->generate_content( lv_prompt
)out->write( lv_response ).
IF lv_response IS NOT INITIAL.
out->write( lv_response ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
out->write( lo_cx_sdk->get_text( ) ).
ENDTRY.
更改下列內容:
MODEL_KEY
:模型鍵名稱,會在模型產生參數中設定。PROMPT
:您的文字提示。SYSTEM_INSTRUCTIONS
:您對模型的系統指示。MIME_TYPE
:檔案資料的 IANA 標準 MIME 類型。根據預設,MIME 類型設為application/pdf
。FILE_URI
:儲存在 Cloud Storage 值區中的檔案 URI。INLINE_DATA
:圖片、PDF 或影片的 Base64 編碼原始資料,可在提示中內嵌。HARM_CATEGORY
:您要套用的有害類別。HARM_BLOCK_THRESHOLD
:您要套用的機率型臨界值等級。HARM_BLOCK_METHOD
:您要套用的危害阻斷方法。
找出提示中的符號數量和可計費字元
在使用提示喚起模型前,建議您檢查提示中的符記數量,以及符記中可計費的字元數量,以便規劃 Google Cloud 專案計費。下列程式碼範例說明如何找出這些數字,並評估相似模型呼叫的收費金額。
程式碼範例
DATA:
lv_prompt TYPE string.
lv_prompt = 'PROMPT'.
TRY.
DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
DATA(lv_total_tokens) = lo_model->count_tokens( lv_prompt
)->get_total_tokens( ).
DATA(lv_total_billable_characters) = lo_model->count_tokens( lv_prompt
)out->write( |Total Tokens - { lv_total_tokens }| ).
IF lv_total_tokens IS NOT INITIAL.
out->write( |Total Tokens - { lv_total_tokens }| ).
ENDIF.
IF lv_total_billable_characters IS NOT INITIAL.
out->write( |Total Billable Characters - { lv_total_billable_characters }| ).
out->write( lo_cx_sdk->get_text( ) ).
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。