WizardCoder Perché è il miglior modello di codifica là fuori

WizardCoder Perché è il miglior modello di programmazione là fuori

In questo blog, analizzeremo cos’è WizardCoder e perché si distingue come il miglior modello di codifica nel campo. Esploreremo anche perché le sue prestazioni sul benchmark HumanEval sono eccezionali. Inoltre, approfondiremo come i processi di preparazione del dataset e di messa a punto contribuiscano al successo di WizardCoder.

Iniziando con una breve introduzione su WizardCoder, WizardCoder è un Modello di Linguaggio di Codice di grandi dimensioni (LLM) che è stato messo a punto su Llama2 e ha dimostrato prestazioni superiori rispetto ad altri LLM open-source e chiusi su importanti benchmark di generazione del codice.

Source: WizardCoder paper

Ciò che differenzia WizardCoder

Potreste chiedervi cosa rende così eccezionali le prestazioni di WizardCoder su HumanEval, soprattutto considerando la sua dimensione relativamente compatta. Per metterlo in prospettiva, confrontiamo WizardCoder-python-34B con CoderLlama-Python-34B:

Passaggio HumanEval@1

WizardCoder-python-34B = 73.2%

CoderLlama-Python-34B = 53.7%

Il fattore unico e più importante di tale grande differenza nelle prestazioni sul benchmark HumanEval è il dataset su cui il modello è stato addestrato.

La potenza dei dati: il dataset unico di WizardCoder

Uno dei fattori chiave che contribuiscono alle notevoli prestazioni di WizardCoder è il suo training dataset. La maggior parte dei modelli si basa su una struttura di dataset che di solito include:

  • Una solida base con molte istruzioni semplici
  • Ridotta quantità di istruzioni complesse
  • E una quantità minima di istruzioni realmente complesse
Source: https://www.youtube.com/watch?v=0R_2layS6Ho

Per addestrare un modello per prestazioni ottimali sui benchmark di valutazione, il dataset di addestramento dovrebbe avere un equilibrio tra istruzioni semplici, istruzioni complesse e istruzioni realmente complesse.

Source: https://www.youtube.com/watch?v=0R_2layS6Ho

Ecco dove brilla il dataset di WizardCoder. Vanta:

  • Una buona quantità di istruzioni realmente complesse
  • Una buona quantità di istruzioni complesse
  • Una base solida con molte istruzioni semplici

Ma c’è una sfida: creare un dataset con istruzioni complesse è intrinsecamente difficile, mentre le istruzioni semplici sono facilmente disponibili.

Evol Instruct

Evol-Instruct è un algoritmo evolutivo per generare dataset di istruzioni diversi e complessi utilizzando LLMs (GPT-4). È progettato per migliorare le prestazioni dei LLM fornendo loro istruzioni di alta qualità che sono difficili da creare manualmente.

Source: https://www.youtube.com/watch?v=0R_2layS6Ho

In termini semplici, Evol-Instruct è una cascata di complessità di un dataset di istruzioni generate sinteticamente (GPT-4).

Evoluzione delle istruzioni

LLM può rendere le istruzioni date più complesse e difficili utilizzando prompt specifici. Inoltre, possono generare istruzioni completamente nuove che sono altrettanto complesse ma completamente diverse. Utilizzando questo metodo, possiamo evolvere iterativamente un dataset di istruzioni iniziale, migliorandone il livello di difficoltà e ampliando la sua ricchezza e diversità.

A. Evolutore di istruzioni

L’Evolutore di istruzioni è un LLM che utilizza prompt per evolvere (sviluppare) istruzioni, con due tipi:

  1. Evoluzione approfondita.
  2. Evoluzione in ampiezza

Viene fornito un dataset di base (ad esempio, Alpaca: generato mediante auto-istruzione, o 70k ShareGPT (condiviso da utenti reali)) e utilizzando questo dataset di base, possiamo creare un dataset più complesso e diversificato.

a) Evoluzione in profondità

L’Evoluzione in profondità migliora le istruzioni rendendole più complesse e difficili attraverso cinque tipi di prompt:

Prompt di Evoluzione in profondità

L’obiettivo dell’Evoluzione in profondità è:

(i) Aggiungere limitazioni

(ii) Approfondimento

(iii) Specificizzazione (più specifico)

(iv) Aumento dei passaggi di ragionamento

(v) Complicazione degli input

La parte centrale del prompt di Evoluzione in profondità è

