Utilizzare le chiamate di funzione SAP con Gemini

Questo documento fornisce una panoramica di come utilizzare le chiamate di funzioni SAP con Gemini, utilizzando l'SDK Vertex AI per ABAP nel tuo ambiente SAP BTP, 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 al modello il nome del modulo di funzione SAP o del servizio OData (Open Data Protocol) come dichiarazioni di funzione, descrivendo il nome della funzione o del servizio, la relativa finalità e i parametri correlati.
  • Impostazione dell'invocazione automatica del modulo di funzione SAP o del servizio OData implicitamente durante l'invocazione del modello.

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:

Arricchisci il contesto del modello di IA Gemini con i dati SAP chiamando un modulo di funzione SAP

Questa sezione spiega come arricchire il contesto del modello di IA Gemini con i dati SAP richiamando un modulo di funzione SAP.

Di seguito è riportato il percorso tipico di uno sviluppatore ABAP per richiamare un modulo di funzione 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 di 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.

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 tipico flusso di lavoro di chiamate di funzione per utilizzare strumenti esterni come API e funzioni.

Chiamate di funzioni SAP con Gemini in un ambiente SAP BTP, 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 la 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.

Arricchisci il contesto del modello di IA di Gemini con i dati SAP chiamando un servizio OData

Questa sezione spiega come arricchire il contesto del modello di IA di Gemini con i dati SAP richiamando un servizio OData.

Di seguito è riportato il percorso tipico di uno sviluppatore ABAP per richiamare un servizio OData:

  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 servizio OData.
  5. L'SDK invoca quindi il modello con l'output del servizio OData chiamato.
  6. Il modello risponde con una risposta affidabile per il prompt finale arricchito con l'output del servizio OData chiamato.
  7. L'SDK restituisce la risposta all'utente.

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

Chiamate di funzioni SAP con Gemini in un ambiente SAP BTP, ABAP

Creare un servizio OData

Per creare un servizio OData per l'invocazione automatica da parte dell'SDK come funzione, utilizza lo schema seguente:

{
    "UserRequest": "Input Prompt as user request",
    "FunctionResponse": null,
    "ModifiedUserRequest": null,
    "ContextParameters": [
        {
            "ParameterName": "Parameter 1",
            "ParameterValue": "Value 1"
        },
        {
            "ParameterName": "Parameter 2",
            "ParameterValue": "Value 2"
        }
    ]
}

La tabella seguente fornisce informazioni sui campi utilizzati in questo schema:

Campo Schema Tipo di campo Modalità Input/Output Descrizione
UserRequest String Solo input Il prompt di input inserito dall'utente.
FunctionResponse String Solo output L'output del servizio OData. Può essere un singolo valore o una stringa JSON serializzata.
ModifiedUserRequest String Solo output Il UserRequest modificato, che viene fornito a Gemini come prompt.
ContextParameters Table of parameters Solo input La tabella dei parametri, che include i nomi e i valori dei parametri.
ParameterName String Solo input Nome del parametro della funzione.
ParameterValue String Solo input Valore del parametro della funzione, come suggerito da Gemini.

