I Large Language Models (o LLM) sono modelli linguistici con un’ampia gamma di applicazioni, tra cui ad esempio la generazione di codice, la sintesi di documenti, o la traduzione. La loro versatilità deriva dalla loro caratteristica principale: la capacità di elaborazione e la produzione del linguaggio naturale.
E’ proprio la complessità del linguaggio che rappresenta al tempo stesso il punto di forza e la principale sfida nella progettazione di questo tipo di modelli. Si possono distinguere due livelli fondamentali che contribuiscono all’espressività del linguaggio: sintattico (ovvero, di struttura) e semantico (di significato). Alla luce di questa complessità, è naturale porsi alcune domande: esistono alternative al linguaggio naturale per rappresentare l’informazione? Perché il linguaggio è così flessibile? E cosa rende così difficile generarlo automaticamente?
Sintassi
Dal punto di vista sintattico esistono diverse alternative più semplici rispetto al linguaggio naturale. Se dobbiamo ad esempio organizzare l’inventario di un negozio non useremo una descrizione discorsiva, ma una tabella di questo tipo
| Prodotto | Quantità | Colore |
|---|---|---|
| T-Shirt | 34 | rosso |
| Jeans | 28 | blu |
| Calzini | 40 | nero |
La tabella fornisce un’organizzazione strutturata dei dati: è semplice da interpretare, ma vincolante quando dobbiamo rappresentare relazioni complesse.
Immaginiamo ad esempio il caso in cui ogni tipo di prodotto possa avere proprietà diverse, come ad esempio marca o materiale, oltre al colore. In questo caso sarebbe più pratico organizzare i dati in modo semi-strutturato:
[
{
"prodotto": "T-Shirt",
"quantità": 34,
"proprietà": {
"colore": "rosso"
}
},
{
"prodotto": "Jeans",
"quantità": 28,
"proprietà": {
"marca": "X",
"usato": false
}
},
{
"prodotto": "calzini",
"quantità": 40,
"proprietà": {
"materiale": "cotone"
}
}
]
Questo formato (chiamato JSON) è più flessibile, ma ha dei limiti: presuppone che i campi siano organizzati come coppie chiave:valore (come, ad esempio “prodotto”: “calzini”) con un’interpretazione precisa e concordata.
Nei casi appena visti si parla di sintassi chiusa: la struttura è formale, definita e prevedibile. Il linguaggio ha invece una sintassi aperta: ogni frase può avere una struttura diversa e lunghezza variabile. Naturalmente, anche il linguaggio deve rispettare delle regole, ovvero le regole grammaticali: queste forniscono uno schema strutturale ad alto livello, ma non limitano la complessità delle frasi che possiamo costruire. Grazie alla grammatica, è possibile rappresentare formalmente frasi nel linguaggio naturale tramite una struttura ad albero nota come Abstract Syntax Tree. Questo tipo di rappresentazione non ha profondità predefinita, riflettendo quindi la natura variabile del linguaggio.
Semantica
La ricchezza del linguaggio non è però solo sintattica, ma soprattutto semantica. Non è sufficiente generare frasi sintatticamente (grammaticalmente) corrette, ma è necessario anche che abbiano un significato appropriato rispetto al contesto. Infatti, se nel formato JSON il significato stesso di chiave e valore deve essere concordato, nel caso del linguaggio emerge dinamicamente dal discorso stesso. Ad esempio “Mi passi il sale?” è sintatticamente una domanda, ma è solo grazie alla nostra interpretazione ed esperienza che sappiamo che è anche una richiesta. E’ questa variabilità che rende il linguaggio così potente e così difficile da modellare. Per questo motivo, sviluppare un modello che generi linguaggio significa progettare un sistema che, date enormi moli di dati, apprenda in modo statistico come le parole co-occorrono e si relazionano tra loro in vari contesti.
Il meccanismo principale che permette di farlo nei modelli odierni è la cosiddetta self-attention. Data una sequenza di parole, tale meccanismo opera in due passaggi:
- impara a stabilire l’importanza di ogni parola rispetto alle altre. Una parola è tanto più importante tanto più è correlata (co-occorre) con le altre parole della frase.
- impara a stabilire l’importanza della parola al fine di predire la successiva.
Consideriamo ad esempio la frase “Il gatto beve il latte”. In questo caso la parola “latte” sarà fortemente correlata a “beve”, mentre avrà una relazione più debole con “il”. In una rappresentazione visiva queste relazioni appaiono come celle più o meno scure: più il colore è scuro, maggiore è l’importanza della relazione tra due parole. Si può notare anche che una parola risulta correlata con sè stessa: questo accade spesso perché il modello non deve utilizzare solo la mutua relazione tra parole ma anche il suo significato originale. È importante notare che queste correlazioni non sono memorizzate staticamente: il modello apprende invece come calcolarle dinamicamente, applicando lo stesso meccanismo a qualsiasi frase nuova. Inoltre, spesso il meccanismo di l’attenzione non cattura una sola relazione linguistica. Vengono generate diverse matrici di questo tipo e ognuna di queste impara relazioni diverse, ad esempio che collega articoli e nomi, soggetti e verbi, o la posizione delle parole nella frase.
Il risultato è quindi un sistema capace di emulare il linguaggio umano: non recupera semplicemente risposte predefinite, ma genera nuove frasi scegliendo i completamenti più probabili e coerenti con il contesto ricevuto, catturando la dimensione semantica che altre strutture formali non possono rappresentare.