Condividi tramite


Modelli Codex e servizio Azure OpenAI

Importante

Questo articolo è stato creato e testato in base ai modelli di generazione di codice legacy. Questi modelli usano l'API di completamento e il relativo stile di interazione prompt/completamento. Per testare le tecniche descritte in questo articolo verbatim, è consigliabile usare il modello gpt-35-turbo-instruct che consente l'accesso all'API dei completamenti. Tuttavia, per la generazione del codice l'API di completamento della chat e i modelli GPT-4o più recenti genereranno i risultati migliori, ma le richieste devono essere convertite nello stile di conversazione specifico per interagire con tali modelli.

La serie di modelli Codex discende dalla serie GPT-3 sottoposta a training sia sul linguaggio naturale che su miliardi di righe di codice. È più capace in Python ed è esperta in oltre una dozzina di linguaggi, tra cui C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL e anche Shell.

È possibile usare Codex per diverse attività, tra cui:

  • Trasformare i commenti in codice
  • Completare la riga o la funzione successiva nel contesto
  • È possibile ottenere informazioni, ad esempio trovare una libreria utile o una chiamata API per un'applicazione
  • Aggiunta di commenti
  • Riscrivere il codice per l'efficienza

Come usare i modelli di completamento con il codice

Ecco alcuni esempi di uso di Codex che possono essere testati nel playground di Azure AI Studio con una distribuzione di un modello di serie Codex, ad esempio code-davinci-002.

Messaggio "Hello" (Python)

"""
Ask the user for their name and say "Hello"
"""

Creare nomi casuali (Python)

"""
1. Create a list of first names
2. Create a list of last names
3. Combine them randomly into a list of 100 full names
"""

Creare una query MySQL (Python)

"""
Table customers, columns = [CustomerId, FirstName, LastName, Company, Address, City, State, Country, PostalCode, Phone, Fax, Email, SupportRepId]
Create a MySQL query for all customers in Texas named Jane
"""
query =

Spiegazione del codice (JavaScript)

// Function 1
var fullNames = [];
for (var i = 0; i < 50; i++) {
  fullNames.push(names[Math.floor(Math.random() * names.length)]
    + " " + lastNames[Math.floor(Math.random() * lastNames.length)]);
}

// What does Function 1 do?

Procedure consigliate

Iniziare un commento, dati o codice

È possibile sperimentare uno dei modelli Codex nel playground (con istruzioni sotto forma di commenti quando necessario).

Per ottenere Codex per creare un completamento utile, potrebbe aiutare pensare alle informazioni necessarie per un programmatore per eseguire un'attività. Può trattarsi semplicemente di un commento chiaro o dei dati necessari per scrivere una funzione utile, ad esempio i nomi delle variabili o la classe gestita da una funzione.

In questo esempio viene indicato a Codex come chiamare la funzione e quale attività verrà eseguita.

# Create a function called 'nameImporter' to add a first and last name to the database

Questo approccio viene ridimensionato fino al punto in cui è possibile fornire a Codex un commento e un esempio di schema di database per far sì che scriva richieste di query utili per vari database. Di seguito è riportato un esempio in cui vengono forniti i nomi delle colonne e delle tabelle per la query.

# Table albums, columns = [AlbumId, Title, ArtistId]
# Table artists, columns = [ArtistId, Name]
# Table media_types, columns = [MediaTypeId, Name]
# Table playlists, columns = [PlaylistId, Name]
# Table playlist_track, columns = [PlaylistId, TrackId]
# Table tracks, columns = [TrackId, Name, AlbumId, MediaTypeId, GenreId, Composer, Milliseconds, Bytes, UnitPrice]

# Create a query for all albums with more than 10 tracks

Se si mostra a Codex lo schema del database, è in grado di indovinare in modo informato come formattare una query.

Specificare il linguaggio di programmazione

Codex comprende decine di linguaggi di programmazione diversi. Molti condividono convenzioni simili per commenti, funzioni e altre sintassi di programmazione. Specificando il linguaggio e la versione in un commento, Codex è in grado di fornire un completamento per ciò che si desidera. Detto questo, Codex è abbastanza flessibile in quanto a stile e sintassi. Ecco un esempio per R e Python.

# R language
# Calculate the mean distance between an array of points
# Python 3
# Calculate the mean distance between an array of points

Richiedere a Codex ciò che si vuole fare

Se si vuole che Codex crei una pagina Web, se si posiziona la riga iniziale di codice in un documento HTML (<!DOCTYPE html>) dopo il commento, si indica a Codex le operazioni da eseguire successivamente. Lo stesso metodo funziona per la creazione di una funzione da un commento (facendo seguire al commento una nuova riga che inizia con func o def).

<!-- Create a web page with the title 'Kat Katman attorney at paw' -->
<!DOCTYPE html>

