Creazione di complesse query SQL con l’assistenza dell’IA generativa

Creazione di query SQL complesse con IA generativa

Introduzione

Il lancio di ChatGPT ha segnato un momento senza precedenti nella storia dell’IA. Con le loro incredibili capacità, ChatGPT e molti altri strumenti di IA generativa hanno il potenziale per cambiare in modo significativo il modo in cui lavoriamo. Scrivere SQL è già una delle attività che stanno cambiando nel campo della scienza dei dati a seguito della rivoluzione dell’IA. Forniremo un esempio illustrativo di utilizzo del linguaggio naturale per connettersi e interagire con un database SQL. Utilizzerai il pacchetto open-source Vanna di Python. Il link al Notebook è qui. Padrona l’arte di creare complesse query SQL con l’AI generativa. Scopri come semplificare le interazioni con il database utilizzando prompt di linguaggio naturale in questa guida illuminante.

Obiettivi di Apprendimento

In questo articolo imparerai:

  • Perché scrivere SQL è una sfida comune nei progetti basati sui dati?
  • Il potenziale dell’IA generativa per rendere SQL più facile e accessibile
  • Come possono essere implementati LLM per scrivere SQL utilizzando prompt di linguaggio naturale?
  • Come connettersi e interagire con un database SQL utilizzando il pacchetto Vanna di Python?
  • Limitazioni di Vanna e, più in generale, di LLM nella scrittura di SQL.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

SQL: Una Sfida Comune nei Progetti Basati sui Dati

SQL è uno dei linguaggi di programmazione più popolari e ampiamente utilizzati. La maggior parte delle aziende moderne ha adottato l’architettura SQL per archiviare e analizzare i dati aziendali. Tuttavia, non tutti all’interno dell’azienda sono in grado di sfruttare quei dati. Potrebbero mancare le competenze tecniche o non essere familiari con la struttura e lo schema del database.

Qualunque sia il motivo, questo è spesso un ostacolo nei progetti basati sui dati, poiché per rispondere alle domande aziendali tutti dipendono dalla disponibilità di poche persone che sanno come utilizzare il database SQL. Non sarebbe fantastico se tutti all’interno dell’azienda, indipendentemente dalle loro competenze in SQL, potessero sfruttare quei dati ogni volta, ovunque, tutti insieme?

Questo potrebbe presto essere possibile grazie all’aiuto dell’IA generativa. Sviluppatori e ricercatori stanno già testando approcci diversi per addestrare Modelli di Linguaggio Ampi (LLM) – la tecnologia di base della maggior parte degli strumenti di IA generativa – per scopi di SQL. Ad esempio, LangChain, il framework popolare per lo sviluppo di applicazioni basate su LLM, può ora connettersi e interagire con database SQL basati su prompt di linguaggio naturale.

Tuttavia, questi strumenti sono ancora in uno stadio embrionale. Spesso restituiscono risultati inaccurati o subiscono così dette allucinazioni LLM, soprattutto quando si lavora con database grandi e complessi. Inoltre, potrebbero non essere sufficientemente intuitivi per gli utenti non tecnici. Pertanto, c’è ancora un ampio margine di miglioramento.

Vanna in Breve

Vanna è un agente di intelligenza artificiale progettato per democratizzare l’uso di SQL. Partendo da un modello pre-addestrato basato su una combinazione di LLM di terze parti da OpenAI e Google, è possibile ottimizzare un modello personalizzato specifico per il proprio database.

Una volta che il modello è pronto, è sufficiente porre domande aziendali in linguaggio naturale e il modello le tradurrà in query SQL. Sarà anche possibile eseguire le query sul database di destinazione. Basta chiedere al modello e restituirà la query insieme a un DataFrame di pandas con i risultati, un grafico plotly e un elenco di domande di approfondimento.

Per creare il modello personalizzato, Vanna deve essere addestrata con informazioni contestualmente rilevanti, tra cui esempi di SQL, documentazione del database e schemi del database, ovvero il linguaggio di definizione dei dati (DDL). L’accuratezza del modello dipenderà in definitiva dalla qualità e quantità dei dati di addestramento. La buona notizia è che il modello è progettato per continuare a imparare mentre lo si utilizza. Poiché le query SQL generate vengono automaticamente aggiunte ai dati di addestramento, il modello imparerà dai propri errori precedenti e migliorerà gradualmente.

Tutto il processo è illustrato nell’immagine seguente:

Leggi questo articolo per saperne di più sulle specifiche tecniche dei LLM e altri tipi di reti neurali.

Ora che conosci la teoria, passiamo alla pratica.

Primi passi

Come per qualsiasi pacchetto Python, devi prima installare Vanna. Il pacchetto è disponibile su PyPI e dovrebbe essere installato in pochi secondi.

Una volta che hai Vanna sul tuo computer, importala nel tuo ambiente di lavoro utilizzando l’alias vn:

# Installa vanna, se necessario
%pip install vanna