Crea le entità di servizio OData

  1. Crea un'entità utilizzando lo schema precedente.

    Questa entità accetta la richiesta dell'utente come prompt, la inoltra a Gemini e viene dichiarata come funzione utilizzando l'SDK Vertex AI per ABAP. Questa entità restituisce anche la risposta della funzione OData dal sistema SAP di backend alla BTP, che viene poi integrata nel contesto del modello di IA Gemini.

    1. Imposta un nome appropriato per il nuovo elemento.
    2. Imposta i valori per i seguenti attributi. Mantieni i valori predefiniti per tutti gli altri attributi.

      Nome È una chiave? Tipo di nucleo EDM Nome del campo ABAP
      UserRequest Edm.String USER_REQUEST
      FunctionResponse No Edm.String FUNCTION_RESPONSE
      ModifiedUserRequest No Edm.String MODIFIED_USER_REQUEST

    Se vuoi inserire più entità nello stesso servizio OData, creale utilizzando lo stesso schema.

  2. Crea un'altra entità denominata ContextParameters con i seguenti attributi. Mantieni i valori predefiniti per tutti gli altri attributi.

    Questa entità contiene i parametri della funzione e i relativi valori forniti dal modello Gemini.

    Nome È una chiave? Tipo di nucleo EDM Nome del campo ABAP
    ParameterName Edm.String PARAMETER_NAME
    ParameterValue Edm.String PARAMETER_VALUE
  3. Crea insiemi di entità per tutte le entità che hai creato nei passaggi precedenti.

  4. Crea un'associazione tra ogni entità creata nel passaggio 1 e l'entità ContextParameters creata nel passaggio 2 come segue:

    1. Imposta un nome per l'associazione.
    2. Nel campo Principal Entity (Entità principale), imposta il nome dell'entità che hai creato nel passaggio 1.
    3. Nel campo Cardinalità dell'entità principale, imposta M.
    4. Nel campo Entità dipendente, imposta ContextParameters.
    5. Nel campo Cardinalità entità dipendente, imposta M.
    6. Salva e genera gli artefatti di runtime OData.
  5. Aggiungi il servizio OData creato in SAP Gateway e attiva il nodo ICF.

  6. Genera il file EDMX per i metadati OData come segue:

    1. Vai a TCode /iwfnd/maint_services e recupera i metadati per il servizio OData.
    2. Formatta e salva il file XML generato con l'estensione .edmx.

