Richiama i modelli Gemini

Questo documento descrive come invocare i modelli Gemini per generare una risposta per input di testo e multimodali utilizzando l'SDK Vertex AI per ABAP. I modelli Gemini possono accettare più modalità di input, tra cui testo, immagini, video, audio e documenti. Puoi utilizzare i modelli Gemini per casi d'uso come i seguenti:

  • Riassumere un testo in formato libero
  • Descrivere o interpretare gli asset multimediali
  • Traduzione tra lingue

L'utilizzo di modelli generativi per creare funzionalità incentrate sull'IA non richiede alcuna competenza in materia di machine learning (ML). Non è necessario raccogliere un set di dati di grandi dimensioni o addestrare un modello. Per avviare il tuo primo programma, è sufficiente descrivere cosa vuoi che faccia il modello in poche frasi. L'SDK Vertex AI per ABAP fornisce classi e metodi ABAP per accedere ai modelli Gemini dal tuo ambiente SAP. Per iniziare, consulta questi esempi di codice.

Prima di iniziare

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

Invia richiesta a Gemini

Questa sezione spiega come inviare richieste ai modelli Gemini tramite l'API Vertex AI utilizzando l'SDK Vertex AI per ABAP.

Crea un'istanza della classe di invocatore multimodale Gemini

Per richiamare i modelli di testo e multimodali di Gemini utilizzando prompt di testo o multimodali, puoi utilizzare 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.

Generare contenuti con un prompt

Per generare contenuti fornendo al modello un prompt di testo, puoi utilizzare il metodo GENERATE_CONTENT.

lo_model->generate_content( 'PROMPT' ).

Sostituisci PROMPT con il prompt di testo.

Fornire istruzioni di sistema al modello

Per passare al modello istruzioni di sistema basate su testo, puoi utilizzare il metodo SET_SYSTEM_INSTRUCTIONS.

lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).

Sostituisci SYSTEM_INSTRUCTIONS con le istruzioni di sistema per il modello.

Aggiungere impostazioni di sicurezza

Per aggiungere impostazioni di sicurezza per consentire al modello di generare risposte, puoi utilizzare il metodo ADD_SAFETY_SETTINGS. Questa funzionalità viene utilizzata per imporre linee guida di sicurezza al modello per bloccare i contenuti non sicuri.

lo_model->add_safety_settings( iv_harm_category        = 'HARM_CATEGORY'
                        iv_harm_block_threshold = 'HARM_BLOCK_THRESHOLD'
                        iv_harm_block_method    = 'HARM_BLOCK_METHOD' ).

Sostituisci quanto segue:

A ogni chiamata del metodo, il metodo ADD_SAFETY_SETTINGS aggiunge le impostazioni di sicurezza specificate all'input del modello.

Imposta la configurazione di generazione per il modello

Gestisci la configurazione di generazione per i modelli nella tabella /GOOG/AI_CONFIG. Per sostituire la configurazione di generazione per una determinata chiamata, puoi utilizzare il metodo SET_GENERATION_CONFIG. Se il parametro di importazione per una proprietà di generazione è impostato, viene applicato il valore del parametro passato.

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

Sostituisci quanto segue:

  • RESPONSE_MIME_TYPE: tipo MIME di risposta per il modello.
  • TEMPERATURE: temperatura di casualità.
  • TOP_P: campionamento Top-P.
  • TOP_K: campionamento Top-K.
  • CANDIDATE_COUNT: numero di candidati da generare.
  • MAX_OUTPUT_TOKENS: numero massimo di token di output per messaggio
  • PRESENCE_PENALTY: penalità positive.
  • FREQUENCY_PENALTY: penalizzazioni per frequenza.

Per ulteriori informazioni su questi parametri, consulta Configurare i parametri di generazione del modello.

Passare l'input multimodale al modello

Puoi richiamare i modelli Gemini utilizzando input multimodali, che possono essere testo, immagini, video, documenti o una combinazione di questi. Puoi passare l'input come dati non elaborati o fornendo l'URI Cloud Storage degli oggetti file.

Impostare i dati non elaborati

