Come ho imparato ad amare l’AI generativa autonoma rispetto all’autocompletamento

'Come ho imparato ad amare l'AI generativa autonoma'

La nuova intelligenza artificiale generativa per gli strumenti di codice aiuta gli sviluppatori a svolgere il proprio lavoro più rapidamente con meno sforzo mediante la sintesi del codice. ChatGPT e altri approcci LLM hanno reso questa forma di intelligenza artificiale generativa accessibile a un vasto pubblico generale. Gli sviluppatori si stanno affrettando ad utilizzarla.

Tuttavia, spesso vengono trascurate le differenze fondamentali tra gli strumenti generativi di intelligenza artificiale per il codice, e queste differenze informano su quale approccio sia migliore per i compiti degli sviluppatori. Sotto la superficie, gli strumenti generativi di intelligenza artificiale per il codice rientrano in due categorie di base: modelli di linguaggio ampio basati su trasformatori (ad esempio, Copilot, ChatGPT) e sistemi basati su apprendimento per rinforzo (RL).

La differenza più grande tra RL e LLM come Copilot è che Copilot è uno strumento interattivo di suggerimento del codice per la scrittura generale del codice (Microsoft lo chiama un “programmatore AI a coppie”), mentre i sistemi basati sull’apprendimento per rinforzo possono creare codice senza l’aiuto umano. Un esempio di RL è Diffblue Cover, che può scrivere autonomamente interi insiemi di test unitari completamente funzionanti.

Copilot è progettato per lavorare con uno sviluppatore umano per gestire compiti noiosi e ripetitivi di codifica come la scrittura di boilerplate e l’invocazione di “terre straniere” (API di terze parti). Sebbene si possa chiedere a Copilot di suggerire un test unitario per il proprio codice, non si può puntarlo a un milione di righe di codice e tornare dopo qualche ora con decine di migliaia di test unitari che si compilano e si eseguono correttamente.

Questo perché sono cose o strumenti intrinsecamente diversi, in cui lo sviluppatore deve prima considerare cosa vuole ottenere prima di scegliere l’approccio giusto.

L’apprendimento per rinforzo può essere uno strumento potente per risolvere problemi complessi. I sistemi RL si eseguono rapidamente su un laptop perché utilizzano dati pre-raccolti per imparare, rendendoli particolarmente efficaci su grandi set di dati.

Storicamente il costo di addestramento online (far interagire un modello di intelligenza artificiale con il mondo reale per imparare) era proibitivo. I nuovi LLM di OpenAI, Google e Meta hanno in gran parte eliminato quella spesa assorbendola. Ma gli sviluppatori devono comunque verificare il codice generato!

Prendiamo ad esempio la creazione di test unitari. Copilot scriverà un test e poi richiederà un po’ di “ingegneria del prompt” per convincerlo a scrivere un test diverso, oltre al tempo per modificare i suggerimenti risultanti e farli compilare ed eseguire correttamente. D’altro canto, RL può comprendere l’effetto di ogni azione, potenzialmente ricevere una ricompensa e rimodellare i suoi parametri per massimizzare quelle ricompense. In questo modo, il modello impara quali azioni producono ricompense e definisce la politica, la strategia, che seguirà per massimizzarle. E voilà! Produce test unitari che si compilano ed eseguono autonomamente.

Gli strumenti di completamento del codice basati su modelli di trasformatori prevedono la prossima parola o token in una sequenza analizzando il testo fornito. Questi modelli di trasformatori hanno subito un’evoluzione drammatica e hanno portato l’intelligenza artificiale generativa alle prime pagine dei giornali di tutto il mondo. Il loro output sembra magico. GPT-2, uno dei primi modelli open source rilasciati nel febbraio 2019. Da allora, il numero di parametri in questi modelli è aumentato drasticamente, da 1,5 miliardi in GPT-2 a 175 miliardi in GPT-3.5, rilasciato nel novembre 2022.

OpenAI Codex, un modello con circa 5 miliardi di parametri utilizzato in GitHub CoPilot, è stato appositamente addestrato sul codice open source, il che gli consente di eccellere in compiti come la generazione di codice boilerplate da semplici commenti e l’invocazione di API basandosi su esempi che ha visto in passato. L’accuratezza di previsione “one-shot” di questi modelli ha raggiunto livelli paragonabili a quelli dei modelli di linguaggio addestrati esplicitamente. Purtroppo, GPT-4 è una scatola nera: non sappiamo quanti dati di addestramento o quanti parametri sono stati utilizzati per sviluppare il modello.

Per quanto meravigliosi possano sembrare gli strumenti di generazione di codice basati su LLM AI, a volte sono imprevedibili e dipendono molto dalla qualità dei prompt (con conseguente pubblicazione di nuovi lavori di “ingegneria” dei prompt su LinkedIn). Essendo essenzialmente modelli statistici di pattern testuali, possono generare codice che sembra ragionevole ma che è fondamentalmente difettoso o famosamente illusorio.

Ad esempio, GPT-3.5 incorpora l’apprendimento per rinforzo umano nel ciclo, in cui le risposte vengono classificate dagli esseri umani per ottenere risultati migliorati, oltre all’addestramento sulle risposte scritte dagli esseri umani. Tuttavia, la sfida rimane nell’identificare gli errori sottili prodotti da questi modelli, che possono portare a conseguenze indesiderate, come l’incidente di ChatGPT coinvolgente l’azienda di codifica tedesca OpenCage. Questi problemi non scompaiono, indipendentemente dalla quantità di dati di addestramento e parametri utilizzati durante l’addestramento di questi modelli.

Inoltre, i modelli di linguaggio ampio (LLM) imparano elaborando il testo. Ma gran parte dell’apprendimento non ha assolutamente nulla a che fare con il testo o il linguaggio. È come imparare il basket leggendo libri di testo rispetto a giocare partite di pallacanestro.

L’apprendimento per rinforzo differisce dai LLM concentrandosi sull’apprendimento mediante l’azione, anziché basarsi sul testo. E nel contesto dei test unitari, questo processo consente al sistema di migliorare iterativamente e generare test con una copertura maggiore e una migliore leggibilità, risultando in un processo di testing più efficace ed efficiente per gli sviluppatori.