Come configurare un sistema NL2SQL con Azure OpenAI Studio

Configurazione di un sistema NL2SQL con Azure OpenAI Studio

Vedremo come utilizzare Azure OpenAI Studio per configurare un endpoint di inferenza che possiamo chiamare per generare comandi SQL.

Questo articolo fa parte di un corso su Large Language Models disponibile su GitHub.

Creato dall'autore con Dall-E2

Nell’articolo precedente, abbiamo imparato come configurare un prompt in grado di generare comandi SQL dalle richieste dell’utente.

Ora, vedremo come utilizzare Azure OpenAI Studio per creare un endpoint di inferenza che possiamo chiamare per generare comandi SQL.

Anche se stai leggendo queste righe, probabilmente soddisfi già i requisiti, ti ricordo che è necessario avere:

  • È necessario un abbonamento Azure, che è gratuito e viene fornito con crediti gratuiti iniziali se ti registri per la prima volta. Crea un abbonamento Azure.
  • È anche necessario ottenere accesso alle risorse OpenAI. Attualmente, Microsoft ha ridotto i requisiti e i tempi di attesa. Il modulo di richiesta potrebbe sembrare più intimidatorio di quanto sia in realtà. Ho richiesto l’accesso utilizzando un’email da un dominio registrato e ho menzionato che volevo informazioni per un corso. Mi hanno concesso l’accesso quasi immediatamente. Richiedi l’accesso ad Azure OpenAI Studio.

È molto probabile che la necessità di richiedere l’accesso scompaia presto. Quindi, ti consiglierei comunque di provare, anche se non hai richiesto il permesso.

Configurazione di Azure OpenAI Studio.

Possiamo accedervi direttamente dal portale di Azure: https://portal.azure.com/#home

Una volta all’interno, nei servizi, è necessario selezionare Azure AI Services.

Facciamo clic su Azure OpenAI Account.

In questa schermata, è necessario scegliere la Sottoscrizione. Se hai una sottoscrizione per studenti, è probabile che non funzioni. Crea una diversa.

Per il gruppo di risorse, ne creerei uno nuovo. Puoi dargli qualsiasi nome tu voglia. È solo un raggruppamento logico che mantiene tutte le risorse sotto un unico gruppo. In questo modo, quando elimini il gruppo, rimuovi tutte le risorse create senza influire su altri progetti o gruppi. Poiché si tratta solo di un progetto temporaneo, è una buona pratica eliminarlo alla fine per evitare costi.

Per la Regione, scegli quella più vicina alla tua posizione. Azure ti mostrerà solo le regioni in cui sono disponibili i servizi OpenAI.

Per il Nome, scegli un nome unico per il tuo progetto.

Per il Livello di Prezzi, seleziona Standard S0. Questa è probabilmente l’unica opzione disponibile per te.

Con questo, puoi premere il pulsante Review+Create, verificare i dati e iniziare a goderti il servizio.

La configurazione richiederà alcuni minuti per completarsi e, una volta terminata, vedrai uno schermo simile a questo:

Clicca su Go to Resource.

Ora puoi creare una nuova distribuzione dalla sezione Model Deployments. Basta dargli un nome e scegliere il modello: GPT-3.5-Turbo.

In pochi secondi, Azure OpenAI Studio completerà la distribuzione.

Cliccando sul nome della distribuzione, possiamo iniziare a lavorare.

Nella sezione PlayGround, seleziona Chat e puoi iniziare a inserire il tuo prompt.

Abbiamo creato il prompt seguendo il paper ‘How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings

create table employees(        ID_Usr INT primary key,        name VARCHAR);    /*3 righe di esempio    select * from employees limit 3;    ID_Usr    name    1344      George StPierre    2122      Jon jones    1265      Anderson Silva    */    create table salary(        ID_Usr INT,        year DATE,        salary FLOAT,        foreign key (ID_Usr) references employees(ID_Usr));    /*3 righe di esempio    select * from salary limit 3    ID_Usr    date          salary    1344      01/01/2023    61000    1344      01/01/2022    60000    1265      01/01/2023    55000    */    create table studies(        ID_study INT,        ID_Usr INT,        educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */        Institution VARCHAR,        Years DATE,        Speciality VARCHAR,        primary key (ID_study, ID_Usr),        foreign key(ID_Usr) references employees (ID_Usr));    /*3 righe di esempio    select * from studies limit 3    ID_Study ID_Usr educational_level Institution    Years       Speciality    2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing    2334     1344   5                 MIT            01/01/2023  Phd. Data Science.    2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing    */-Mantieni l'ordine SQL semplice ed efficiente, utilizzando SQL Lite valido, rispondi alle seguenti domande per la tabella fornita. Domanda: Quanti dipendenti abbiamo con uno stipendio superiore a 50000?SELECT COUNT(*) AS total_employeesFROM employees eINNER JOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.salary > 50000;  Domanda: Restituisci i nomi delle tre persone che hanno avuto l'aumento di stipendio più alto negli ultimi tre anni.SELECT e.nameFROM employees eJOIN salary s ON e.ID_usr = s.ID_usrWHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)GROUP BY e.nameORDER BY (MAX(s.salary) - MIN(s.salary)) DESCLIMIT 3;Domanda: Il nome dell'impiegato con il salario più alto.