# Importa i pacchetti
import pandas as pd
import vanna as vn

Per utilizzare Vanna, devi creare un account e ottenere una chiave API. Questo è un processo semplice. Esegui la funzione vn.get_api_key() con la tua email e ti verrà inviato un codice nella tua casella di posta. Inserisci semplicemente il codice, quindi esegui vn.set_api_key() e sei pronto per utilizzare Vanna.

# Crea un account e ottieni una chiave API
api_key = vn.get_api_key('[email protected]')
vn.set_api_key(api_key)

Come funzionano i modelli in Vanna?

Con Vanna, puoi creare quanti modelli personalizzati desideri. Supponiamo che tu faccia parte del dipartimento marketing della tua azienda. Il tuo team lavora normalmente con il data warehouse Snowflake dell’azienda e un database PostgreSQL specifico per il dipartimento. Potresti quindi creare due modelli diversi, ciascuno addestrato sulle caratteristiche specifiche dei database e con diverse autorizzazioni di accesso.

Per creare un modello, utilizza la funzione vn.create_model(model, db_type), fornendo un nome e il tipo di database. Vanna può essere utilizzata con qualsiasi database che supporti la connessione tramite Python, inclusi SQLite, PostgreSQL, Snowflake, BigQuery e Amazon Athena.

Due database

Immagina di voler creare due modelli per i due database con cui lavora il tuo team:

# Crea i modelli
vn.create_model(model="data_warehouse", db_type="Snowflake")
vn.create_model(model="marketing_db", db_type="Postgres")

Una volta creati, puoi accedervi utilizzando la funzione vn.get_model(). La funzione restituirà un elenco dei modelli disponibili.

['data_warehouse',
 'marketing_db',
 'my-dataset2',
 'demo-tpc-h',
 'tpc',
 'chinook']

Avrai notato che ci sono più modelli rispetto a quelli appena creati. Questo perché Vanna include un insieme di modelli pre-addestrati che possono essere utilizzati per scopi di test.

Gioccheremo con il modello “chinook” per il resto del tutorial. È addestrato sul Chinook, un database fittizio SQLite contenente informazioni su un negozio di musica. Per maggior chiarezza, di seguito puoi trovare le tabelle e le relazioni che compongono il database:

Seleziona il modello

Per selezionare quel modello, esegui:

# Imposta il modello
vn.set_model('chinook')

Questa funzione imposterà il modello da utilizzare per l’API di Vanna. Consentirà all’agente di inviare le tue richieste al LLM sottostante, sfruttando le sue capacità con i dati di addestramento per tradurre le tue domande in linguaggio naturale in query SQL.

Tuttavia, se desideri che l’agente esegua le query SQL generate sul database, sarà necessario connettersi ad esso. A seconda del tipo di database, avrai bisogno di una diversa funzione di connessione. Poiché stiamo utilizzando un database SQLite, utilizzeremo la funzione vn.connect_to_sqlite(url) con l’URL in cui è ospitato il database:

# Connetti al database
url= """https://github.com/lerocha/chinook-database/raw/master
/ChinookDatabase/DataSources/Chinook_Sqlite.sqlite"""
vn.connect_to_sqlite(url=url)

Modello Chinook

Come accennato, il modello Chinook è già pre-addestrato con informazioni contestualmente rilevanti. Una delle cose più interessanti di Vanna è che hai sempre il pieno controllo sul processo di addestramento. In qualsiasi momento, puoi verificare quali dati sono presenti nel modello. Ciò viene fatto con la funzione vn.get_training_data(), che restituirà un DataFrame pandas con i dati di addestramento:

# Verifica dei dati di addestramento
training_data = vn.get_training_data()
training_data

Il modello è stato addestrato con una combinazione di domande con le relative query SQL, DDL e documentazione del database. Se si desidera aggiungere ulteriori dati di addestramento, è possibile farlo manualmente utilizzando la funzione vn.train(). A seconda dei parametri utilizzati, la funzione può raccogliere diversi tipi di dati di addestramento:

  • vn.train(question, sql): Aggiunge nuove coppie domanda-query SQL.
  • vn.train(ddl): Aggiunge una dichiarazione DDL al modello.
  • vn.train(documentazione): Aggiunge documentazione del database.

Ad esempio, includiamo la domanda “Quali sono i primi cinque negozi per vendite?” e la relativa query SQL:

# Aggiungi coppia domanda-query
vn.train(question="Quali sono i primi cinque negozi per vendite?", 
         sql="""SELECT BILLINGCITY, SUM(TOTAL) 
         FROM INVOICE 
         GROUP BY 1 
         ORDER BY 2 DESC 
         LIMIT 5;""" )

Addestrare manualmente il modello può essere scoraggiante e richiedere molto tempo. Esiste anche la possibilità di addestrare il modello automaticamente dicendo all’agente Vanna di esplorare il database per recuperare i metadati. Purtroppo, questa funzionalità è ancora in fase sperimentale ed è disponibile solo per i database Snowflake, quindi non ho avuto la possibilità di provarla.

