Gemini no RStudio

Hype de Machado de Assis

Introdução

No blog listendata, Deepanshu demonstra como utilizar a API do Google Gemini no R, inclusive com o uso da interface interativa Shiny. Vamos detalhar o código básico de exemplo, sugerido para integrar os dois sistemas, capaz de gerar uma resposta do Gemini a um prompt apresentado através de uma função chamada no R.

Bibliotecas

Carregamos as bibliotecas indispensáveis:

  • httr - permite realizar requisições HTTP,;
  • jsonlite - facilita a interpretação e manipulação de dados json;
library(httr)
library(jsonlite)

Diretório de trabalho

Definimos o diretório de trabalho:

setwd("/home/gf/Scripts/gemini")

Armazene a api key como variável de ambiente

O valor da chave da API key do Gemini pode ser atribuído diretamente ao objeto key ou ser salvo em uma variável de ambiente, que pode ser chamada a qualquer momento através da função Sys.getenv(), de acordo com o roteiro fornecido por Paul Oldham.

usethis::edit_r_environ()

Definições e parâmetros

Prompt: Prompt significa uma pergunta que você deseja fazer ou um conjunto de instruções específicas. Também é chamado de consulta de pesquisa.
Tokens: Tokens são subpalavras ou palavras. Por exemplo, a palavra “nocivo” é dividida em dois tokens: radical “noc” (Latim nocere = prejudicar) e sufixo “ivo”. De modo que o cognato “inocente” pode ser dividido em três tokens: “in”, “noc” e “ente”.
Temperatura: É um parâmetro do modelo que é usado para ajustar a resposta. Ele está entre 0 e 1. Se você definir o valor da temperatura próximo a 0, isso significa que o modelo gerará uma resposta com a maior probabilidade. Um valor mais próximo de 1 produzirá respostas mais criativas.
Max output tokens: É um parâmetro do modelo que define o número máximo de tokens que podem ser gerados na resposta.

Definição da função

Definimos a função gemini, que recebe o prompt do usuário, parâmetros de configuração e a chave de API do Gemini:

rgemini <- function(prompt, 
                   temperature=0.5, # Parâmetro de temperatura para a geração de texto
                   max_output_tokens=1024, # Limite máximo de tokens de saída
                   api_key=Sys.getenv("GEMINI_API_KEY"), # Chave de API do Gemini
                   model = "gemini-1.5-pro-latest") # Modelo do Gemini a ser utilizado

Verificamos o processo de autenticação:

# Verificação da chave de API
  if(nchar(api_key)<1) { 
    api_key <- readline("Informe a api key: ") # Solicita a chave de API ao usuário
    Sys.setenv(GEMINI_API_KEY = api_key) # Armazena a chave de API na variável de ambiente
  }

Definimos o endpoint da API do Gemini. Um endpoint da API é um endereço específico e único que identifica um recurso ou serviço dentro de uma API (Interface de Programação de Aplicativos):

 model_query <- paste0(model, ":generateContent") 

Requisição POST:

  # Realiza uma requisição POST para o endpoint da API
  response <- POST(
    url = paste0("https://generativelanguage.googleapis.com/v1beta/models/", model_query), # URL da API
    query = list(key = api_key), # Parâmetros da requisição (chave de API)
    content_type_json(), # Define o tipo de conteúdo como JSON
    encode = "json", # Codifica os dados como JSON
    body = list(
      contents = list(
        parts = list(
          list(text = prompt) # O prompt do usuário, como entrada para a geração de texto
        )),
      generationConfig = list(
        temperature = temperature, # Temperatura para a geração de texto
        maxOutputTokens = max_output_tokens # Limite de tokens de saída
      )
    )
  )

Verifica o status da requisição:

  # Verifica se a requisição foi bem-sucedida
  if(response$status_code>200) { 
    stop(paste("Error - ", content(response)$error$message)) # Se houve erro, exibe a mensagem de erro
  }

Extraímos os candidatos da resposta JSON e o texto gerado de cada candidato:

candidates <- content(response)$candidates

Retorna o texto gerado pelo Gemini:

return(outputs) 

Define o prompt do usuário e chama a função rgemini:

prompt <- "Aja como um crítico literário especialista na obra de Machado de Assis. \
          Apresente, com entusiasmo, o livro 'Memórias Póstumas de Brás Cubas',\
          para um público que desconhece esse romance."

Chamamos a função rgemini com o prompt definido:

cat(rgemini(prompt))

Tudo junto fica assim:

