
Una serie di startup sta correndo per costruire modelli in grado di produrre software sempre migliori. Sostengono che sia la strada più breve per l’intelligenza artificiale generale (AGI).
Chiedete a chi sta costruendo l’IA generativa a che cosa serve l’IA generativa in questo momento, per che cosa è davvero entusiasta, e molti vi diranno: la codifica.
“È un aspetto molto interessante per gli sviluppatori”, ha dichiarato questo mese a MIT Technology Review Jared Kaplan, scienziato capo di Anthropic: “Si tratta di capire cosa c’è di sbagliato nel codice e di eseguire il debug”.
Copilot, uno strumento costruito sulla base dei grandi modelli linguistici di OpenAI e lanciato da GitHub, sostenuta da Microsoft, nel 2022, è ora utilizzato da milioni di sviluppatori in tutto il mondo. Altri milioni si rivolgono a chatbot generici come Claude di Anthropic, ChatGPT di OpenAI e Gemini di Google DeepMind per l’aiuto quotidiano.
“Oggi, più di un quarto di tutto il nuovo codice di Google è generato dall’intelligenza artificiale, quindi rivisto e accettato dagli ingegneri”, ha dichiarato Sundar Pichai, CEO di Alphabet, durante una conferenza stampa di ottobre: “Questo aiuta i nostri ingegneri a fare di più e a muoversi più velocemente”. Ci aspettiamo che altre aziende tecnologiche si mettano al passo, se non lo hanno già fatto.
Non sono solo le grandi aziende a lanciare gli strumenti di codifica dell’intelligenza artificiale. Anche un gruppo di nuove startup è entrato in questo mercato in fermento. Nuovi arrivati come Zencoder, Merly, Cosine, Tessl (valutata 750 milioni di dollari a pochi mesi dalla sua creazione) e Poolside (valutata 3 miliardi di dollari prima ancora di rilasciare un prodotto) stanno tutti lottando per la loro fetta di torta. “Sembra che gli sviluppatori siano disposti a pagare per i copiloti”, afferma Nathan Benaich, analista della società di investimenti Air Street Capital: “E quindi il codice è uno dei modi più semplici per monetizzare l’IA”.
Queste aziende promettono di portare gli assistenti generativi di codifica a un livello superiore. Invece di fornire agli sviluppatori una sorta di completamento automatico potenziato, come la maggior parte degli strumenti esistenti, questa nuova generazione è in grado di prototipare, testare ed eseguire il debug del codice al posto dell’utente. Il risultato è che gli sviluppatori potrebbero essenzialmente trasformarsi in manager, che potrebbero passare più tempo a rivedere e correggere il codice scritto da un modello che a scriverlo da zero.
Ma c’è di più. Molte delle persone che stanno costruendo assistenti di codifica generativi pensano che potrebbero essere una corsia preferenziale per l’intelligenza artificiale generale (AGI), l’ipotetica tecnologia sovrumana che diverse aziende di alto livello affermano di avere nel mirino.
“La prima volta che vedremo un’attività di grande valore economico raggiungere capacità di livello umano sarà nello sviluppo di software”, afferma Eiso Kant, CEO e cofondatore di Poolside. (OpenAI si è già vantata del fatto che il suo ultimo modello o3 ha battuto lo scienziato capo dell’azienda in una sfida di codifica).
Benvenuti nella seconda ondata di codifica dell’intelligenza artificiale.
Codice corretto
Gli ingegneri del software parlano di due tipi di correttezza. La correttezza della sintassi di un programma (la sua grammatica), ovvero tutte le parole, i numeri e gli operatori matematici al posto giusto. Questo aspetto è molto più importante della correttezza grammaticale nel linguaggio naturale. Se si sbaglia una piccola cosa in migliaia di righe di codice, nessuna di esse verrà eseguita.
La prima generazione di assistenti alla codifica è ormai abbastanza brava a produrre codice corretto in questo senso. Addestrati su miliardi di stringhe di codice, hanno assimilato le strutture di superficie di molti tipi di programmi.
Ma c’è anche il senso in cui il funzionamento di un programma è corretto: certo, funziona, ma fa davvero quello che volevate? È a questo secondo livello di correttezza che mira la nuova ondata di assistenti alla codifica generativa, ed è questo che cambierà davvero il modo in cui viene realizzato il software.
“I modelli linguistici di grandi dimensioni possono scrivere codice che si compila, ma non sempre scrivono il programma che si desidera”, afferma Alistair Pullen, cofondatore di Cosine. “Per farlo, è necessario ricreare i processi di pensiero che un codificatore umano avrebbe seguito per ottenere quel risultato finale”.
Il problema è che i dati su cui la maggior parte degli assistenti di codifica è stata addestrata – miliardi di pezzi di codice presi da archivi online – non catturano questi processi di pensiero. Rappresentano un prodotto finito, non quello che è stato creato. “C’è un sacco di codice là fuori”, dice Kant. “Ma quei dati non rappresentano lo sviluppo del software”.
Quello che Pullen, Kant e altri stanno scoprendo è che per costruire un modello che faccia molto di più del completamento automatico, che sia in grado di proporre programmi utili, di testarli e di risolvere i bug, è necessario mostrargli molto di più del semplice codice. È necessario mostrargli come quel codice è stato messo insieme.
In breve, aziende come Cosine e Poolside stanno costruendo modelli che non si limitano a imitare l’aspetto di un buon codice – che funzioni bene o meno – ma imitano il processo che produce tale codice. Se lo si fa bene, i modelli produrranno codice migliore e correzioni di bug molto più efficaci.
Pangrattato
Ma prima è necessario un set di dati che catturi il processo, ovvero i passi che uno sviluppatore umano potrebbe compiere durante la scrittura del codice. Pensate a questi passaggi come a una traccia di pane che una macchina potrebbe seguire per produrre un pezzo di codice simile.
Parte di ciò consiste nel capire da quale materiale attingere: quali sezioni del codice esistente sono necessarie per un determinato compito di programmazione? “Il contesto è fondamentale”, afferma Andrew Filev, fondatore di Zencoder. “La prima generazione di strumenti faceva un pessimo lavoro sul contesto, in pratica si limitavano a guardare le schede aperte. Ma il vostro repo [repository di codice] potrebbe avere 5.000 file e la maggior parte di essi non verrebbe individuata”.
Zencoder ha assunto un gruppo di veterani dei motori di ricerca per aiutarla a costruire uno strumento in grado di analizzare grandi basi di codice e capire cosa è o non è rilevante. Questo contesto dettagliato riduce le allucinazioni e migliora la qualità del codice che i modelli linguistici di grandi dimensioni possono produrre, dice Filev: “Lo chiamiamo repo grokking”.
Anche Cosine ritiene che il contesto sia fondamentale. Ma attinge a quel contesto per creare un nuovo tipo di serie di dati. L’azienda ha chiesto a decine di programmatori di registrare ciò che stavano facendo mentre lavoravano a centinaia di diverse attività di programmazione. “Abbiamo chiesto loro di scrivere tutto”, dice Pullen: “Perché hai aperto quel file? Perché sei arrivato a metà del percorso? Perché l’hai chiuso?”. Inoltre hanno chiesto loro di annotare i pezzi di codice finiti, segnando le sezioni che avrebbero richiesto la conoscenza di altri pezzi di codice o di documentazione specifica per essere scritte.
Cosine prende quindi tutte queste informazioni e genera un grande insieme di dati sintetici che mappa i passi tipici dei programmatori e le fonti di informazioni a cui attingono, fino a giungere a pezzi di codice finiti. Utilizzano questo set di dati per addestrare un modello a capire quale percorso potrebbe essere necessario seguire per produrre un particolare programma, e quindi come seguirlo.
Anche Poolside, con sede a San Francisco, sta creando un set di dati sintetici che cattura il processo di codifica, ma si basa maggiormente su una tecnica chiamata RLCE, ovvero l’apprendimento con rinforzo dall’esecuzione del codice. (Anche Cosine la utilizza, ma in misura minore).
L’RLCE è analogo alla tecnica utilizzata per rendere i chatbot come ChatGPT degli abili conversatori, nota come RLHF (apprendimento rafforzato dal feedback umano). Con RLHF, un modello viene addestrato a produrre testo più simile a quello che i tester umani dicono di preferire.
Giocare con il sistema
Cosine e Poolside dicono di ispirarsi all’approccio adottato da DeepMind con il suo modello di gioco AlphaZero. Ad AlphaZero sono stati dati i passi che poteva compiere – le mosse di un gioco – e poi gli è stato lasciato il compito di giocare contro se stesso più e più volte, capendo per tentativi ed errori quale sequenza di mosse fosse vincente e quale no.
“Gli hanno permesso di esplorare le mosse in ogni momento possibile, simulando il maggior numero di partite che si possono lanciare: questo ha portato a battere Lee Sedol”, dice Pengming Wang, scienziato fondatore di Poolside, riferendosi al grande maestro coreano di Go che AlphaZero ha battuto nel 2016. Prima di Poolside, Wang ha lavorato presso Google DeepMind su applicazioni di AlphaZero che vanno oltre i giochi da tavolo, tra cui FunSearch , una versione addestrata a risolvere problemi matematici avanzati.
Quando l’approccio AlphaZero viene applicato alla codifica, le fasi di produzione di un codice – le briciole di pane – diventano le mosse disponibili in un gioco, e un programma corretto diventa la vittoria di quel gioco. Lasciato a giocare da solo, un modello può migliorare molto più velocemente di quanto potrebbe fare un essere umano. “Un codificatore umano prova e fallisce un errore alla volta”, dice Kant. “I modelli possono provare le cose 100 volte alla volta”.
Una differenza fondamentale tra Cosine e Poolside è che Cosine utilizza una versione personalizzata di GPT-4o fornita da OpenAI, che consente di allenarsi su un set di dati più ampio di quello che il modello di base può gestire, mentre Poolside costruisce da zero il proprio modello linguistico di grandi dimensioni.
Kant di Poolside ritiene che addestrare un modello sul codice fin dall’inizio darà risultati migliori che adattare un modello esistente che ha assorbito non solo miliardi di pezzi di codice ma anche la maggior parte di Internet. “Mi va benissimo che il nostro modello si dimentichi dell’anatomia delle farfalle”, dice.
Cosine sostiene che il suo assistente generativo di codifica, chiamato Genie, è in cima alla classifica di SWE-Bench, una serie di test standard per i modelli di codifica. Poolside sta ancora costruendo il suo modello, ma sostiene che quello che ha finora è già all’altezza delle prestazioni di Copilot di GitHub.
“Personalmente, sono fermamente convinto che i modelli linguistici di grandi dimensioni ci porteranno ad avere le stesse capacità di uno sviluppatore di software”, afferma Kant.
Non tutti però sono di questo parere.
LLM illogici
Per Justin Gottschlich, CEO e fondatore di Merly, i modelli linguistici di grandi dimensioni sono lo strumento sbagliato per questo lavoro, punto e basta. Invoca il suo cane: “Nessun addestramento per il mio cane lo porterà mai ad essere in grado di codificare, semplicemente non succederà”, dice. “Può fare un sacco di altre cose, ma non è in grado di raggiungere quel livello profondo di cognizione”.
Avendo lavorato alla generazione di codice per oltre un decennio, Gottschlich ha un problema simile con i modelli di linguaggio di grandi dimensioni. La programmazione richiede la capacità di risolvere enigmi logici con una precisione incrollabile. Per quanto i modelli linguistici di grandi dimensioni possano imparare a imitare ciò che fanno i programmatori umani, nel loro nucleo sono ancora essenzialmente delle slot machine statistiche, dice Gottschlich: “Non posso addestrare un sistema illogico a diventare logico”.
Invece di addestrare un modello linguistico di grandi dimensioni a generare codice fornendogli molti esempi, Merly non mostra affatto al suo sistema codice scritto da esseri umani. Questo perché per costruire un modello in grado di generare codice, sostiene Gottschlich, è necessario lavorare a livello della logica sottostante che il codice rappresenta, non del codice stesso. Il sistema di Merly è quindi addestrato su una rappresentazione intermedia, qualcosa di simile alla notazione leggibile dalla macchina in cui la maggior parte dei linguaggi di programmazione viene tradotta prima di essere eseguita.
Gottschlich non vuole dire esattamente come si presenta o come funziona il processo. Ma lancia un’analogia: in matematica c’è l’idea che gli unici numeri che devono esistere sono i numeri primi, perché si possono calcolare tutti gli altri numeri usando solo i primi. “Prendete questo concetto e applicatelo al codice”, dice.
Questo approccio non solo va dritto alla logica della programmazione, ma è anche veloce, perché milioni di righe di codice vengono ridotte a poche migliaia di righe di linguaggio intermedio prima che il sistema le analizzi.
Cambiare mentalità
L’opinione che si ha di questi approcci rivali può dipendere da cosa si vuole che siano gli assistenti di codifica generativa.
A novembre Cosine ha vietato ai propri ingegneri di utilizzare strumenti diversi dai propri prodotti. Ora sta vedendo l’impatto di Genie sui propri ingegneri, che spesso si trovano a guardare lo strumento mentre elabora il codice per loro. “Ora si dà al modello il risultato che si desidera, e lui va avanti e si preoccupa dell’implementazione per noi”, dice Yang Li, un altro cofondatore di Cosine.
Pullen ammette che può essere sconcertante e richiede un cambio di mentalità. “Abbiamo ingegneri che svolgono più attività contemporaneamente, passando da una finestra all’altra”, spiega. “Mentre Genie sta eseguendo il codice in una finestra, potrebbero chiedergli di fare qualcos’altro in un’altra”.
Questi strumenti consentono anche di progettare più versioni di un sistema contemporaneamente. Supponiamo che stiate sviluppando un software che necessita di un sistema di pagamento integrato. Si può ricorrere a un assistente di codifica per provare simultaneamente diverse opzioni – Tripe, Mango, Checkout – invece di doverle codificare a mano una alla volta.
Genie può essere lasciato a correggere i bug 24 ore su 24. La maggior parte dei team software utilizza strumenti di segnalazione dei bug che consentono di caricare le descrizioni degli errori riscontrati. Genie può leggere queste descrizioni e proporre delle correzioni. Poi un umano deve solo rivederle prima di aggiornare il codice di base.
Nessun essere umano è in grado di comprendere i trilioni di linee di codice dei più grandi sistemi software di oggi, afferma Li, “e man mano che sempre più software viene scritto da altri software, la quantità di codice non potrà che aumentare”.
Questo renderà essenziali gli assistenti di codifica che manterranno il codice per noi. “Il collo di bottiglia diventerà la velocità con cui gli esseri umani potranno rivedere il codice generato dalle macchine”, afferma Li.
Cosa ne pensano gli ingegneri di Cosine di tutto questo? Secondo Pullen, almeno, bene. “Se ti do un problema difficile, devi comunque pensare a come descrivere quel problema al modello”, dice. “Invece di scrivere il codice, devi scriverlo in linguaggio naturale. Ma c’è ancora molto da pensare, quindi non ci si priva del piacere dell’ingegneria. La voglia di fare è ancora presente”.
Alcuni possono adattarsi più velocemente di altri. Cosine ama invitare i potenziali assunti a trascorrere qualche giorno di codifica con il suo team. Un paio di mesi fa ha chiesto a uno di questi candidati di costruire un widget che permettesse ai dipendenti di condividere sui social media i pezzi più interessanti del software a cui stavano lavorando.
Il compito non era semplice e richiedeva la conoscenza di diverse sezioni dei milioni di righe di codice di Cosine. Ma il candidato è riuscito a farlo in poche ore. “Questa persona, che non aveva mai visto la nostra base di codice, si è presentata il lunedì e il martedì pomeriggio aveva già spedito qualcosa”, racconta Li. “Pensavamo che ci avrebbe messo tutta la settimana”. (L’hanno assunto).
Ma c’è anche un’altra prospettiva. Molte aziende utilizzeranno questa tecnologia per ridurre il numero di programmatori da assumere. Li pensa che presto vedremo diversi livelli di ingegneri del software. A un’estremità ci saranno sviluppatori d’élite con stipendi milionari in grado di diagnosticare i problemi quando l’intelligenza artificiale va male. All’altra estremità, team più piccoli di 10-20 persone svolgeranno un lavoro che un tempo richiedeva centinaia di codificatori. “Sarà come i bancomat hanno trasformato le banche”, afferma Li.
“Qualsiasi cosa vogliate fare sarà determinata dal calcolo e non dal numero di persone”, afferma. “Penso che sia generalmente accettato che l’era dell’aggiunta di altre migliaia di ingegneri alla vostra organizzazione sia finita”.
Motori a curvatura
Per Gottschlich, infatti, le macchine in grado di codificare meglio degli esseri umani saranno essenziali. È l’unico modo per costruire i vasti e complessi sistemi software di cui, secondo lui, avremo bisogno. Come molti nella Silicon Valley, prevede un futuro in cui gli esseri umani si trasferiranno su altri pianeti. Questo sarà possibile solo se riusciremo a far costruire all’intelligenza artificiale il software necessario, dice: “Il vero obiettivo di Merly è portarci su Marte”.
Gottschlich preferisce parlare di “programmazione automatica” piuttosto che di “assistenti alla codifica”, perché ritiene che questo termine inquadri il problema nel modo sbagliato. “Non credo che questi sistemi debbano assistere gli esseri umani, ma che gli esseri umani debbano assisterli”, afferma. “Possono muoversi alla velocità dell’intelligenza artificiale. Perché limitare il loro potenziale?”.
“C’è un cartone animato chiamato I Flintstones in cui ci sono queste macchine, ma si muovono solo quando i conducenti usano i piedi”, dice Gottschlich. “Questo è più o meno il modo in cui credo che la maggior parte delle persone stia facendo l’IA per i sistemi software”.
“Ma quello che Merly sta costruendo sono essenzialmente astronavi”, aggiunge. Non sta scherzando. “E non credo che le astronavi debbano essere alimentate da esseri umani in bicicletta. Le astronavi dovrebbero essere alimentate da un motore a curvatura”.
Se vi sembra assurdo, lo è. Ma c’è un’osservazione seria da fare su quello che le persone che costruiscono questa tecnologia pensano sia l’obiettivo finale.
Gottschlich non è un’eccezione con la sua visione galattica. Nonostante si concentrino su prodotti che gli sviluppatori vorranno usare oggi, la maggior parte di queste aziende ha in mente un guadagno molto più grande. Visitando il sito web di Cosine, l’azienda si presenta come “Human Reasoning Lab”. Per Cosine il coding è solo il primo passo verso un modello più generale, in grado di imitare la risoluzione dei problemi umani in diversi ambiti.
Poolside ha obiettivi simili: l’azienda dichiara in anticipo che sta costruendo un’intelligenza artificiale generale. “Il codice è un modo per formalizzare il ragionamento”, dice Kant.
Wang invoca gli agenti. Immaginate un sistema in grado di creare il proprio software per svolgere qualsiasi compito al volo. “Se si arriva a un punto in cui l’agente può davvero risolvere qualsiasi compito computazionale che si desidera attraverso il software, questo è un esempio di AGI, essenzialmente”.
Qui sulla Terra, tali sistemi possono rimanere una chimera. Eppure l’ingegneria del software sta cambiando più velocemente di quanto molti all’avanguardia si aspettassero.
“Non siamo ancora a un punto in cui tutto viene fatto dalle macchine, ma ci stiamo decisamente allontanando dal ruolo abituale di un ingegnere del software”, afferma Pullen di Cosine. “Stiamo vedendo le scintille di questo nuovo flusso di lavoro, che significa essere un ingegnere del software nel futuro”.