Utilizzare le chiamate di funzione SAP con Gemini

Questo documento descrive come utilizzare le chiamate di funzione SAP con Gemini tramite l'SDK Vertex AI per ABAP.

Puoi definire funzioni personalizzate e fornirle ai modelli Gemini utilizzando la funzionalità di chiamata di funzione. I modelli non invocano direttamente le funzioni personalizzate, ma generano un output di dati strutturati che specifica il nome della funzione e gli argomenti suggeriti. Questo output ti consente di scrivere applicazioni che acquisiscono l'output strutturato e chiamano API esterne. L'output dell'API risultante può quindi essere incorporato in un altro prompt del modello, consentendo risposte alle query più complete.

L'SDK Vertex AI per ABAP semplifica le chiamate di funzione per gli sviluppatori ABAP offrendo loro l'opportunità di richiamare la logica personalizzata scritta nei moduli di funzione SAP:

  • Passare i nomi dei moduli di funzione SAP al modello come dichiarazioni di funzione, descrivendo il nome della funzione, il suo scopo e i parametri correlati.
  • Impostazione dell'attivazione automatica del modulo di funzione SAP in modo implicito durante l'attivazione del modello.

Di seguito è riportato il percorso tipico di uno sviluppatore ABAP per richiamare la chiamata di funzioni SAP:

  1. L'utente fornisce un prompt di input.
  2. L'SDK passa il prompt di input e le dichiarazioni di funzione al modello.
  3. Il modello esamina il prompt e le funzioni dichiarate per dedurre la funzione da chiamare e suggerisce i valori dei parametri per chiamarla.
  4. Se l'invocazione automatica è impostata, l'SDK chiama il modulo funzione SAP.
  5. L'SDK richiama quindi il modello con l'output della funzione chiamata.
  6. Il modello risponde con una risposta affidabile per il prompt finale arricchito con l'output della funzione chiamata.
  7. L'SDK restituisce la risposta all'utente.

Chiamate di funzioni SAP con Gemini

Se scegli di non invocare automaticamente i moduli di funzione SAP, l'SDK ti consente di utilizzare la funzionalità di chiamata di funzione senza invocare alcun modulo di funzione SAP. In questo caso, puoi seguire il flusso di lavoro tipico delle chiamate di funzione per utilizzare strumenti esterni come API e funzioni.

Prima di iniziare

Prima di utilizzare l'SDK Vertex AI per ABAP per le chiamate di funzione SAP con Gemini, assicurati che tu o i tuoi amministratori abbiate completato i seguenti prerequisiti:

Arricchire il contesto del modello di IA di Gemini con i dati SAP

Questa sezione spiega come arricchire il contesto del modello di IA Gemini con i dati SAP utilizzando l'SDK Vertex AI per ABAP.

Crea un'istanza della classe di invocatore multimodale Gemini

Per invocare la chiamata di funzione in SAP, utilizza la classe /GOOG/CL_GENERATIVE_MODEL. Puoi creare un'istanza della classe passando la chiave del modello configurata nei parametri di generazione del modello.

DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

Sostituisci MODEL_KEY con il nome della chiave del modello, configurata nei parametri di generazione del modello.

Crea un modulo funzione SAP

Per creare un modulo di funzione SAP per la chiamata automatica da parte dell'SDK, segui lo schema fornito:

Categoria Nome parametro Tipo associato
Importazione in corso IT_FUNCTION_PARAMETERS /GOOG/T_FUNCTION_PARAMETERS
In fase di esportazione EV_FUNCTION_RESPONSE STRING
Modifica in corso CV_PROMPT STRING
Eccezioni /GOOG/CX_SDK Exception Class

In base ai parametri di importazione, scrivi la logica personalizzata all'interno del modulo della funzione, che può recuperare i dati SAP tramite query SELECT o chiamare un'API o un modulo esterno per recuperare le informazioni mancanti.

Imposta il parametro di esportazione EV_FUNCTION_RESPONSE con le informazioni per il feedback al contesto LLM. Puoi anche cambiare o modificare il testo del prompt in CV_PROMPT in base alla logica personalizzata e ai requisiti della tua attività per istruire ulteriormente l'LLM in base a diversi scenari aziendali.