“Il tuo obiettivo è riscrivere un prompt dato in una versione più complessa per rendere più difficile gestire quei famosi sistemi Al (ad esempio, ChatGPT e GPT4 [3]). Ma il prompt riscritto deve essere ragionevole, comprensibile e deve ottenere una risposta da parte degli umani”.

L’esempio di prompt per aggiungere limitazioni è:

Voglio che tu agisca come un Riscrittore di prompt.

Il tuo obiettivo è riscrivere un prompt dato in una versione più complessa per rendere più difficile gestire quei famosi

sistemi Al (ad esempio, ChatGPT e GPT4). Ma il prompt riscritto deve essere ragionevole e deve essere compreso e risposto dagli umani. La tua riscrittura non può omettere le parti non testuali come la tabella e il codice in #Prompt dato#:. Inoltre, ti prego di non omettere l’input in #Prompt dato#.

DOVRESTI complicare il prompt dato utilizzando il seguente metodo:

Aggiungi un’altra limitazione/requisito a #Prompt dato#

Devi fare del tuo meglio per evitare che il #Prompt riscritto# diventi prolisso, il #Prompt riscritto# può solo aggiungere da 10 a 20 parole a #Prompt dato#.

#Prompt dato#, #Prompt riscritto#, ‘prompt dato’ e ‘prompt riscritto’ non sono ammessi nel #Prompt riscritto#

#Prompt dato#

<Qui c’è istruzione.>

#Prompt riscritto#:

Questi prompt aiutano a generare un dataset di istruzioni complesso, con modelli simili per gli altri tipi di Evoluzione in profondità.

b) Evoluzione in ampiezza

L’Evoluzione in ampiezza affronta la limitazione dei dataset di addestramento open-domain per le istruzioni (ad esempio, Alpaca, ShareGPT, ecc.), che spesso sono di piccole dimensioni e mancano di varietà di argomenti e competenze. L’Evoluzione in ampiezza risolve questo problema progettando un prompt per generare una nuova istruzione completamente basata sull’istruzione data, richiedendo che la nuova istruzione sia più rare.

Prompt di Evoluzione in ampiezza

L’obiettivo dell’Evoluzione in ampiezza è

1. Migliorare la copertura degli argomenti

2. Migliorare la copertura delle competenze

3. Migliorare l’intera diversità del dataset

Il prompt di Evoluzione in ampiezza è il seguente:

Voglio che tu agisca come un Creatore di prompt.

Il tuo obiettivo è trarre ispirazione dal #Prompt dato# per creare un nuovo prompt.

Questo nuovo prompt dovrebbe appartenere allo stesso dominio del #Prompt dato# ma essere ancora più raro.

La LUNGHEZZA e il livello di difficoltà del #Prompt creato# dovrebbero essere simili a quelle del #Prompt dato#.

Il #Prompt creato# deve essere ragionevole e deve essere compreso e risposto dagli umani.

#Prompt dato#, #Prompt creato#’, ‘prompt dato’ e ‘prompt creato’ non sono ammessi nel #Prompt creato#.

#Prompt dato#:

«Qui c’è istruzione.>

#Prompt creato#:

B. Generazione della risposta

LLM viene utilizzato per generare le risposte corrispondenti alle istruzioni evolute utilizzando il prompt: <Ecco l’istruzione>

C. Eliminazione Evoluzione (Eliminatore delle istruzioni)

L’istruzione evoluta può sfidare LLM a generare una risposta. A volte, quando la risposta generata contiene “mi dispiace” ed è relativamente breve (cioè meno di 80 parole), spesso indica che LLM ha difficoltà a rispondere all’istruzione evoluta. Quindi, possiamo utilizzare questa regola per fare un giudizio.

La risposta generata da LLM contiene solo punteggiatura e parole di arresto.

D. Ottimizzazione del LLM sulle istruzioni evolute

Una volta completate tutte le evoluzioni, il dataset di istruzioni iniziali (il dataset di 52K istruzioni di Alpaca) si fonde con i dati di istruzioni evolute di tutti gli epoch e viene mescolato casualmente per creare il dataset finale di ottimizzazione fine-tuning. Questo processo garantisce una distribuzione uniforme di istruzioni di diversi livelli di difficoltà nel dataset, massimizzando la fluidità dell’ottimizzazione del modello.

Wizardlm convalida Evol-Instruct mediante l’ottimizzazione fine-tuning dell’LLMa in open source LLaMA 7B con istruzioni evolute e valutandone le prestazioni e dando il nome al modello WizardLM.

