Dela via


Codex-modeller och Azure OpenAI-tjänsten

Kommentar

Den här artikeln har skapats och testats mot äldre kodgenereringsmodeller. Dessa modeller använder API:et för slutföranden och dess interaktionstyp för fråga/slutförande. Om du vill testa de tekniker som beskrivs i den här artikeln ordagrant rekommenderar vi att du använder modellen gpt-35-turbo-instruct som ger åtkomst till API:et för slutföranden. För kodgenerering ger dock API:et för chattavslut och de senaste GPT-4-modellerna vanligtvis bästa resultat, men prompterna måste konverteras till konversationsstilen som är specifik för att interagera med dessa modeller.

Codex-modellserien är en ättling till vår GPT-3-serie som har tränats på både naturligt språk och miljarder kodrader. Det är mest kapabelt i Python och kunnigt i över ett dussin språk, inklusive C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL och till och med Shell.

Du kan använda Codex för en mängd olika uppgifter, bland annat:

  • Omvandla kommentarer till kod
  • Slutför nästa rad eller funktion i kontexten
  • Ge dig kunskap, till exempel att hitta ett användbart bibliotek eller API-anrop för ett program
  • Lägg till kommentarer
  • Skriv om kod för effektivitet

Så här använder du Codex-modellerna

Här är några exempel på hur du använder Codex som kan testas i Azure OpenAI Studio playground med en distribution av en Codex-seriemodell, till exempel code-davinci-002.

Säger "Hello" (Python)

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

