Delen via


Codex-modellen en Azure OpenAI-service

Belangrijk

Dit artikel is geschreven en getest op basis van de verouderde modellen voor het genereren van code. Deze modellen gebruiken de API voor voltooiingen en de prompt-/voltooiingsstijl van de interactie. Als u de technieken wilt testen die in dit artikel worden beschreven, raden we u aan het gpt-35-turbo-instruct model te gebruiken dat toegang biedt tot de voltooiings-API. Voor het genereren van code levert de chat-voltooiings-API en de nieuwste GPT-4o-modellen echter de beste resultaten op, maar de prompts moeten worden geconverteerd naar de gespreksstijl die specifiek is voor interactie met deze modellen.

De Codex-modelreeks is een afstammeling van onze GPT-3-serie die is getraind op zowel natuurlijke taal als miljarden regels code. Het is het meest geschikt in Python en is bekwaam in meer dan tien talen, waaronder C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL en zelfs Shell.

U kunt Codex gebruiken voor verschillende taken, waaronder:

  • Opmerkingen omzetten in code
  • De volgende regel of functie voltooien in context
  • Kennis aan u toevoegen, zoals het vinden van een nuttige bibliotheek of API-aanroep voor een toepassing
  • Opmerkingen toevoegen
  • Code herschrijven voor efficiëntie

Voltooiingsmodellen gebruiken met code

Hier volgen enkele voorbeelden van het gebruik van Codex die kunnen worden getest in de speeltuin van Azure OpenAI Studio met een implementatie van een Codex-seriemodel, zoals code-davinci-002.

Hallo zeggen (Python)

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