# Função para interagir com o Gemini
rgemini <- function(prompt, 
                   temperature=0.5, # Parâmetro de temperatura para a geração de texto
                   max_output_tokens=1024, # Limite máximo de tokens de saída
                   api_key=Sys.getenv("GEMINI_API_KEY"), # Chave de API do Gemini
                   model = "gemini-1.5-pro-latest") { # Modelo do Gemini a ser utilizado

  # Verificação da chave de API
  if(nchar(api_key)<1) { 
    api_key <- readline("Informe a api key: ") # Solicita a chave de API ao usuário
    Sys.setenv(GEMINI_API_KEY = api_key) # Armazena a chave de API na variável de ambiente
  }
  
  # Define o endpoint da API do Gemini
  model_query <- paste0(model, ":generateContent") 
  
  # Realiza uma requisição POST para o endpoint da API
  response <- POST(
    url = paste0("https://generativelanguage.googleapis.com/v1beta/models/", model_query), # URL da API
    query = list(key = api_key), # Parâmetros da requisição (chave de API)
    content_type_json(), # Define o tipo de conteúdo como JSON
    encode = "json", # Codifica os dados como JSON
    body = list(
      contents = list(
        parts = list(
          list(text = prompt) # O prompt do usuário, como entrada para a geração de texto
        )),
      generationConfig = list(
        temperature = temperature, # Temperatura para a geração de texto
        maxOutputTokens = max_output_tokens # Limite de tokens de saída
      )
    )
  )
  
  # Verifica se a requisição foi bem-sucedida
  if(response$status_code>200) { 
    stop(paste("Error - ", content(response)$error$message)) # Se houve erro, exibe a mensagem de erro
  }
  
  # Extrai os candidatos da resposta JSON
  candidates <- content(response)$candidates
  # Extrai o texto gerado de cada candidato
  outputs <- unlist(lapply(candidates, function(candidate) candidate$content$parts)) 
  
  # Retorna o texto gerado pelo Gemini
  return(outputs) 
  
}

# Define o prompt do usuário
prompt <- "Aja como um crítico literário especialista na obra de Machado de Assis. \
          Apresente, com entusiasmo, o livro 'Memórias Póstumas de Brás Cubas',\
          para um público que desconhece esse romance."
cat(rgemini(prompt))

Caríssimos, preparem suas poltronas e acendam as luzes da razão, pois hoje vos apresento uma obra que subverte a lógica e nos convida a rir da nossa própria mortalidade! Abramos, com a vã curiosidade que nos é peculiar, as páginas de “Memórias Póstumas de Brás Cubas”, obra-prima do mestre Machado de Assis!

Esqueçam, meus caros, os romances açucarados e as histórias previsíveis! Aqui, o narrador, o defunto autor Brás Cubas, nos presenteia com a sua autobiografia, escrita do além-túmulo, com uma ironia fina e uma sagacidade mordaz que desafiam os padrões literários da época.

Preparem-se para conhecer um protagonista cínico e egocêntrico, um anti-herói que passeia pela vida sem grandes aspirações, movido por caprichos e devaneios. Acompanhem Brás Cubas em suas desventuras amorosas, em suas reflexões filosóficas pouco ortodoxas e em suas observações perspicazes sobre a sociedade carioca do século XIX.

Mas não se enganem com o tom aparentemente leviano da narrativa! Machado de Assis, com sua pena afiada e genial, nos conduz por um labirinto de digressões, metanarrativas e jogos metalinguísticos, questionando a própria natureza da realidade, da memória e da literatura.

Em “Memórias Póstumas de Brás Cubas”, a morte não é o fim, mas o ponto de partida para uma análise profunda e irônica da existência humana. Preparem-se para rir de si mesmos, para se surpreender com a ousadia narrativa e para se encantar com a genialidade do Bruxo do Cosme Velho!

Não percam a oportunidade de se aventurar por esta obra singular, que revolucionou a literatura brasileira e que continua a encantar e desafiar leitores de todas as épocas. Uma leitura obrigatória para aqueles que buscam uma experiência literária única e inesquecível!

Considerações adicionais

  • A função Sys.getenv(“GEMINI_API_KEY”) busca a chave de API no ambiente do sistema, garantindo a segurança da sua chave de API.
  • A função content(response) extrai o conteúdo JSON da resposta da API.
  • A função unlist é usada para converter a lista de texto gerado em uma única string.

Este código demonstra como o R pode ser utilizado para interagir com APIs de linguagem natural, como o Gemini, e obter resultados relevantes para tarefas específicas.

Referências:

Bhalla, D. (2024). How to use Google’s Gemini AI model in R. Acessado em 24/05/2024: https://www.listendata.com/2023/12/google-gemini-r.html

Abolafio Jr., R. (2020) Nova tradução aumenta o hype de Machado de Assis no exterior. Revista Versatille. Edição 116. Acessada a versão online em 24/05/2024: https://versatille.com/re-descobrir-machado-de-assis/