L'integrazione delle funzionalità dei Large Language Models (LLM) nelle applicazioni R non è più un problema grazie a una serie di strumenti in rapida evoluzione. Sebbene l'ecosistema di intelligenza artificiale generativa di R non possa ancora competere con quello di Python in termini di ampiezza, ha compiuto passi da gigante negli ultimi mesi. Inizialmente, l'attenzione era focalizzata principalmente su strumenti legati a ChatGPT, ma ora è disponibile un supporto nativo più esteso per vari fornitori di LLM. Inoltre, si è ampliata la gamma di compiti di intelligenza artificiale generativa che gli sviluppatori possono affrontare con R.

In questo articolo, presentiamo cinque dei migliori strumenti per integrare grandi modelli linguistici nei progetti R, sia per l'esecuzione locale che tramite API.

ellmer

Uno degli strumenti più importanti per integrare gli LLM nei flussi di lavoro di R è ellmer. Questo progetto è nato nell'azienda open-source Posit ed è mantenuto da sviluppatori che si sono già fatti un nome con altri popolari pacchetti R, come ggplot2 e il framework web Shiny R. Inoltre, questo strumento gode di una comunità vivace ed entusiasta, come evidenziato dal commento di Kyle Walker:

{ellmer} è la migliore interfaccia #LLM in qualsiasi lingua, a mio parere, e vi incoraggio a provare il nuovo supporto PDF.

Scopri di più: ellmer.tidyverse.org/

— Kyle Walker (@kylewalker.bsky.social)

14 febbraio 2025 alle 22:41

Quando si tratta di dettagli tecnici, ellmer è ben documentato e supporta una vasta gamma di funzioni, casi d'uso e piattaforme di intelligenza artificiale. Tra queste ultime troviamo:

  • OpenAI
  • Azure OpenAI
  • Anthropic
  • Google Gemini
  • AWS Bedrock
  • Snowflake Cortex
  • Perplexity AI
  • Ollama (per modelli locali)

È possibile installare il pacchetto ellmer nel modo usuale tramite CRAN, oppure testare la versione di sviluppo con pak::pak("tidyverse/ellmer").

Utilizzo di ellmer

Per utilizzare ellmer, è necessario creare innanzitutto un oggetto chat con funzioni come chat_openai() o chat_claude(). Questo oggetto verrà poi utilizzato per interagire con il Large Language Model. Per scoprire come archiviare la vostra chiave API (se non state utilizzando un modello locale), consultate il file di aiuto della funzione chat.

Ad esempio, un oggetto chat OpenAI di base potrebbe essere creato nel seguente modo:

library(ellmer)
my_chat <- chat_openai()

Nel caso di Claude di Anthropic, la sintassi sarebbe:

my_chat_claude <- chat_claude()

I prompt di sistema non sono strettamente necessari, ma sono raccomandati per compiti specifici. Non è nemmeno necessario impostare un modello per tutte le funzioni di chat. Tuttavia, è una buona idea farlo per evitare di essere sorpresi da un modello obsoleto o molto costoso.

All'inizio del 2025, Anthropic Claude Sonnet 3.5 sembra essere il più adatto per il codice R, e secondo i primi rapporti, il prossimo modello Sonnet 3.7 dovrebbe avere prestazioni ancora migliori in generale. Tuttavia, poiché il panorama degli LLM si evolve rapidamente, è importante rimanere informati. Un consiglio a questo punto: OpenAI o3-mini, secondo la nostra esperienza, è anche molto bravo a scrivere codice R ed è più economico di Sonnet. Tuttavia, essendo un modello di ragionamento, potrebbe non reagire così rapidamente come l'LLM di Anthropic.

Se si desidera definire altri parametri per il modello (inclusa la temperatura), utilizzare api_arg. Ciò richiede una lista nominata come:

my_chat <- chat_openai(
  api_arg = list(temperature = 0.5)
)

Una temperatura più alta è spesso associata a un output più "creativo", mentre una più bassa a uno più preciso. Va notato che la temperatura non è un argomento esplicito nelle funzioni di chat di ellmer. Pertanto, è necessario definirla all'interno dell'elenco api_arg. Un elenco degli argomenti disponibili e degli intervalli di valori validi per la temperatura (e altre impostazioni) è disponibile nella documentazione API del rispettivo fornitore del modello.

Per utilizzare gli oggetti chat, ellmer può:

  • offrire un'interfaccia chatbot (nella console R o nel browser),
  • trasmettere e salvare i risultati in formato testo, oppure
  • salvare solo i risultati della query, senza lo streaming.

Nella console R, live_console(my_chat) apre un'interfaccia di chat. In un browser, si utilizza live_browser(my_chat). In entrambi i casi, le risposte vengono trasmesse in streaming.

La "Chiamata a metodo interattivo" di ellmer utilizza una sintassi come my_chat$chat() per visualizzare le risposte in streaming e per salvare il risultato in formato testo:

