Oggi annunciamo una svolta all'avanguardia che sta ampliando i confini della generazione di codice AI. Il nostro team scientifico di NinjaTech AI ha sviluppato un nuovo approccio per la generazione di codice denominato «Multi-Programming Language Ensemble» (MPLE).

Utilizzando questo approccio con Llama 3.1 405B Instruct siamo stati in grado di mostrare statisticamente prestazioni migliori rispetto a GPT-4o di OpenAI e Sonnet 3.5 di Anthropic misurate dal benchmark HumanEval. Puoi trovare questi risultati, insieme ai dettagli del nostro approccio, nel nostro documento tecnico pubblicato su arxiv.org.

In questo post del blog, approfondiremo tre risultati fondamentali relativi al Multi-Programming Language Ensemble (MPLE), che ha il potenziale per migliorare significativamente le capacità di generazione di codice in tutti gli assistenti AI:

  1. Un approccio agentic workflow (MPLE), per la generazione di codice, produce una precisione migliore del 2-9% in modo conveniente.
  2. L'integrazione di MPLE con tecniche di inferenza avanzate come Reflection e Monte Carlo Tree Search (MCTS), applicate ai modelli LLM esistenti, produce ulteriori miglioramenti delle prestazioni.
  3. Con nostra piacevole sorpresa, abbiamo osservato che le tecniche MPLE+MCTS basate su llama3.1-405b-instruct hanno raggiunto una precisione di 96,25% nel benchmark HumanEval.

La sfida della generazione di codice

Scrivere codice può essere difficile perché richiede una profonda comprensione dei linguaggi di programmazione e la capacità di tradurre idee complesse in codice eseguibile. Inoltre, gli sviluppatori devono affrontare anche problemi come il debug, l'ottimizzazione e la compatibilità, il che può rendere il processo di codifica ancora più complesso e dispendioso in termini di tempo.

È qui che l'intelligenza artificiale aiuta; i Large Language Model (LLM) possono generare grandi quantità di codice rapidamente quando richiesto da un utente. Da quando abbiamo lanciato MyNinja.ai alla fine di maggio 2024, ha elaborato oltre 734.000 attività di programmazione da circa 173.000 sviluppatori.

Ma la generazione di codice AI non elimina tutte le sfide legate alla scrittura del codice. Gli LLM non sono affidabili al 100%: possono commettere errori durante la generazione del codice.

