Freigeben über


Codex-Modelle und Azure OpenAI Service

Wichtig

Dieser Artikel wurde mit den alten Codegenerierungsmodellen verfasst und getestet. Diese Modelle verwenden die Abschluss-API und den Eingabe-/Vervollständigungsstil der Interaktion. Wenn Sie die in diesem Artikel beschriebenen Techniken testen möchten, empfehlen wir die Verwendung des gpt-35-turbo-instruct- Modells, das den Zugriff auf die Abschluss-API ermöglicht. Für die Codegenerierung liefern die Chatvervollständigungs-API und die neuesten GPT-4o-Modelle die besten Ergebnisse, aber die Eingabeaufforderungen müssten in den für die Interaktion mit diesen Modellen spezifischen Konversationsstil umgewandelt werden.

Die Codex-Modellreihe ist ein Ableger unserer GPT-3-Reihe, die sowohl mit natürlicher Sprache als auch mit Milliarden von Codezeilen trainiert wurde. Sie ist am besten für Python geeignet und in mehr als einem Dutzend Sprachen kompetent, darunter C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL und sogar Shell.

Sie können Codex für eine Vielzahl von Aufgaben einsetzen, darunter:

  • Umwandeln von Kommentaren in Code
  • Vervollständigen Ihrer nächsten Zeile oder Funktion im Kontext
  • Bereichern Ihres Wissensschatzes, etwa durch Finden einer nützlichen Bibliothek oder des API-Aufrufs für eine Anwendung
  • Hinzufügen von Kommentaren
  • Umschreiben von Code zur Effizienzsteigerung

Verwenden von Abschlussmodellen mit Code

Hier sehen Sie einige Beispiele für die Verwendung von Codex, die im Playground von Azure OpenAI Studio mit einer Bereitstellung eines Modells aus der Codex-Reihe wie z. B. code-davinci-002 getestet werden können.

Sagen von „Hallo“ (Python)

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