my_results <- my_chat$chat("Can you recommend some good R packages for data visualization?")

Se si utilizza nuovamente my_chat per porre un'altra domanda, la cronologia della chat con le domande e le risposte precedenti viene mantenuta, consentendo di fare riferimento ad esse, come nell'esempio seguente:

my_results2 <- my_chat$chat("Ora coloralo di turchese per favore")

La successiva query di chat contiene una cronologia di domande e risposte precedenti, consentendo al modello di mantenere il contesto.

Uso non interattivo e documentazione aggiuntiva

Se non si utilizza il codice ellmer in modo interattivo all'interno di uno script R come parte di un flusso di lavoro più ampio, la documentazione raccomanda di "impacchettare" il codice in una funzione R:

my_function <- function(prompt) {
  my_chat <- chat_openai()
  my_answer <- my_chat$chat(prompt)
  return(my_answer)
}

In questo caso, my_answer è una semplice stringa di testo.

Il pacchetto ellmer include anche documentazioni per:

  • Tool/Function Calling,
  • Prompt Design, o
  • Estrazione dati.

Lo abbiamo utilizzato in combinazione con il pacchetto shinychat per aggiungere funzionalità di chatbot a un'applicazione Shiny. In questo GitHub Gist pubblico, trovate codice di esempio per creare una semplice interfaccia di chat Shiny per LLM Ollama locali (incluso un menu a discesa per la selezione del modello e un pulsante per scaricare le chat).

tidyllm

Questo strumento ha radici tedesche: tidyllm è stato sviluppato da Eduard Brüll, ricercatore presso lo ZEW – Leibniz-Zentrum für Europäische Wirtschaftsforschung. Per quanto riguarda le funzioni, tidyllm e ellmer, di cui abbiamo appena parlato, presentano aree di sovrapposizione. Tuttavia, in termini di interfaccia utente e filosofia di progettazione, ci sono differenze sostanziali tra questi due strumenti di intelligenza artificiale per gli sviluppatori R.

Infatti, tidyllm combina "verbi" – il tipo di richiesta che si desidera effettuare, come chat() o send_batch() – con i fornitori. Queste richieste includono text embeddings, chat e elaborazione batch.

Attualmente, lo strumento tidyllm supporta i modelli AI di:

  • Anthropic (Claude),
  • OpenAI,
  • Google (Gemini),
  • Mistral,
  • Groq (non Grok),
  • Perplexity,
  • Azure OpenAI, nonché
  • modelli Ollama locali.

Se si utilizza un provider cloud, è necessario impostare prima la chiave API, tramite sys.setenv() o tramite il file .Renviron.

Interagire con tidyllm

Una semplice query di chat di solito inizia creando un semplice oggetto LLMMessage con la funzione llm_message("la tua query qui") e passandolo a una funzione chat():

library(tidyllm)

my_conversation <- llm_message("Per favore, spiegami i vantaggi di R per l'analisi dei dati.") |>
  chat(openai(.model = "gpt-4o-mini", .temperature = 0, .stream = FALSE))

La funzione llm_message() può anche contenere un messaggio .system_prompt, utile per guidare il comportamento del modello.

Il valore restituito da my_conversation è semplicemente una stringa di testo con la risposta del modello, che può essere facilmente stampata o utilizzata. Su questa base, è possibile aggiungere un altro messaggio e una chat, mantenendo la query e la risposta originali in memoria:

# Mantiene la cronologia dell'ultimo messaggio
my_conversation2 <- my_conversation |>
  llm_message("Come potrei ruotare le etichette sull'asse x di 90 gradi?") |>
  chat(openai(.model = "gpt-4o-mini", .temperature = 0, .stream = FALSE))
print(my_conversation2)

Per estrarre i metadati dai risultati, utilizzare:

result_metadata(my_conversation2)

Questo restituisce un "Tibble" (un tipo speciale di Data Frame) che presenta colonne per:

  • model,
  • timestamp,
  • prompt_tokens,
  • completion_tokens,
  • total_tokens, e
  • liste api_specific con ulteriori dettagli sui token.

È anche possibile estrarre il messaggio utente che ha generato la risposta con get_user_message(my_conversation2).

Inoltre, llm_message() supporta anche modelli che consentono il caricamento di immagini con l'argomento .imagefile, nonché domande su file PDF con l'argomento .pdf (a condizione che sia installato il pacchetto R pdftools). Ad esempio, abbiamo scaricato il manuale di riferimento PDF di tidyllm da CRAN e lo abbiamo utilizzato per porre domande, dimostrando la capacità di elaborazione di documenti.

L'evoluzione continua di questi e altri strumenti rende R una piattaforma sempre più potente per gli sviluppatori che desiderano integrare le capacità avanzate degli LLM nei loro progetti, aprendo nuove possibilità per l'analisi dei dati, l'automazione e la creazione di applicazioni intelligenti.