Questo è il nostro prompt completo. Dovremo dividerlo in parti per inserire ciascuna sezione nella sua casella corrispondente.

Nella casella del Messaggio di sistema, inseriremo l’intero prompt tranne gli esempi:

create table employees(        ID_Usr INT primary key,        name VARCHAR);    /*3 righe di esempio    select * from employees limit 3;    ID_Usr    name    1344      George StPierre    2122      Jon jones    1265      Anderson Silva    */    create table salary(        ID_Usr INT,        year DATE,        salary FLOAT,        foreign key (ID_Usr) references employees(ID_Usr));    /*3 righe di esempio    select * from salary limit 3    ID_Usr    date          salary    1344      01/01/2023    61000    1344      01/01/2022    60000    1265      01/01/2023    55000    */    create table studies(        ID_study INT,        ID_Usr INT,        educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */        Institution VARCHAR,        Years DATE,        Speciality VARCHAR,        primary key (ID_study, ID_Usr),        foreign key(ID_Usr) references employees (ID_Usr));    /*3 righe di esempio    select * from studies limit 3    ID_Study ID_Usr educational_level Institution    Years       Speciality    2782     1344   3                 UC San Diego   01/01/2010  Laurea in Scienze del Marketing    2334     1344   5                 MIT            01/01/2023  Dottorato in Data Science    2782     2122   3                 UC San Diego   01/01/2010  Laurea in Scienze del Marketing    */-Mantieni l'ordine SQL semplice ed efficiente, utilizzando SQL Lite valido, rispondi alle seguenti domande per la tabella fornita sopra. 

In questa sezione, abbiamo fornito la struttura del database, alcuni esempi del suo contenuto e istruzioni per il modello per generare query SQL.

Ora è il momento di popolare la sezione Esempi con gli esempi della nostra richiesta. Nella richiesta originale, ne abbiamo due:

Domanda: Quanti dipendenti abbiamo con uno stipendio superiore a 50000?SELECT COUNT(*) AS total_employeesFROM employees eINNER JOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.salary > 50000;  Domanda: Restituire i nomi delle tre persone che hanno avuto il maggior aumento di stipendio negli ultimi tre anni.SELECT e.nameFROM employees eJOIN salary s ON e.ID_usr = s.ID_usrWHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)GROUP BY e.nameORDER BY (MAX(s.salary) - MIN(s.salary)) DESCLIMIT 3;Domanda: Il nome del dipendente più pagato.

Come puoi vedere, abbiamo creato un esempio per ogni query. Questa tecnica è conosciuta come few-shot sampling e permette al modello di capire come dovrebbe rispondere alle query dell’utente.

Il numero ottimale di esempi va generalmente da uno a sei; aggiungere più esempi potrebbe non avere un impatto positivo significativo sulla risposta del modello.

Possiamo anche modificare le impostazioni degli iperparametri.

Per la generazione di codice, consiglio di utilizzare una temperatura di 0. Non c’è bisogno che il modello sia eccessivamente fantasioso nelle sue risposte.

È ora di iniziare a giocare e testare la richiesta.

Da qui, se ci piacciono le risposte, possiamo fare due cose:

  • Esportare la configurazione. Salverà un file che possiamo utilizzare per riconfigurare il Playground.
  • Cliccare su Vedi Codice, che fornirà un esempio di codice per chiamare il nostro modello.

Chiamare i servizi Azure OpenAI da un Notebook.

Il notebook è disponibile nel repository del corso Large Language Models Course su Github.

Large-Language-Model-Notebooks-Course/P1-NL2SQL/NL2SQL_OpenAI_Azure.ipynb su main ·…

Corso pratico sui grandi modelli di linguaggio. . Contribuisci a peremartra/Large-Language-Model-Notebooks-Course…

github.com

Iniziamo installando e importando la libreria OpenAI.

#Install openai !pip install -q "openai<1.0.0"import osimport openai

Ora dobbiamo configurare l’accesso ad Azure.

#Configurazione Azureopenai.api_type = "azure"#Qui il punto di inferenza che si può ottenere da Azureopenai.api_base = "https://openaicourseperemartra.openai.azure.com/"openai.api_version = "2023-07-01-preview"openai.api_key = "la-tua-chiave-azure-openai"

Informare il prompt:

