Similar to Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da un Large Language Model Tramite Genetic Improvement - Slides (20)
3. Introduzione
La scrittura di programmi software è un’attività complessa e impegnativa, che richiede
abilità, conoscenze e competenze specifiche
I Large Language Models (LLMs), sistemi di intelligenza artificiale, possono essere
utilizzati come supporto ai programmatori
Per l’interfacciamento con questi modelli viene richiesta una descrizione in linguaggio
naturale del compito da risolvere, detta prompt
Prompt vago o un problema troppo complesso −→ risposta incompleta o errata
1/21
4. Metodologia proposta
Miglioramento del codice software generato da un LLM utilizzando il Genetic Improvement
(GI)
• Fornitura del prompt e delle coppie di valori input e relativi output da parte
dell’utente
• Ottenimento di una soluzione da un LLM e successiva valutazione del codice
• Applicazione del GI in caso di soluzione non ottima
2/21
5. Specifiche
Focalizzazione sul linguaggio Python
Risoluzione di problemi codificabili con un’unica struttura di funzione
Applicazione del GI mediante Grammatical Evolution (GE), tramite tecnica innovativa per
la definizione di una grammatica dinamica rispetto al problema in esame
Validazione del metodo tramite benchmark PSB2 [3]
3/21
6. PSB2
Ideato per la ricerca su sintesi automatica di programmi, con tecniche come Genetic
Programming (GP)
Dataset di benchmark che racchiude 25 problemi di programmazione
Libreria Python per l’accesso diretto a coppie di input-output per ciascun problema
Descrizioni testuali di ciascun problema definite in un file csv
4/21
8. Modelli
Lo strumento proposto offre la possibilità di utilizzare diversi modelli, permettendo anche
l’inserimento di ulteriori LLMs.
• Alpaca: versione da 7B e 13B, basato sul modello della società Meta AI, chiamato
Large Language Model Meta AI (LLaMA)
• Modelli di OpenAI: ChatGPT e GPT-4, entrambi accessibili via API
5/21
9. Inizializzazione
Dati i prompts di ciascun problema, essi vengono ordinatamente dati al LLM scelto
Viene aggiunta una stringa come preambolo, per specificare il tipo di codice richiesto e
incoraggiare l’inserimento dei moduli richiesti
• ”Write a single Python function to solve the following problem inserting the necessary
modules:”
Il risultato, la cui formattazione dipende dal LLM, è sempre una stringa, che può però
contenere testo o altri elementi non interessanti
6/21
10. Valutazione del codice ottenuto
Tramite l’esecuzione della funzione sui valori di esempio, e confronto del risultato con
l’output atteso, se ne valuta la correttezza
I risultati dei test, la funzione e altri dati vengono salvati in un file JSON unico per
problema dato
Con la ripetizione di questo processo più volte per problema, 10 nello studio proposto, è
possibile ottenere soluzioni diverse dal modello
7/21
14. PonyGE2
PonyGE2 [1]: implementazione Python del GE
Opzione per inserire individui nella popolazione iniziale, al fine di eseguire GI
Grammatica Backus-Naur Form (BNF) per evoluzione e per processo di mappatura
fenotipo-genotipo tramite parser integrato
File txt per definire gli iper-parametri del processo di evoluzione
10/21
15. Generazione della grammatica dinamica
Tramite la grammatica BNF è possibile esprimere il codice generabile dal GI
La sua dimensione intacca il tempo necessario all’evoluzione:
• Molto grande −→ troppe possibili combinazioni
• Molto piccola −→ perdita di generalità
Utilizzo di una grammatica che racchiude tutto Python mostra come il numero troppo alto
di combinazioni impedisce di ottenere risultati significativi
11/21
16. Generazione della grammatica dinamica
Riduzione dello spazio di ricerca vincolando alcune parti costitutive, con la produzione
iniziale che permette la definizione di sole funzioni
• <pred> ::= <IMPORT>"def evolve("<vars>"):{:"<NL><code>":}"
Nome della funzione fissato per evitare generazione di individui con modifiche solamente a
questo elemento
<IMPORT> riempito con carattere vuoto e tutti i pacchetti inseriti dal LLM nelle varie
iterazioni
Nomi delle variabili ridotti ad una lista predefinita
12/21
17. Generazione della grammatica dinamica
Miglioramento della generalità della grammatica con ulteriori produzioni dinamiche
• Metodi e funzioni usate in ogni specifica generazione aggiunti a quelli più comuni già
presenti
• Numeri caratteristici del problema, estratti dal prompt (simbolo/parola)
• Stringhe particolari, estratte dal codice generato ma anche dal prompt tramite
KeyBERT [2]
13/21
18. File di configurazione del GI
Template del file di GI personalizzato sul
problema a runtime, sostituendo:
• <bnf>
• <train> e <test>
• <seedFolder>
14/21
19. File di configurazione del GI
<seedFolder> è il percorso relativo della cartella in cui sono specificati gli individui della
popolazione iniziale
Il genotipo degli individui viene ottenuto subito dopo la generazione della grammatica
Per massimizzare la generalità, la funzione di fitness è generica, basata sul numero di test
falliti
15/21
20. Selezione dei problemi per il GI
Esclusione di alcuni problemi di
PSB2 per la fase di GI:
• Problemi completamente
corretti
• Problemi con codice
generato troppo complesso
Alpaca7B Alpaca13B
Basement Basement
Dice Game Snow Day
Tabella 1: Problemi scelti per i modelli Alpaca.
ChatGPT, GPT-4
Basement
Camel Case
Dice Game
Fizz Buzz
Snow Day
Tabella 2: Problemi scelti per la fase di GI nel caso dei modelli
GPT di OpenAI.
16/21
21. Esempio - problema Fizz Buzz
Figura 1: Fitness dell’individuo migliore al passare delle generazioni, per 10 iterazioni indipendenti, nel caso di
Fizz Buzz con individui di partenza ottenuti da ChatGPT.
17/21
22. Tempi di esecuzione
Validazione del processo ripetendo l’esecuzione per ciascun problema scelto per ogni
modello 10 volte
Esperimenti eseguiti su una macchina con Ubuntu 20.04.5 LTS, 8 core su 2 CPU AMD
EPYC 7542 32-Core Processor e GPU NVIDIA A100 80 GB limitata a 20 GB con MIG
Tempo di esecuzione (s)
Problema Alpaca7B Alpaca13B ChatGPT GPT-4
Basement 3057.30 2565.59 82.70 93.33
Camel Case — — 16.17 56.36
Dice Game 2331.98 — 1344.13 3281.47
Fizz Buzz — — 994.48 420.92
Snow Day — 2709.70 18 956.82 3201.40
Tabella 3: Tempi di esecuzione mediati nelle 10 iterazioni, in secondi, del GI. I numeri in grassetto indicano se
è stato ottenuto almeno un ottimo.
18/21
23. Confronto pre e post GI
Problema A7 A13 CG G4
n< (%) n> (%) n< (%) n> (%) n< (%) n> (%) n< (%) n> (%)
Basement 0.00 23.10 0.00 17.40 30.00 100.00 50.00 100.00
Camel Case — — — — 64.37 100.00 20.62 100.00
Dice Game 0.00 2.20 — — 1.00 8.62 0.73 2.86
Fizz Buzz — — — — 0.00 89.80 0.45 94.90
Snow Day — — 0.00 5.70 2.32 75.06 3.35 8.20
Tabella 4: Percentuale del numero di test passati, mediata sulle 10 iterazioni, prima (n<) e dopo (n>)
l’applicazione del GI. In ordine, i valori sono relativi a Alpaca7B (A7), Alpaca13B (A13), ChatGPT (CG) e
GPT-4 (G4) e per i relativi problemi considerati. In grassetto sono evidenziati i valori che risultano essere
statisticamente significativi rispetto al test di Wilcoxon.
19/21
25. Osservazioni
I risultati sono promettenti anche se l’insieme dei problemi trattati è molto ridotto
La grammatica è il collo di bottiglia di questa tecnica
Il tempo richiesto è comunque relativamente lungo
20/21
26. Sviluppi futuri
Implementazione di LLM ideati per la generazione di codice
Scrittura più precisa dei prompt
Miglioramento della scelta degli iper-parametri per il GI
21/21
28. Riferimenti bibliografici
Michael Fenton et al. «PonyGE2: Grammatical Evolution in Python». In: (mar. 2017).
Maarten Grootendorst. KeyBERT: Minimal keyword extraction with BERT.
Ver. v0.3.0. 2020. DOI: 10.5281/zenodo.4461265. URL:
https://doi.org/10.5281/zenodo.4461265.
Thomas Helmuth e Peter Kelly. «PSB2: The Second Program Synthesis Benchmark
Suite». In: Proceedings of the Genetic and Evolutionary Computation Conference. GECCO ’21.
Lille, France: Association for Computing Machinery, 2021, pp. 785–794. ISBN: 9781450383509.
DOI: 10.1145/3449639.3459285. URL: https://doi.org/10.1145/3449639.3459285.