運用 Gemini 快速設計出原型

Google 的生成式語言 API 可讓您使用 Gemini 模型,打造無縫的原型。您可以使用這個工具測試及探索 Gemini 模型的功能,無須設定複雜的基礎架構或管理模型部署作業。Google 的瀏覽器原型設計工具 Google AI Studio 使用生成式語言 API,可透過生成式模型進行瀏覽器原型設計。

有了 ABAP 適用的 Vertex AI SDK,您就能直接在 ABAP 環境中使用生成式語言 API (Gemini API) 開始原型設計歷程。您必須使用 Google AI Studio 產生的 API 金鑰,才能存取 Gemini 模型。您只需產生這個 API 金鑰一次。

產生 API 金鑰

您透過 Google AI Studio 產生的 API 金鑰,可提供方便的方式驗證 Gemini API。

如要產生 API 金鑰,請執行下列步驟:

  1. 在 Google AI Studio 中開啟「API 金鑰」頁面。

    取得 API 金鑰

  2. 按一下「建立 API 金鑰」

  3. 如果有填入,請詳閱並確認法律聲明,然後按一下「繼續」

  4. 如果已填入,請詳閱並確認安全設定提醒。

  5. 在「Create API key」對話方塊中,視情況選取下列其中一個選項:

    • 在新專案中建立 API 金鑰
    • 在現有專案中建立 API 金鑰
  6. 複製金鑰字串並妥善保存。您需要這個 API 金鑰,才能設定 Gemini API 的驗證機制。

  7. 複製產生 API 金鑰的 Google Cloud 專案編號。在後續步驟中會用到這項資訊。

設定驗證方法

如要使用 API 金鑰驗證 Gemini API,請使用下列任一方法:

透過自訂驗證類別使用 API 金鑰進行驗證

您可以建立自訂驗證類別,以便保留 API 金鑰,並使用自訂驗證類別設定用戶端金鑰。

  1. 在 SAP BTP ABAP 環境中,繼承 ABAP 適用的 Google Cloud SDK 隨附的 /GOOG/CL_AUTH_BASE 類別,藉此建立新類別:

    1. 在 Eclipse 平台中,按一下要建立類別的套件,然後依序點選「New」>「ABAP Class」
    2. 在「Name」(名稱) 欄位中輸入 ZCL_TEST_GEMINI_API
    3. 在「Description」欄位中輸入 Authentication Class for testing Gemini API
    4. 在「Superclass」欄位中輸入 /GOOG/CL_AUTH_BASE
    5. 點按「Next」
    6. 選取傳輸要求或建立新的傳輸要求。
    7. 按一下「完成」
    8. 在編輯器中,將現有程式碼替換成以下程式碼:

      CLASS zcl_test_gemini_api DEFINITION
          PUBLIC
          INHERITING FROM /goog/cl_auth_base FINAL
          CREATE PUBLIC.
          PUBLIC SECTION.
              CONSTANTS: BEGIN OF c_com_scn_sdk,
                                      wif     TYPE /goog/comm_scenario VALUE '/GOOG/COM_SDK_WIF',
                                      apik_sm TYPE /goog/comm_scenario VALUE '/GOOG/COM_SDK_APIKSM',
                                      END OF c_com_scn_sdk.
              METHODS get_access_token REDEFINITION.
      PROTECTED SECTION.
      PRIVATE SECTION.
      ENDCLASS.
      CLASS zcl_test_gemini_api IMPLEMENTATION.
          METHOD get_access_token.
              ev_auth_type = CONV #( apikey_sm ).
              ev_token = API_KEY.
          ENDMETHOD.
      ENDCLASS.
      

      API_KEY 替換成您在 Google AI Studio 中產生的 API 金鑰。

    9. 啟用 Z 類別。

    10. 前往這個類別的屬性,然後前往「API 狀態」分頁,然後使用契約狀態 C1 釋出 API。

      如要進一步瞭解 API 狀態,請參閱「發布開發物件」。

  2. 存取已安裝 ABAP 適用於 Google Cloud 的 SDK 的 BTP ABAP 系統 SAP Fiori 啟動工具。

  3. 存取 Google SDK:主要設定應用程式,然後執行下列步驟:

    1. 按一下 [建立]。
    2. 在「Create new entry」對話方塊中,輸入下列欄位的值:

      欄位 說明
      Google Cloud 金鑰名稱 指定用戶端金鑰設定的名稱,例如 GEMINI_QUICK_TEST
      Google Cloud 服務帳戶名稱 請將這個欄位留空。
      Google Cloud 範圍 請將這個欄位留空。
      Google Cloud 專案 ID 指定您建立 API 金鑰的 Google Cloud 專案 ID。
      Google Cloud 專案編號 指定您建立 API 金鑰的 Google Cloud 專案編號。
      驗證類型 選取「Z」。
      驗證類別 選取您在上一個步驟中建立的 ZCL_TEST_GEMINI_API 類別。
    3. 儲存新項目。

  4. 請記下用戶端金鑰。您可以使用這組用戶端金鑰進行驗證。