context = [{'role':'system', 'content':"""create table employees(    ID_Usr INT primary key,    name VARCHAR);/* 3 righe di esempioselect * from employees limit 3;ID_Usr    name1344      George StPierre2122      Jon jones1265      Anderson Silva*/create table salary(    ID_Usr INT,    year DATE,    salary FLOAT,    foreign key (ID_Usr) references employees(ID_Usr));/* 3 righe di esempioselect * from salary limit 3ID_Usr    date          salary1344      01/01/2023    610001344      01/01/2022    600001265      01/01/2023    55000*/create table studies(    ID_study INT,    ID_Usr INT,    educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */    Institution VARCHAR,    Years DATE,    Speciality VARCHAR,    primary key (ID_study, ID_Usr),    foreign key(ID_Usr) references employees (ID_Usr));/* 3 righe di esempioselect * from studies limit 3ID_Study ID_Usr educational_level Institution    Years       Speciality2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing2334     1344   5                 MIT            01/01/2023  Phd. Data Science.2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing*/Mantenere l'ordinamento SQL semplice ed efficiente, utilizzando SQL Lite valido, rispondere alle seguenti domande per la tabella fornita. Domanda: Quanti dipendenti abbiamo con uno stipendio superiore a 50000?SELECT COUNT(*) AS total_employeesFROM employees eINNER JOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.salary > 50000;Question: Restituire i nomi delle tre persone che hanno avuto il più alto aumento di stipendio negli ultimi tre anni.SELECT e.nameFROM employees eJOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)GROUP BY e.nameORDER BY (MAX(s.salary) - MIN(s.salary)) DESCLIMIT 3;"""}]

Sto per creare una funzione per incapsulare la chiamata all’API di OpenAI.

#Funzione per chiamare il modello.def return_CCRMSQL(user_message, context):    newcontext = context.copy()    newcontext.append({'role':'user', 'content':"question: " + user_message})    response = openai.ChatCompletion.create(      engine="GPT3NL2SQLSample1Deployment", #La nostra distribuzione      messages = newcontext,      temperature=0,      max_tokens=800)    return (response.choices[0].message["content"])

Ora possiamo procedere con i test necessari e ottenere il codice SQL per interrogare il nostro database:

context_user = context.copy()print(return_CCRMSQL("Il nome del dipendente con il salario più alto", context_user))

SELECT e.name FROM employees e JOIN salary s ON e.ID_usr = s.ID_usr WHERE s.salary = (SELECT MAX(salary) FROM salary); Questa query restituirà il nome del dipendente con il salario più alto.

print(return_CCRMSQL("Restituisci l'istituzione con un salario medio più alto", context_user))

SELECT st.Institution, AVG(sa.salary) AS avg_salary FROM studies st JOIN employees e ON st.ID_Usr = e.ID_Usr JOIN salary sa ON e.ID_Usr = sa.ID_Usr GROUP BY st.Institution ORDER BY avg_salary DESC LIMIT 1;

Conclusioni.

Una volta determinato quale prompt utilizzare, configurare i servizi Azure OpenAI e utilizzare i modelli OpenAI ospitati su Azure anziché l’API OpenAI è un compito semplice.

La scelta tra l’uso di uno o dell’altro dipende dalle decisioni della tua azienda. I modelli OpenAI utilizzati tramite Azure Open Services non risiedono all’interno di OpenAI. In altre parole, i dati forniti non lasciano mai la tua sottoscrizione di Azure e non verranno mai utilizzati per addestrare futuri modelli OpenAI.

Da un punto di vista tecnico, le differenze sono minime e la complessità è praticamente inesistente.

Risorse.

Il corso completo su Large Language Models è disponibile su Github. Per rimanere aggiornato su nuovi articoli, considera di seguire il repository o di dargli una stella. In questo modo riceverai notifiche ogni volta che viene aggiunto nuovo contenuto.

GitHub – peremartra/Large-Language-Model-Notebooks-Course: Corso pratico sui grandi modelli di linguaggio…

Corso pratico sui grandi modelli di linguaggio. . Contribuisci a peremartra/Large-Language-Model-Notebooks-Course…

github.com

Il prompt utilizzato nelle soluzioni si basa sul paper “How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings.

Questo articolo fa parte di una serie in cui esploriamo le applicazioni pratiche dei grandi modelli di linguaggio. Puoi trovare il resto degli articoli nell’elenco seguente:

Pere Martra

Pere Martra

Corso pratico sui grandi modelli di linguaggio

Visualizza elenco12 storie

Scrivo regolarmente su Deep Learning e Intelligenza Artificiale. Considera seguirmi su VoAGI per ricevere aggiornamenti su nuovi articoli. E, naturalmente, sei il benvenuto a collegarti con me su LinkedIn e su Twitter.