Scrivi la logica della funzione OData

  1. Nella classe MPC_EXT generata, aggiungi e attiva un tipo di entità approfondita:

    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.
    
  2. Ridefinisci il metodo CREATE_DEEP_ENTITY della classe DPC_EXT generata completando i seguenti passaggi:

    1. Se hai creato più di un'entità OData nella sezione Creare le entità di servizio OData, aggiungi un'istruzione CASE per ogni entità OData.
    2. Scrivi la logica ABAP per get o prepare la risposta per aumentare il contesto per Gemini nell'applicazione BTP.
    3. Nel campo FUNCTION_RESPONSE, imposta la risposta.
    4. Nel campo MODIFIED_USER_REQUEST, imposta la richiesta modificata.
    5. Utilizzando il metodo OData COPY_DATA_TO_REF, associa la risposta complessiva al messaggio.

    Il seguente snippet è un esempio di logica 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.
     ```
    

Sostituisci quanto segue:

  • ENTITY_TYPE: il nome dell'entità OData che hai creato nel passaggio 1 della sezione Creare le entità di servizio OData
  • MODIFIED_GEMINI_PROMPT: il prompt modificato fornito da Gemini
  • ODATA_FUNCTION_RESPONSE: la risposta fornita dal servizio OData

Se hai più di un campo o una struttura o una tabella nidificata da passare come risposta della funzione, puoi serializzare il tipo ABAP in una stringa utilizzando il metodo SERIALIZE_JSON della classe /GOOG/CL_JSON_UTIL dell'SDK.

Definire il servizio OData come modello di consumo del servizio su SAP BTP

Dopo aver creato il servizio OData, devi definirlo come modello di consumo di servizi nel tuo ambiente SAP BTP. A tal fine, crea un modello di consumo di servizi, un servizio in uscita HTTP, uno scenario di comunicazione e un arrangiamento di comunicazione.

Crea un modello di consumo del servizio

  1. Nel progetto ABAP, apri il menu contestuale e seleziona Nuovo > Altro oggetto del repository ABAP > Servizi aziendali > Modello di consumo del servizio.
  2. Nella finestra Nuovo modello di consumo del servizio, completa i seguenti passaggi:
    1. Nel campo Pacchetto, seleziona e carica il file EDMX generato in precedenza in una sezione precedente.
    2. Inserisci un nome e una descrizione.
    3. Nel campo Modalità di consumo remoto, seleziona OData.
    4. Fai clic su Fine.

Creare un servizio in uscita HTTP

  1. Nel progetto ABAP, apri il menu contestuale.
  2. Seleziona il pacchetto e fai clic su Nuovo > Altro oggetto del repository ABAP.
  3. Nel campo Tipo di servizio, seleziona Servizio HTTP.
  4. Nel campo Prefisso percorso predefinito, inserisci il prefisso del percorso per il servizio OData nel sistema SAP di backend.

    Per conoscere il prefisso del percorso OData, accedi a SAP Gateway Client. Il valore visualizzato nel campo URI richiesta è il prefisso del percorso per il servizio OData.

  5. Fai clic su Avanti.

Crea uno scenario di comunicazione

Dopo aver creato un servizio in uscita HTTP, devi creare uno scenario di comunicazione e assegnargli il servizio in uscita. Per farlo, segui questa procedura:

  1. Nel progetto ABAP, seleziona Scenario di comunicazione e poi fai clic su Avanti.
  2. Nella finestra Nuovo scenario di comunicazione, completa i seguenti passaggi:
    1. Inserisci un nome e una descrizione.
    2. Fai clic su Avanti.
    3. Nel campo Tipo di scenario di comunicazione, seleziona Gestito dal cliente.
    4. Vai alla scheda In uscita.
    5. Nel campo Istanze consentite, seleziona Un'istanza per scenario e sistema di comunicazione.
    6. Nel campo Metodi di autenticazione supportati, seleziona le seguenti caselle di controllo: Di base, X.509 e OAuth 2.0.
    7. Nel campo OAuth 2.0 Grant Type (Tipo di concessione OAuth 2.0), seleziona SAML 2.0 Bearer Assertion (Affermazione con token SAML 2.0).
    8. Nella sezione Servizi in uscita, fai clic su Aggiungi e poi seleziona il servizio in uscita che hai creato nella sezione precedente.
    9. Nella sezione Servizio in uscita, assicurati che il Prefisso percorso predefinito sia corretto. In caso contrario, fai clic su Sincronizza.
    10. Salva lo scenario di comunicazione.

Creare un accordo di comunicazione

  1. Accedi al launchpad SAP Fiori del sistema ABAP BTP in cui è installato l'SDK ABAP per Google Cloud.
  2. Apri l'app Accordo di comunicazione.

    1. Fai clic su New (Nuovo).
    2. Nella finestra di dialogo Nuovo accordo di comunicazione visualizzata, inserisci un valore per i seguenti campi:

      • Scenario: seleziona lo scenario di comunicazione che hai creato nella sezione Creare uno scenario di comunicazione.
      • Nome organizzazione: inserisci un nome per l'organizzazione delle comunicazioni.
    3. Fai clic su Crea.

    4. Per l'organizzazione della comunicazione visualizzata, seleziona il sistema di comunicazione creato nel passaggio precedente nel campo Sistema di comunicazione.

    5. Fai clic su Salva.

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, che è configurata nei parametri di generazione del modello.

Aggiungi la dichiarazione di funzione

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

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

Sostituisci quanto segue:

  • PARAMETER_NAME: il nome del parametro
  • PARAMETER_TYPE: il tipo di dati del parametro, ad esempio string, integer o boolean
  • PARAMETER_DESCRIPTION: una spiegazione chiara dello scopo e del formato previsto del parametro
  • PARAMETER_IS_REQUIRED: imposta il valore su ABAP_TRUE se questo parametro è obbligatorio per il funzionamento della funzione
  • COMMUNICATION_SCENARIO: l'ID dello scenario di comunicazione che hai creato
  • ODATA_SERVICE_ID: l'ID del servizio in uscita che hai creato per il servizio OData
  • ODATA_SERVICE_CONSUMPTION_MODEL_ID: l'ID del modello di consumo del servizio che hai creato per il servizio OData
  • ODATA_ROOT_URI: l'URI principale del servizio OData nel sistema SAP di backend
  • ODATA_ENTITY_SET_NAME: il nome dell'insieme di entità del servizio OData da dichiarare come funzione
  • FUNCTION_NAME: il nome della funzione dichiarata per il servizio OData che vuoi utilizzare
  • FUNCTION_DESCRIPTION: la descrizione della funzione che hai dichiarato per il servizio OData che vuoi utilizzare

Impostare l'invocazione automatica del servizio OData

Per impostare l'invocazione automatica del servizio OData della funzione SAP selezionato dal modello Gemini, 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) ).

Esempio di codice

Il seguente esempio di codice illustra come utilizzare la chiamata di funzioni SAP con un servizio Odata per ricevere una risposta finale dal modello:

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.

Passaggi successivi