From dc97126f74dfb295f5829830d9d5d6c17a55a518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20de=20Jesus=20Filho?= Date: Tue, 15 Oct 2024 17:13:26 +0000 Subject: [PATCH] =?UTF-8?q?Feat:=20Adiciona=20vers=C3=A3o=202=20do=20gemin?= =?UTF-8?q?i=5Fextrair=20com=20sa=C3=ADda=20estruturada.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NAMESPACE | 1 + R/gemini_extrair.R | 97 ++++++++++++++++++++++++++++++++++++++++++ man/gemini_extrair2.Rd | 48 +++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 man/gemini_extrair2.Rd diff --git a/NAMESPACE b/NAMESPACE index 45b9a65..3fd0af1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -31,6 +31,7 @@ export(extrair_valor_arbitrado) export(file_search) export(filtrar_df) export(gemini_extrair) +export(gemini_extrair2) export(gpt_extrair) export(gpt_json) export(gpt_ler) diff --git a/R/gemini_extrair.R b/R/gemini_extrair.R index 2f88355..4207884 100644 --- a/R/gemini_extrair.R +++ b/R/gemini_extrair.R @@ -92,3 +92,100 @@ Retorne as respostas em formato json com as seguintes chaves: {colunas}") extrair <- purrr::insistently(.f, taxa, quiet = FALSE) extrair() } + + +#' Extrai informações de textos judiciais com o GEMINI com saída estruturada +#' +#' @param x Texto +#' @param api_key Chave do GEMINI. Se não informada, buscara a variável de ambiente +#' GEMINI_API_KEY. +#' @param instrucao Orientação ao GEMINI, informando inclusive a delimitação por três +#' apóstrofes. +#' @param perguntas Vetor de perguntas. +#' @param colunas lista com json schema +#' @param modelo Modelo do Gemini +#' @param temperatura Nível de aleatoriedade. Padrão: 0, ou seja, determinístico. +#' @param max_output_tokens = Número máximo na resposta. +#' @param top_p Máxima probabilidade cumulativa para a amostra de tokens. +#' @param top_k Número máximo de tokens incluídos na amostra. +#' +#' @return json +#' @export +#' +gemini_extrair2 <- function(x, + api_key=NULL, + instrucao, + perguntas, + colunas, + modelo = "gemini-1.5-flash", + temperatura = 0, + max_output_tokens = 100000, + top_p = 0.4, + top_k = 2){ + + if(is.null(api_key)){ + + api_key = Sys.getenv("GEMINI_API_KEY") + } + uri <- glue::glue("https://generativelanguage.googleapis.com/v1beta/models/{modelo}:generateContent?key={api_key}") + + + headers <- c(`Content-Type`="application/json") + + perguntas <- stringr::str_c(perguntas, collapse = ",\n") + + #colunas <- stringr::str_c(colunas, collapse = ", ") + + body <- list(contents = list( + parts = list( text = glue::glue("{instrucao} ```{x}```. Responda \u00E0s seguintes perguntas: +{perguntas}") + )), + `safetySettings` = list( + list(category = "HARM_CATEGORY_HARASSMENT", + threshold = "BLOCK_NONE"), + list(category = "HARM_CATEGORY_HATE_SPEECH", + threshold = "BLOCK_NONE"), + list(category = "HARM_CATEGORY_DANGEROUS_CONTENT", + threshold = "BLOCK_NONE"), + list(category = "HARM_CATEGORY_SEXUALLY_EXPLICIT", + threshold = "BLOCK_NONE") + ), + + `generationConfig` = list( + `response_mime_type` = "application/json", + `response_schema` = list( + type = "OBJECT", + properties = colunas), + temperature = temperatura, + `maxOutputTokens` = max_output_tokens, + topP = top_p, + topK = top_k + ) + + + ) + + + taxa <- purrr::rate_delay(0.2, max_times = 3) + + + .f <- function(){ + + r2 <- httr::POST(uri, body = body, encode ="json", + httr::add_headers(.headers = headers)) + + + x1 <- httr::content(r2, "text") |> + jsonlite::fromJSON() |> + purrr::pluck("candidates","content","parts",1,"text") |> + stringr::str_extract("\\{\\X+\\}") |> + jsonlite::prettify() + + return(x1) + } + + + extrair <- purrr::insistently(.f, taxa, quiet = FALSE) + extrair() +} + diff --git a/man/gemini_extrair2.Rd b/man/gemini_extrair2.Rd new file mode 100644 index 0000000..aad9807 --- /dev/null +++ b/man/gemini_extrair2.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/gemini_extrair.R +\name{gemini_extrair2} +\alias{gemini_extrair2} +\title{Extrai informações de textos judiciais com o GEMINI com saída estruturada} +\usage{ +gemini_extrair2( + x, + api_key = NULL, + instrucao, + perguntas, + colunas, + modelo = "gemini-1.5-flash", + temperatura = 0, + max_output_tokens = 1e+05, + top_p = 0.4, + top_k = 2 +) +} +\arguments{ +\item{x}{Texto} + +\item{api_key}{Chave do GEMINI. Se não informada, buscara a variável de ambiente +GEMINI_API_KEY.} + +\item{instrucao}{Orientação ao GEMINI, informando inclusive a delimitação por três +apóstrofes.} + +\item{perguntas}{Vetor de perguntas.} + +\item{colunas}{lista com json schema} + +\item{modelo}{Modelo do Gemini} + +\item{temperatura}{Nível de aleatoriedade. Padrão: 0, ou seja, determinístico.} + +\item{max_output_tokens}{= Número máximo na resposta.} + +\item{top_p}{Máxima probabilidade cumulativa para a amostra de tokens.} + +\item{top_k}{Número máximo de tokens incluídos na amostra.} +} +\value{ +json +} +\description{ +Extrai informações de textos judiciais com o GEMINI com saída estruturada +}