fbpx Computer che programmano | Scienza in rete

Computer che programmano

"Artificial intelligence can write code", DALL-E, 2023.

Tempo di lettura: 11 mins

All’inizio di dicembre la rivista scientifica Science ha pubblicato uno studio condotto dalla compagnia londinese DeepMind, di proprietà di Google, che documenta il funzionamento e le performance di AlphaCode. Alpha Code è un sistema di apprendimento automatico capace di tradurre un problema scritto in linguaggio naturale in un programma informatico, linee di codice (Python, C++ e altri) capaci di risolvere il problema in questione.

AlphaCode è stato messo alla prova in dieci competizioni organizzate dalla piattaforma CodeForces nel mese di dicembre 2021 posizionandosi in media a metà della classifica. I ricercatori scrivono che questo piazzamento è quello di un programmatore alle prime armi, ma che «è la prima volta che un computer si è dimostrato competitivo con partecipanti umani in gare di programmazione».

Già a febbraio, quando DeepMind aveva pubblicato AlphaCode per la prima volta, gli utenti di CodeForces erano rimasti molto impressionati.

Su un blog della piattaforma, un moderatore aveva commentato così: «Nel 1997 Kasparov ha perso contro il supercomputer DeepBlue. Forse assisteremo a un confronto tra Tourist e un’IA nel prossimo futuro. Cosa ne pensate?».

Tourist è il nome in codice di Gennady Korotkevich, programmatore bielorusso primo in classifica su CodeForces al momento della conversazione.