Per fornire i dati non elaborati di un file come input al modello, insieme al relativo tipo MIME, puoi utilizzare il metodo SET_INLINE_DATA. Per gli input video, per prendere in considerazione solo una parte specifica di un video, puoi impostare l'ora di inizio e l'ora di fine utilizzando i parametri facoltativi di importazione IV_VIDEO_START_OFFSET e IV_VIDEO_END_OFFSET, rispettivamente.

lo_model->set_inline_data( iv_mime_type = 'MIME_TYPE'
                          iv_data      = 'RAW_DATA' ).

Sostituisci quanto segue:

  • MIME_TYPE: il tipo MIME standard IANA dei dati non elaborati. Per impostazione predefinita, il tipo MIME è impostato su application/pdf.
  • RAW_DATA: i dati non elaborati codificati in Base64 dell'immagine, del PDF o del video da includere in linea nel prompt.

Per cancellare i dati non elaborati dei file dall'input del modello con la stessa istanza della classe /GOOG/CL_GENERATIVE_MODEL, puoi utilizzare il metodo CLEAR_INLINE_DATA.

lo_model->clear_inline_data( ).

Impostare oggetti da Cloud Storage

Per fornire l'URI di un oggetto file archiviato in un bucket Cloud Storage come input per il modello, insieme al tipo MIME, puoi utilizzare il metodo SET_FILE_DATA. Per gli input video, per prendere in considerazione solo una parte specifica di un video, puoi impostare l'ora di inizio e l'ora di fine utilizzando i parametri facoltativi di importazione IV_VIDEO_START_OFFSET e IV_VIDEO_END_OFFSET, rispettivamente.

lo_model->set_file_data( iv_mime_type = 'MIME_TYPE'
                        iv_file_uri  = 'FILE_URI' ).

Sostituisci quanto segue:

  • MIME_TYPE: il tipo MIME standard IANA dei dati del file. Per impostazione predefinita, il tipo MIME è impostato su application/pdf.
  • FILE_URI: l'URI del file archiviato in un bucket Cloud Storage.

Se vuoi passare tutti i file presenti in un bucket Cloud Storage come input al modello, utilizza il metodo SET_FILES_FROM_GCS per specificare il nome del bucket Cloud Storage di destinazione.

lo_model->set_files_from_gcs( iv_storage_bucket_name = 'STORAGE_BUCKET_NAME').

Sostituisci STORAGE_BUCKET_NAME con il nome del bucket Cloud Storage che contiene i file.

Se hai una chiave client separata per chiamare l'API Cloud Storage tramite l'ABAP SDK for Google Cloud, passa il nome della chiave client nel parametro di importazione IV_KEY_NAME.

Per cancellare gli oggetti impostati tramite gli URI di Cloud Storage dall'input del modello con la stessa istanza della classe /GOOG/CL_GENERATIVE_MODEL, puoi utilizzare il metodo CLEAR_FILE_DATA.

lo_model->clear_file_data( ).

Imposta il tipo MIME di risposta

Per impostare il tipo MIME della risposta con cui il modello risponde, puoi utilizzare il metodo SET_RESPONSE_MIME_TYPE. Se non è impostato, per impostazione predefinita il modello assume text/plain come tipo MIME di risposta.

lo_model->set_response_mime_type( iv_mime_type = 'RESPONSE_MIME_TYPE' ).

Sostituisci RESPONSE_MIME_TYPE con il tipo MIME della risposta dei contenuti generati.

Imposta lo schema di risposta

Con la generazione controllata, puoi assicurarti che l'output generato da un modello rispetti uno schema specifico per risposte formattate in modo coerente.

Per impostare lo schema di risposta per un modello, puoi utilizzare il metodo SET_GENERATION_CONFIG:

lo_model->set_generation_config( iv_response_schema = 'RESPONSE_SCHEMA'
   iv_response_mime_type = 'application/json'
)->generate_content( lv_prompt )->get_text( ).

Sostituisci RESPONSE_SCHEMA con il riferimento alla struttura ABAP nel formato descritto in Campi dello schema supportati.

Contare il numero di token in un prompt di testo

Per contare il numero di token in un prompt di testo prima di invocare il modello con il prompt, puoi utilizzare il metodo 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( ).

