Invocar os modelos do Gemini

Este documento descreve como invocar os modelos do Gemini para gerar respostas para entrada de texto e multimodais usando o SDK da Vertex AI para ABAP. Os modelos Gemini podem aceitar vários modos de entrada, incluindo texto, imagem, vídeo, áudio e documentos. É possível usar os modelos do Gemini para casos de uso como estes:

  • Resumir texto em formato livre
  • Como descrever ou interpretar recursos de mídia
  • Como traduzir entre idiomas

O uso de modelos generativos para criar recursos centrados em IA não exige nenhuma experiência em aprendizado de máquina (ML). Você não precisa coletar um grande conjunto de dados ou treinar um modelo. Para iniciar seu primeiro programa, basta descrever o que você quer que o modelo faça em algumas frases. O SDK da Vertex AI para ABAP oferece classes e métodos ABAP para acessar os modelos Gemini no seu ambiente SAP. Para começar, confira estes exemplos de código.

Antes de começar

Antes de usar o SDK da Vertex AI para ABAP com os modelos Gemini, verifique se você ou seus administradores concluíram os seguintes pré-requisitos:

Enviar solicitação para o Gemini

Esta seção explica como enviar solicitações para modelos do Gemini usando a API Vertex AI com o SDK da Vertex AI para ABAP.

Criar a classe de invocação multimodal do Gemini

Para invocar os modelos de texto e multimodal do Gemini usando comandos de texto ou multimodais, use a classe /GOOG/CL_GENERATIVE_MODEL. Você instancia a classe transmitindo a chave de modelo configurada nos parâmetros de geração de modelos.

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

Substitua MODEL_KEY pelo nome da chave do modelo, que é configurado nos parâmetros de geração de modelo.

Gerar conteúdo com um comando

Para gerar conteúdo fornecendo um comando de texto ao modelo, use o método GENERATE_CONTENT.

lo_model->generate_content( 'PROMPT' ).

Substitua PROMPT pelo comando de texto.

Fornecer instruções do sistema ao modelo

Para transmitir instruções do sistema com base em texto para o modelo, use o método SET_SYSTEM_INSTRUCTIONS.

lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).

Substitua SYSTEM_INSTRUCTIONS pelas instruções do sistema para o modelo.

Adicionar configurações de segurança

Para adicionar configurações de segurança ao modelo para gerar respostas, use o método ADD_SAFETY_SETTINGS. Esse recurso é usado para impor diretrizes de segurança ao modelo para bloquear conteúdo inseguro.

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

Substitua:

Com cada chamada de método, o método ADD_SAFETY_SETTINGS adiciona as configurações de segurança especificadas à entrada do modelo.

Definir a configuração de geração do modelo

Você mantém a configuração de geração dos modelos na tabela /GOOG/AI_CONFIG. Para substituir a configuração de geração de uma chamada específica, use o método SET_GENERATION_CONFIG. Se o parâmetro de importação de uma propriedade de geração estiver definido, o valor do parâmetro transmitido será aplicado.

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

Substitua:

  • RESPONSE_MIME_TYPE: tipo MIME da resposta para o modelo.
  • TEMPERATURE: temperatura da aleatoriedade.
  • TOP_P: amostragem top-P.
  • TOP_K: amostragem Top-K.
  • CANDIDATE_COUNT: número de candidatos a serem gerados.
  • MAX_OUTPUT_TOKENS: número máximo de tokens de saída por mensagem
  • PRESENCE_PENALTY: penalidades positivas.
  • FREQUENCY_PENALTY: penalidades de frequência.

Para mais informações sobre esses parâmetros, consulte Configurar parâmetros de geração de modelos.

Transmitir entrada multimodal para o modelo

É possível invocar os modelos Gemini usando entrada multimodal, que pode ser texto, imagem, vídeo, documentos ou uma combinação deles. É possível transmitir a entrada como dados brutos ou fornecendo o URI do Cloud Storage dos objetos de arquivo.

Definir dados brutos

Para fornecer os dados brutos de um arquivo como entrada para o modelo, junto com o tipo MIME, use o método SET_INLINE_DATA. Para considerar apenas uma parte específica de um vídeo, use os parâmetros de importação opcionais IV_VIDEO_START_OFFSET e IV_VIDEO_END_OFFSET, respectivamente.

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

Substitua:

  • MIME_TYPE: o tipo MIME padrão IANA dos dados brutos. Por padrão, o tipo MIME é definido como application/pdf.
  • RAW_DATA: dados brutos codificados em base64 da imagem, do PDF ou do vídeo a ser incluído inline no comando.

Para limpar os dados brutos dos arquivos da entrada do modelo com a mesma instância da classe /GOOG/CL_GENERATIVE_MODEL, use o método CLEAR_INLINE_DATA.

lo_model->clear_inline_data( ).

Definir objetos do Cloud Storage

Para fornecer o URI de um objeto de arquivo armazenado em um bucket do Cloud Storage como entrada para o modelo, junto com o tipo MIME, use o método SET_FILE_DATA. Para considerar apenas uma parte específica de um vídeo, use os parâmetros de importação opcionais IV_VIDEO_START_OFFSET e IV_VIDEO_END_OFFSET, respectivamente.

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

Substitua:

  • MIME_TYPE: o tipo MIME padrão IANA dos dados do arquivo. Por padrão, o tipo MIME é definido como application/pdf.
  • FILE_URI: o URI do arquivo armazenado em um bucket do Cloud Storage.

Se você quiser transmitir todos os arquivos presentes em um bucket do Cloud Storage como entrada para o modelo, use o método SET_FILES_FROM_GCS para especificar o nome do bucket de destino do Cloud Storage.

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

