Come fare il fine-tuning di un LLM [e quando usare invece la RAG o il prompting]
Questa guida spiega come fare il fine-tuning di un LLM passo dopo passo, confronta il fine-tuning completo con LoRA e QLoRA e mostra quando il prompting o la RAG sono il modo migliore per migliorare gli output di un modello.

Fare il fine-tuning di un modello linguistico di grandi dimensioni (LLM) significa perfezionare un LLM pre-addestrato su un piccolo dataset specifico per un compito, in modo che produca output che il solo prompting non riesce a ottenere.
Il fine-tuning consiste nel raccogliere coppie di esempio input/output che mostrano il comportamento desiderato, eseguire passaggi di addestramento che spostano i pesi del modello verso di esse e confrontare il risultato con gli output del modello originale. Metodi efficienti in termini di parametri come LoRA rendono il processo abbastanza economico da poterlo eseguire su una sola GPU.
Se gli output dell’LLM non ti soddisfano, perfeziona prima i prompt e la retrieval-augmented generation (RAG). Il fine-tuning cambia il modo in cui l’LLM si comporta. Quando hai bisogno che utilizzi informazioni aggiornate o proprietarie, il prompting e la RAG sono di solito una scelta migliore.
Ecco come fare il fine-tuning di un LLM passo dopo passo, quali sono i principali metodi di fine-tuning (LoRA e QLoRA) e quali sfide ed errori possono compromettere il processo.
Che cos’è il fine-tuning degli LLM e in cosa si differenzia dal pre-addestramento
Il pre-addestramento di un LLM sviluppa da zero le capacità linguistiche generali di un modello su un corpus vastissimo, mentre il fine-tuning adatta un modello pre-addestrato a un unico compito usando un piccolo dataset.
Il pre-addestramento di un LLM è la fase ad alto consumo di risorse che produce un modello base. Il modello impara da un ampio corpus di testi, che gli fornisce grammatica, conoscenze fattuali e capacità di ragionamento generali, ma nessuna specializzazione per il tuo compito.
Il fine-tuning di un LLM prosegue l’addestramento del modello base su un piccolo dataset selezionato con cura, affinché produca gli output desiderati per un compito o un caso d’uso specifico. Pensa a un formato coerente, a una voce o un tono di brand, a pattern specifici di un dominio o a chiamate affidabili a strumenti e funzioni.
Quando fare il fine-tuning degli LLM e quando invece usare il prompting o la RAG
Per migliorare le prestazioni di un LLM, sali la scala un gradino alla volta: prompting -> RAG -> fine-tuning.
Perfeziona i prompt con istruzioni più dettagliate e usa la RAG per fornire al modello informazioni aggiornate. Ricorri al fine-tuning solo quando i miglioramenti a prompt e retrieval non bastano.
Approccio | Cosa cambia | Quando usarlo | Limite principale |
Prompt engineering | La richiesta che invii | Il comportamento è già quasi quello desiderato e vuoi rapidità e reversibilità | Limitato dalle capacità esistenti del modello base |
RAG | Ciò che il modello vede in fase di inferenza | I fatti cambiano spesso e hai bisogno che l’LLM acceda a informazioni aggiornate | Aggiunge latenza di retrieval e infrastruttura; non cambia il comportamento |
Fine-tuning degli LLM | I pesi del modello (parametri interni del modello) | Hai bisogno di comportamento, formato o tono coerenti su larga scala, oppure di prompt più brevi a ogni chiamata | Costo iniziale, conoscenze incorporate nei pesi che diventano obsolete, rischio di dimenticare comportamenti pre-addestrati |
Quando prompt migliori sono preferibili al fine-tuning e quando non bastano
Il prompting è la leva più rapida ed economica. In molti casi, prompt più accurati e dettagliati bastano a ottenere i cambiamenti di comportamento desiderati.
Ma i prompt più lunghi rallentano il lavoro, lo rendono più costoso e non possono superare i limiti esistenti del modello.
Segnali che il prompting potrebbe aver raggiunto i suoi limiti:
- Nuovi casi limite continuano a compromettere l’output: per esempio, il modello restituisce testo in prosa quando ti serve JSON o sbaglia tono, e tu correggi il prompt per ogni nuovo caso.
- Il prompt di sistema continua a crescere: il prompt arriva a centinaia o migliaia di righe ed è difficile da gestire.
- Lo paghi a ogni chiamata: il prompt viene reinviato e rielaborato a ogni richiesta, quindi il costo in token e la latenza aumentano.
- Le modifiche non fanno più la differenza: le nuove istruzioni non migliorano gli output.
Anche in questo caso, prova prima le soluzioni più economiche a livello di prompt. Usa esempi few-shot per mostrare al modello lo schema da seguire (coppie input/output), il prompt chaining per suddividere i compiti difficili in passaggi più piccoli, oppure hook di function calling per delegare ricerche puntuali o calcoli.
Quando la RAG ha più senso del fine-tuning del modello
La RAG cambia ciò che l’LLM sa, mentre il fine-tuning cambia il modo in cui si comporta. Se la lacuna riguarda le conoscenze, soprattutto quelle che cambiano spesso o che risiedono nei tuoi documenti, la risposta è la RAG. Se la lacuna riguarda il comportamento, fai il fine-tuning.
Anche il fine-tuning modifica ciò che un modello sa, ma tutti i fatti che assimila restano congelati al momento dell’addestramento e perdono presto attualità nei settori in rapida evoluzione. Inoltre, le informazioni vengono incorporate nei pesi del modello, che non conservano alcuna traccia della loro fonte.
Aggiornare i documenti di origine usati da un livello di retrieval è più rapido ed economico, e il sistema può citare le fonti esatte che ha usato. Per questo è una scelta migliore quando ti servono informazioni aggiornate e verificabili.
Lo svantaggio della RAG? È un livello aggiuntivo da costruire e mantenere, e aggiunge latenza.
In pratica, spesso ti serviranno entrambi. I sistemi in produzione abbinano modelli sottoposti a fine-tuning alla RAG, usando i primi per un comportamento coerente e la seconda per i fatti aggiornati.
Insidie, rischi e sfide comuni del fine-tuning
Anche quando il fine-tuning è lo strumento giusto, comporta costi e rischi:
- Costi e tempi: sia la raccolta di dati di addestramento puliti e rappresentativi sia la potenza di calcolo necessaria per l’addestramento sono costose.
- Oblio catastrofico: se addestrato su un dataset ristretto, un modello può perdere competenze generali e sviluppare nuove modalità di errore, commettendo sbagli che il modello base non faceva.
- Overfitting: con dati troppo scarsi o troppo ripetitivi, il modello memorizza gli esempi di addestramento invece di apprendere pattern, quindi ottiene buoni risultati sui campioni di addestramento ma scarsi sugli input reali.
- Conoscenze superate: le conoscenze incorporate nei pesi invecchiano rapidamente, quindi devi ripetere l’addestramento su nuovi dati.
- Obsolescenza: quando esce un modello più potente, spesso supera già in partenza il tuo modello sottoposto a fine-tuning, e devi rifare il lavoro.
- Difficoltà di valutazione e riproducibilità: dimostrare che il modello sottoposto a fine-tuning supera il modello base è difficile. Inoltre, due esecuzioni di addestramento su GPU con le stesse impostazioni possono produrre modelli leggermente diversi.
- Governance dei dati: l’addestramento su dati proprietari o sensibili solleva questioni di privacy e di licenza; in seguito, un modello può far emergere frammenti dei dati su cui è stato addestrato.
I principali metodi di fine-tuning
I principali tipi di fine-tuning degli LLM si distinguono per quanta parte del modello modificano: il fine-tuning completo riaddestra l’intero modello, mentre i metodi di parameter-efficient fine-tuning (PEFT) come LoRA e QLoRA aggiornano solo alcuni pesi. I metodi PEFT richiedono una frazione della memoria del fine-tuning completo e, con le impostazioni giuste, possono ottenere risultati equivalenti.
Il fine-tuning completo aggiorna tutti i pesi del modello. È il metodo più costoso e quello con il rischio più alto di oblio catastrofico. Riservalo ai cambiamenti di comportamento importanti, quando disponi dei dati e della potenza di calcolo necessari.
L’alternativa è il parameter-efficient fine-tuning, o PEFT. È un termine generico per i metodi che congelano la maggior parte del modello e addestrano solo un piccolo insieme di parametri. Usa molta meno memoria ed è meno soggetto all’oblio, poiché il modello base resta intatto.
Con ranghi bassi, il PEFT apprende meno di un fine-tuning completo, ma aumentando il rango e regolando il tasso di apprendimento si colma gran parte del divario nelle attività di instruction tuning.
I metodi PEFT includono:
- LoRA (Low-Rank Adaptation): il punto di partenza abituale; congela i pesi originali e addestra un piccolo insieme di parametri adattatori aggiuntivi, spesso meno dell’1% del totale, quindi può essere eseguito su una sola GPU consumer.
- QLoRA (Quantized Low-Rank Adaptation): comprime il modello base a una precisione di 4 bit prima di applicare LoRA, consentendoti di fare il fine-tuning di un modello di grandi dimensioni su una sola GPU.
Metodo | Cosa aggiorna | Hardware necessario | Quando usarlo |
Fine-tuning completo | Tutti i pesi del modello | Un nodo multi-GPU per i modelli della classe 7B, molto di più per quelli più grandi | Ti serve un cambiamento profondo del comportamento e disponi dei dati e della potenza di calcolo |
LoRA (PEFT) | Un piccolo insieme di pesi adattatori aggiuntivi | Una sola GPU consumer | Il punto di partenza standard |
QLoRA (PEFT) | Adattatori LoRA su un modello base compresso a 4 bit | Modelli molto grandi su una sola GPU | Hai poca memoria ma vuoi un modello base di grandi dimensioni |
Oltre a questi, usiamo metodi di instruction tuning e preference tuning, dall’RLHF (Reinforcement Learning from Human Feedback) ad alternative più leggere come la Direct Preference Optimization (DPO) e la Odds Ratio Preference Optimization (ORPO), per definire il modo in cui un modello segue le istruzioni e si allinea alle preferenze umane.
Come fare il fine-tuning di un LLM passo dopo passo
Una volta stabilito che il fine-tuning di un LLM è la scelta giusta, ecco il flusso di lavoro.
Passaggio 1: definisci il compito e come misurerai il successo
Decidi quale comportamento vuoi dall’LLM e come capirai di averlo ottenuto.
Indica il compito specifico che vuoi far svolgere al modello sottoposto a fine-tuning, per esempio classificare i ticket di assistenza, riassumere contratti in un formato fisso o generare codice secondo lo stile della tua azienda.
Poi definisci il successo. Le opzioni più comuni includono:
- Validità dell’output: per esempio, il risultato è un JSON valido o rispetta la struttura Markdown che ti serve?
- Punteggi automatici: usa metriche come BLEU o ROUGE, che confrontano il testo generato con risposte di riferimento, oppure l’accuratezza sul compito misurata su un set etichettato.
- Valutazioni umane: una griglia di valutazione a punteggio o di tipo superato/non superato per le qualità che uno script valuta male, come il tono o l’utilità.
- Affidabilità sugli input difficili: il modello gestisce gli input insoliti che mettevano in difficoltà il modello base?
Passaggio 2: prepara il dataset
La qualità dei dati determina il successo del fine-tuning, quindi impegnati per raccogliere il dataset di fine-tuning giusto.
Formatta i dati come coppie istruzione/risposta in JSONL, dove ogni riga contiene l’input (più l’eventuale contesto) e l’output esatto che vuoi ottenere.
Per esempio, dai un’occhiata a dataset pubblici per istruzioni generiche come Alpaca-cleaned o Dolly di Databricks, oppure al dataset banking77, specifico per un compito, che include oltre 13.000 richieste di assistenza reali etichettate in 77 intenti.
Per un compito mirato, da qualche centinaio a qualche migliaio di esempi puliti e vari possono modificare il comportamento, a patto che rispecchino gli input reali di produzione, inclusi i casi limite, e che abbiano una formattazione coerente.
Non hai ancora coppie input/output? Crea il set a partire dai dati che hai già, come i ticket di assistenza e le relative risposte migliori, oppure i documenti e i relativi riassunti.
Se hai solo gli output, usa un modello più potente per generare un input plausibile per ciascuno, oppure scrivi a mano un piccolo set iniziale ed espandilo con un modello «insegnante» più grande, quindi conserva le coppie migliori.
Infine, suddividi i dati in set di addestramento, validazione e test, così da poter misurare i risultati su esempi che il modello non ha mai visto.
Passaggio 3: scegli un modello base e un metodo
Inizia con un piccolo modello open source da 3 a 7 miliardi di parametri e un metodo di parameter-efficient fine-tuning come LoRA o QLoRA.
Famiglie open come Llama, Mistral e Qwen ti offrono una base solida da ospitare in autonomia, e i metodi PEFT mantengono bassi i requisiti hardware: QLoRA quantizza il modello base a 4 bit, quindi per il fine-tuning di un modello da 7B basta una scheda consumer da 16-24 GB. Il fine-tuning completo dello stesso modello richiede una quantità di memoria molte volte superiore.
Passaggio 4: imposta gli iperparametri di addestramento
Ecco i principali parametri di fine-tuning degli LLM e gli intervalli iniziali consigliati:
- Il tasso di apprendimento controlla l’entità di ogni aggiornamento dei pesi. Uno studio del 2024 di Biderman et al. ha rilevato che i tassi ottimali per LoRA erano circa dieci volte più alti di quelli del fine-tuning completo, in genere da 5e-5 a 5e-4 contro valori da 1e-5 a 5e-5. Lo studio consiglia di esplorare valori da 1e-5 a 5e-4 e di usare il valore più alto con cui l’addestramento resta stabile.
- La dimensione del batch è il numero di esempi da cui il modello impara prima di ogni aggiornamento dei pesi. Su una singola GPU, usa un batch per dispositivo ridotto, da 1 a 8, e l'accumulo del gradiente per raggiungere un batch effettivo di circa 16-64.
- Il numero di epoche indica quante volte il modello vede l'intero dataset. Quando addestri il modello a svolgere compiti specifici, 1-3 epoche sono una buona regola empirica, ma gli addestramenti LoRA spesso ne richiedono di più.
- Il rango LoRA (r) definisce la capacità dell'adapter, ovvero quanto può apprendere. Parti da 8-32 per i compiti più semplici e aumentalo per quelli più complessi: nello studio su LoRA di Biderman et al. citato in precedenza, l'instruction tuning di un modello da 7B sul codice ha richiesto un rango di 256 per eguagliare il fine-tuning completo, mentre sulla matematica un rango di 64 ci è andato vicino.
- La lunghezza massima della sequenza è l'input più lungo che l'addestramento elaborerà. Impostala in modo da coprire gli esempi più lunghi, fino alla finestra di contesto del modello, perché tutto ciò che la supera viene troncato.
- Il warmup e lo scheduling controllano come il learning rate aumenta gradualmente e varia nel corso dell'addestramento. Un breve warmup e un decadimento cosinusoidale sono le impostazioni predefinite più comuni. Tuttavia, lo studio di Pareja et al. sui modelli piccoli ha rilevato che eliminare il warmup non peggiorava i punteggi finali.
Considera questi valori come punti di partenza per uno sweep degli iperparametri, non come impostazioni fisse.
Passaggio 5: addestra il modello e monitora la loss
Durante l'addestramento, osserva le curve della loss di training e di validazione per capire se sta funzionando.
La loss misura quanto gli output del modello si discostano dai tuoi esempi e dovrebbe diminuire in modo regolare man mano che l'addestramento procede. La loss di training riguarda i dati da cui il modello impara, mentre la loss di validazione si calcola sugli esempi tenuti da parte.
Se la loss di training e quella di validazione diminuiscono insieme, il modello sta imparando a generalizzare. Se la loss di training continua a scendere ma quella di validazione si stabilizza o risale, il modello sta memorizzando il set di addestramento invece di apprenderne lo schema (overfitting).
Passaggio 6: valuta il modello, poi distribuiscilo
Una loss di training bassa non garantisce output corretti, quindi valuta il modello sottoposto a fine-tuning in base ai criteri che hai definito nel Passaggio 1.
Se supera la valutazione, hai due modi per distribuirlo:
- Esegui l'adapter sul modello base, caricandoli entrambi a runtime: in questo modo l'adapter resta intercambiabile.
- Unisci l'adapter ai pesi del modello base per ottenere un unico modello autonomo, più semplice da ospitare.
Usa Perplexity per dare al tuo LLM accesso a informazioni aggiornate
Il fine-tuning è la scelta giusta quando vuoi adattare il comportamento del modello alle tue esigenze.
Se il tuo modello ha bisogno di informazioni attuali, soprattutto di quelle che cambiano rapidamente, ti serve un sistema RAG o uno strumento di ricerca di terze parti affidabile.
Uno stack di recupero personalizzato è la soluzione migliore per i dataset proprietari, come il wiki interno, lo storico dell'assistenza clienti, i contratti o la documentazione di prodotto.
Quando le conoscenze che vuoi utilizzare sono pubbliche, non c'è bisogno di creare un livello di recupero su misura. Perplexity è un motore di risposte: ogni risposta include citazioni inline e cliccabili tratte da un indice web in tempo reale. La sua Agent API fornisce queste risposte basate sul web e corredate di citazioni con una sola chiamata, così la tua app può attingere a fonti aggiornate.
Domande frequenti sul fine-tuning degli LLM
È possibile fare il fine-tuning di un LLM gratuitamente?
Sì, puoi fare il fine-tuning di un piccolo LLM open source gratuitamente. Ad esempio, il piano gratuito di Google Colab offre risorse GPU sufficienti per eseguire QLoRA su un modello da 3B a 8B, più che adeguate per un compito mirato. Inizi a pagare quando ti servono più memoria, addestramenti più lunghi o un modello base più grande di quello supportato dal piano gratuito.
Serve una GPU propria o si può fare il fine-tuning nel cloud?
Non è necessario possedere una GPU per fare il fine-tuning degli LLM. I servizi gestiti e i provider cloud di GPU noleggiano l'hardware a ore, quindi una sola GPU a noleggio è sufficiente per un addestramento QLoRA su un modello piccolo. Acquistare una GPU conviene solo se fai fine-tuning spesso o se devi mantenere tutti i dati sulle tue macchine.
Quanto tempo richiede il fine-tuning degli LLM?
Per un LLM piccolo, un addestramento può durare da pochi minuti a qualche ora, a seconda delle dimensioni del dataset e dell'hardware. Oumi, ad esempio, ha eseguito il fine-tuning completo di un modello da 0,8B in poco più di un'ora sulla propria piattaforma in hosting.
Con modelli più grandi o decine di migliaia di esempi si arriva a un giorno o più: gli addestramenti LoRA di Emburse su un modello da 7B hanno richiesto 8 ore per 5.000 esempi e circa 30 ore per 50.000 su una singola GPU da 40 GB.
È possibile continuare ad aggiornare un modello sottoposto a fine-tuning man mano che i dati cambiano?
Puoi ripetere il fine-tuning su dati nuovi, ma ogni ciclo ha un costo computazionale e comporta il rischio di oblio catastrofico. Per le conoscenze che cambiano spesso, la RAG è in genere la soluzione migliore, perché aggiorni i documenti sorgente invece di riaddestrare il modello.