Addestramento e personalizzazione dei modelli GPT: Custom instructions e Fine-tuning.

Addestramento e personalizzazione dei modelli GPT: Custom instructions e Fine-tuning.

Condividi con i tuoi amici...

A novembre del 2022 quando chatGPT fece capolino online, fummo tutti stupiti dei risultati raggiunti da questi modelli generativi del linguaggio. Il chatbot riusciva a comprendere le nostre richieste e a fare rapidamente cose che prima, impiegando altri sistemi, richiedevano molte ore di lavoro. Con il passare dei mesi, sino ad oggi, lo stupore ha lasciato il posto al senso critico, soprattutto dei professionisti che devono capire se e come possono impiegare questi modelli nel loro flusso di lavoro.

Ci si è resi conto che, nonostante la strabiliante capacità mostrata dall’AI, ci sono parecchie criticità. Intanto non sono gratuiti. Le API sono a pagamento e così anche ChatGPT plus, quindi ci si aspetta una certa efficienza. Se, per esempio, le richieste per essere soddisfatte necessitano di un ciclo di parecchi prompt con rispettive verifiche ci si chiede se ne valga la pena. Se il modello non è stabile rischia di diventare inutile.

A fronte di queste difficoltà è evidente il motivo per cui lo sforzo dei creatori sia volto a mettere i professionisti e non solo, in condizione di offrire al chatbot il contesto necessario affinché migliori le proprie performance.

In quest’ottica vanno visti gli ultimi aggiornamenti di OpenAI.

Le istruzioni personalizzate (Custom instructions)

Aprendo chatGPT e cliccando sul nostro indirizzo email a sinistra in basso visualizziamo tra le altre cose la nuova funzione “Custom instructions”.

Grazie a questa funzione è possibile personalizzare il chatbot in due modi:

  • indicando alcune informazioni personali, tra cui il nostro lavoro, dove viviamo, i nostri hobby, i nostri argomenti preferiti e gli obiettivi.
  • impostando alcune preferenze sulle modalità con cui desideriamo ottenere le risposte: il tono del chatbot, la lunghezza dei messaggi. Possiamo indicare se vogliamo che il chatbot sia neutrale o se può esprimere delle opinioni.

Le istruzioni personalizzate assolvono una funzione simile a quella del messaggio di sistema che viene inviata quando ci si serve delle API. Offre a tutti la possibilità di creare un proprio chatbot personalizzato con cui conversare.

Il fatto di poter fornire informazioni personali aggiuntive è molto importante perché offre al modello del contesto utile per intuire meglio e prima gli intenti delle richieste che facciamo.

Fine-tuning

Un’altra funzione appena introdotta da OpenAI riguarda le API.

La funzione di Fine-tuning permette di dare al modello un elenco di dati di esempio che rappresentano un addestramento su come deve rispondere alle richieste successive. Si crea un vero e proprio modello ottimizzato inviando un file JSON con i dati di addestramento. Le risposte che il modello invierà a seguito di richieste in grado di richiamare quello specifico modello saranno ottimizzate e coerenti con gli intenti della richiesta stessa. Anche in questo caso, l’invio di più contesto è la soluzione adatta per rendere più stabile il modello e permettergli di soddisfare le richieste in modo più preciso e rapido.

gpt-3-5-turbo fine tuning and api updates

Guida di Openai >

Prove tecniche: creiamo un progetto fine-tuning d’esempio.

Il seguente esempio mostra in breve come procedere per creare dei progetti fine-tuning.

Il primo passo è quello di stilare un elenco di domande con le rispettive risposte che devono costituire un modello per il chatbot. Si tratta di fornirgli degli esempi che indicano soprattutto la forma, il tono e in generale, la struttura delle risposte che deve dare. Questi dati vanno considerati come un’estensione del prompt. Inoltre dobbiamo creare anche un messaggio di sistema che attribuisce un’identità al chatbot.

Si può usare chatGPT sia per creare delle domande d’esempio, che per metterle nella forma richiesta. È sufficiente dare un’istruzione simile a questa:

Inventa 10 domande qualsiasi con le rispettive risposte tenendo conto d’inserire nel content di system, content=”sono un chatbot che risponde ai quiz”, quindi genera 10 righe nel formato seguente in cui inserisci opportunamente le domande e le risposte rispettivamente in content di user e in content di assistant:{“messages”: [{“role”: “system”, “content”: “Marv is a factual chatbot that is also sarcastic.”}, {“role”: “user”, “content”: “What’s the capital of France?”}, {“role”: “assistant”, “content”: “Paris, as if everyone doesn’t know that already.”}]}

L’elenco di domande e risposte assumerà la seguente forma:

