In questo tutorial, effettueremo il prompt tune di un modello IBM® Granite utilizzando un set di dati sintetico contenente recensioni dei clienti su un'azienda di toelettatura per cani.
Il prompt tuning è un modo efficiente ed economico per adattare un foundation model di intelligenza artificiale (AI) a nuove attività a valle senza riqualificare l'intero modello e aggiornarne i pesi.
I foundation model sono basati su modelli linguistici di grandi dimensioni (LLM) e ricevono grandi quantità di dati di addestramento. I casi d'uso più comuni dei foundation model sono i chatbot e gli assistenti virtuali.
Esistono diversi modi per migliorare l'interpretazione dell'input e la qualità delle risposte da parte di un foundation model. Per comprendere meglio queste sfumature, confrontiamo alcuni metodi.
Gli hard prompt sono rivolti all'utente e richiedono un'azione da parte sua. Un hard prompt può essere pensato come un modello o come le istruzioni per l'LLM al fine di generare risposte. Di seguito viene presentato un esempio di hard prompt. Ti invitiamo a consultare la pagina della documentazione IBM per maggiori informazioni su questo tipo di prompt e su molti altri.
Utilizzando questo modello di hard prompt, è possibile fornire a un LLM istruzioni specifiche sulla struttura e sullo stile degli output preferiti. Attraverso questo prompt esplicito, l'LLM avrebbe maggiori probabilità di produrre risposte desiderabili di qualità superiore.
I soft prompt, a differenza degli hard prompt, non sono scritti in linguaggio naturale. In questo caso, i prompt vengono inizializzati come vettori numerici generati dall'AI aggiunti all'inizio di ogni embedding di input che estrae la conoscenza dal modello più ampio. Questa mancanza di interpretabilità si estende all'AI che sceglie prompt ottimizzati per una determinata attività. Spesso l'AI non è in grado di spiegare perché ha scelto quegli embedding. Rispetto ad altri metodi di richiesta, questi token virtuali sono meno dispendiosi dal punto di vista computazionale rispetto alla messa a punto, poiché il modello stesso rimane bloccato con pesi fissi. I soft prompt tendono a superare anche i prompt rigidi progettati dall'uomo.
In questo tutorial lavoreremo con i soft prompt per il tuning dei prompt.
Per creare un progetto watsonx.ai è necessario un account IBM Cloud .
Sebbene sia possibile scegliere tra diversi strumenti, questo tutorial illustra come configurare un account IBM per l'utilizzo di un Jupyter Notebook.
Accedi a watsonx.ai usando il tuo account IBM Cloud.
Crea un progetto watsonx.ai.
Puoi ottenere l'ID del tuo progetto dall'interno del tuo progetto. Clicca sulla scheda Gestisci. Quindi, copia l'ID del progetto dalla sezione Dettagli della pagina Generali. Per questo tutorial ti serve questo ID.
Crea un Jupyter Notebook.
Questo passaggio aprirà un ambiente Notebook in cui potrai copiare il codice da questo tutorial per implementare autonomamente il tuning del prompt. In alternativa, puoi scaricare questo notebook sul tuo sistema locale e caricarlo nel tuo progetto watsonx.ai come asset. Questo Jupyter Notebook, insieme ai set di dati utilizzati, è disponibile su GitHub.
Crea un'istanza di servizio watsonx.ai Runtime (seleziona l'area geografica appropriata e scegli il piano Lite, che è un'istanza gratuita).
Genera una chiave API.
Associa l'istanza del servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.
Abbiamo bisogno di alcune librerie e moduli per questo tutorial. Assicurati di importare le seguenti e, se non sono installate, puoi risolvere il problema con una rapida installazione pip.
Configura le tue credenziali. Inserisci la tua chiave API e l'ID del progetto.
Come primo passo per stabilire l'ambiente, crea un'istanza di APIClient con i suoi dati di autenticazione e imposti il suo project_id.
Output:
'SUCCESS'
Per questo tutorial utilizzeremo un set di dati sintetico costituito da recensioni di attività di toelettatura per cani. Utilizzando l'URL appropriato, possiamo collegare il set di dati al client API.
Puoi utilizzare qualsiasi set di dati tu preferisca. Diversi set di dati open source sono disponibili su piattaforme come HuggingFace.
Output
Creazione degli asset di dati...
SUCCESS
Output:
3b1db894-8d9e-428d-8fee-d96f328c7726
Per ottenere degli insight nella formattazione di queste recensioni dei clienti, carichiamo i dati in un dataframe Pandas e stampiamo alcune righe che mostrano sia le recensioni positive che quelle negative. Un output di "1" indica recensioni positive mentre "0" viene utilizzato per recensioni negative.
Output
La classe TuneExperiment viene utilizzata per creare esperimenti e pianificare il tuning. Usiamola per inizializzare il nostro esperimento e impostare il nostro foundation model, i dati di addestramento e i parametri. L'obiettivo di questo rapido esercizio di tuning del prompt è che l'LLM personalizzi le sue risposte in base alle valutazioni di soddisfazione dei clienti estratte dal nostro set di dati. Si tratta di un'attività di classificazione, poiché le recensioni possono essere classificate come positive ("1") o negative ("0").
Per questo tutorial, suggeriamo di utilizzare un modello IBM® Granite come modello linguistico di grandi dimensioni per ottenere risultati simili.
Ora che abbiamo impostato il nostro esperimento di ottimizzazione, dobbiamo collegarlo al nostro set di dati. Per farlo, utilizziamo la classe DataConnection. Ciò richiede l'asset_id prodotto in precedenza all'avvio dell'asset di dati con il nostro client API.
Puoi utilizzare il modello AI che preferisci. I foundation model disponibili per l'adattamento tramite watsonx possono essere trovati qui o eseguendo il seguente comando.
Output
{'FLAN_T5_XL': 'google/flan-t5-xl', 'GRANITE_13B_INSTRUCT_V2': 'ibm/granite-13b-instruct-v2', 'LLAMA_2_13B_CHAT': 'meta-llama/llama-2-13b-chat'}
Output
##############################################
Running '20671f17-ff53-470b-9bfe-04318ecb91d9'
##############################################
pending......
running....................................................................................................................................
completed
Addestramento di '20671f17-ff53-470b-9bfe-04318ecb91d9' completato con successo.
Per assicurarci che la nostra messa a punto dei prompt sia terminata, possiamo controllarne lo stato. Se lo stato stampato è diverso da "completato", attendi che la messa a punto sia terminata prima di continuare.
Output:
completato
Ora possiamo recuperare il riepilogo della messa a punto del prompt. In questo riepilogo vedrai un valore di perdita. Per ogni sessione di addestramento, la funzione di perdita misura la differenza tra i risultati previsti e quelli effettivi. Pertanto, è preferibile un valore di perdita inferiore.
Possiamo anche tracciare la curva di apprendimento del nostro modello di messa a punto utilizzando la funzione plot_learning_curve(). Una curva verso il basso che si livella vicino allo zero indica che il modello sta migliorando la generazione di output prevista. Per saperne di più sull'interpretazione dei grafici delle funzioni di perdita, consulta la documentazione pertinente di IBM® watsonx.
Output
Questa fase di implementazione del modello messo a punto è critica per completare i passaggi successivi di confronto delle prestazioni del modello messo a punto con quello pre-ottimizzato.
Nota: il SERVING_NAME è impostato sulla data e l'ora correnti, poiché deve essere un valore univoco.
Output:
######################################################################################
Creazione dell'implementazione sincrona per l'id: '6aa5dd5c-0cc4-44e0-9730-18303e88e14a' started
######################################################################################
initializing.......................
ready
-----------------------------------------------------------------------------------------------
Creazione dell'implementazione conclusa con successo, deployment_id='24a97b84-47d0-4490-9f5f-21ed2376fdd6'
-----------------------------------------------------------------------------------------------
Ora, testiamo le prestazioni sia del modello messo a punto che del foundation model originale per vedere l'impatto del nostro processo di tuning. Innanzitutto, carichiamo il set di dati di test. Questo set di dati dovrebbe essere un sottoinsieme di dati che non erano presenti durante l'ottimizzazione. Spesso, il set di test è anche più piccolo del set di addestramento. Inoltre, ogni input nel set di dati di test ha il prompt come prefisso del commento dell'utente.
Ecco una piccola parte del set di dati per comprenderne meglio la struttura.
Output
Dopo aver caricato il set di dati di prova, estraiamo gli input e gli output.
Possiamo anche stampare un esempio di input e output di test per capire meglio come abbiamo estratto il contenuto del set di dati.
Output
'Extract the satisfaction from the comment. Return simple 1 for satisfied customer or 0 for unsatisfied.\nComment: Long wait times.\nSatisfaction:\n'
In questo esempio, viene introdotto il prompt, seguito dalla recensione del cliente sui lunghi tempi di attesa e infine una soddisfazione pari a 0, a indicare una recensione negativa.
Output:
0
Ora che abbiamo il set di dati di test, testiamo la precisione e il punteggio F1 del nostro modello ottimizzato. Il punteggio F1 è la media della precisione e del richiamo del modello. Per fare ciò avremo bisogno di deployment_id. Tieni presente che il concurrency_limit è impostato su 2 per evitare di raggiungere il limite di velocità dell'API. Questo è il numero di richieste che verranno inviate in parallelo.
Output
accuracy_score: 0.9827586206896551, f1_score: 0.9827586206896551
Data l'elevata precisione e il punteggio F1 del nostro modello, testiamo le prestazioni dello stesso modello Granite senza alcuna messa a punto.
Output
base model accuracy_score: 0.9310344827586207, base model f1_score: 0.9298245614035088
Il nostro modello con messa a punto supera le prestazioni del foundation model pre-ottimizzato. Poiché il modello con messa a punto è specializzato nell'estrazione dei punteggi di soddisfazione, può essere utilizzato per altri compiti uguali. Ottimo lavoro!
In questo tutorial, hai eseguito il tuning dei prompt su un modello IBM Granite utilizzando l'API watsonx. Il modello ottimizzato e distribuito ha superato con successo il foundation model con una precisione superiore di circa il 5%.