Aggiungi dichiarazione di funzione

Per aggiungere una dichiarazione di funzione al contesto LLM, puoi utilizzare il metodo ADD_FUNCTION_DECLARATION. Chiama il metodo ADD_FUNCTION_DECLARATION ogni volta che devi aggiungere una funzione al contesto.

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

Sostituisci quanto segue:

  • PARAMETER_NAME: il nome del parametro.
  • PARAMETER_TYPE: il tipo di dati del parametro, come string, integer o boolean.
  • PARAMETER_DESCRIPTION: una spiegazione chiara dello scopo e del formato previsto del parametro.
  • PARAMETER_IS_REQUIRED: se questo parametro è obbligatorio per il funzionamento della funzione, imposta il valore su ABAP_TRUE.
  • FUNCTION_MODULE_NAME: nome del modulo di funzione SAP.
  • FUNCTION_MODULE_DESCRIPTION: descrizione del modulo della funzione SAP.

Puoi anche dichiarare una funzione senza parametri, che può fungere da funzione di riserva o di backup. Se una richiesta dell'utente non fornisce informazioni sufficienti per chiamare una funzione specifica, puoi chiedere a Gemini di selezionare questa funzione di riserva.

Impostare l'invocazione automatica del modulo di funzione SAP

Per impostare l'invocazione automatica della funzione SAP selezionata dal modello, puoi utilizzare il metodo SET_AUTO_INVOKE_SAP_FUNCTION. Se ABAP_TRUE viene passato nel parametro di importazione IV_AUTO_INVOKE, il modulo della funzione viene invocato dall'SDK e la relativa risposta viene inclusa nel contesto dell'LLM per generare la risposta finale.

Devi definire il modulo di funzione seguendo lo schema descritto nella sezione Creare il modulo di funzione SAP.

lo_model->set_auto_invoke_sap_function( abap_true ).

Generare contenuti con chiamate di funzione

Per passare il testo del prompt al modello Gemini, puoi utilizzare il metodo GENERATE_CONTENT. Per ottenere la risposta generata da Gemini con il contesto aggiuntivo aggiunto dal modulo di funzione SAP tramite la chiamata di funzione, utilizza il metodo GET_TEXT.

DATA(lv_response) = lo_model->generate_content( iv_prompt_text ='PROMPT'
                           )->get_text( ).

Sostituisci PROMPT con il prompt di testo.

Ottenere il nome della funzione selezionata e i valori dei parametri

Per ottenere la funzione selezionata da Gemini (tra le funzioni dichiarate) e i relativi parametri suggeriti, utilizza il metodo 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) ).

Sostituisci PROMPT con il prompt di testo.

Puoi ottenere il nome della funzione selezionata di Gemini da LV_FUNCTION_NAME e i parametri suggeriti da LT_FUNCTION_PARAMETERS. Puoi utilizzare queste informazioni per convalidare, monitorare e registrare le azioni di Gemini in base alle linee guida per la gestione degli eventi e le informazioni sulla sicurezza della tua azienda.

Esempio di codice

Il seguente esempio di codice illustra come utilizzare le chiamate di funzioni SAP per ricevere una risposta finale dal modello.

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.

Sostituisci quanto segue:

  • MODEL_KEY: il nome della chiave del modello, configurato nei parametri di generazione del modello.
  • PARAMETER_NAME: il nome del parametro.
  • PARAMETER_TYPE: il tipo di dati del parametro, come string, integer o boolean.
  • PARAMETER_DESCRIPTION: una spiegazione chiara dello scopo e del formato previsto del parametro.
  • PARAMETER_IS_REQUIRED: se questo parametro è obbligatorio per il funzionamento della funzione, imposta il valore su ABAP_TRUE.
  • FUNCTION_MODULE_NAME: nome del modulo di funzione SAP.
  • FUNCTION_MODULE_DESCRIPTION: descrizione del modulo della funzione SAP.
  • PROMPT: il prompt di testo.

Catena di funzioni automatica