L'inserimento di <!DOCTYPE html> dopo il commento chiarisce bene a Codex ciò che si vuole fare.

In alternativa, se si vuole scrivere una funzione, è possibile avviare il prompt come indicato di seguito e Codex comprenderà le operazioni da eseguire successivamente.

# Create a function to count to 100

def counter

Se si specificano le librerie, si consentirà a Codex di comprendere cosa si vuole

Codex è a conoscenza di un numero elevato di librerie, API e moduli. Indicando a Codex quali usare, da un commento o importandole nel codice, Codex creerà suggerimenti in base a esse invece di altre alternative.

<!-- Use A-Frame version 1.2.0 to create a 3D website -->
<!-- https://aframe.io/releases/1.2.0/aframe.min.js -->

Specificando la versione, Codex userà la libreria più recente.

Nota

Codex può suggerire librerie e API utili, ma assicurarsi sempre di eseguire ricerche personalizzate affinché siano sicure per l'applicazione.

Lo stile dei commenti può influire sulla qualità del codice

Con alcuni linguaggi, lo stile dei commenti può migliorare la qualità dell'output. Ad esempio, quando si usa Python, in alcuni casi l'uso di stringhe di documentazione (commenti racchiusi tra virgolette triple) può offrire risultati di qualità più elevata rispetto all'uso del simbolo della sterlina (#).

"""
Create an array of users and email addresses
"""

I commenti all'interno delle funzioni possono essere utili

Gli standard di codifica consigliati suggeriscono in genere di inserire la descrizione di una funzione all'interno della funzione. L'uso di questo formato consente a Codex di comprendere più chiaramente cosa si vuole che faccia la funzione.

def getUserBalance(id):
    """
    Look up the user in the database ‘UserData' and return their current account balance.
    """

Fornire esempi per ottenere risultati più precisi

Se si ha bisogno che Codex utilizzi uno stile o un formato specifico, fornendo esempi o eseguendo una dimostrazione nella prima parte della richiesta si aiuterà Codex a trovare in modo più accurato ciò di cui si ha bisogno.