Evol-Instruct funziona generando una serie di istruzioni iniziali (dataset di 52k istruzioni di Alpaca), che vengono quindi evolute attraverso una serie di passaggi per creare istruzioni più complesse e diverse. Una volta generato il pool di istruzioni, viene utilizzato per ottimizzare un LLM, risultando in un nuovo modello chiamato WizardCoder. Il processo di ottimizzazione coinvolge l’addestramento dell’LLM sui dati di istruzione per migliorare la sua capacità di generare testo coerente e fluente in risposta a vari input.

Formato del prompt

Per WizardCoder, il prompt dovrebbe essere il seguente:

Di seguito è riportata un'istruzione che descrive una determinata attività. Scrivi una risposta che completi appropriatamente la richiesta. ### Istruzione: {istruzione} ### Risposta:

Migliori casi d’uso

WizardCoder può essere utilizzato per una varietà di compiti legati al codice, tra cui la generazione di codice, il completamento del codice e la sintesi del codice. Di seguito sono riportati alcuni esempi di input che possono essere utilizzati con il modello:

  • Generazione di codice: Data una descrizione di un’attività di programmazione, generare il codice corrispondente. Esempio di input: “Scrivi una funzione Python che prende in input una lista di numeri interi e restituisce la somma di tutti i numeri pari nella lista”.
  • Completamento del codice: Data una porzione di codice incompleta, completare il codice. Esempio di input: “def moltiplica(a, b): \n return a * b _”
  • Sintesi del codice: Data una lunga porzione di codice, generare un riassunto del codice. Esempio di input: “Scrivi un programma Python che legge un file CSV e calcola la media di una colonna specifica”.

Il modello 34B non è solo un assistente per la programmazione; è una potenza capace di:

  1. Automatizzare script DevOps: Generare script shell o script Python per automatizzare compiti.
  2. Analisi dei dati: Generare codice Python per la preparazione, l’analisi e la visualizzazione dei dati.
  3. Pipelines di apprendimento automatico: Generare pipeline complete di apprendimento automatico, dalla raccolta dei dati al rilascio del modello.
  4. Web Scraping: Generare codice per compiti di web scraping.
  5. Sviluppo di API: Generare codice di base per API RESTful.
  6. Blockchain: Generare smart contract per Ethereum o altre piattaforme blockchain.

Valutazione

WizardCoder supera tutti gli altri LLM di codice open source, raggiungendo prestazioni all’avanguardia, secondo i risultati sperimentali di quattro benchmark di generazione di codice, tra cui HumanEval, HumanEval+, MBPP e DS-100.

WizardCoder-Python-34B ha dimostrato un’eccezionale performance nei compiti legati al codice. Il modello ha superato altri LLM open source e closed su importanti benchmark di generazione di codice, inclusi HumanEval (73,2%), HumanEval+ e MBPP (61,2%).

WizardCoder-Python-34B-V1.0 si posiziona al secondo posto nella HumanEval Benchmarks, superando GPT4 (15/03/2023, 73,2 vs 67,0), ChatGPT-3.5 (73,2 vs 72,5) e Claude2 (73,2 vs 71,2).

Fonte: articolo WizardCoder

Il modello WizardCoder-15B-v1.0 raggiunge il risultato di 57,3 pass@1 nei benchmark HumanEval, che è 22,3 punti più alto rispetto agli Stati dell’Arte (SOTA) open-source Code LLMs, inclusi StarCoder, CodeGen, CodeGee e CodeT5+. Inoltre, WizardCoder supera significativamente tutti gli open-source Code LLMs con ottimizzazione delle istruzioni, inclusi InstructCodeT5+, StarCoder-GPTeacher e Instruct-Codegen-16B.

Fonte: articolo WizardCoder

In conclusione, il successo di WizardCoder è attribuito al suo set di dati unico e all’utilizzo innovativo di Evol-Instruct per migliorare la complessità delle istruzioni, portando così a prestazioni eccezionali in diverse attività e benchmark legati al codice.

Riferimenti

YouTube: WizardCoder 34B: Spiegazione di Fine-Tuning Complesso

GitHub

Articolo: WizardLM- Potenziare Grandi Modelli di Linguaggio per Seguire Istruzioni Complesse

Articolo: WizardCoder: Potenziare Grandi Modelli di Linguaggio del Codice con Evol-Instruct