La funzionalità di concatenazione automatica delle funzioni ti consente di richiamare più moduli di funzioni definite dall'utente per generare una risposta. Questa funzionalità è supportata solo se è attivata l'attivazione automatica dei moduli di funzione SAP.

Il seguente esempio di codice illustra l'accodamento automatico delle funzioni. Per il prompt Get the air quality in my current location, l'API Gemini invoca prima il modulo funzionale Z_GET_CURRENT_LOCATION per ottenere le informazioni su longitudine e latitudine, quindi le passa al modulo funzionale Z_GET_CURRENT_AIR_QUALITY per ottenere la qualità dell'aria per i punti di longitudine e latitudine specificati.

gv_prompt = 'Get the air quality in my current location'.

  gv_system_instruction = 'You are a helpful weather assistant bot. You can turn find my location and get the weather information like temperature' &&
  'You can also alert me about EarthQuakes and Storm.' &&
  'You can also provide me information on Air Quality based on a location' &&
  'Do not perform any other tasks.'.

  TRY.

      DATA(lo_model_key) = NEW /goog/cl_generative_model( iv_model_key = 'gemini-flash-2' ).

      gv_final_op = lo_model_key->gs_ai_config-model_id.

      lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_LOCATION'
                                              iv_description = 'Get the current location'
                                              it_parameters  = gt_parameters ).
      CLEAR gt_parameters.

      gs_parameter-parameter_name = |Latitude|.
      gs_parameter-type = 'string'.
      gs_parameter-description = |Latitude|.
      gs_parameter-is_required = abap_true.

      APPEND gs_parameter TO gt_parameters.
      CLEAR gs_parameter.

      gs_parameter-parameter_name = |Longitude|.
      gs_parameter-type = 'string'.
      gs_parameter-description = |Longitude|.
      gs_parameter-is_required = abap_true.

      APPEND gs_parameter TO gt_parameters.
      CLEAR gs_parameter.

      lo_model_key->add_function_declaration( iv_name        = 'Z_GET_WEATHER_INFORMATION'
                                              iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).


      lo_model_key->add_function_declaration( iv_name        = 'Z_GET_CURRENT_AIR_QUALITY'
                                              iv_description = 'Gets weather information like temperature for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).


      lo_model_key->add_function_declaration( iv_name        = 'GET_EARTHQUAKE_POSSIBILITY'
                                              iv_description = 'Gets possibility of Earthquake for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).


      lo_model_key->add_function_declaration( iv_name        = 'GET_STORM_POSSIBILITY'
                                              iv_description = 'Gets possibility of a STORM for a given location which is latitude and longitude'
                                              it_parameters  = gt_parameters ).

      lo_model_key->set_system_instructions(
        EXPORTING
          iv_text = gv_system_instruction
      ).

      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

      DATA(ls_response) = lo_response->get_response( ).
      /ui2/cl_json=>serialize(
        EXPORTING
          data   = ls_response-candidates[ 1 ]-content-parts           " Data to serialize
        RECEIVING
          r_json = DATA(lv_json_string)                 " JSON string
      ).
      IF lv_json_string IS NOT INITIAL.
        CLEAR gv_output.
        gv_output = lv_json_string.

      ENDIF.

    CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
      cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
  ENDTRY.

  lo_model_key->close( ).
  CLEAR lo_model_key.
  CLEAR lo_response.
  CLEAR ls_response.

Per disattivare l'accodamento automatico delle funzioni e ottenere solo la risposta della prima funzione dall'LLM, utilizza il metodo SET_FUNCTION_CALLING_CONFIG e imposta il parametro IV_DISABLE_FUNCTION_CHAINING su ABAP_TRUE. Ad esempio:


      lo_model_key->set_function_calling_config( iv_disable_function_chaining = abap_true ).
      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

Se vuoi ottenere tutti i moduli di funzione invocati dall'SDK e i parametri a cui sono stati passati, chiama il metodo GET_ALL_FUNCTION_CALLS:

      DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                                     )->generate_content( iv_prompt_text = gv_prompt ).

      DATA(ls_response) = lo_response->get_all_function_calls( ).

Passaggi successivi