"""
Create a list of random animals and species
"""
animals  = [ {"name": "Chomper", "species": "Hamster"}, {"name":

Le temperature più basse danno risultati più precisi

L'impostazione della temperatura dell'API su 0 o quasi zero (ad esempio 0,1 o 0,2) tende a produrre risultati migliori nella maggior parte dei casi. A differenza dei modelli GPT-3, in cui una temperatura più elevata può fornire risultati creativi e casuali utili, le temperature più elevate con i modelli Codex possono produrre risposte davvero casuali o irregolari.

Nei casi in cui è necessario Codex per fornire risultati potenziali diversi, iniziare da zero e quindi incrementare verso l'alto di 0,1 fino a trovare una variazione appropriata.

Organizzare le attività in funzioni

È possibile far scrivere a Codex delle funzioni specificando le operazioni che la funzione deve eseguire nel modo più preciso possibile nel commento. Scrivendo ad esempio il commento seguente, Codex crea una funzione timer JavaScript attivata quando un utente preme un pulsante:

Un semplice timer JavaScript

// Create a timer that creates an alert in 10 seconds

Creazione di dati di esempio

I test delle applicazioni richiedono spesso l'uso di dati di esempio. Poiché Codex è un modello linguistico che sa comprendere e scrivere linguaggio naturale, è possibile chiedere a Codex di creare dati come matrici di nomi, prodotti e altre variabili. Ad esempio, qui viene chiesto a Codex di creare una matrice di temperature meteorologiche.

/* Create an array of weather temperatures for San Francisco */

Se si chiede a Codex di eseguire questa attività, verrà creata una tabella simile alla seguente:

var weather = [
  { month: 'January', high: 58, low: 48 },
  { month: 'February', high: 61, low: 50 },
  { month: 'March', high: 64, low: 53 },
  { month: 'April', high: 67, low: 55 },
  { month: 'May', high: 70, low: 58 },
  { month: 'June', high: 73, low: 61 },
  { month: 'July', high: 76, low: 63 },
  { month: 'August', high: 77, low: 64 },
  { month: 'September', high: 76, low: 63 },
  { month: 'October', high: 73, low: 61 },
  { month: 'November', high: 68, low: 57 },
  { month: 'December', high: 64, low: 54 }
];

Funzioni composte e piccole applicazioni

È possibile fornire a Codex un commento costituito da una richiesta complessa, ad esempio la creazione di un generatore di nomi casuali o l'esecuzione di attività con l'input dell'utente, e Codex può generare il resto purché ci siano token sufficienti.

/*
Create a list of animals
Create a list of cities
Use the lists to generate stories about what I saw at the zoo in each city
*/

Limitare le dimensioni di completamento per ottenere risultati più precisi o una latenza inferiore

La richiesta di completamenti più lunghi in Codex può causare risposte e ripetizioni imprecise. Limitare le dimensioni della query riducendo max_tokens e impostando token di arresto. Ad esempio, aggiungere \n come sequenza di arresto per limitare i completamenti a una riga di codice. Anche i completamenti più piccoli comportano una minore latenza.

Usare lo streaming per ridurre la latenza

Il completamento delle query Codex di grandi dimensioni può richiedere decine di secondi. Per creare applicazioni che richiedono una latenza inferiore, ad esempio assistenti alla codifica che eseguono il completamento automatico, è consigliabile usare lo streaming. Le risposte verranno restituite prima che il modello finisca di generare l'intero completamento. Le applicazioni che richiedono solo parte di un completamento possono ridurre la latenza eliminando un completamento a livello di codice o usando valori creativi per stop.

Gli utenti possono combinare lo streaming con la duplicazione per ridurre la latenza richiedendo più soluzioni dall'API e usando la prima risposta restituita. A tale scopo, impostare n > 1. Questo approccio usa una quota di token maggiore, quindi deve essere usato con attenzione (ad esempio, usando impostazioni ragionevoli per max_tokens e stop).

Usare Codex per spiegare il codice

La capacità di Codex di creare e comprendere il codice consente di usarlo per eseguire attività come spiegare il codice in un file. Un modo per eseguire questa operazione consiste nell'inserire un commento dopo una funzione che inizia con "Questa funzione" o "Questa applicazione è". Codex in genere interpreta ciò come l’inizio di una spiegazione e completa il resto del testo.

/* Explain what the previous function is doing: It

Spiegazione di una query SQL

In questo esempio si usa Codex per spiegare in un formato leggibile l'esecuzione di una query SQL.

SELECT DISTINCT department.name
FROM department
JOIN employee ON department.id = employee.department_id
JOIN salary_payments ON employee.id = salary_payments.employee_id
WHERE salary_payments.date BETWEEN '2020-06-01' AND '2020-06-30'
GROUP BY department.name
HAVING COUNT(employee.id) > 10;
-- Explanation of the above query in human readable format
--

Scrittura di unit test

La creazione di uno unit test può essere eseguita in Python semplicemente aggiungendo il commento "Unit test" e avviando una funzione.

# Python 3
def sum_numbers(a, b):
  return a + b

# Unit test
def

Verificare la presenza di errori nel codice

Usando esempi, è possibile mostrare a Codex come identificare gli errori nel codice. In alcuni casi non sono necessari esempi, ma la dimostrazione del livello e dei dettagli per fornire una descrizione può aiutare Codex a comprendere cosa cercare e come spiegarlo. (Un controllo da Codex per verificare la presenza di errori non deve sostituire un'attenta revisione da parte dell'utente).

/* Explain why the previous function doesn't work. */

Uso dei dati di origine per scrivere funzioni di database

Proprio come un programmatore umano trarrebbe vantaggio dalla comprensione della struttura del database e dei nomi delle colonne, Codex può usare questi dati per scrivere richieste di query accurate. In questo esempio si inserisce lo schema per un database e si indica a Codex che tipo di query eseguire sul database.

# Table albums, columns = [AlbumId, Title, ArtistId]
# Table artists, columns = [ArtistId, Name]
# Table media_types, columns = [MediaTypeId, Name]
# Table playlists, columns = [PlaylistId, Name]
# Table playlist_track, columns = [PlaylistId, TrackId]
# Table tracks, columns = [TrackId, Name, AlbumId, MediaTypeId, GenreId, Composer, Milliseconds, Bytes, UnitPrice]

# Create a query for all albums with more than 10 tracks

Conversione tra linguaggi

È possibile chiedere a Codex di eseguire la conversione da un linguaggio a un altro seguendo un formato semplice in cui si elenca il linguaggio del codice che si vuole convertire in un commento, seguito dal codice e quindi da un commento con il linguaggio in cui si vuole tradurre.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Riscrittura del codice per una libreria o un framework

Se si vuole che Codex renda più efficiente una funzione, è possibile fornirla con il codice da riscrivere seguito da un'istruzione sul formato da usare.

// Rewrite this as a React component
var input = document.createElement('input');
input.setAttribute('type', 'text');
document.body.appendChild(input);
var button = document.createElement('button');
button.innerHTML = 'Say Hello';
document.body.appendChild(button);
button.onclick = function() {
  var name = input.value;
  var hello = document.createElement('div');
  hello.innerHTML = 'Hello ' + name;
  document.body.appendChild(hello);
};

// React version:

Passaggi successivi

Altre informazioni sui modelli sottostanti che alimentano OpenAI di Azure.