Udostępnij za pośrednictwem


Modele Codex i usługa Azure OpenAI Service

Ważne

Ten artykuł został utworzony i przetestowany pod kątem starszych modeli generowania kodu. Te modele korzystają z interfejsu API uzupełniania oraz jego stylu monitu/ukończenia interakcji. Jeśli chcesz przetestować techniki opisane w tym artykule, zalecamy użycie gpt-35-turbo-instruct modelu, który umożliwia dostęp do interfejsu API uzupełniania. Jednak w przypadku generowania kodu interfejs API uzupełniania czatów i najnowszych modeli GPT-4o przyniesie najlepsze wyniki, ale monity muszą zostać przekonwertowane na styl konwersacji specyficzny dla interakcji z tymi modelami.

Seria modeli Codex jest elementem potomnym naszej serii GPT-3, która została wytrenowana zarówno w języku naturalnym, jak i w miliardach wierszy kodu. Jest on najbardziej zdolny w języku Python i biegły w kilkunastu językach, w tym C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL, a nawet Shell.

Codex można używać do wykonywania różnych zadań, takich jak:

  • Przekształcanie komentarzy w kod
  • Ukończ następny wiersz lub funkcję w kontekście
  • Przynieś wiedzę, na przykład znalezienie przydatnej biblioteki lub wywołania interfejsu API dla aplikacji
  • Dodawanie komentarzy
  • Ponowne zapisywanie kodu w celu zwiększenia wydajności

Jak używać modeli uzupełniania z kodem

Poniżej przedstawiono kilka przykładów użycia narzędzia Codex, które można przetestować na placu zabaw usługi Azure AI Studio z wdrożeniem modelu serii Codex, takiego jak code-davinci-002.

Powiedzenie "Hello" (Python)

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