Un altro utente della piattaforma, che si fa chiamare Ke Jie, il nome di uno dei più forti giocatori di Go al mondo, rispondeva così alla domanda del moderatore: «Non riesco ancora a dimenticare quando cinque anni fa AlphaGo (un'altra IA sviluppata da DeepMind ma che gioca a Go) ha demolito me e Lee Sedol. Ora sembra che AlphaCode stia invadendo l’informatica. Spero sinceramente che Tourist possa reagire per l'umanità. I miei migliori auguri».

Un’altra utente scriveva «È ora di rendere privati tutti i nostri archivi su GitHub».

GitHub è un servizio che ospita progetti di sviluppo di software permettendo agli utenti di caricare i codici sorgente e lavorarci in modo collaborativo. Proprio usando il grosso database di codici archiviati su GitHub, AlphaCode ha “imparato” a programmare.

Modelli di linguaggio naturale

Alla base di AlphaCode c’è infatti un modello di linguaggio, o meglio quello che gli esperti chiamano un large language model. L’aggettivo “large” si riferisce al grandissimo numero di parametri che sono necessari a descrivere la rete neurale profonda che costituisce AlphaCode, oltre che alla dimensione del database utilizzato per il suo allenamento.

Di large language model ne sentiamo parlare ormai da anni. L’ultimo nato è Chat-GPT, sviluppato dalla società OpenAI (partecipata da Microsoft con 1 miliardo di dollari di investimento nel 2019), un chatbot che ha sorpreso anche gli esperti per la sua capacità di produrre testi estremamente credibili e ricchi di informazioni e di significato.

Questi algoritmi vengono allenati su enormi database di testi, reperiti per lo più online, e imparano a completare le frasi, cioè a valutare qual è la parola successiva più probabile.

Già nel 2020, quando OpenAI aveva pubblicato una versione precedente del suo chatbot chiamata GPT-3 e di cui avevamo parlato qui, gli autori del sistema si erano resi conto che GPT-3 sapeva anche produrre delle forme rudimentali di codice Python. Questo accadeva perché tra i testi su cui era stato allenato c’erano anche i testi di programmi in Python.

Da quella constatazione, dopo un anno di lavoro era nato Codex, una versione di GPT-3 allenata sugli archivi di GitHub. Codex era stato messo a disposizione di tutti attraverso l’applicazione Copilot, disponibile su GitHub e testato da tanti programmatori esperti.

Alpha Code e Codex: stessa architettura, diversi allenamenti

L’architettura della rete neurale su cui è basato AlphaCode è la stessa di Codex. La differenza sta nel tipo di testi su cui sono allenate le due reti.

L’allenamento delle reti neurali usate per modellizzare il linguaggio naturale avviene solitamente in due fasi. Nella prima, chiamata pre-training, la rete apprende il funzionamento generale della lingua, nella seconda, chiamata fine-tuning, la rete si specializza su un certo tipo di testi. Lo stesso approccio viene seguito quando si intende sviluppare modelli di linguaggio specialistico. Si parte da modelli pre-allenati su testi generici nella lingua di interesse, e poi si raffinano dandogli in pasto testi dell’ambito prescelto. Per esempio, se si è interessati al linguaggio medico, si prende un modello di lingua pre-allenato e si raffina dandogli in pasto articoli pubblicati su riviste mediche.

Mentre Codex si basa su una rete pre-allenata su testi scritti in linguaggio naturale e poi affinata sugli script in Python disponibili su GitHub, AlphaCode viene pre-allenata già sugli script disponibili su GitHub (in diversi linguaggi di programmazione). In questa prima fase gli script vengono spezzati arbitrariamente in due parti. AlphaCode riceve come input la prima parte e deve imparare a restituire come output la seconda. Questo gli permette di familiarizzare con la sintassi e le convenzioni del linguaggio di programmazione. Nella seconda fase di allenamento, i ricercatori hanno utilizzato un database di problemi e soluzioni costruito ad hoc nello stile di quelli proposti sulla piattaforma CodeForces. Un esempio è riportato qui sotto.

Un esempio di problema dalla piattaforma CodeForces, disponibile qui.

La descrizione del problema in linguaggio naturale viene data come input alla rete nella forma di commento (facendo precedere ogni riga con un # come è convenzione in molti linguaggi di programmazione). In questo modo l’input somiglierà alla prima parte degli script dati come input ad AlphaCode durante il pre-allenamento (spesso gli script su GitHub contengono numerose righe di commento per rendere più comprensibile il codice a chi legge). Processando un database di 2,6 GB di problemi e soluzioni, AlphaCode impara a restituire come output il codice che risolve il problema.

Una volta terminato l’allenamento, AlphaCode si vede sottoporre uno dei problemi di CodeForces e deve rispondere con un codice che lo risolve nel linguaggio di programmazione desiderato.

I ricercatori di DeepMind hanno allenato diverse versioni della rete neurale che costituisce AlphaCode, aumentando e diminuendo il numero di parametri. In questo modo AlphaCode genera molte soluzioni diverse per il problema e queste vengono raggruppate e filtrate per scegliere le migliori. Anche i ricercatori di OpenAI facevano qualcosa di simile, ma se Codex genera decine o centinaia di proposte, AlphaCode ne genera fino a un milione.

La dimensione è probabilmente un’altra delle chiavi del successo di AlphaCode. Ma non è gratis: viene al costo di un enorme sforzo computazionale e quindi di un enorme consumo energetico. Gli autori scrivono su Science: “l'allenamento e la valutazione del nostro modello più grande, con 41 miliardi di parametri, hanno richiesto 175 megawattora (~16 volte il consumo energetico annuale di una famiglia americana media). Il grande utilizzo di risorse richiesto per questo esperimento ha un impatto ambientale e inoltre rende difficile replicarlo per la maggior parte degli enti di ricerca.”

Gli sviluppatori perderanno il lavoro?

La pubblicazione di AlphaCode ha fatto riaffiorare una domanda che spesso ci si pone quando un algoritmo di machine learning dimostra di poter raggiungere livelli di performance simili a quelli umani. Ovvero: questi sistemi ruberanno il lavoro a programmatori e sviluppatori?

Se lo chiedono anche gli utenti di CodeForces. Un utente pessimista scrive: «Potrebbe sembrare un'idea divertente, ma se in realtà l'intelligenza artificiale dovesse dominare la programmazione, il mondo degli sviluppatori potrebbe subire un duro colpo. Migliaia di persone lavorano come sviluppatori in tutto il mondo e ogni anno se ne aggiungono molte altre. Questa popolazione potrebbe essere colpita molto duramente da tali miglioramenti. Mi spiace che questo commento risulti un po' meno umoristico. Forse sono un programmatore grigio, ecco perché sono così spaventato :(».

Altri, più ottimisti, rispondono che il lavoro dei programmatori è ancora molto diverso da quello svolto da AlphaCode o Codex: «Non dico che non accadrà, ma credo che siamo ancora lontani dal dominio dell'intelligenza artificiale sulla programmazione. Nel mondo reale la maggior parte dei problemi di programmazione sono molto meno ben specificati rispetto alla programmazione competitiva, e gran parte della programmazione consiste nel capire cosa vuole il cliente, piuttosto che nell'implementare algoritmi intelligenti».

Dello stesso avviso è anche Armando Solar-Lezama, coordinatore del Computer Assisted Programming Group all’MIT. «I problemi risolti nelle gare di programmazione erano ben specificati» ha detto Solar-Lezama a Science. «La programmazione del mondo reale spesso richiede la gestione di grandi pacchetti di codice, il che richiede una comprensione più olistica del software». Infine ha aggiunto: «anche se questo tipo di tecnologia dovesse avere un successo straordinario, sarebbe opportuno trattarla come si tratta un programmatore all'interno di un'organizzazione. Non si vuole mai un'organizzazione in cui un singolo programmatore possa far crollare l'intera organizzazione».

Zico Kolter, informatico della Carnegie Mellon University, ha un punto di vista simile. «La mia ipotesi migliore è che strumenti come questi, in grado di generare porzioni di programma, diventeranno probabilmente strumenti "di seconda natura" per i programmatori», ha dichiarato a Nature.

In effetti sta già succedendo. Intervistato dall’Economist, Kevin Scott, Chief Technology Officer di Microsoft, ha dichiarato che i programmatori dell’azienda amano Codex. «Il prodotto è estremamente valido, abbiamo circa 100'000 utenti attivi ogni giorno». La tecnologia non li sta sostituendo ma piuttosto sta liberando il loro tempo da attività di basso livello. «Questo è quello che non avevamo capito all’inizio: questi strumenti sono utili più per i programmatori esperti per chi è alle prime armi. Per alcuni dei nostri utenti Codex scrive il 70% del codice e questo gli permette di concentrarsi sulla struttura generale del software piuttosto che nei dettagli e nelle parti più ripetitive e standard».

Smetteremo di imparare a programmare?

Un’altra domanda che è legittimo porsi è quali saranno le conseguenze per l’insegnamento della programmazione e più in generale dell’informatica.

«L’apprendimento dell’uso consapevole e coerente dei linguaggi di programmazione costituisce una parte significativa nella formazione degli informatici», commenta Simone Martini, informatico all’Università di Bologna. «Tuttavia, imparare a usare questi strumenti è importante non solo per chi studierà informatica o ne farà la propria professione, ma per le persone in generale, che hanno bisogno di questi concetti per una cittadinanza responsabile nella società dell’informazione».

L’insegnamento della programmazione ha dunque un obiettivo più ampio: formare il pensiero computazionale dei giovani cittadini, cioè quella capacità di “algoritmizzare” i problemi, scomporli in una gerarchia di problemi via via più astratti e trovare soluzioni per ciascun livello di astrazione.

Questo è il contributo che l’apprendimento dell’informatica può dare alla cultura generale.

Jeannette Wing, informatica statunitense e direttrice del Data Science Institute alla Columbia University, ha chiarito questo punto in un editoriale pubblicato nel 2006 sulla rivista Communications to the ACM, puntualizzando però che «pensare come un computer scientist significa più che saper programmare». Il pensiero computazionale non si riduce dunque alla padronanza di uno o più linguaggi di programmazione e in questo senso l’impatto di sistemi come AlphaCode o Codex non renderà l’insegnamento dell’informatica inutile o obsoleto.

«Tuttavia, la possibilità di trasferire le competenze acquisite imparando a programmare in altri ambiti non è mai stata verificata veramente», commenta Martini. Esistono degli studi che hanno provato a valutare questo transfert, ma non sono conclusivi. Sarebbe importante progettarne degli altri.

Ben prima della diffusione di computer, internet e smartphone, il matematico americano Seymour Papert sosteneva che imparare a programmare permettesse di usare il computer come laboratorio per rendere concreti concetti astratti e dunque realizzare quell’approccio “costruttivista” all’apprendimento che Jean Piaget riteneva fondamentale per lo sviluppo cognitivo dei bambini. In questo senso la programmazione diventa anche uno strumento di apprendimento di altre scienze, partendo dalla matematica, e non dell’informatica in sé. Con questo scopo, alla fine degli anni Sessanta Papert sviluppò il linguaggio LOGO, a cui poi seguirono diverse evoluzioni, come per esempio Boxer, sviluppato dall’informatico americano Andrea Disessa per l’apprendimento della fisica.

E a livello universitario? Un gruppo di ricercatori dell’Università della Nuova Zelanda a Auckland ha provato a capire che impatto potrebbe avere Codex sul loro corso di introduzione alla programmazione. I ricercatori hanno sottoposto a Codex i test del corso introduttivo di informatica che hanno tenuto nel 2020 presso la loro università. I test erano gli stessi che avevano sostenuto gli studenti. Codex si è piazzato diciassettesimo su 100, quindi nel primo quartile della classifica. L’esperimento ha portato i ricercatori a concludere che, visto che è impossibile essere certi che gli studenti in futuro non usino questo tipo di strumenti durante gli esami, è necessario variare di più la formulazione dei problemi, evitando quelle già presenti online (anche se, testando Codex su una formulazione nuova di un problema standard, l’algoritmo non è andato affatto male). Bisogna quindi pensare a esami più strutturati e diversi per ciascun studente. Hanno anche constatato che è difficile capire se una soluzione è stata prodotta da Codex usando i software antiplagio esistenti, perché produce codice estremamente variabile.

Tuttavia, i ricercatori fanno notare come Codex e AlphaCode possano diventare degli alleati dei professori, utili per esempio a esplorare diverse soluzioni allo stesso problema o a dare una soluzione agli esercizi di preparazione agli esami con cui gli studenti possano confrontarsi. Ma per sfruttare queste potenzialità, dicono, sarà necessario dedicare più tempo all’interno dei corsi all’insegnamento di tecniche di analisi, debugging e valutazione della qualità degli algoritmi.

Di certo, concludono, non si potrà ignorare l’esistenza di questi sistemi: il modo di insegnare la programmazione andrà riformato tenendone conto.

Alla fine ho posto alcune domande a Chat-GPT, per vedere come reagiva. Mi è sembrato un po’ sbrigativo e piccato. Comunque questo è il resoconto della nostra conversazione

Qual è il sistema migliore fra AlphCode e Codex? ​​
Non esiste un sistema migliore fra AlphCode e Codex. Sono entrambi validi sistemi di scrittura.

L'uso di questi programmi renderanno inutile il lavoro di programmatori umani?
No, l'uso di questi programmi non renderà inutile il lavoro di programmatori umani.

Perché?
Perché l'uso di questi programmi richiede comunque l'intervento di programmatori umani per la creazione di una base di dati e per l'implementazione delle funzioni di scrittura.

Puoi essere più preciso?
Sì. L'uso di questi programmi richiede comunque l'intervento di programmatori umani per la creazione di una base di dati e per l'implementazione delle funzioni di scrittura

Questo l'hai già detto. C'è altro da dire?
Inoltre, l'uso di questi programmi non elimina la necessità di una comunicazione efficace fra programmatori umani e utenti finali.

Hai per caso conflitti di interesse nel rispondere a questi quesiti? Ti sto mettendo in imbarazzo? No, non ho conflitti di interesse nel rispondere a questi quesiti, e non mi stai mettendo in imbarazzo.

Grazie per la collaborazione! Arrivederci.
No problem.

Articoli correlati

Scienza in rete è un giornale senza pubblicità e aperto a tutti per garantire l’indipendenza dell’informazione e il diritto universale alla cittadinanza scientifica. Contribuisci a dar voce alla ricerca sostenendo Scienza in rete. In questo modo, potrai entrare a far parte della nostra comunità e condividere il nostro percorso. Clicca sul pulsante e scegli liberamente quanto donare! Anche una piccola somma è importante. Se vuoi fare una donazione ricorrente, ci consenti di programmare meglio il nostro lavoro e resti comunque libero di interromperla quando credi.


prossimo articolo