Sostituisci quanto segue:

Aggiungere la cronologia dei contenuti

Per passare la cronologia di una conversazione con Gemini, puoi utilizzare il metodo ADD_CONTENT_HISTORY. Gemini utilizza la cronologia della conversazione passata tramite questo metodo come contesto per rispondere ai prompt di input.

DATA:
  ls_content_history TYPE /goog/cl_generative_model=>ty_content_history,
  lt_content_history TYPE /goog/cl_generative_model=>tt_content_history.

ls_content_history-role = 'user'.
ls_content_history-text = 'HISTORICAL_INPUT_PROMPT'.
APPEND ls_content_history TO lt_content_history.
CLEAR ls_content_history.

ls_content_history-role = 'model'.
ls_content_history-text = 'HISTORICAL_MODEL_RESPONSE'.
APPEND ls_content_history TO lt_content_history.
CLEAR ls_content_history.

TRY.
    DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'gemini-flash' ).
    DATA(lv_response) = lo_model->add_content_history( lt_content_history
                               )->generate_content('CURRENT_INPUT_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:

  • HISTORICAL_INPUT_PROMPT: il prompt di input storico passato a Gemini.
  • HISTORICAL_MODEL_RESPONSE: la risposta del modello storico per il prompt di input storico.
  • CURRENT_INPUT_PROMPT: il prompt di input a Gemini per il quale vuoi una risposta nel contesto dei prompt di input e delle risposte del modello impostati in precedenza.

Puoi anche passare file non elaborati, URI file Cloud Storage, chiamate di funzione e risposte di funzione come cronologia delle conversazioni utilizzando il metodo ADD_CONTENT_HISTORY. Per farlo, imposta i seguenti campi della variabile LS_CONTENT_HISTORY:

  • FILE_INLINE_DATA: passa i dati non elaborati di uno o più file con i seguenti campi:
    • MIME_TYPE: il tipo MIME standard IANA dei dati del file.
    • FILE_DATA: i dati non elaborati del file con codifica Base64.
    • VIDEO_START_OFFSET: ora di inizio del video (solo per i file video).
    • VIDEO_END_OFFSET: ora di fine del video (solo per i file video).
  • FILE_URIS: passa l'URI Cloud Storage di uno o più file con i seguenti campi:
    • MIME_TYPE: il tipo MIME standard IANA dei dati del file.
    • FILE_URI: l'URI del file archiviato in un bucket Cloud Storage.
    • VIDEO_START_OFFSET: ora di inizio del video (solo per i file video).
    • VIDEO_END_OFFSET: ora di fine del video (solo per i file video).
  • FUNCTION_CALL: passa la chiamata alla funzione al modello con i seguenti campi:
    • NAME: il nome della funzione da chiamare.
    • ARGS: parametri di funzione con valori come riferimento.
  • FUNCTION_RESPONSE: passa la risposta della funzione dal modello con i seguenti campi:
    • NAME: il nome della funzione richiamata che ha prodotto la risposta.
    • RESPONSE: risposta del modello come riferimento.

Ricevere una risposta da Gemini

Per ricevere le risposte elaborate dal modello e presentarle in modo significativo per gli sviluppatori ABAP, l'SDK fornisce la classe/GOOG/CL_MODEL_RESPONSE.

La risposta acquisita dalla classe /GOOG/CL_MODEL_RESPONSE viene collegata alle richieste effettuate tramite i metodi della classe /GOOG/CL_GENERATIVE_MODEL, in modo da poter accedere direttamente alla risposta in un'unica istruzione senza dover utilizzare variabili per memorizzare i risultati intermedi.

Ricevere una risposta via SMS

Per ricevere una risposta di testo dal modello, puoi utilizzare il metodo GET_TEXT.

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

Sostituisci PROMPT con il prompt di testo.

Ottenere la valutazione di sicurezza

Per ricevere un elenco di valutazioni per la sicurezza della risposta del modello, puoi utilizzare il metodo GET_SAFETY_RATING.

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

Sostituisci PROMPT con il prompt di testo.

Ottenere il numero di token nel prompt della richiesta

Per ricevere il numero di token nel prompt di input al modello, puoi utilizzare il metodo GET_PROMPT_TOKEN_COUNT.

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

Sostituisci PROMPT con il prompt di testo.

Ottenere il numero di token nella risposta del modello

Per ricevere il numero di token nella risposta del modello, puoi utilizzare il metodo GET_CANDIDATES_TOKEN_COUNT.

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

Sostituisci PROMPT con il prompt di testo.

Ottenere il motivo del blocco

Per ricevere il motivo per cui il modello ha bloccato la generazione della risposta, puoi utilizzare il metodo GET_BLOCK_REASON.

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

Sostituisci PROMPT con il prompt di testo.

Ricevere un messaggio con il motivo del blocco

Per ricevere un messaggio di motivo leggibile per il blocco della generazione della risposta da parte del modello, puoi utilizzare il metodo GET_BLOCK_REASON_MESSAGE.

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

Sostituisci PROMPT con il prompt di testo.

Esempi di codice

I seguenti esempi di codice mostrano come invocare i modelli Gemini per generare una risposta per diversi tipi di input.

Generazione basata su testo

Il seguente esempio di codice mostra come generare una risposta da un prompt di testo insieme a un'istruzione di sistema. L'istruzione di sistema è facoltativa e può essere passata insieme al prompt per indicare al modello di comportarsi in un determinato modo.

Esempio di codice

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

Generazione multimodale

Il seguente esempio di codice mostra come generare una risposta da un input multimodale, ad esempio testo e un'immagine. Puoi menzionare l'URI Cloud Storage o i dati non elaborati di un'immagine, un video o un documento insieme a un prompt di testo. L'istruzione di sistema è facoltativa e può essere passata insieme al prompt per indicare al modello di comportarsi in un determinato modo.

Esempio di codice

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
                              )->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.
  • PROMPT: il prompt di testo.
  • SYSTEM_INSTRUCTIONS: l'istruzione di sistema per il modello.
  • MIME_TYPE: il tipo MIME standard IANA dei dati del file. Per impostazione predefinita, il tipo MIME è impostato su application/pdf.
  • FILE_URI: l'URI del file archiviato in un bucket Cloud Storage.
  • INLINE_DATA: i dati non elaborati codificati in Base64 dell'immagine, del PDF o del video da includere in linea nel prompt.

