叫用 Gemini 模型

本文說明如何使用 ABAP 專用的 Vertex AI SDK,叫用 Gemini 模型,為文字和多模態輸入內容產生回應。Gemini 模型可接受多種輸入模式,包括文字圖片影片音訊文件。您可以將 Gemini 模型用於下列用途:

  • 摘要任意形式的文字
  • 說明或解釋媒體素材資源
  • 翻譯不同語言

使用生成式模型建構以 AI 為中心的功能,不需要任何機器學習 (ML) 專業知識。您不需要收集大量資料集或訓練模型。只要在幾個句子中描述您希望模型執行的操作,即可開始撰寫第一個程式。ABAP 適用的 Vertex AI SDK 提供 ABAP 類別和方法,可從 SAP 環境存取 Gemini 模型。如要開始,請查看這些程式碼範例

事前準備

在使用 Vertex AI SDK for ABAP 搭配 Gemini 模型之前,請確認您或管理員已完成下列必要條件:

傳送要求給 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' ).

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_OFFSETIV_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_OFFSETIV_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( ).

PROMPT 替換為您的文字「提示」

取得安全評分

如要取得模型回應安全性的評分清單,您可以使用 GET_SAFETY_RATING 方法。

DATA(lt_safety_ratings) = lo_model->generate_content( 'PROMPT'
                                )->get_safety_rating( ).

PROMPT 替換為您的文字「提示」

取得要求提示中的符記數

如要接收模型輸入提示中的符記數量,您可以使用 GET_PROMPT_TOKEN_COUNT 方法。

DATA(lv_prompt_token_count) = lo_model->generate_content( 'PROMPT'
                                    )->get_prompt_token_count( ).

PROMPT 替換為您的文字「提示」

取得模型回覆中的符記數量

如要從模型的回應中接收符號數量,您可以使用 GET_CANDIDATES_TOKEN_COUNT 方法。

DATA(lv_candidates_token_count) = lo_model->generate_content( 'PROMPT'
                                        )->get_candidates_token_count( ).

PROMPT 替換為您的文字「提示」

取得封鎖原因

如要接收模型封鎖回應產生作業的原因,您可以使用 GET_BLOCK_REASON 方法。

DATA(lv_block_reason) = lo_model->generate_content( 'PROMPT'
                              )->get_block_reason( ).

PROMPT 替換為您的文字「提示」

取得封鎖原因訊息

如要接收模型封鎖回應產生作業的可讀原因訊息,您可以使用 GET_BLOCK_REASON_MESSAGE 方法。

DATA(lv_block_reason_message) = lo_model->generate_content( 'PROMPT'
                                      )->get_block_reason_message( ).

PROMPT 替換為您的文字「提示」

程式碼範例

以下程式碼範例示範如何叫用 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.

更改下列內容:

後續步驟