Tworzenie losowych nazw (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
"""

Tworzenie zapytania 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 =

Wyjaśnienie kodu (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?

Najlepsze rozwiązania

Zacznij od komentarza, danych lub kodu

Możesz eksperymentować przy użyciu jednego z modeli Codex na naszym placu zabaw (instrukcje dotyczące stylów jako komentarze w razie potrzeby).

Aby uzyskać kod Codex w celu utworzenia przydatnego ukończenia, warto zastanowić się, jakie informacje musi wykonać programista. Może to być po prostu jasny komentarz lub dane potrzebne do zapisania przydatnej funkcji, takiej jak nazwy zmiennych lub klasa, która obsługuje funkcję.

W tym przykładzie informujemy Codex, co należy wywołać funkcję i jakie zadanie ma wykonać.

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

Takie podejście jest skalowane nawet do punktu, w którym można udostępnić kod Codex z komentarzem i przykład schematu bazy danych, aby umożliwić pisanie przydatnych żądań zapytań dla różnych baz danych. Oto przykład, w którym udostępniamy kolumny i nazwy tabel dla zapytania.

# 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

Po wyświetleniu schematu bazy danych Codex jest w stanie dowiedzieć się, jak sformatować zapytanie.

Określanie języka programowania

Codex rozumie dziesiątki różnych języków programowania. Wiele osób ma podobne konwencje dotyczące komentarzy, funkcji i innych składni programowania. Określając język i wersję w komentarzu, Codex jest lepiej w stanie zapewnić ukończenie tego, co chcesz. Oznacza to, że Codex jest dość elastyczny ze stylem i składnią. Oto przykład języka R i Python.

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

Monituj kod x z tym, co chcesz zrobić

Jeśli chcesz, aby kod Codex utworzył stronę internetową, umieszczając początkowy wiersz kodu w dokumencie HTML () po<!DOCTYPE html> komentarzu informuje Codex, co powinno zrobić dalej. Ta sama metoda działa w celu utworzenia funkcji na podstawie komentarza (po komentarzu z nowym wierszem rozpoczynającym się od func lub def).

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

Umieszczenie <!DOCTYPE html> po naszym komentarzu sprawia, że jest bardzo jasne dla Codex, co chcemy zrobić.

Lub jeśli chcemy napisać funkcję, możemy uruchomić monit w następujący sposób, a Codex zrozumie, co musi zrobić dalej.

# Create a function to count to 100

def counter

Określanie bibliotek pomoże Codex zrozumieć, co chcesz

Codex jest świadomy dużej liczby bibliotek, interfejsów API i modułów. Mówiąc Codex, który z nich należy użyć, albo z komentarza lub zaimportowania ich do kodu, Codex przedstawi sugestie oparte na nich zamiast alternatyw.

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

Określając wersję, możesz upewnić się, że kod codex używa najnowszej biblioteki.

Uwaga

Codex może sugerować przydatne biblioteki i interfejsy API, ale zawsze należy przeprowadzić własne badania, aby upewnić się, że są one bezpieczne dla twojej aplikacji.

Styl komentarza może mieć wpływ na jakość kodu

W niektórych językach styl komentarzy może poprawić jakość danych wyjściowych. Na przykład podczas pracy z językiem Python w niektórych przypadkach przy użyciu ciągów dokumentu (komentarze opakowane w potrójne cudzysłów) mogą dać wyniki o wyższej jakości niż użycie symbolu funta (#).

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

Komentarze wewnątrz funkcji mogą być przydatne

Zalecane standardy kodowania zwykle sugerują umieszczenie opisu funkcji wewnątrz funkcji. Użycie tego formatu pomaga kodowi Codex lepiej zrozumieć, co ma robić funkcja.

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

Podaj przykłady w celu uzyskania bardziej precyzyjnych wyników

Jeśli masz określony styl lub format, którego potrzebujesz, aby kod Codex był używany, podając przykłady lub demonstrując go w pierwszej części żądania, pomoże Kodx dokładniej dopasować to, czego potrzebujesz.

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

Niższe temperatury dają bardziej precyzyjne wyniki

Ustawienie temperatury interfejsu API na 0 lub zbliżone do zera (na przykład 0.1 lub 0.2) zwykle daje lepsze wyniki w większości przypadków. W przeciwieństwie do modeli GPT-3, gdzie wyższa temperatura może zapewnić przydatne wyniki twórcze i losowe, wyższe temperatury z modelami Codex mogą generować losowe lub niekonsekwentne odpowiedzi.

W przypadkach, gdy potrzebujesz kodu Codex, aby zapewnić różne potencjalne wyniki, zacznij od zera, a następnie zwiększa się w górę o 0,1, aż znajdziesz odpowiednie odmiany.

Organizowanie zadań w funkcje

Możemy pobrać codex do pisania funkcji, określając, co funkcja powinna zrobić w możliwie dokładny sposób w komentarzu. Na przykład, pisząc następujący komentarz, Codex tworzy funkcję czasomierza Języka JavaScript wyzwalaną po naciśnięciu przycisku przez użytkownika:

Prosty czasomierz języka JavaScript

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

Tworzenie przykładowych danych

Testowanie aplikacji często wymaga użycia przykładowych danych. Ponieważ Codex to model językowy, który rozumie, jak rozumieć i pisać język naturalny, możesz poprosić Codex o utworzenie danych, takich jak tablice z nazwami, produktami i innymi zmiennymi. Na przykład w tym miejscu prosimy Codex o utworzenie tablicy temperatur pogodowych.

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

Monitowanie Codex o wykonanie tego zadania spowoduje utworzenie tabeli podobnej do następującej:

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

Funkcje złożone i małe aplikacje

Możemy udostępnić kod codex z komentarzem składającym się ze złożonego żądania, takiego jak utworzenie generatora nazw losowych lub wykonywanie zadań z danymi wejściowymi użytkownika, a kod Codex może wygenerować resztę, pod warunkiem, że są wystarczające tokeny.

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

Ogranicz rozmiar ukończenia w celu uzyskania bardziej precyzyjnych wyników lub mniejszego opóźnienia

Żądanie dłuższych uzupełnień w kodzie może prowadzić do nieprecyzyjnej odpowiedzi i powtórzeń. Ogranicz rozmiar zapytania, zmniejszając max_tokens i ustawiając tokeny zatrzymania. Na przykład dodaj \n jako sekwencję zatrzymania, aby ograniczyć uzupełnianie do jednego wiersza kodu. Mniejsze uzupełnienia również powodują mniejsze opóźnienie.

Użyj przesyłania strumieniowego, aby zmniejszyć opóźnienie

Ukończenie dużych zapytań Codex może potrwać kilkadziesiąt sekund. Aby tworzyć aplikacje wymagające mniejszego opóźnienia, takie jak asystenty kodowania, które wykonują autouzupełnianie, rozważ użycie przesyłania strumieniowego. Odpowiedzi zostaną zwrócone przed zakończeniem generowania całego ukończenia przez model. Aplikacje, które wymagają tylko części ukończenia, mogą zmniejszyć opóźnienie, odcinając ukończenie programowo lub używając wartości kreatywnych dla elementu stop.

Użytkownicy mogą łączyć przesyłanie strumieniowe z duplikacją, aby zmniejszyć opóźnienie, żądając więcej niż jednego rozwiązania z interfejsu API i używając pierwszej zwróconej odpowiedzi. Zrób to, ustawiając wartość n > 1. Takie podejście zużywa więcej limitu przydziału tokenu, dlatego należy używać ostrożnie (na przykład przy użyciu rozsądnych ustawień dla max_tokens i stop).

Objaśnienie kodu przy użyciu kodu Codex

Możliwość tworzenia i zrozumienia kodu codex pozwala nam używać go do wykonywania zadań, takich jak wyjaśnienie, co robi kod w pliku. Jednym ze sposobów osiągnięcia tego celu jest umieszczenie komentarza po funkcji rozpoczynającej się od "Ta funkcja" lub "Ta aplikacja jest". Codex zwykle interpretuje to jako początek wyjaśnienia i uzupełni resztę tekstu.

/* Explain what the previous function is doing: It

Wyjaśnienie zapytania SQL

W tym przykładzie używamy kodu codex do wyjaśnienia w formacie czytelnym dla człowieka, co robi zapytanie 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
--

Pisanie testów jednostkowych

Tworzenie testu jednostkowego można wykonać w języku Python, dodając komentarz "Test jednostkowy" i uruchamiając funkcję.

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

# Unit test
def

Sprawdzanie kodu pod kątem błędów

Korzystając z przykładów, można pokazać Kodx, jak identyfikować błędy w kodzie. W niektórych przypadkach nie są wymagane żadne przykłady, jednak przedstawienie poziomu i szczegółów w celu podania opisu może pomóc Codex zrozumieć, czego szukać i jak je wyjaśnić. (Sprawdzanie przez codex pod kątem błędów nie powinno zastępować starannego przeglądu przez użytkownika. )

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

Używanie danych źródłowych do zapisywania funkcji bazy danych

Tak jak programista ludzki skorzysta z zrozumienia struktury bazy danych i nazw kolumn, Codex może użyć tych danych, aby ułatwić pisanie dokładnych żądań zapytań. W tym przykładzie wstawimy schemat dla bazy danych i poinformujemy Codex o to, dla czego należy wykonywać zapytania dotyczące bazy danych.

# 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

Konwertowanie między językami

Kod x można przekonwertować z jednego języka na inny, postępując zgodnie z prostym formatem, w którym wymieniono język kodu, który chcesz przekonwertować w komentarz, a następnie kod, a następnie komentarz z językiem, na który ma zostać przetłumaczony.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Ponowne zapisywanie kodu dla biblioteki lub platformy

Jeśli chcesz, aby kod Codex był bardziej wydajny, możesz podać go z kodem do ponownego zapisania, a następnie instrukcje dotyczące tego, jakiego formatu użyć.

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

Następne kroki

Dowiedz się więcej o modelach bazowych, które zasilają usługę Azure OpenAI.