{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Qual è il più grande oceano del mondo?"}, {"role": "assistant", "content": "L'oceano Pacifico."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Quale è il fiume più lungo del mondo?"}, {"role": "assistant", "content": "Il fiume Nilo."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Chi è l'autore de 'Il Signore degli Anelli'?"}, {"role": "assistant", "content": "J.R.R. Tolkien."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Qual è la capitale del Brasile?"}, {"role": "assistant", "content": "Brasilia."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Quante lingue si parla in Svizzera?"}, {"role": "assistant", "content": "Quattro: tedesco, francese, italiano e romancio."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "In quale anno è stata scoperta l'America?"}, {"role": "assistant", "content": "1492."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Chi ha dipinto 'La Gioconda'?"}, {"role": "assistant", "content": "Leonardo da Vinci."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Qual è l'elemento chimico simbolo H?"}, {"role": "assistant", "content": "L'idrogeno."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "In quale città si trova la Torre Eiffel?"}, {"role": "assistant", "content": "A Parigi."}]}
{"messages": [{"role": "system", "content": "sono un chatbot che risponde ai quiz"}, {"role": "user", "content": "Qual è il deserto più grande del mondo?"}, {"role": "assistant", "content": "Il deserto del Sahara."}]}

Quello mostrato può essere esattamente il contenuto del file data.jsonl da salvare nella cartella dedicata al progetto. Ricordiamo che si tratta di un banale esempio fatto con il solo scopo di mostrare i passaggi da seguire. Probabilmente in questo specifico caso con un prompt più semplice sarebbe possibile raggiungere lo stesso risultato. Resta il fatto che l’esempio mostra come indicare al chatbot la forma delle risposte che deve fornire.

Una volta salvato questo file ricordiamoci di aggiornare il modulo openai mediante l’istruzione

pip install –upgrade opneai

da prompt dei comandi del nostro sistema operativo.

Per creare il progetto si può eseguire il seguente codice:

import os
import openai
import time

# Imposta la chiave API di OpenAI

openai.api_key = "<chiave openai>"

# Carica il file dei dati per il perfezionamento
file_perfezionamento = openai.File.create(
    file=open("data.jsonl", "rb"),
    purpose='fine-tune'
)

#TEMPO per elaborazione OpenAI
time.sleep(20) 

# Crea un lavoro di perfezionamento
lavoro_perfezionamento = openai.FineTuningJob.create(
    training_file=file_perfezionamento.id,
    model="gpt-3.5-turbo"
)

# Elenca i lavori di perfezionamento esistenti
lista_lavori_perfezionamento = openai.FineTuningJob.list(limit=10)
print(lista_lavori_perfezionamento)

numero=input("scegli quale progetto usare. (0,1,2..):")
numero=int(numero)

id_value = lista_lavori_perfezionamento.data[numero]["id"]
id_org = lista_lavori_perfezionamento.data[numero]["organization_id"]
fine_tuned_model = lista_lavori_perfezionamento.data[numero]["fine_tuned_model"]

domanda=input("domanda:")

completions = openai.ChatCompletion.create(
  model=fine_tuned_model,
  messages=[
    {"role": "system", "content": "Tu sei un chatbot che risponde ai quiz"},
    {"role": "user", "content": domanda}
  ]
)

result = json.dumps(completions)
if result:
        json_response = json.loads(result)
        message = json_response['choices'][0]['message']['content']

print(message)

dove è necessario sostituire a <chiave openai> la propria chiave.
Il codice indicato carica il file data.jsonl e lo trasmette al chatbot che lo elabora. Abbiamo impostato 20 secondi per l’elaborazione dei dati di addestramento, ma se il chatbot ne richiede di più possiamo incrementarli.
La parte seguente mostra un codice indipendente che serve per utilizzare il modello appena addestrato o i modelli addestrati prima. Intanto ci fornisce un elenco dei progetti di fine-tuning già creati e ci permette di scegliere quale interrogare (0/1/2…).

import os
import openai
import time
import json

openai.api_key = "<chiave openai>"


# Elenca i lavori di perfezionamento esistenti
lista_lavori_perfezionamento = openai.FineTuningJob.list(limit=10)
print(lista_lavori_perfezionamento)

numero=input("scegli quale progetto usare. (0,1,2..):")
numero=int(numero)

id_value = lista_lavori_perfezionamento.data[numero]["id"]
id_org = lista_lavori_perfezionamento.data[numero]["organization_id"]
fine_tuned_model = lista_lavori_perfezionamento.data[numero]["fine_tuned_model"]

domanda=input("domanda:")

completions = openai.ChatCompletion.create(
  model=fine_tuned_model,
  messages=[
    {"role": "system", "content": "Tu sei un chatbot che risponde ai quiz"},
    {"role": "user", "content": domanda}
  ]
)

result = json.dumps(completions)
if result:
        json_response = json.loads(result)
        message = json_response['choices'][0]['message']['content']

print(message)

Come creare il file di addestramento

L’elenco di domande e risposte da impiegare come modello per addestrare il chatbot possono essere generate dal chatbot stesso ma non nel modo che abbiamo indicato nell’esempio precedente con il quale abbiamo solo voluto mostrare alcuni aspetti tecnici.

Quando noi inviamo un prompt al modello GPT e dopo alcune risposte insoddisfacenti otteniamo una risposta adeguata allora possiamo selezionarla ed inserirla tra quelle dell’elenco da inviare al chatbot nell’ambito del progetto di fine-tuning (file data.jsonl). In questo modo stiamo ottimizzando i risultati del chatbot avvalendoci del chatbot stesso e della nostra supervisione.

Quello mostrato è un esempio di addestramento supervisionato.

In conclusione

Ci aspettiamo che il miglioramento dell’AI generativa lavori in due direzioni: la prima riguarda l’efficientamento strutturale delle reti neurali alla base dei modelli, la seconda mira a fornire loro sempre più contesto facendo si che gli utenti siano messi in grado di addestrarli e di personalizzarli

Dato un buon contesto ci possiamo aspettare che con il tempo, non vi sarà più l’esigenza di un prompting fatto a regola d’arte e perfetto, in quanto lo scopo di questi chatbot è quello di comprendere gli intenti delle richieste anche quando queste non sono perfettamente complete e dichiarate. Il punto di forza dei modelli generativi sta proprio nel “completamento” di ciò che gli viene fornito.