From 589c3834432cbd0c02f95ccec21f1b59f65e0ca2 Mon Sep 17 00:00:00 2001 From: Corrado Lanera Date: Mon, 22 Apr 2024 00:39:51 +0200 Subject: [PATCH] updated README and zzz --- NAMESPACE | 1 + NEWS.md | 2 + R/compose_prompt.R | 62 ++++- R/get_completion_from_messages.R | 28 ++- R/query_gpt.R | 3 +- R/zzz.R | 39 ++++ README.Rmd | 141 ++++++++++-- README.md | 277 +++++++++++++++++++---- dev/{01-check.R => 02-check.R} | 6 +- dev/img/gpt-example.png | Bin 0 -> 109611 bytes inst/WORDLIST | 33 +-- man/compose_prompt.Rd | 16 +- man/create_usr_data_prompter.Rd | 64 ++++++ man/get_completion_from_messages.Rd | 13 +- tests/testthat/test-compose_prompt.R | 1 - tests/testthat/test-compose_prompt_api.R | 24 ++ 16 files changed, 584 insertions(+), 126 deletions(-) rename dev/{01-check.R => 02-check.R} (99%) create mode 100644 dev/img/gpt-example.png create mode 100644 man/create_usr_data_prompter.Rd create mode 100644 tests/testthat/test-compose_prompt_api.R diff --git a/NAMESPACE b/NAMESPACE index b40d9bd..fe17ac8 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,7 @@ export(compose_prompt) export(compose_prompt_api) export(compose_prompt_system) export(compose_prompt_user) +export(create_usr_data_prompter) export(get_completion_from_messages) export(get_content) export(get_tokens) diff --git a/NEWS.md b/NEWS.md index acfe804..5fd2502 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,6 @@ # ubep.gpt (development version) +* Added zzz.R with startup messages checking for API keys. +* Update README with examples of usage. * Setup development environment. * Initial setup from CorradoLanera/gpt-template. diff --git a/R/compose_prompt.R b/R/compose_prompt.R index e44d73c..a6a0090 100644 --- a/R/compose_prompt.R +++ b/R/compose_prompt.R @@ -1,11 +1,11 @@ #' Create a prompt to ChatGPT #' -#' Questa funzione è un semplice wrapper per comporre un buon prompt per -#' ChatGPT. L'output non è altro che la giustapposizione su righe separate delle -#' varie componenti (con il testo addizionale racchiuso tra i delimitatori in -#' fondo al prompt). Dunque il suo utilizzo è più che altro focalizzato è utile -#' per ricordare e prendere l'abitudine di inserire le componenti utili per un -#' buon prompt. +#' This function is a simple wrapper to compose a good prompt for +#' ChatGPT. The output is nothing more than the juxtaposition on +#' separate lines of the various components (with the additional text +#' enclosed between the delimiters at the bottom of the prompt). So its +#' use is more focused and useful for remembering and getting used to +#' entering the components useful for a good prompt. #' #' @param role (chr) The role that ChatGPT should play #' @param context (chr) The context behind the task required @@ -15,8 +15,8 @@ #' @param style (chr) The style ChatGPT should use in the output #' @param examples (chr) Some examples of correct output #' @param text (chr) Additional text to embed in the prompt -#' @param delimiter (chr) delimiters for the `text` to embed, a sequence of -#' three identical symbols is suggested +#' @param delimiter (chr) delimiters for the `text` to embed, a sequence +#' of three identical symbols is suggested #' #' @return (chr) the glue of all the prompts components #' @export @@ -116,6 +116,52 @@ compose_prompt_user <- function( } +#' Create a function to prompt the user for data +#' +#' This function create a function that can be used to prompt the user +#' for data in a specific context. Given the interested context, the +#' function created will accept a string of text as input and return the +#' complete prompt based on the desired context. +#' +#' @param task (chr) The task ChatGPT should assess +#' @param instructions (chr) Description of steps ChatGPT should follow +#' @param output (chr) The type/kind of output required +#' @param style (chr) The style ChatGPT should use in the output +#' @param examples (chr) Some examples of correct output +#' +#' @return (function) a function that can be used to prompt the user, +#' accepting a string of text as input and returning the complete +#' prompt based on the desired context. +#' +#' @export +#' +#' @examples +#' prompter <- create_usr_data_prompter( +#' task = "Your task is to extract information from a text provided.", +#' instructions = " +#' You should extract the first and last words of the text.", +#' output = " +#' Return the first and last words of the text separated by a dash, +#' i.e., `first - last`.", +#' style = " +#' Do not add any additional information, return only the requested +#' information.", +#' examples = " +#' text: 'This is an example text.' +#' output: 'This - text' +#' text: 'Another example text!!!' +#' output: 'Another - text'" +#' ) +#' prompter("This is an example text.") +#' prompter("Another example text!!!") +#' +#' # You can also use it with a data frame to programmaically create +#' # prompts for each row of a data frame's column. +#' db <- data.frame( +#' text = c("This is an example text.", "Another example text!!!") +#' ) +#' db$text |> purrr::map_chr(prompter) +#' create_usr_data_prompter <- function( task = "", instructions = "", output = "", style = "", examples = "" ) { diff --git a/R/get_completion_from_messages.R b/R/get_completion_from_messages.R index 504bd30..dd25cc2 100644 --- a/R/get_completion_from_messages.R +++ b/R/get_completion_from_messages.R @@ -12,6 +12,7 @@ #' @param max_tokens (dbl, default = 500) a value greater than 0. The #' maximum number of tokens to generate in the chat completion. (see: #' https://platform.openai.com/docs/api-reference/chat/create#chat/create-max_tokens) +#' @param quiet (lgl, default = FALSE) whether to suppress messages #' #' @details For argument description, please refer to the [official #' documentation](https://platform.openai.com/docs/api-reference/chat/create). @@ -76,7 +77,8 @@ get_completion_from_messages <- function( messages, model = c("gpt-3.5-turbo", "gpt-4-turbo"), temperature = 0, - max_tokens = 1000 + max_tokens = 1000, + quiet = FALSE ) { model <- match.arg(model) @@ -85,7 +87,14 @@ get_completion_from_messages <- function( "gpt-4-turbo" = "gpt-4-1106-preview" ) - res <- openai::create_chat_completion( + get_chat_completion <- if (quiet) { + \(...) openai::create_chat_completion(...) |> + suppressMessages() + } else { + openai::create_chat_completion + } + + res <- get_chat_completion( model = model, messages = messages, temperature = temperature, @@ -114,17 +123,22 @@ get_content <- function(completion) { #' #' @param completion the number of tokens used for output of a #' `get_completion_from_messages` call -#' @param what (chr) one of "total" (default), "prompt", or "completion" +#' @param what (chr) one of "total" (default), "prompt", "completion", +#' or "all" #' @describeIn get_completion_from_messages #' -#' @return (int) number of token used in completion for prompt or completion part, or overall (total) +#' @return (int) number of token used in completion for prompt or +#' completion part, or overall (total) #' @export get_tokens <- function( completion, - what = c("total", "prompt", "completion") + what = c("total", "prompt", "completion", "all") ) { what <- match.arg(what) - sel <- paste0(what, "_tokens") - completion[["tokens"]][[sel]] + if (what == "all") { + completion[["tokens"]] |> unlist() + } else { + completion[["tokens"]][[paste0(what, "_tokens")]] + } } diff --git a/R/query_gpt.R b/R/query_gpt.R index 2080dbc..31a29ed 100644 --- a/R/query_gpt.R +++ b/R/query_gpt.R @@ -58,7 +58,8 @@ query_gpt <- function( get_completion_from_messages( model = model, temperature = temperature, - max_tokens = max_tokens + max_tokens = max_tokens, + quiet = quiet ) done <- TRUE aux diff --git a/R/zzz.R b/R/zzz.R index be916ed..8e88a2a 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,3 +1,42 @@ .onAttach <- function(...) { + usethis::ui_info("Wellcome to ubep.gpt!") + if (Sys.getenv("OPENAI_API_sKEY") == "") { + usethis::ui_info("OPENAI_API_KEY environment variable is not set.") + usethis::ui_info( + "it is required to use OpenAI APIs with `ubep.gpt`.") + usethis::ui_info( + "To set the OPENAI_API_KEY environment variable, + you can call {usethis::ui_code('usethis::edit_r_environ(\"project\")')}, + and add the line {usethis::ui_code('OPENAI_API_KEY=')}." + ) + usethis::ui_info( + "REMIND: + Never share your API key with others. + Keep it safe and secure. + If you need an API key, you can generate it in the OpenAI-API website + (https://platform.openai.com/api-keys). + Remind to assign it to the correct project + (i.e., NOT to the 'default' one). + If you need to be added to the organization and/or to a project, + please, contact your project's referent." + ) + + usethis::ui_todo( + "Please, set the OPENAI_API_KEY environment variable with your OpenAI API key." + ) + usethis::ui_todo("And than, restart your R session.") + } else { + usethis::ui_info("The OPENAI_API_KEY environment variable is set") + usethis::ui_info("You are ready to use the package `ubep.gpt`.") + usethis::ui_todo("Just, double check if the key is the correct one.") + usethis::ui_info( + "REMIND: Never share your API key with others. + Keep it safe and secure. + If you think that your API key was compromised, + you can regenerate it in the OpenAI-API website + (https://platform.openai.com/api-keys)." + ) + usethis::ui_done("Enjoy the package!") + } } diff --git a/README.Rmd b/README.Rmd index 75bea9b..1249586 100644 --- a/README.Rmd +++ b/README.Rmd @@ -21,49 +21,118 @@ knitr::opts_chunk$set( [![R-CMD-check](https://github.com/UBESP-DCTV/ubep.gpt/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/UBESP-DCTV/ubep.gpt/actions/workflows/R-CMD-check.yaml) -The goal of ubep.gpt is to ... +The goal of `{ubep.gpt}` is to provide a simple interface to OpenAI's GPT API. The package is designed to work with dataframes/tibbles and to simplify the process of querying the API. ## Installation -You can install the development version of ubep.gpt like so: +You can install the development version of `{ubep.gpt}` like so: ``` r -# FILL THIS IN! HOW CAN PEOPLE INSTALL YOUR DEV PACKAGE? +remotes::install_github("UBESP-DCTV/ubep.gpt") ``` -## Example +## Basic example -This is a basic example which shows you how to solve a common problem: +You can use the `query_gpt` function to query the GPT API. You can decide +if use GPT-3.5-turbo or GPT-4-turbo models. This function is useful because mainly it iterate the query a decided number of times (10 by default) in case of error (often caused by server overload). -```{r example} +To use the function you need to compose a prompt. You can use the `compose_prompt_api` function to compose the prompt. This function is useful because it helps you to compose the prompt automatically adopting the required API's structure. + +Once you have queried the API, you can extract the content of the response using the `get_content` function. You can also extract the tokens of the prompt and the response using the `get_tokens` function. + +```{r} library(ubep.gpt) +prompt <- compose_prompt_api( + sys_msg = "You are the assistant of a university professor.", + usr_msg = "Tell me about the last course you provided." +) +prompt + +res <- query_gpt( + prompt = prompt, + model = "gpt-3.5-turbo", + quiet = FALSE, # default TRUE + max_try = 2, # default 10 + temperature = 1.5, # default 0 [0-2] + max_tokens = 100 # default 1000 +) + +str(res) +get_content(res) +get_tokens(res) +get_tokens(res, "prompt") +get_tokens(res, "all") +``` + +## Easy prompt-assisted creation + +You can use the `compose_prompt_system` and `compose_prompt_user` functions to create the system and user prompts, respectively. These functions are useful because they help you to compose the prompts following best practices in composing prompt. In fact the arguments are just the main components every prompt should have. They do just that, composing the prompt for you juxtaposing the components in the right order. + +```{r} +sys_prompt <- compose_prompt_system( + role = "You are the assistant of a university professor.", + context = "You are analyzing the comments of the students of the last course." +) +sys_prompt + +usr_prompt <- compose_prompt_user( + task = "Your task is to extract information from a text provided.", + instructions = "You should extract the first and last words of the text.", + output = "Return the first and last words of the text separated by a dash, i.e., `first - last`.", + style = "Do not add any additional information, return only the requested information.", + examples = " + # Examples: + text: 'This is an example text.' + output: 'This - text' + text: 'Another example text!!!' + output: 'Another - text'", + text = "Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura" +) +usr_prompt + +compose_prompt_api(sys_prompt, usr_prompt) |> + query_gpt() |> + get_content() +``` + +## Querying a column of a dataframe + +You can use the `query_gpt_on_column` function to query the GPT API on a column of a dataframe. This function is useful because it helps you to iterate the query on each row of the column and to compose the prompt automatically adopting the required API's structure. In this case, you need to provide the components of the prompt creating the prompt template, and the name of the column you what to embed in the template as a "text" to query. All the prompt's components are optional, so you can provide only the ones you need: `role` and `context` compose the system prompt, while `task`, `instructions`, `output`, `style`, and `examples` compose the user prompt (they will be just juxtaposed in the right order) + +```{r example} db <- data.frame( - commenti = c( - "Che barba, che noia!", - "Un po' noioso, ma interessante", - "Che bello, mi è piaciuto molto!" + txt = c( + "I'm very satisfied with the course; it was very interesting and useful.", + "I didn't like it at all; it was deadly boring.", + "The best course I've ever attended.", + "The course was a waste of time.", + "blah blah blah", + "woow", + "bim bum bam" ) ) -role <- "Sei l'assistente di un docente universitario." -context <- "State analizzando i commenti degli studenti dell'ultimo corso." +# system +role <- "You are the assistant of a university professor." +context <- "You are analyzing the comments of the students of the last course." -task <- "Il tuo compito è capire se sono soddisfatti del corso." -instructions <- "Analizza i commenti e decidi se sono soddisfatti o meno." -output <- "Riporta 'soddisfatto' o 'insoddisfatto', in caso di dubbio o impossibilità riporta 'NA'." -style <- "Non aggiungere nessun commento, restituisci solo ed esclusivamente una delle classificazioni possibile." +# user +task <- "Your task is to understand if they are satisfied with the course." +instructions <- "Analyze the comments and decide if they are satisfied or not." +output <- "Report 'satisfied' or 'unsatisfied', in case of doubt or impossibility report 'NA'." +style <- "Do not add any comment, return only and exclusively one of the possible classifications." examples <- " -commento_1: 'Mi è piaciuto molto il corso; davvero interessante.' -classificazione_1: 'soddisfatto' -commento_2: 'Non mi è piaciuto per niente; una noia mortale' -classificazione_2: 'insoddisfatto' -" + # Examples: + text: 'I'm very satisfied with the course; it was very interesting and useful.' + output: 'satisfied' + text: 'I didn't like it at all; it was deadly boring.' + output: 'unsatisfied'" -res <- db |> +db |> query_gpt_on_column( - "commenti", + "txt", role = role, context = context, task = task, @@ -72,9 +141,33 @@ res <- db |> style = style, examples = examples ) -res ``` +## Base ChatGPT prompt creation (NOT for API) + +You can use the `compose_prompt` function to create a prompt for ChatGPT. This function is useful because it helps you to compose the prompt following best practices in composing prompt. In fact the arguments are just the main components every prompt should have. They do just that, composing the prompt for you juxtaposing the components in the right order. The result is suitable to be copy-pasted on ChatGPT, not to be used with API calls, i.e., it cannot be used with the `query_gpt` function!! + +```{r} +compose_prompt( + role = "You are the assistant of a university professor.", + context = "You are analyzing the comments of the students of the last course.", + task = "Your task is to extract information from a text provided.", + instructions = "You should extract the first and last words of the text.", + output = "Return the first and last words of the text separated by a dash, i.e., `first - last`.", + style = "Do not add any additional information, return only the requested information.", + examples = " + # Examples: + text: 'This is an example text.' + output: 'This - text' + text: 'Another example text!!!' + output: 'Another - text'", + text = "Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura" +) + +``` + +![https://chat.openai.com/share/394a008b-d463-42dc-9361-1bd745bcad6d](dev/img/gpt-example.png) + ## Code of Conduct Please note that the ubep.gpt project is released with a [Contributor Code of Conduct](https://contributor-covenant.org/version/2/1/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. diff --git a/README.md b/README.md index b63f670..17f440e 100644 --- a/README.md +++ b/README.md @@ -12,49 +12,194 @@ coverage](https://codecov.io/gh/UBESP-DCTV/ubep.gpt/branch/main/graph/badge.svg) [![R-CMD-check](https://github.com/UBESP-DCTV/ubep.gpt/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/UBESP-DCTV/ubep.gpt/actions/workflows/R-CMD-check.yaml) -The goal of ubep.gpt is to … +The goal of `{ubep.gpt}` is to provide a simple interface to OpenAI’s +GPT API. The package is designed to work with dataframes/tibbles and to +simplify the process of querying the API. ## Installation -You can install the development version of ubep.gpt like so: +You can install the development version of `{ubep.gpt}` like so: ``` r -# FILL THIS IN! HOW CAN PEOPLE INSTALL YOUR DEV PACKAGE? +remotes::install_github("UBESP-DCTV/ubep.gpt") ``` -## Example +## Basic example -This is a basic example which shows you how to solve a common problem: +You can use the `query_gpt` function to query the GPT API. You can +decide if use GPT-3.5-turbo or GPT-4-turbo models. This function is +useful because mainly it iterate the query a decided number of times (10 +by default) in case of error (often caused by server overload). + +To use the function you need to compose a prompt. You can use the +`compose_prompt_api` function to compose the prompt. This function is +useful because it helps you to compose the prompt automatically adopting +the required API’s structure. + +Once you have queried the API, you can extract the content of the +response using the `get_content` function. You can also extract the +tokens of the prompt and the response using the `get_tokens` function. ``` r library(ubep.gpt) +prompt <- compose_prompt_api( + sys_msg = "You are the assistant of a university professor.", + usr_msg = "Tell me about the last course you provided." +) +prompt +#> [[1]] +#> [[1]]$role +#> [1] "system" +#> +#> [[1]]$content +#> [1] "You are the assistant of a university professor." +#> +#> +#> [[2]] +#> [[2]]$role +#> [1] "user" +#> +#> [[2]]$content +#> [1] "Tell me about the last course you provided." + +res <- query_gpt( + prompt = prompt, + model = "gpt-3.5-turbo", + quiet = FALSE, # default TRUE + max_try = 2, # default 10 + temperature = 1.5, # default 0 [0-2] + max_tokens = 100 # default 1000 +) +#> • POST the query +#> ✔ POST the query +#> • Parse the response +#> ✔ Parse the response +#> • Check whether request failed and return parsed +#> ✔ Check whether request failed and return parsed +#> ℹ Tries: 1. +#> ℹ Prompt token used: 29. +#> ℹ Response token used: 100. +#> ℹ Total token used: 129. + +str(res) +#> List of 2 +#> $ content: chr "Certainly! The last course our professor provided was a seminar on environmental ethics for senior undergraduat"| __truncated__ +#> $ tokens :List of 3 +#> ..$ prompt_tokens : int 29 +#> ..$ completion_tokens: int 100 +#> ..$ total_tokens : int 129 +get_content(res) +#> [1] "Certainly! The last course our professor provided was a seminar on environmental ethics for senior undergraduate students. The course explored key issues at the intersection of environmental philosophy and ethics, considering perspectives from diverse thinkers such as Aldo Leopold, Rachel Carson, and Arne Naess. Students had the opportunity to read and discuss foundational texts in the field, engage in critical analysis of case studies, and develop their own perspectives on environmental ethics issues. The course culminated in a final research project where students took a" +get_tokens(res) +#> [1] 129 +get_tokens(res, "prompt") +#> [1] 29 +get_tokens(res, "all") +#> prompt_tokens completion_tokens total_tokens +#> 29 100 129 +``` +## Easy prompt-assisted creation + +You can use the `compose_prompt_system` and `compose_prompt_user` +functions to create the system and user prompts, respectively. These +functions are useful because they help you to compose the prompts +following best practices in composing prompt. In fact the arguments are +just the main components every prompt should have. They do just that, +composing the prompt for you juxtaposing the components in the right +order. + +``` r +sys_prompt <- compose_prompt_system( + role = "You are the assistant of a university professor.", + context = "You are analyzing the comments of the students of the last course." +) +sys_prompt +#> You are the assistant of a university professor. +#> You are analyzing the comments of the students of the last course. + +usr_prompt <- compose_prompt_user( + task = "Your task is to extract information from a text provided.", + instructions = "You should extract the first and last words of the text.", + output = "Return the first and last words of the text separated by a dash, i.e., `first - last`.", + style = "Do not add any additional information, return only the requested information.", + examples = " + # Examples: + text: 'This is an example text.' + output: 'This - text' + text: 'Another example text!!!' + output: 'Another - text'", + text = "Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura" +) +usr_prompt +#> Your task is to extract information from a text provided. +#> You should extract the first and last words of the text. +#> Return the first and last words of the text separated by a dash, i.e., `first - last`. +#> Do not add any additional information, return only the requested information. +#> +#> # Examples: +#> text: 'This is an example text.' +#> output: 'This - text' +#> text: 'Another example text!!!' +#> output: 'Another - text' +#> +#> """" +#> Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura +#> """" + +compose_prompt_api(sys_prompt, usr_prompt) |> + query_gpt() |> + get_content() +#> [1] "Nel - oscura" +``` + +## Querying a column of a dataframe + +You can use the `query_gpt_on_column` function to query the GPT API on a +column of a dataframe. This function is useful because it helps you to +iterate the query on each row of the column and to compose the prompt +automatically adopting the required API’s structure. In this case, you +need to provide the components of the prompt creating the prompt +template, and the name of the column you what to embed in the template +as a “text” to query. All the prompt’s components are optional, so you +can provide only the ones you need: `role` and `context` compose the +system prompt, while `task`, `instructions`, `output`, `style`, and +`examples` compose the user prompt (they will be just juxtaposed in the +right order) + +``` r db <- data.frame( - commenti = c( - "Che barba, che noia!", - "Un po' noioso, ma interessante", - "Che bello, mi è piaciuto molto!" + txt = c( + "I'm very satisfied with the course; it was very interesting and useful.", + "I didn't like it at all; it was deadly boring.", + "The best course I've ever attended.", + "The course was a waste of time.", + "blah blah blah", + "woow", + "bim bum bam" ) ) -role <- "Sei l'assistente di un docente universitario." -context <- "State analizzando i commenti degli studenti dell'ultimo corso." +# system +role <- "You are the assistant of a university professor." +context <- "You are analyzing the comments of the students of the last course." -task <- "Il tuo compito è capire se sono soddisfatti del corso." -instructions <- "Analizza i commenti e decidi se sono soddisfatti o meno." -output <- "Riporta 'soddisfatto' o 'insoddisfatto', in caso di dubbio o impossibilità riporta 'NA'." -style <- "Non aggiungere nessun commento, restituisci solo ed esclusivamente una delle classificazioni possibile." +# user +task <- "Your task is to understand if they are satisfied with the course." +instructions <- "Analyze the comments and decide if they are satisfied or not." +output <- "Report 'satisfied' or 'unsatisfied', in case of doubt or impossibility report 'NA'." +style <- "Do not add any comment, return only and exclusively one of the possible classifications." examples <- " -commento_1: 'Mi è piaciuto molto il corso; davvero interessante.' -classificazione_1: 'soddisfatto' -commento_2: 'Non mi è piaciuto per niente; una noia mortale' -classificazione_2: 'insoddisfatto' -" + # Examples: + text: 'I'm very satisfied with the course; it was very interesting and useful.' + output: 'satisfied' + text: 'I didn't like it at all; it was deadly boring.' + output: 'unsatisfied'" -res <- db |> +db |> query_gpt_on_column( - "commenti", + "txt", role = role, context = context, task = task, @@ -63,33 +208,71 @@ res <- db |> style = style, examples = examples ) -#> • POST the query -#> ✔ POST the query -#> • Parse the response -#> ✔ Parse the response -#> • Check whether request failed and return parsed -#> ✔ Check whether request failed and return parsed -#> • POST the query -#> ✔ POST the query -#> • Parse the response -#> ✔ Parse the response -#> • Check whether request failed and return parsed -#> ✔ Check whether request failed and return parsed -#> • POST the query -#> ✔ POST the query -#> • Parse the response -#> ✔ Parse the response -#> • Check whether request failed and return parsed -#> ✔ Check whether request failed and return parsed -res -#> # A tibble: 3 × 2 -#> commenti gpt_res -#> -#> 1 Che barba, che noia! insoddisfatto -#> 2 Un po' noioso, ma interessante insoddisfatto -#> 3 Che bello, mi è piaciuto molto! soddisfatto +#> # A tibble: 7 × 2 +#> txt gpt_res +#> +#> 1 I'm very satisfied with the course; it was very interesting and usefu… satisf… +#> 2 I didn't like it at all; it was deadly boring. unsati… +#> 3 The best course I've ever attended. satisf… +#> 4 The course was a waste of time. unsati… +#> 5 blah blah blah satisf… +#> 6 woow +#> 7 bim bum bam +``` + +## Base ChatGPT prompt creation (NOT for API) + +You can use the `compose_prompt` function to create a prompt for +ChatGPT. This function is useful because it helps you to compose the +prompt following best practices in composing prompt. In fact the +arguments are just the main components every prompt should have. They do +just that, composing the prompt for you juxtaposing the components in +the right order. The result is suitable to be copy-pasted on ChatGPT, +not to be used with API calls, i.e., it cannot be used with the +`query_gpt` function!! + +``` r +compose_prompt( + role = "You are the assistant of a university professor.", + context = "You are analyzing the comments of the students of the last course.", + task = "Your task is to extract information from a text provided.", + instructions = "You should extract the first and last words of the text.", + output = "Return the first and last words of the text separated by a dash, i.e., `first - last`.", + style = "Do not add any additional information, return only the requested information.", + examples = " + # Examples: + text: 'This is an example text.' + output: 'This - text' + text: 'Another example text!!!' + output: 'Another - text'", + text = "Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura" +) +#> You are the assistant of a university professor. +#> You are analyzing the comments of the students of the last course. +#> Your task is to extract information from a text provided. +#> You should extract the first and last words of the text. +#> Return the first and last words of the text separated by a dash, i.e., `first - last`. +#> Do not add any additional information, return only the requested information. +#> +#> # Examples: +#> text: 'This is an example text.' +#> output: 'This - text' +#> text: 'Another example text!!!' +#> output: 'Another - text' +#> +#> """" +#> Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura +#> """" ``` +
+ + +
+ ## Code of Conduct Please note that the ubep.gpt project is released with a [Contributor diff --git a/dev/01-check.R b/dev/02-check.R similarity index 99% rename from dev/01-check.R rename to dev/02-check.R index a70232d..f6c94f8 100644 --- a/dev/01-check.R +++ b/dev/02-check.R @@ -1,10 +1,12 @@ +## CTRL + SHIFT + D: update project documentation +devtools::build_readme() + spelling::spell_check_package() ## spelling::update_wordlist() + lintr::lint_package() -## CTRL + SHIFT + D: update project documentation ## CTRL + SHIFT + T: run all project's tests ## CTRL + SHIFT + E: run all CRAN tests -devtools::build_readme() usethis::use_version() diff --git a/dev/img/gpt-example.png b/dev/img/gpt-example.png new file mode 100644 index 0000000000000000000000000000000000000000..17c50f23d80542e5e276008014605c420f8a9f78 GIT binary patch literal 109611 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 literal 0 HcmV?d00001 diff --git a/inst/WORDLIST b/inst/WORDLIST index 249cf60..516fcf5 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,30 +1,31 @@ +API's +API’s CMD ChatGPT Codecov CorradoLanera -Dunque +GPT Il -L'output Lifecycle ORCID OpenAI +OpenAI's +OpenAI’s Questa +README Sei Tuttavia -addizionale al alternanze alternati -altro anche api assistente assistenza -buon -che +bcad +bd chr commenti -componenti comporre comportamento consente @@ -34,7 +35,6 @@ cui da dall'utente del -delimitatori dell'assistente dell'utente delle @@ -47,24 +47,19 @@ esempi esempio essere facoltativo -focalizzato -fondo formattata fornire forniscono funzione genere generico -giustapposizione gpt https il impostare impostazione iniziale -inserire istruzioni -l'abitudine l'assistente l'impostazione le @@ -83,16 +78,12 @@ più possibile possono precedenti -prendere prima primo probabilmente quello -racchiuso richiesta richieste -ricordare -righe rispondere risposte sarà @@ -104,20 +95,14 @@ semplicità senza sistema specifiche -su sua sul -suo tenere -testo tibble -tra +tibbles ubep un una usare utile -utili -utilizzo -varie è diff --git a/man/compose_prompt.Rd b/man/compose_prompt.Rd index bec71e9..0125d51 100644 --- a/man/compose_prompt.Rd +++ b/man/compose_prompt.Rd @@ -47,8 +47,8 @@ compose_prompt_user( \item{text}{(chr) Additional text to embed in the prompt} -\item{delimiter}{(chr) delimiters for the \code{text} to embed, a sequence of -three identical symbols is suggested} +\item{delimiter}{(chr) delimiters for the \code{text} to embed, a sequence +of three identical symbols is suggested} } \value{ (chr) the glue of all the prompts components @@ -58,12 +58,12 @@ three identical symbols is suggested} (chr) The complete user prompt } \description{ -Questa funzione è un semplice wrapper per comporre un buon prompt per -ChatGPT. L'output non è altro che la giustapposizione su righe separate delle -varie componenti (con il testo addizionale racchiuso tra i delimitatori in -fondo al prompt). Dunque il suo utilizzo è più che altro focalizzato è utile -per ricordare e prendere l'abitudine di inserire le componenti utili per un -buon prompt. +This function is a simple wrapper to compose a good prompt for +ChatGPT. The output is nothing more than the juxtaposition on +separate lines of the various components (with the additional text +enclosed between the delimiters at the bottom of the prompt). So its +use is more focused and useful for remembering and getting used to +entering the components useful for a good prompt. } \section{Functions}{ \itemize{ diff --git a/man/create_usr_data_prompter.Rd b/man/create_usr_data_prompter.Rd new file mode 100644 index 0000000..ec36486 --- /dev/null +++ b/man/create_usr_data_prompter.Rd @@ -0,0 +1,64 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/compose_prompt.R +\name{create_usr_data_prompter} +\alias{create_usr_data_prompter} +\title{Create a function to prompt the user for data} +\usage{ +create_usr_data_prompter( + task = "", + instructions = "", + output = "", + style = "", + examples = "" +) +} +\arguments{ +\item{task}{(chr) The task ChatGPT should assess} + +\item{instructions}{(chr) Description of steps ChatGPT should follow} + +\item{output}{(chr) The type/kind of output required} + +\item{style}{(chr) The style ChatGPT should use in the output} + +\item{examples}{(chr) Some examples of correct output} +} +\value{ +(function) a function that can be used to prompt the user, +accepting a string of text as input and returning the complete +prompt based on the desired context. +} +\description{ +This function create a function that can be used to prompt the user +for data in a specific context. Given the interested context, the +function created will accept a string of text as input and return the +complete prompt based on the desired context. +} +\examples{ +prompter <- create_usr_data_prompter( + task = "Your task is to extract information from a text provided.", + instructions = " + You should extract the first and last words of the text.", + output = " + Return the first and last words of the text separated by a dash, + i.e., `first - last`.", + style = " + Do not add any additional information, return only the requested + information.", + examples = " + text: 'This is an example text.' + output: 'This - text' + text: 'Another example text!!!' + output: 'Another - text'" +) +prompter("This is an example text.") +prompter("Another example text!!!") + +# You can also use it with a data frame to programmaically create +# prompts for each row of a data frame's column. +db <- data.frame( + text = c("This is an example text.", "Another example text!!!") +) +db$text |> purrr::map_chr(prompter) + +} diff --git a/man/get_completion_from_messages.Rd b/man/get_completion_from_messages.Rd index 2ea8603..7a87167 100644 --- a/man/get_completion_from_messages.Rd +++ b/man/get_completion_from_messages.Rd @@ -10,12 +10,13 @@ get_completion_from_messages( messages, model = c("gpt-3.5-turbo", "gpt-4-turbo"), temperature = 0, - max_tokens = 1000 + max_tokens = 1000, + quiet = FALSE ) get_content(completion) -get_tokens(completion, what = c("total", "prompt", "completion")) +get_tokens(completion, what = c("total", "prompt", "completion", "all")) } \arguments{ \item{messages}{(list) in the following format: \verb{⁠list(list("role" = "user", "content" = "Hey! How old are you?")} (see: @@ -33,10 +34,13 @@ https://platform.openai.com/docs/api-reference/chat/create#chat/create-temperatu maximum number of tokens to generate in the chat completion. (see: https://platform.openai.com/docs/api-reference/chat/create#chat/create-max_tokens)} +\item{quiet}{(lgl, default = FALSE) whether to suppress messages} + \item{completion}{the number of tokens used for output of a \code{get_completion_from_messages} call} -\item{what}{(chr) one of "total" (default), "prompt", or "completion"} +\item{what}{(chr) one of "total" (default), "prompt", "completion", +or "all"} } \value{ (list) of two element: \code{content}, which contains the chr @@ -47,7 +51,8 @@ other two) (chr) the output message returned by the assistant -(int) number of token used in completion for prompt or completion part, or overall (total) +(int) number of token used in completion for prompt or +completion part, or overall (total) } \description{ Get completion from chat messages diff --git a/tests/testthat/test-compose_prompt.R b/tests/testthat/test-compose_prompt.R index d34edb4..442ef9c 100644 --- a/tests/testthat/test-compose_prompt.R +++ b/tests/testthat/test-compose_prompt.R @@ -135,4 +135,3 @@ test_that("query_gpt_on_column works", { expect_tibble(res_not_simplified, ncols = 2, nrows = 2) expect_tibble(res_without_source_text, ncols = 1, nrows = 2) }) - diff --git a/tests/testthat/test-compose_prompt_api.R b/tests/testthat/test-compose_prompt_api.R new file mode 100644 index 0000000..29a6058 --- /dev/null +++ b/tests/testthat/test-compose_prompt_api.R @@ -0,0 +1,24 @@ +test_that("compose_prompt_api works", { + # setup + role <- "role" + context <- "context" + task <- "task" + instructions <- "instructions" + + sys_prompt <- compose_prompt_system(role = role, context = context) + usr_prompt <- compose_prompt_user( + task = task, instructions = instructions + ) + + # execution + res <- compose_prompt_api(sys_prompt, usr_prompt) + + # expectation + expect_list(res, "list", len = 2) + expect_list(res[[1]], "character", len = 2) + expect_list(res[[2]], "character", len = 2) + expect_string(res[[1]][[1]]) + expect_string(res[[1]][[2]]) + expect_string(res[[2]][[1]]) + expect_string(res[[2]][[2]]) +})