Erstellen von zufälligen Namen (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
"""

Erstellen einer MySQL-Abfrage (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 =

Erläutern von Code (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?

Bewährte Methoden

Beginnen mit einem Kommentar, Daten oder Code

Sie können mit einem der Codex-Modelle in unserem Playground experimentieren (Formatierung von Anweisungen als Kommentare bei Bedarf.)

Damit Codex einen nützlichen Abschluss erstellen kann, sollte überlegt werden, welche Informationen ein Programmierer benötigt, um eine Aufgabe zu erledigen. Dies könnte einfach ein klarer Kommentar sein, oder die Daten, die zum Schreiben einer nützlichen Funktion benötigt werden, etwa die Namen von Variablen oder die Information, welche Klasse von einer Funktion behandelt wird.

In diesem Beispiel teilen wir Codex mit, wie die Funktion benannt werden und welche Aufgabe sie ausführen soll.

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

Dieser Ansatz skaliert sogar so weit, dass Sie Codex einen Kommentar und ein Beispiel eines Datenbankschemas übergeben können, damit es nützliche Abfrageanforderungen für verschiedene Datenbanken schreibt. Hier sehen Sie ein Beispiel, in dem wir die Spalten und Tabellennamen für die Abfrage angeben.

# 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

Wenn Sie Codex das Datenbankschema zeigen, kann es eine informierte Vermutung darüber anstellen, welches Format eine Abfrage aufweisen muss.

Angeben der Programmiersprache

Codex versteht Dutzende verschiedener Programmiersprachen. Viele teilen ähnliche Konventionen für Kommentare, Funktionen und andere Programmiersyntax. Indem Sie die Sprache und ihre Version in einem Kommentar angeben, ist Codex besser in der Lage, eine Lösung für das gewünschte Ziel bereitzustellen. Davon abgesehen ist Codex ziemlich flexibel in Stil und Syntax. Hier ist ein Beispiel für R und Python.

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

Auffordern von Codex, das Gewünschte zu erledigen

Wenn Codex für Sie eine Webseite erstellen soll, stellt das Platzieren der ersten Codezeile in einem HTML-Dokument (<!DOCTYPE html>) nach Ihrem Kommentar die Anweisung für Codex dar, was es als nächstes tun soll. Die gleiche Methode funktioniert zum Erstellen einer Funktion aus einem Kommentar (im Anschluss an den Kommentar mit einer neuen Zeile, die mit „func“ oder „def“ beginnt).

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

Das Platzieren von <!DOCTYPE html> nach unserem Kommentar macht sehr klar, was Codex für uns tun soll.

Oder wenn wir eine Funktion schreiben möchten, können wir die Aufforderung wie folgt beginnen, und Codex wird verstehen, was es als nächstes tun muss.

# Create a function to count to 100

def counter

Die Angabe von Bibliotheken hilft Codex zu verstehen, was Sie wünschen

Codex stützt sich auf eine große Anzahl von Bibliotheken, APIs und Modulen. Wenn Sie Codex mitteilen, welche es verwenden soll, entweder in einem Kommentar oder durch ihren Import in Ihren Code, macht Codex Vorschläge auf ihrer Grundlage statt auf der von Alternativen.

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

Durch Angeben der Version können Sie sicherstellen, dass Codex die aktuellste Bibliothek verwendet.

Hinweis

Codex kann nützliche Bibliotheken und APIs vorschlagen, achten Sie aber immer darauf, durch eigene Nachforschungen sicherzustellen, dass sie für Ihre Anwendung sicher sind.

Das Kommentarformat kann sich auf die Codequalität auswirken

Bei einigen Sprachen kann das Format von Kommentaren die Qualität der Ausgabe verbessern. Wenn Sie beispielsweise mit Python arbeiten, kann in einigen Fällen die Verwendung von Doc-Zeichenfolgen (in drei Anführungszeichen eingeschlossene Kommentare) Ergebnisse von höherer Qualität erbringen als bei Verwendung des Gattersymbols (#).

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

Kommentare innerhalb von Funktionen können nützlich sein

Empfohlene Programmierstandards enthalten in der Regel den Vorschlag, die Beschreibung einer Funktion innerhalb der Funktion zu platzieren. Die Verwendung dieses Formats hilft Codex, besser zu verstehen, was die Funktion tun soll.

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

Angeben von Beispielen für genauere Ergebnisse

Wenn Sie über eine bestimmte Formatvorlage oder ein bestimmtes Format verfügen, die bzw. das Codex verwenden muss, hilft das Angeben von Beispielen im ersten Teil der Anforderung Codex, genauer das zu liefern, was Sie benötigen.

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

Niedrigere Temperaturen ergeben genauere Ergebnisse

Das Festlegen der API-Temperatur auf 0 oder nahe null (z. B. 0,1 oder 0,2) führt in den meisten Fällen zu besseren Ergebnissen. Im Gegensatz zu GPT-3-Modellen, bei denen eine höhere Temperatur nützliche kreative und zufällige Ergebnisse bieten kann, können höhere Temperaturen bei Codex-Modellen wirklich zufällige oder erratische Antworten liefern.

In Fällen, in denen Codex unterschiedliche mögliche Ergebnisse liefern muss, beginnen Sie mit null und erhöhen Sie dann um 0,1 nach oben, bis Sie eine passende Variante finden.

Strukturieren von Aufgaben in Funktionen

Wir können Codex dazu bringen Funktionen zu schreiben, indem wir so präzise wie möglich in einem Kommentar angeben, was die Funktion tun soll. Wenn Sie beispielsweise den folgenden Kommentar schreiben, erstellt Codex eine JavaScript-Zeitgeberfunktion, die ausgelöst wird, wenn ein Benutzer eine Schaltfläche drückt:

Ein einfacher JavaScript-Zeitgeber

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

Erstellen von Beispieldaten

Das Testen von Anwendungen erfordert oftmals die Verwendung von Beispieldaten. Da Codex ein Sprachmodell ist, das versteht, wie natürliche Sprache verstanden und geschrieben wird, können Sie Codex bitten, Daten wie Arrays aus erfundenen Namen, Produkten und anderen Variablen zu erstellen. Hier bitten wir Codex beispielsweise, eine Reihe von Wettertemperaturen zu erstellen.

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

Die Bitte an Codex, diese Aufgabe auszuführen, erzeugt eine Tabelle wie diese:

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

Zusammengesetzte Funktionen und kleine Anwendungen

Wir können Codex einen Kommentar übergeben, der aus einer komplexen Anforderung besteht, wie etwa dem Erstellen eines Generators für Zufallsnamen oder der Ausführung von Aufgaben mit Benutzereingaben, und Codex kann den Rest generieren, sofern genügend Token vorhanden sind.

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

Einschränken der Abschlussgröße für präzisere Ergebnisse oder geringere Latenz

Werden in Codex längere Abschlüsse angefordert, kann dies zu ungenauen Antworten und Wiederholungen führen. Schränken Sie die Größe der Abfrage ein, indem Sie max_tokens reduzieren und Stopptoken festlegen. Fügen Sie beispielsweise \n als Stoppsequenz hinzu, um Abschlüsse auf eine Codezeile zu beschränken. Kleinere Abschlüsse gehen auch mit weniger Latenz einher.

Verwenden von Streaming zum Reduzieren der Latenz

Der Abschluss großer Codex-Abfragen kann mehrere zehn Sekunden dauern. Zum Erstellen von Anwendungen, die geringere Latenz erfordern, wie etwa Codierassistenten, die Autovervollständigen ausführen, sollten Sie Streaming in Betracht ziehen. Antworten werden zurückgegeben, bevor das Modell die Generierung des gesamten Abschlusses beendet hat. Anwendungen, die nur einen Teil eines Abschlusses benötigen, können die Latenz reduzieren, indem sie entweder einen Abschluss programmgesteuert beschneiden oder kreative Werte für stop verwenden.

Benutzer können Streaming mit Duplizierung kombinieren, um die Latenz zu verringern, indem sie mehrere Lösungen bei der API anfordern und die erste zurückgegebene Antwort verwenden. Dazu legen Sie n > 1 fest. Dieser Ansatz nutzt mehr Tokenkontingent, verwenden Sie ihn daher umsichtig (z. B. mit angemessenen Einstellungen für max_tokens und stop).

Verwenden von Codex zum Erläutern von Code

Die Fähigkeit von Codex, Code zu erstellen und zu verstehen, ermöglicht es uns, es für die Ausführung von Aufgaben einzusetzen, z. B. zu erläutern, was der Code in einer Datei tut. Eine Möglichkeit, dies zu erreichen, besteht darin, einen Kommentar nach einer Funktion zu platzieren, der mit „Diese Funktion“ oder „Diese Anwendung ist“ beginnt. Codex interpretiert dies in der Regel als den Anfang einer Erklärung und vervollständigt den Rest des Texts.

/* Explain what the previous function is doing: It

Erläutern einer SQL-Abfrage

In diesem Beispiel verwenden wir Codex, um in einem für Menschen lesbaren Format zu erläutern, was eine SQL-Abfrage tut.

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

Schreiben von Komponententests

Das Erstellen eines Komponententests kann in Python einfach durch Hinzufügen des Kommentars „Unit test“ und Starten einer Funktion ausgeführt werden.

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

# Unit test
def

Überprüfen von Code auf Fehler

Mithilfe von Beispielen können Sie Codex zeigen, wie es Fehler im Code bestimmen soll. In einigen Fällen sind keine Beispiele erforderlich, jedoch kann das Darstellen von Ebene und Detailgrad Codex helfen, zu verstehen, wonach es suchen und wie es das Gefundene erläutern soll. (Eine Fehlerüberprüfung durch Codex sollte keine sorgfältige Überprüfung durch den Benutzer ersetzen.)

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

Verwenden von Quelldaten zum Schreiben von Datenbankfunktionen

Ebenso wie ein menschliches Programmierer von dem Verständnis der Datenbankstruktur und der Spaltennamen profitieren würde, kann Codex diese Daten verwenden, um Sie beim Schreiben genauer Abfrageanforderungen zu unterstützen. In diesem Beispiel fügen wir das Schema für eine Datenbank ein und weisen Codex an, worauf es die Datenbank abfragen soll.

# 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

Konvertieren zwischen Sprachen

Sie können Codex dazu bringen, von einer Sprache in eine andere zu konvertieren, indem Sie ein einfaches Format verwenden, in dem Sie in einem Kommentar die Sprache des Codes auflisten, den Sie konvertieren möchten, gefolgt vom Code und dann einem Kommentar mit der Sprache, in die Sie ihn übersetzen lassen möchten.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Umschreiben von Code für eine Bibliothek oder ein Framework

Wenn Codex eine Funktion effizienter gestalten soll, können Sie ihm den umzuschreibenden Code übergeben, gefolgt von einer Anweisung, welches Format verwendet werden soll.

// 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ächste Schritte

Erfahren Sie mehr über die zugrunde liegenden Modelle, auf denen Azure OpenAI basiert.