執行程式碼範例

您可以執行以下範例程式碼,探索 Gemini API 的功能:

  1. 在 Eclipse 平台中,按一下要建立類別的套件,然後依序點選「New」>「ABAP Class」

  2. 在「Name」(名稱) 欄位中輸入 ZCL_INVOKE_LLM

  3. 在「Description」欄位中輸入 Sample class for testing Gemini API

  4. 點按「Next」

  5. 選取運送要求或建立新的運送要求。

  6. 按一下「完成」

  7. 在編輯器中,將現有程式碼替換成以下程式碼:

    CLASS zcl_invoke_llm DEFINITION
    PUBLIC FINAL
    CREATE PUBLIC.
    PUBLIC SECTION.
        INTERFACES if_oo_adt_classrun.
    ENDCLASS.
    CLASS zcl_invoke_llm IMPLEMENTATION.
    METHOD if_oo_adt_classrun~main.
        DATA lv_sys_instruction TYPE string.
        DATA lv_client_key      TYPE /goog/keyname.
        DATA lv_model_id        TYPE string.
        DATA lv_max_tokens      TYPE int4.
        DATA lv_resp_mime_type  TYPE string.
        DATA lv_prompt          TYPE string.
        DATA lv_temperature     TYPE /goog/num_float.
        DATA lv_top_k           TYPE int4.
        DATA lv_top_p           TYPE /goog/num_float.
        DATA ls_input           TYPE /goog/cl_generativelang_v1beta=>ty_045.
        DATA ls_output          TYPE /goog/cl_generativelang_v1beta=>ty_046.
        DATA ls_part            TYPE /goog/cl_generativelang_v1beta=>ty_068.
        DATA lt_parts           TYPE /goog/cl_generativelang_v1beta=>ty_t_068.
        DATA ls_content         TYPE /goog/cl_generativelang_v1beta=>ty_018.
        DATA lv_msg             TYPE string.
        DATA ls_raw             TYPE string.
        DATA lv_err_msg         TYPE string.
        DATA lo_cx_sdk          TYPE REF TO /goog/cx_sdk.
    
        " TODO Developer: Set values for Mandatory Fields
        lv_model_id = 'gemini-1.5-flash'.  " You can also change the Model ID of your choosing
        lv_client_key = 'GEMINI_QUICK_TEST'.    " Client key configured
    
        " TODO Developer: Set values for Optional Fields, if required
        " lv_temperature =
        " lv_top_k =
        " lv_top_p =
        " lv_max_tokens =
    
        " TODO Developer: (Optional) Set the System Instruction
            lv_sys_instruction  = 'You are an Italian Chef in a 5 Star Restaurant'.
    
        " TODO Developer: (Mandatory) Set the Prompt
            lv_prompt = 'Give me a recipe to make Margarita Pizza'.
        IF lv_temperature IS NOT INITIAL.
            ls_input-generation_config-temperature = lv_temperature.
        ENDIF.
        IF lv_top_k IS NOT INITIAL.
            ls_input-generation_config-top_k = lv_top_k.
        ENDIF.
        IF lv_top_p IS NOT INITIAL.
            ls_input-generation_config-top_p = lv_top_p.
        ENDIF.
        IF lv_max_tokens IS NOT INITIAL.
            ls_input-generation_config-max_output_tokens = lv_max_tokens.
        ENDIF.
        IF lv_sys_instruction IS NOT INITIAL.
            ls_input-system_instruction-role = 'system'.
            ls_part-text = lv_sys_instruction.
            APPEND ls_part TO ls_input-system_instruction-parts.
            CLEAR ls_part.
        ENDIF.
        ls_content-role = 'user'.
        IF lv_prompt IS NOT INITIAL.
            ls_part-text = lv_prompt.
            APPEND ls_part TO ls_content-parts.
            CLEAR ls_part.
        ENDIF.
        APPEND ls_content TO ls_input-contents.
        CLEAR ls_content.
        TRY.
                DATA(lo_llm_invoker) = NEW /goog/cl_generativelang_v1beta( iv_key_name = lv_client_key ).
            CATCH /goog/cx_sdk INTO lo_cx_sdk.
                lv_err_msg = lo_cx_sdk->get_text( ).
    out->write( |Exception occurred, reason: { lv_err_msg }| ).
        ENDTRY.
        TRY.
                lo_llm_invoker->generate_content_models( EXPORTING iv_p_models_id = lv_model_id
                                                                                                                        is_input       = ls_input
                                                                                                    IMPORTING es_raw         = ls_raw
                                                                                                                        es_output      = ls_output
                                                                                                                        ev_ret_code    = DATA(lv_ret_code)
                                                                                                                        ev_err_text    = DATA(lv_err_text)
                                                                                                                        es_err_resp    = DATA(ls_err_resp) ).
            CATCH /goog/cx_sdk INTO lo_cx_sdk.
                lv_err_msg = lo_cx_sdk->get_text( ).
                out->write( |Exception occurred, reason: { lv_err_msg }| ).
                RETURN.
        ENDTRY.
        IF lo_llm_invoker->is_success( lv_ret_code ) = abap_true.
            ASSIGN ls_output-candidates[ 1 ] TO FIELD-SYMBOL(<ls_candidate>).
            IF sy-subrc = 0.
                lt_parts = <ls_candidate>-content-parts.
                ASSIGN lt_parts[ 1 ] TO FIELD-SYMBOL(<ls_part>).
                IF sy-subrc = 0.
                    DATA(lv_response) = <ls_part>-text.
                    out->write( lv_response ).
                ELSE.
                    out->write( |Model stopped generating response due to finish reason: { <ls_candidate>-finish_reason }| ).
                    out->write( |Read more about finish reason in the below link:| ).
                    out->write( |https://cloud.google.com/vertex-ai/docs/reference/rest/v1/GenerateContentResponse#FinishReason| ).
                ENDIF.
            ENDIF.
        ELSE.
            out->write( |Error occurred, reason: { lv_ret_code }:{ lv_err_text }| ).
        ENDIF.
    ENDMETHOD.
    ENDCLASS.
    
  8. 啟用課程。

  9. 執行 ABAP 程式碼。

使用 ABAP 製作 AI 用途的原型

您可以使用 SDK 隨附的 /GOOG/CL_GENERATIVELANGUAGE_V1/GOOG/CL_GENERATIVELANG_V1BETA 類別,建構 SAP 應用程式原型。您可以使用在「設定驗證方法」一節中建立的用戶端金鑰,從 ABAP 環境叫用這些類別。

後續步驟