Il motivo per cui gli LLM commettono errori è che gli approcci tradizionali alla generazione di codice AI si basano su un unico linguaggio di programmazione, il che può portare a errori e pregiudizi specifici del linguaggio. Ad esempio, un LLM può funzionare bene nella generazione di codice Python perché è stato addestrato in Python. Tuttavia, quando viene richiesto di creare un codice C++ o Java, potrebbe non creare un risultato accurato a causa delle differenze nella gestione degli errori o nell'utilizzo della libreria. Un altro motivo per cui un LLM può avere difficoltà a generare codice accurato è la difficoltà di tradurre testo leggibile dall'uomo (ad esempio il prompt dell'utente) in codice.

Una soluzione a questo problema è investire in una maggiore formazione sui modelli. Le aziende possono dedicare più tempo e sempre più denaro alla formazione degli LLM affinché rispondano alle domande di programmazione al primo tentativo. Si chiama apprendimento a risposta zero, il che significa che il modello produce una risposta corretta senza esempi, ma solo un prompt, e genera una risposta appropriata basata solo sulle sue conoscenze pregresse. Tuttavia, un approccio zero shot richiede un enorme investimento di tempo e denaro (tra 10 e 100 milioni di dollari) per migliorare la precisione del modello.

Ma i costi di inferenza sono diminuiti di oltre 100 volte negli ultimi 2 anni e continuano a farlo, dando vita a un nuovo modo: Agentic Workflows for CodeGen.

La nostra soluzione: Multi-Programming Language Ensemble (MPLE)

Il nostro team ha proposto un nuovo approccio alla generazione di codice AI chiamato Multi-Programming Language Ensemble (MPLE). Questo approccio sfrutta la forza di più linguaggi di programmazione per generare codice più accurato e robusto utilizzando un approccio multi-shot.

Invece di affidarci al modello per creare una risposta corretta al primo tentativo (colpo singolo), ci interfacciamo con l'LLM più volte per generare la risposta corretta. Ogni volta che ci interfacciamo con il modello, gli chiediamo di risolvere il problema dell'utente utilizzando un linguaggio di programmazione diverso. Questo ci consente di sfruttare un punto di forza naturale di un LLM: la capacità di tradurre codice da un linguaggio di programmazione a un altro.

Pensa a MPLE come a un team di esperti, ognuno esperto in un linguaggio di programmazione diverso, che lavorano insieme per creare il codice più accurato al primo tentativo. Ogni esperto (o linguaggio di programmazione) mette in campo i propri punti di forza unici e, combinandoli, può produrre una soluzione più accurata e affidabile. MPLE chiede a tutti questi esperti di contribuire con la loro «esperienza» mentre il nostro sistema genera il codice corretto richiesto dall'utente.

Ecco come funziona MPLE:

  1. Generazione iniziale di codice: Quando un utente richiede al nostro sistema una domanda relativa al codice, il nostro modello di intelligenza artificiale genera una risposta iniziale nel linguaggio di programmazione richiesto dall'utente.
  2. Campionamento e traduzione multilingue: Prima che la risposta venga restituita all'utente, il codice viene testato per assicurarne la qualità e l'accuratezza. Se il codice non supera tutti i test, il nostro modello genera nuovo codice in un linguaggio di programmazione diverso. Il nuovo codice viene quindi tradotto nuovamente nel linguaggio di programmazione richiesto dall'utente. Questa versione alternativa è diversa dalla versione originale perché sfrutta i punti di forza del linguaggio alternativo, eliminando potenzialmente gli errori che hanno causato il fallimento del test.
  3. Perfezionamento iterativo: La versione del codice perfezionata viene nuovamente testata rispetto ai casi di test. Se non supera tutti i test, il processo continua iterando su diversi linguaggi di codifica fino a quando una versione non supera con successo tutti i test. Al termine del processo, viene restituita una risposta (ovvero la versione finale del codice) all'utente.
  4. Integrazione dell'ensemble: Nel corso delle iterazioni, l'ensemble framework integra i punti di forza di più linguaggi per perfezionare progressivamente il programma. Considerando ogni generazione di codice specifica per ogni linguaggio come un «esperto debole», il framework combina i relativi risultati per mitigare errori e pregiudizi specifici del linguaggio.

È importante notare che questo approccio non è un nuovo modello, né richiede la riqualificazione di un modello. È un sistema che orchestra interazioni multiple con il tuo LLM esistente per creare la migliore risposta possibile utilizzando un approccio multi-shot. Riteniamo che, poiché i costi di inferenza continuano a diminuire, il futuro dei risultati basati sull'intelligenza artificiale, che sono economicamente sostenibili, sarà guidato da flussi di lavoro agentici che sfruttano tecniche di inferenza pesanti, in cui vengono generati molti token per rispondere a domande complicate.

Convalida di MPLE tramite test

Abbiamo testato il framework MPLE su due benchmark di generazione di codice ampiamente riconosciuti: Valutazione umana e Humaneval-Plus. Questi benchmark misurano la capacità degli LLM di generare codice funzionale in base a un prompt dell'utente.

HumanEval è progettato per attività di generazione di testo in codice in cui l'input è un prompt dell'utente che descrive la funzionalità prevista del programma. L'output del LLM viene quindi valutato in base alla sua capacità di superare test unitari con requisiti specifici. HumanEval-Plus estende HumanEval incorporando un gran numero di casi di test aggiuntivi per valutare rigorosamente la robustezza e la correttezza del codice.

Abbiamo misurato l'efficacia di MPLE utilizzando Pass @1. Questo metodo di valutazione del codice misura la percentuale di attività completate con successo dal codice generato al primo tentativo.

Abbiamo condotto esperimenti utilizzando sia i nostri LLM proprietari che altri modelli noti come GPT-4o, Claude-Sonnet-3.5 e LLAMA3.1-405b.

I nostri test hanno dimostrato che il framework MPLE proposto migliora costantemente l'accuratezza di Pass @1 in tutti gli LLM testati rispetto a una linea di base. Ad esempio La precisione di GPT3.5-Turbo è aumentata dal 65,83% nella linea di base al 74,17% con MPLE, evidenziando l'efficacia dello sfruttamento di più linguaggi di programmazione per ridurre i pregiudizi e gli errori specifici del linguaggio (vedi Tabella 1).

Tabella 1: Risultati dei test HumanEval per MPLE applicati a vari LLM

L'integrazione di MPLE con Reflection e Monte Carlo produce risultati migliori

Abbiamo spinto ulteriormente MPLE e progettato un sistema che integra MPLE con tecniche di inferenza avanzate come Reflection e MCTS. Queste tecniche vengono utilizzate per migliorare le capacità di risoluzione dei problemi e di ragionamento degli LLM, specialmente quando si tratta di attività che richiedono un processo decisionale strategico o in più fasi. La nostra ipotesi era che la combinazione di questi sistemi avrebbe prodotto risultati ancora più elevati rispetto all'utilizzo del solo MPLE. Attraverso una serie di test siamo riusciti a dimostrare che questa ipotesi è vera.

Abbiamo anche testato MPLE utilizzando il benchmark HumanEval-Plus e i risultati convalidano ulteriormente i vantaggi del nostro approccio di ensemble multilingue. In particolare, Le prestazioni di llama3.1-8binstruct sono migliorate dal 60,00% nella linea di base al 71,88% con MPLE+ Reflection (vedi tabella 2).

Tabella 2: Risultati dei test HumanEval-Plus per MPLE e Reflection o MCTS, applicati a vari LLM

Inoltre, MPLE+Reflection e MPLE+MCTS offrono risultati competitivi, con diversi modelli (GPT-4oMini, GPT-4o, Claude-Sonnet-3.5 e llama3.1-405b-instruct) che raggiungono l'87,50% (vedi tabella 3).

Tabella 3: Risultati dei test HumanEval-Plus per MPLE e Reflection o MCTS, applicati a vari LLM

I nostri risultati dimostrano chiaramente che il framework MPLE, specialmente se utilizzato insieme ad algoritmi di inferenza aggiuntivi, offre un approccio potente e flessibile per migliorare la generazione di codice su più LLM. I costanti miglioramenti delle prestazioni di MPLE sottolineano il suo potenziale per applicazioni pratiche nello sviluppo di software basato sull'intelligenza artificiale.

Llama 3.1-405b ottiene risultati all'avanguardia con MPLE e MCTS: precisione del 96,25%!

Durante la nostra analisi siamo rimasti particolarmente colpiti dalle prestazioni di MPLE quando applicato a La combinazione di MPLE+MCTS ha raggiunto la massima precisione per diversi modelli, come llama3.1-405b-instruct, che ha raggiunto una precisione SOTA Pass @1 del 96,25% (vedi tabella 4).

Tabella 4: Risultati dei test HumanEval per MPLE e MCTS, applicati a vari LLM

La strada da percorrere

Mentre continuiamo a superare i limiti di ciò che è possibile con MPLE, siamo entusiasti di esplorare nuove aree di ricerca e sviluppo. Le potenziali aree di interesse includono:

  1. Sviluppo di metriche di valutazione più solide: La creazione di metriche di valutazione efficaci è fondamentale per misurare con precisione le prestazioni di MPLE. Concentrandoci su metriche più complete, possiamo garantire l'accuratezza, l'affidabilità e l'applicabilità pratica del framework in vari domini.
  2. Applicazione di MPLE a problemi reali: MPLE ha il potenziale per affrontare sfide complesse del mondo reale, come l'automazione dei processi aziendali, l'ottimizzazione delle pipeline di sviluppo del software e il miglioramento delle misure di sicurezza informatica. La valutazione di MPLE su una gamma più ampia di set di dati e applicazioni reali sarà fondamentale per valutarne la generalizzabilità e l'impatto.
  3. Miglioramento di NinjaLM per le attività di codifica: il nostro NinjaLM 3.0 (una versione ottimizzata e quantizzata di llama3.1-405b), disponibile all'indirizzo MyNinja.ai ha ottenuto punteggi promettenti su HumanEval (93,85%) e HumanEval-Plus (86,67%) e siamo sulla buona strada per migliorarne ulteriormente le prestazioni. Lanceremo un Ninja Coder basato su MPLE tra un mese.

Siamo entusiasti di condividere la nostra ricerca su MPLE con il mondo. Riteniamo che questo approccio abbia il potenziale per avere un impatto significativo sulla generazione di codice LLM. MPLE riduce gli errori e i pregiudizi specifici del linguaggio, garantendo una generazione di codice più accurata e robusta, il che significa più tempo per gli sviluppatori per affrontare problemi più grandi. Ci impegniamo a continuare la nostra ricerca e sviluppo in questo settore e non vediamo l'ora di vedere le applicazioni innovative di MPLE in futuro.

P.S. Il futuro è molto meno pieno di bug :-)

P.P.S. Abbiamo usato MyNinja.ai per aiutare nella creazione di questo post sul blog.