Skapa slumpmässiga namn (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
"""

Skapa en MySQL-fråga (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 =

Förklara kod (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?

Bästa praxis

Börja med en kommentar, data eller kod

Du kan experimentera med någon av Codex-modellerna i vår lekplats (formateringsinstruktioner som kommentarer när det behövs.)

För att få Codex att skapa ett användbart slutförande är det bra att tänka på vilken information en programmerare behöver för att utföra en uppgift. Detta kan helt enkelt vara en tydlig kommentar eller de data som behövs för att skriva en användbar funktion, till exempel namnen på variabler eller vilken klass en funktion hanterar.

I det här exemplet berättar vi för Codex vad som ska anropa funktionen och vilken uppgift den ska utföra.

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

Den här metoden skalas även till den punkt där du kan ge Codex en kommentar och ett exempel på ett databasschema för att få det att skriva användbara frågebegäranden för olika databaser. Här är ett exempel där vi anger kolumnerna och tabellnamnen för frågan.

# 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

När du visar Codex-databasschemat kan det göra en välgrundad gissning om hur du formaterar en fråga.

Ange programmeringsspråket

Codex förstår dussintals olika programmeringsspråk. Många delar liknande konventioner för kommentarer, funktioner och annan programmeringssyntax. Genom att ange språket och vilken version i en kommentar kan Codex bättre tillhandahålla ett slutförande för det du vill ha. Med det sagt är Codex ganska flexibelt med stil och syntax. Här är ett exempel för R och Python.

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

Fråga Codex med vad du vill att det ska göra

Om du vill att Codex ska skapa en webbsida placerar du den första kodraden i ett HTML-dokument (<!DOCTYPE html>) efter att din kommentar anger för Codex vad den ska göra härnäst. Samma metod fungerar för att skapa en funktion från en kommentar (efter kommentaren med en ny rad som börjar med func eller def).

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

Att placera <!DOCTYPE html> efter vår kommentar gör det mycket tydligt för Codex vad vi vill att det ska göra.

Eller om vi vill skriva en funktion kan vi starta prompten på följande sätt och Codex kommer att förstå vad den behöver göra härnäst.

# Create a function to count to 100

def counter

Att ange bibliotek hjälper Codex att förstå vad du vill ha

Codex är medveten om ett stort antal bibliotek, API:er och moduler. Genom att berätta för Codex vilka som ska användas, antingen från en kommentar eller genom att importera dem till din kod, kommer Codex att lägga fram förslag baserat på dem i stället för alternativ.

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

Genom att ange versionen kan du se till att Codex använder det senaste biblioteket.

Kommentar

Codex kan föreslå användbara bibliotek och API:er, men se alltid till att göra din egen forskning för att se till att de är säkra för ditt program.

Kommentarsformat kan påverka kodkvaliteten

Med vissa språk kan kommentarsformatet förbättra kvaliteten på utdata. När du till exempel arbetar med Python kan du i vissa fall använda dokumentsträngar (kommentarer omslutna med tre citattecken) med högre kvalitet än att använda symbolen pund (#).

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

Kommentarer i funktioner kan vara till hjälp

Rekommenderade kodningsstandarder rekommenderar vanligtvis att du placerar beskrivningen av en funktion i funktionen. Med det här formatet kan Codex bättre förstå vad du vill att funktionen ska göra.

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

Ge exempel för mer exakta resultat

Om du har ett visst format eller format som du behöver Codex för att använda, kommer det att hjälpa Codex att bättre matcha det du behöver genom att tillhandahålla exempel eller visa det i den första delen av begäran.

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

Lägre temperaturer ger mer exakta resultat

Att ange API-temperaturen till 0 eller nära noll (till exempel 0,1 eller 0,2) tenderar att ge bättre resultat i de flesta fall. Till skillnad från GPT-3-modeller, där en högre temperatur kan ge användbara kreativa och slumpmässiga resultat, kan högre temperaturer med Codex-modeller ge slumpmässiga eller oberäkneliga svar.

Om du behöver Codex för att ge olika potentiella resultat börjar du vid noll och ökar sedan uppåt med 0,1 tills du hittar lämplig variation.

Organisera aktiviteter i funktioner

Vi kan få Codex att skriva funktioner genom att ange vad funktionen ska göra i så exakta termer som möjligt i kommentaren. Genom att till exempel skriva följande kommentar skapar Codex en JavaScript-timerfunktion som utlöses när en användare trycker på en knapp:

En enkel JavaScript-timer

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

Skapa exempeldata

Testning av program kräver ofta att du använder exempeldata. Eftersom Codex är en språkmodell som förstår hur man förstår och skriver naturligt språk kan du be Codex att skapa data som matriser med påbyggda namn, produkter och andra variabler. Här ber vi till exempel Codex att skapa en matris med vädertemperaturer.

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

Om du ber Codex att utföra den här uppgiften skapas en tabell som den här:

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 }
];

Sammansatta funktioner och små program

Vi kan ge Codex en kommentar som består av en komplex begäran som att skapa en slumpgenerator eller utföra uppgifter med användarindata och Codex kan generera resten förutsatt att det finns tillräckligt med token.

/*
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
*/

Begränsa slutförandestorleken för mer exakta resultat eller kortare svarstid

Att begära längre slutföranden i Codex kan leda till oprecisa svar och upprepningar. Begränsa frågans storlek genom att minska max_tokens och ange stopptoken. Lägg \n till exempel som en stoppsekvens för att begränsa slutföranden till en kodrad. Mindre slutföranden medför också mindre svarstid.

Använda strömning för att minska svarstiden

Stora Codex-frågor kan ta tiotals sekunder att slutföra. Om du vill skapa program som kräver kortare svarstid, till exempel kodningsassistenter som utför automatisk komplettering, bör du överväga att använda strömning. Svar returneras innan modellen är klar och genererar hela slutförandet. Program som bara behöver en del av en slutförande kan minska svarstiden genom att stänga av ett slutförande antingen programmatiskt eller genom att använda kreativa värden för stop.

Användare kan kombinera strömning med duplicering för att minska svarstiden genom att begära mer än en lösning från API:et och använda det första svaret som returneras. Gör detta genom att ange n > 1. Den här metoden förbrukar mer tokenkvot, så använd noggrant (till exempel genom att använda rimliga inställningar för max_tokens och stop).

Använda Codex för att förklara kod

Codex förmåga att skapa och förstå kod gör att vi kan använda den för att utföra uppgifter som att förklara vad koden i en fil gör. Ett sätt att åstadkomma detta är genom att lägga en kommentar efter en funktion som börjar med "Den här funktionen" eller "Det här programmet är". Codex tolkar vanligtvis detta som början på en förklaring och slutför resten av texten.

/* Explain what the previous function is doing: It

Förklara en SQL-fråga

I det här exemplet använder vi Codex för att förklara vad en SQL-fråga gör i ett läsbart format.

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
--

Skriva enhetstester

Du kan skapa ett enhetstest i Python genom att lägga till kommentaren "Enhetstest" och starta en funktion.

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

# Unit test
def

Söka efter fel i koden

Med hjälp av exempel kan du visa Codex hur du identifierar fel i kod. I vissa fall krävs inga exempel, men att demonstrera nivån och detaljerna för att tillhandahålla en beskrivning kan hjälpa Codex att förstå vad man ska leta efter och hur man förklarar det. (En kontroll av Codex för fel bör inte ersätta noggrann granskning av användaren. )

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

Använda källdata för att skriva databasfunktioner

Precis som en mänsklig programmerare skulle ha nytta av att förstå databasstrukturen och kolumnnamnen kan Codex använda dessa data för att hjälpa dig att skriva korrekta frågeförfrågningar. I det här exemplet infogar vi schemat för en databas och talar om för Codex vad vi ska fråga databasen efter.

# 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

Konvertera mellan språk

Du kan få Codex att konvertera från ett språk till ett annat genom att följa ett enkelt format där du anger språket för den kod som du vill konvertera i en kommentar, följt av koden och sedan en kommentar med det språk som du vill att den ska översättas till.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Skriva om kod för ett bibliotek eller ramverk

Om du vill att Codex ska göra en funktion mer effektiv kan du ange koden som ska skrivas om följt av en instruktion om vilket format som ska användas.

// 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:

Nästa steg

Läs mer om de underliggande modeller som driver Azure OpenAI.