Willekeurige namen maken (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
"""

Een MySQL-query maken (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 =

Code uitleggen (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?

Aanbevolen procedures

Beginnen met een opmerking, gegevens of code

U kunt experimenteren met een van de Codex-modellen in onze speeltuin (stijlinstructies als opmerkingen indien nodig.)

Als u Codex wilt ophalen om een nuttige voltooiing te maken, is het handig om na te denken over de informatie die een programmeur nodig heeft om een taak uit te voeren. Dit kan gewoon een duidelijke opmerking zijn of de gegevens die nodig zijn om een nuttige functie te schrijven, zoals de namen van variabelen of welke klasse een functie verwerkt.

In dit voorbeeld vertellen we Codex wat de functie moet worden aangeroepen en welke taak deze gaat uitvoeren.

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

Deze benadering schaalt zelfs tot het punt waar u Codex een opmerking en een voorbeeld van een databaseschema kunt geven om het te verkrijgen om nuttige queryaanvragen voor verschillende databases te schrijven. Hier volgt een voorbeeld waarin we de kolommen en tabelnamen voor de query opgeven.

# 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

Wanneer u Codex het databaseschema weergeeft, kunt u een geïnformeerde schatting maken van het opmaken van een query.

De programmeertaal opgeven

Codex begrijpt tientallen verschillende programmeertalen. Veel delen vergelijkbare conventies voor opmerkingen, functies en andere programmeersyntaxis. Door de taal en de versie in een opmerking op te geven, is Codex beter in staat om een voltooiing te bieden voor wat u wilt. Dat gezegd hebbende, Codex is redelijk flexibel met stijl en syntaxis. Hier volgt een voorbeeld voor R en Python.

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

Codex vragen met wat u wilt doen

Als u wilt dat Codex een webpagina maakt, plaatst u de eerste coderegel in een HTML-document (<!DOCTYPE html>) nadat uw opmerking Codex vertelt wat er vervolgens moet worden uitgevoerd. Dezelfde methode werkt voor het maken van een functie op basis van een opmerking (na de opmerking met een nieuwe regel die begint met func of def).

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

Het plaatsen <!DOCTYPE html> na onze opmerking maakt het heel duidelijk voor Codex wat we willen doen.

Of als we een functie willen schrijven, kunnen we de prompt als volgt starten en Codex begrijpt wat er vervolgens moet worden uitgevoerd.

# Create a function to count to 100

def counter

Het opgeven van bibliotheken helpt Codex te begrijpen wat u wilt

Codex is op de hoogte van een groot aantal bibliotheken, API's en modules. Door Codex te vertellen welke code moet worden gebruikt, hetzij uit een opmerking of als u ze in uw code importeert, zal Codex suggesties doen op basis van deze suggesties in plaats van alternatieven.

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

Door de versie op te geven, kunt u ervoor zorgen dat Codex de meest recente bibliotheek gebruikt.

Notitie

Codex kan nuttige bibliotheken en API's voorstellen, maar zorg er altijd voor dat u uw eigen onderzoek doet om ervoor te zorgen dat ze veilig zijn voor uw toepassing.

Opmerkingsstijl kan van invloed zijn op de codekwaliteit

In sommige talen kan de stijl van opmerkingen de kwaliteit van de uitvoer verbeteren. Wanneer u bijvoorbeeld met Python werkt, kunnen in sommige gevallen het gebruik van doc-tekenreeksen (opmerkingen die zijn verpakt in drievoudige aanhalingstekens) hogere kwaliteitsresultaten geven dan het hekje (#).

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

Opmerkingen in functies kunnen nuttig zijn

Aanbevolen coderingsstandaarden stellen meestal voor om de beschrijving van een functie in de functie te plaatsen. Door deze indeling te gebruiken, kan Codex beter begrijpen wat u wilt dat de functie doet.

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

Geef voorbeelden op voor nauwkeurigere resultaten

Als u een bepaalde stijl of indeling hebt, moet u Codex gebruiken, voorbeelden geven of demonstreren in het eerste deel van de aanvraag, helpt Codex nauwkeuriger te voldoen aan wat u nodig hebt.

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

Lagere temperaturen geven nauwkeurigere resultaten

Het instellen van de API-temperatuur op 0 of dicht bij nul (zoals 0.1 of 0.2) geeft meestal betere resultaten in de meeste gevallen. In tegenstelling tot GPT-3-modellen, waarbij een hogere temperatuur nuttige creatieve en willekeurige resultaten kan bieden, kunnen hogere temperaturen met Codex-modellen willekeurige of onregelmatige reacties opleveren.

In gevallen waarin u Codex nodig hebt om verschillende mogelijke resultaten te bieden, begint u bij nul en gaat u vervolgens omhoog met 0,1 totdat u geschikte variatie hebt gevonden.

Taken ordenen in functies

Codex kan worden gebruikt om functies te schrijven door op te geven wat de functie moet doen in zo nauwkeurig mogelijke termen als commentaar. Door bijvoorbeeld de volgende opmerking te schrijven, maakt Codex een JavaScript-timerfunctie die wordt geactiveerd wanneer een gebruiker op een knop drukt:

Een eenvoudige JavaScript-timer

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

Voorbeeldgegevens maken

Voor het testen van toepassingen is vaak het gebruik van voorbeeldgegevens vereist. Omdat Codex een taalmodel is dat begrijpt hoe u natuurlijke taal begrijpt en schrijft, kunt u Codex vragen om gegevens te maken, zoals matrices met namen, producten en andere variabelen. Hier vragen we Codex bijvoorbeeld om een matrix van weerstemperaturen te maken.

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

Als u Codex vraagt om deze taak uit te voeren, wordt er een tabel als volgt geproduceerd:

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

Samengestelde functies en kleine toepassingen

We kunnen Codex voorzien van een opmerking die bestaat uit een complexe aanvraag, zoals het maken van een willekeurige naamgenerator of het uitvoeren van taken met gebruikersinvoer en Codex kan de rest genereren mits er voldoende tokens zijn.

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

Voltooiingsgrootte beperken voor nauwkeurigere resultaten of lagere latentie

Het aanvragen van langere voltooiingen in Codex kan leiden tot onnauwkeurige antwoorden en herhaling. Beperk de grootte van de query door max_tokens te verminderen en stoptokens in te stellen. Voeg bijvoorbeeld \n toe als stopvolgorde om voltooiingen te beperken tot één regel code. Kleinere voltooiingen veroorzaken ook minder latentie.

Streaming gebruiken om latentie te verminderen

Het kan tientallen seconden duren voordat grote Codex-query's zijn voltooid. Als u toepassingen wilt bouwen waarvoor een lagere latentie is vereist, zoals coderingsassistenten die automatisch aanvullen uitvoeren, kunt u overwegen streaming te gebruiken. Antwoorden worden geretourneerd voordat het model klaar is met het genereren van de volledige voltooiing. Toepassingen die slechts een deel van een voltooiing nodig hebben, kunnen latentie verminderen door programmatisch of met behulp van creatieve waarden stopvoor een voltooiing af te snijden.

Gebruikers kunnen streaming combineren met duplicatie om latentie te verminderen door meer dan één oplossing van de API aan te vragen en het eerste antwoord te gebruiken dat wordt geretourneerd. Doe dit door de instelling in te stellen n > 1. Deze benadering verbruikt meer tokenquotum, dus gebruik zorgvuldig (bijvoorbeeld door redelijke instellingen te gebruiken voor max_tokens en stop).

Codex gebruiken om code uit te leggen

Met de mogelijkheid van Codex om code te maken en te begrijpen, kunnen we deze gebruiken om taken uit te voeren, zoals het uitleggen van wat de code in een bestand doet. Een manier om dit te bereiken is door een opmerking te plaatsen na een functie die begint met 'Deze functie' of 'Deze toepassing is'. Codex interpreteert dit meestal als het begin van een uitleg en voltooit de rest van de tekst.

/* Explain what the previous function is doing: It

Een SQL-query uitleggen

In dit voorbeeld gebruiken we Codex om uit te leggen in een door mensen leesbare indeling wat een SQL-query doet.

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

Eenheidstests schrijven

Het maken van een eenheidstest kan worden uitgevoerd in Python door de opmerking 'Eenheidstest' toe te voegen en een functie te starten.

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

# Unit test
def

Code controleren op fouten

Met behulp van voorbeelden kunt u Codex laten zien hoe u fouten in code kunt identificeren. In sommige gevallen zijn er geen voorbeelden vereist, maar het demonstreren van het niveau en de details om een beschrijving te bieden, kan Codex helpen begrijpen wat er moet worden gezocht en hoe het moet worden uitgelegd. (Een controle door Codex op fouten moet de gebruiker niet zorgvuldig controleren. )

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

Brongegevens gebruiken om databasefuncties te schrijven

Net als een menselijke programmeur zou profiteren van inzicht in de databasestructuur en de kolomnamen, kan Codex deze gegevens gebruiken om u te helpen nauwkeurige queryaanvragen te schrijven. In dit voorbeeld voegen we het schema voor een database in en vertellen we Codex waarvoor een query moet worden uitgevoerd.

# 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

Converteren tussen talen

U kunt Codex laten converteren van de ene taal naar de andere door een eenvoudige indeling te volgen waarin u de taal opgeeft van de code die u wilt converteren in een opmerking, gevolgd door de code en vervolgens een opmerking met de taal waarin u deze wilt vertalen.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Code herschrijven voor een bibliotheek of framework

Als u wilt dat Codex een functie efficiënter maakt, kunt u deze voorzien van de code om te herschrijven, gevolgd door een instructie over de indeling die moet worden gebruikt.

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

Volgende stappen

Meer informatie over de onderliggende modellen die Azure OpenAI mogelijk maken.