Substitua STORAGE_BUCKET_NAME pelo nome do bucket do Cloud Storage que contém os arquivos.

Se você tiver uma chave de cliente separada para invocar a API Cloud Storage pelo ABAP SDK for Google Cloud, transmita o nome da chave de cliente no parâmetro de importação IV_KEY_NAME.

Para limpar os objetos definidos por URIs do Cloud Storage da entrada do modelo com a mesma instância da classe /GOOG/CL_GENERATIVE_MODEL, use o método CLEAR_FILE_DATA.

lo_model->clear_file_data( ).

Definir o tipo MIME da resposta

Para definir o tipo MIME da resposta que o modelo responde, use o método SET_RESPONSE_MIME_TYPE. Se não for definido, o modelo vai usar text/plain como o tipo MIME da resposta por padrão.

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

Substitua RESPONSE_MIME_TYPE pelo tipo MIME da resposta do conteúdo gerado.

Contar o número de tokens em um comando de texto

Para contar o número de tokens em um comando de texto antes de invocar o modelo com o comando, use o método 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( ).

Substitua:

Receber resposta do Gemini

Para receber respostas processadas do modelo e apresentá-las de uma maneira significativa para os desenvolvedores ABAP, o SDK fornece a classe /GOOG/CL_MODEL_RESPONSE.

A resposta capturada pela classe /GOOG/CL_MODEL_RESPONSE é vinculada às solicitações feitas pelos métodos da classe /GOOG/CL_GENERATIVE_MODEL para que você possa acessar diretamente a resposta em uma única instrução sem precisar de variáveis para armazenar os resultados intermediários.

Receber resposta por texto

Para receber uma resposta de texto do modelo, use o método GET_TEXT.

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

Substitua PROMPT pelo comando de texto.

Receber classificação de segurança

Para receber uma lista de classificações sobre a segurança da resposta do modelo, use o método GET_SAFETY_RATING.

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

Substitua PROMPT pelo comando de texto.

Receber o número de tokens no comando de solicitação

Para receber o número de tokens na solicitação de entrada para o modelo, use o método GET_PROMPT_TOKEN_COUNT.

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

Substitua PROMPT pelo comando de texto.

Conferir o número de tokens na resposta do modelo

Para receber o número de tokens na resposta do modelo, use o método GET_CANDIDATES_TOKEN_COUNT.

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

Substitua PROMPT pelo comando de texto.

Receber o motivo do bloqueio

Para receber o motivo pelo qual o modelo bloqueou a geração de respostas, use o método GET_BLOCK_REASON.

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

Substitua PROMPT pelo comando de texto.

Receber a mensagem do motivo do bloqueio

Para receber uma mensagem de motivo legível para bloquear a geração de respostas pelo modelo, use o método GET_BLOCK_REASON_MESSAGE.

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

Substitua PROMPT pelo comando de texto.

Amostras de código

Os exemplos de código abaixo demonstram como invocar os modelos Gemini para gerar respostas para vários tipos de entrada.

Geração baseada em texto

O exemplo de código abaixo mostra como gerar uma resposta de um comando de texto com uma instrução do sistema. A instrução do sistema é opcional e pode ser transmitida com o comando para instruir o modelo a se comportar de uma maneira específica.

Exemplo de código

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.

Substitua:

Geração multimodal

O exemplo de código abaixo mostra como gerar uma resposta com base em uma entrada multimodal, como texto e imagem. É possível mencionar o URI do Cloud Storage ou dados de arquivo brutos de uma imagem, vídeo ou documento com um comando de texto. A instrução do sistema é opcional e pode ser transmitida com o comando para instruir o modelo a se comportar de uma maneira específica.

Exemplo de código

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.

Substitua:

  • MODEL_KEY: o nome da chave do modelo, que é configurado nos parâmetros de geração de modelo.
  • PROMPT: o texto do comando.
  • SYSTEM_INSTRUCTIONS: sua instrução do sistema para o modelo.
  • MIME_TYPE: o tipo MIME padrão IANA dos dados do arquivo. Por padrão, o tipo MIME é definido como application/pdf.
  • FILE_URI: o URI do arquivo armazenado em um bucket do Cloud Storage.
  • INLINE_DATA: dados brutos codificados em base64 da imagem, do PDF ou do vídeo a ser incluído inline no comando.

Adicionar configurações de segurança para o modelo

O exemplo de código abaixo mostra como adicionar configurações de segurança para que o modelo gere uma resposta.

Exemplo de código

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.

Substitua:

  • MODEL_KEY: o nome da chave do modelo, que é configurado nos parâmetros de geração de modelo.
  • PROMPT: o texto do comando.
  • SYSTEM_INSTRUCTIONS: sua instrução do sistema para o modelo.
  • MIME_TYPE: o tipo MIME padrão IANA dos dados do arquivo. Por padrão, o tipo MIME é definido como application/pdf.
  • FILE_URI: o URI do arquivo armazenado em um bucket do Cloud Storage.
  • INLINE_DATA: dados brutos codificados em base64 da imagem, do PDF ou do vídeo a ser incluído inline no comando.
  • HARM_CATEGORY: a categoria de dano que você quer aplicar.
  • HARM_BLOCK_THRESHOLD: o nível de limites com base na probabilidade que você quer aplicar.
  • HARM_BLOCK_METHOD: o método de bloqueio de danos que você quer aplicar.

Encontrar o número de tokens e caracteres faturáveis em um comando

Antes de invocar o modelo com um comando, verifique o número de tokens no comando e quantos caracteres faturáveis estão presentes no token para planejar o faturamento do projeto do Google Cloud. O exemplo de código abaixo mostra como encontrar esses números e avaliar o faturamento da chamada de modelo semelhante.

Exemplo de código

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.

Substitua:

A seguir