Fare domande

Ora che il tuo modello è pronto, passiamo alla parte più divertente: fare domande.

Per fare una domanda, devi utilizzare la funzione vn.ask(domanda). Iniziamo con una domanda facile:

vn.ask(domanda='Quali sono i primi 5 artisti jazz per vendite?')

Vanna cercherà di restituire automaticamente gli elementi già menzionati: la query SQL, un DataFrame di Pandas con i risultati, un grafico creato con plotly e una lista di domande di approfondimento. Quando eseguiamo questa riga, i risultati sembrano accurati:

SELECT a.name, sum(il.quantity) as total_sales
FROM artist a 
INNER JOIN album al 
  ON a.artistid = al.artistid 
INNER JOIN track t 
  ON al.albumid = t.albumid 
INNER JOIN invoiceline il 
  ON t.trackid = il.trackid 
INNER JOIN genre g 
  ON t.genreid = g.genreid
WHERE g.name = 'Jazz'
GROUP BY a.nameORDER 
BY total_sales DESC
LIMIT 5;

Salva i risultati

Supponiamo che tu voglia salvare i risultati invece di stamparli. In tal caso, puoi impostare il parametro print_results su False e salvare i risultati in diverse variabili che potrai successivamente scaricare in un formato desiderato utilizzando tecniche comuni, come il metodo .to_csv() di pandas per il DataFrame e il metodo .write_image() di plotly per la visualizzazione:

sql, df, fig, followup_questions = vn.ask(domanda='Quali sono i primi 5 artisti jazz per vendite?', 
                                          print_results=False)

# Salva il DataFrame e l'immagine
df.to_csv('top_artisti_jazz.csv', index=False)
fig.write_image('top_artisti_jazz.png')

La funzione ha un altro parametro chiamato auto_train impostato su True per impostazione predefinita. Ciò significa che la domanda verrà automaticamente aggiunta al set di dati di addestramento. Possiamo confermarlo utilizzando la seguente sintassi:

training_data = vn.get_training_data()
training_data['question'].str.contains('Quali sono i primi 5 artisti jazz per vendite?').any()

Nonostante le impressionanti capacità della funzione vn.ask(domanda), mi chiedo come si comporterà nel mondo reale, probabilmente con database più grandi e complessi. Inoltre, indipendentemente da quanto potente sia il modello LLM sottostante, il processo di addestramento sembra essere la chiave per ottenere un’alta precisione. Quanti dati di addestramento sono necessari? Quali rappresentazioni devono avere? È possibile accelerare il processo di addestramento per sviluppare un modello pratico e operativo?

D’altra parte, Vanna è un progetto completamente nuovo e molte cose potrebbero essere migliorate. Ad esempio, le visualizzazioni di plotly non sembrano molto convincenti e sembra non ci siano strumenti per personalizzarle. Inoltre, la documentazione potrebbe essere chiarita e arricchita con esempi illustrativi.

Inoltre, ho notato alcuni problemi tecnici che non dovrebbero essere difficili da risolvere. Ad esempio, quando si desidera conoscere solo un punto dati, la funzione si interrompe nel tentativo di costruire il grafico, il che ha senso perché, in quegli scenari, una visualizzazione è inutile. Ma il problema è che non si vedono le domande di follow-up e, cosa più importante, non si può scomporre la tupla.

Ad esempio, guarda cosa succede quando si desidera conoscere il dipendente più anziano.

vn.ask(question='Chi è il dipendente più anziano')

Conclusioni

Vanna è uno dei molti strumenti che stanno cercando di sfruttare la potenza degli LLM per rendere SQL accessibile a tutti, indipendentemente dalla loro competenza tecnica. I risultati sono promettenti, ma c’è ancora molta strada da fare per sviluppare agenti di intelligenza artificiale in grado di rispondere in modo accurato a tutte le domande di business con le query SQL. Come abbiamo visto in questo tutorial, mentre gli LLM potenti svolgono un ruolo essenziale nell’equazione, il segreto risiede ancora nei dati di addestramento. Data l’ubiquità di SQL nelle aziende di tutto il mondo, automatizzare le attività di scrittura delle query potrebbe essere un cambiamento epocale. Pertanto, vale la pena osservare come strumenti SQL basati su intelligenza artificiale come Vanna si evolvano in futuro.

Punti chiave

  • L’intelligenza artificiale generativa e gli LLM stanno cambiando rapidamente la scienza dei dati tradizionale.
  • Scrivere SQL è un compito impegnativo e che richiede tempo e spesso porta a rallentamenti nei progetti basati sui dati.
  • SQL potrebbe diventare più semplice e accessibile grazie agli strumenti AI di prossima generazione.
  • Vanna è uno dei tanti strumenti che cercano di affrontare questo problema con la potenza degli LLM.

Domande frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell’autore.