Giocando con GitHub Copilot

martedì 27 luglio 2021

Negli ultimi giorni ho avuto modo di giocare un po' con la Technical Preview di GitHub Copilot. Per chi non lo conoscesse ancora, dal sito ufficiale "GitHub Copilot è un AI pair programmer, che ti aiuta a scrivere il codice più rapidamente e con meno lavoro". E' un nuovo servizio di GitHub e OpenAI, che può essere usato come plugin in Visual Studio Code. Può auto-generare il codice per voi, basandosi sui contenuti del file corrente, e della posizione del cursore corrente. GitHub Copilot deriva il contesto dal codice e dai commenti, e suggerisce singole linee di codice o intere funzioni istantaneamente.

GitHub Copilot non è il primo strumento AI-powered che suggerisce il completamento del codice. Strumenti simili (ma molto meno avanzati) sono Visual Studio IntelliSense e IntelliCode, o Natural Language Semantic Code Search di GitHub, che può trovare esempi di codice usando descrizioni in Inglese. Copilot è un po' differente, perchè può generare funzioni multi-linea, documentazione, test e anche testo generico, basato sul contesto del file sorgente. Essendo stato coinvolto per lavoro in un progetto esplorativo R&D, dove ho potuto sperimentare un po' con la generazione automatica di testo, ero particolarmente interessato a provare Copilot, "generazione di testo per codice sorgente".

Attualmente non è disponibile pubblicamente, per cui se voleste provarlo, dovete farne richiesta tramite lista di attesa, visitando il sito GitHub Copilot.

GitHub Copilot Screenshot - Pagina di registrazione

Per quelli che hanno già avuto accesso, dopo un rapido setup iniziale e l'installazione dell'extension per Visual Studio Code, sembra di avere una sorta di mago che "ascolta in sottofondo" i nostri intenti e scrive il codice per noi. Dopo l'installazione e l'autenticazione con il proprio account GitHub, vedrete l'icona di Copilot a destra in basso, in Visual Studio Code:

GitHub Copilot Screenshot - Icona VSCode

E' possibile in ogni momento abilitare e disabilitare Copilot cliccando sull'icona.

Per esempio, in questo screenshot, ho scritto del codice C# e un commento che descrive una funzione che vorrei implementare.

GitHub Copilot Screenshot - Generazione codice C# in VSCode

Il testo in grigio è stato completamente suggerito da Copilot. Per confermare e accettare il suggerimento, basta premere TAB. Ma Copilot fornisce altre opzioni, come navigare avanti e indietro tra vari suggerimenti, accettare il suggerimento corrente, oppure aprire la finestra di Copilot (CTRL+ENTER), dove vengono mostrate altre 10 alternative possibili. Davvero impressionante!!

Ho giocato un po' con il servizio e sì, effettivamente, le prime volte che lo usate, sembra magia, è impressionante, dato quello che riesce a suggerire e auto-completare. Ma non sono (per ora) del tutto convinto che possa diventare il mio AI pair programmer quotidiano. Vediamo rapidamente perchè.

Copilot è sviluppato sulla base di un modello linguistico a rete neurale profonda chiamato Codex (derivato dalle stesse idee di GPT), che è stato addestrato sui repository pubblici in GitHub. Senza entrare nei dettagli, il modello linguistico Codex impara ad indovinare token e simboli mancanti nel codice sorgente, così da imparare la struttura e il significato dei linguaggi di programmazione. Questo approccio, così come succede anche con i modelli linguistici generici, ha alcune grandi limitazioni, derivate da come sono definiti e addestrati.

Secondo il paper di OpenAI, Codex fornirebbe la risposta corretta meno del 30% delle volte. E, da quello che ho visto io usandolo per un po' in scenari da mondo reale, più complessi, nello specifico in progetti Python/Deep Learning, il codice che scrive è generalmente di bassa qualità e spesso fallisce nel suggerire soluzioni ottimali conosciute. Dato che Copilot ha ingerito moltissimo codice dall'archivio pubblico di GitHub, costituito da milioni di repository, include codice di altissima qualità scritto da programmatori in gamba, ma allo stesso tempo anche codice di media-bassa qualità. E così Copilot è in grado di imparare a scrivere quello che questi programmatori potrebbero scrivere, se stessero scrivendo il pezzo di codice al posto nostro. La ragione è dovuta a come funzionano i modelli linguistici. Sono in grado di generare, in media, quello che la maggior parte della gente scrive. Non hanno senso di cosa è giusto o sbagliato, cosa è corretto o no. Quello che dobbiamo fare noi è prendere quello che ci suggerisce Copilot, e applicarci la nostra intelligenza umana.

Per come la vedo io, questo non significa che Copilot non sia un servizio favoloso: dal punto di vista AI/ML R&D, il fatto che Copilot possa scrivere codice ragionevole e simil-umano è un risultato eccezionale, davvero un passo in avanti nella generazione di testo automatica. Ma ci deve essere bene chiaro che inserendo del codice ragionevole nel nostro lavoro, senza considerare se compila e/o se si comporta come dovrebbe, che potrebbe non funzionare o non aderire alle best-practice, o addirittura usare approcci "vecchi", si può introdurre del debito tecnico, che potrebbe diventare un problema enorme, in certi contesti.

GitHub ha definito Copilot come "pair programmer", ma per ora io non credo che questo servizio sia in grado di fare quello che dovrebbe fare. Dalla mia esperienza personale, un buon pair programmer è qualcuno che mette in dubbio costantemente le nostre idee e assunzioni, ci aiuta a trovare problemi nascosti e ci aiuta nella visione d'insieme. Per ora Copilot non fa nessuna di queste cose: anzi, pensa che le nostre assunzioni siano quelle più appropriate e valide, e si focalizza a scrivere del codice sulla base del file che stiamo modificando e dove si trova il cursore.

In aggiunta, il fatto che GitHub Copilot è stato addestrato su codice pubblicamente disponibile, sotto una varietà di licenze, apre molte discussioni sulle implicazioni etiche e legali. Chi detiene la proprietà intellettuale del codice generato dall'AI? Cosa succede se il codice generato dall'AI è un copia-incolla di codice rilasciato sotto GPL (e noi non sappiamo qual è la sorgente originale e la sua licenza... così potrebbe anche essere che andiamo ad inserire codice GPL nel nostro codice proprietario...)? Per giunta, in alcune prove, il codice generato conteneva alcune informazioni sul codice originale e sui suoi autori, così come informazioni sensibili tipo password, chiavi API, ecc. Queste sono le cose da tenere in considerazione e fare attenzione.

La cosa più importante da ricordare è che, al momento, Copilot è una anteprima tecnica preliminare di una nuova tecnologia, che probabilmente migliorerà via via col tempo. Quello che posso suggerirvi è, se potete, di provarlo e usarlo voi stessi, per vedere se il servizio è in qualche modo utile nei vostri scenari. Quindi, condividete e discutete dei problemi, dei comportamenti strani, delle implicazioni, o di quello che funziona e non funziona. Aiuterete GitHub a migliorare il servizio e, nei prossimi mesi e anni, a fornire davvero un potente ed utile "AI pair programmer". Nel frattempo, io farò lo stesso, e vi terrò aggiornati sugli ultimi sviluppi.