Aggiungere le impostazioni di sicurezza per il modello

Il seguente esempio di codice mostra come aggiungere impostazioni di sicurezza per consentire al modello di generare una risposta.

Esempio di codice

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
                              )->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.
  • PROMPT: il prompt di testo.
  • SYSTEM_INSTRUCTIONS: l'istruzione di sistema per il modello.
  • MIME_TYPE: il tipo MIME standard IANA dei dati del file. Per impostazione predefinita, il tipo MIME è impostato su application/pdf.
  • FILE_URI: l'URI del file archiviato in un bucket Cloud Storage.
  • INLINE_DATA: i dati non elaborati codificati in Base64 dell'immagine, del PDF o del video da includere in linea nel prompt.
  • HARM_CATEGORY: la Categoria di danno che vuoi applicare.
  • HARM_BLOCK_THRESHOLD: il livello delle soglie basato sulla probabilità che vuoi applicare.
  • HARM_BLOCK_METHOD: il metodo di blocco per i contenuti dannosi che vuoi applicare.

Trovare il numero di token e caratteri fatturabili in un prompt

Prima di richiamare il modello con un prompt, ti consigliamo di controllare il numero di token nel prompt e il numero di caratteri fatturabili presenti nel token per pianificare la fatturazione del progetto. Google Cloud Il seguente esempio di codice mostra come trovare questi numeri e valutare la fatturazione per una chiamata di modello simile.

Esempio di codice

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
                                                )->get_total_billable_characters( ).
    IF lv_total_tokens IS NOT INITIAL.
      cl_demo_output=>display( 'Total Tokens -' && lv_total_tokens ).

    ENDIF.

    IF lv_total_billable_characters IS NOT INITIAL.
      cl_demo_output=>display( 'Total Billable Characters -' && lv_total_billable_characters ).

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

ENDTRY.

Sostituisci quanto segue:

Passaggi successivi