Modely Codex a služba Azure OpenAI
Důležité
Tento článek byl vytvořený a testován na starších modelech generování kódu. Tyto modely používají rozhraní API pro dokončování a styl interakce výzvy/dokončení. Pokud chcete otestovat techniky popsané v tomto článku doslovně, doporučujeme použít gpt-35-turbo-instruct
model, který umožňuje přístup k rozhraní API pro dokončování. Pro generování kódu ale rozhraní API pro dokončování chatu a nejnovější modely GPT-4o budou poskytovat nejlepší výsledky, ale výzvy by se měly převést na konverzační styl specifický pro interakci s těmito modely.
Řada modelů Codex je potomkem naší řady GPT-3, která je vytrénovaná v přirozeném jazyce i miliardách řádků kódu. Nejschopnější je v Pythonu a má zkušenosti s více než desítkou jazyků, včetně C#, JavaScriptu, Go, Perl, PHP, Ruby, Swiftu, TypeScriptu, SQL a dokonce Shellu.
Codex můžete použít pro různé úlohy, mezi které patří:
- Převod komentářů na kód
- Dokončení dalšího řádku nebo funkce v kontextu
- Přineste vám znalosti, jako je vyhledání užitečné knihovny nebo volání rozhraní API pro aplikaci.
- Přidávání komentářů
- Přepsání kódu pro efektivitu
Jak používat modely dokončování s kódem
Tady je několik příkladů použití codexu, které je možné testovat v dětském prostředí Azure AI Studio s nasazením modelu řady Codex, například code-davinci-002
.
Řekněte "Hello" (Python)
"""
Ask the user for their name and say "Hello"
"""
Vytváření náhodných názvů (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
"""
Vytvoření dotazu 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 =
Vysvětlení kódu (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?
Osvědčené postupy
Začínáme s komentářem, daty nebo kódem
Můžete experimentovat s použitím některého z modelů Codex v našem dětském hřišti (v případě potřeby styling pokynů jako komentáře.)
Chcete-li získat kód pro vytvoření užitečného dokončení, je užitečné přemýšlet o tom, jaké informace programátor potřebuje k provedení úkolu. Může to být jednoduše jasný komentář nebo data potřebná k zápisu užitečné funkce, jako jsou názvy proměnných nebo jaké třídy zpracovává funkce.
V tomto příkladu řekneme Codexu, co má funkce volat a jakou úlohu má provést.
# Create a function called 'nameImporter' to add a first and last name to the database
Tento přístup se škáluje i do bodu, kde můžete poskytnout Codex s komentářem a příkladem schématu databáze, abyste ho získali k zápisu užitečných požadavků na dotazy pro různé databáze. Tady je příklad, ve kterém zadáme názvy sloupců a tabulek pro dotaz.
# 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
Když zobrazíte Kódx schématu databáze, dokáže se informovaně odhadnout, jak formátovat dotaz.
Určení programovacího jazyka
Codex rozumí desítkám různých programovacích jazyků. Mnoho podobných konvencí pro komentáře, funkce a další syntaxi programování. Zadáním jazyka a verze v komentáři je Codex lépe schopen poskytnout dokončení, co chcete. To znamená, že Codex je poměrně flexibilní se stylem a syntaxí. Tady je příklad pro R a Python.
# R language
# Calculate the mean distance between an array of points
# Python 3
# Calculate the mean distance between an array of points
Prompt Codex with what you want it to do it to do
Pokud chcete, aby Codex vytvořil webovou stránku, umístěte počáteční řádek kódu do dokumentu HTML (<!DOCTYPE html>
) za komentář sdělte Codex, co by měl udělat dál. Stejná metoda funguje při vytváření funkce z komentáře (sledování komentáře s novým řádkem začínajícím func nebo def).
<!-- Create a web page with the title 'Kat Katman attorney at paw' -->
<!DOCTYPE html>
Umístění <!DOCTYPE html>
po našem komentáři je velmi jasné codex, co chceme udělat.
Nebo pokud chceme napsat funkci, mohli bychom spustit výzvu následujícím způsobem a Codex pochopí, co je potřeba udělat dál.
# Create a function to count to 100
def counter
Určení knihoven pomůže Codex pochopit, co chcete.
Codex ví o velkém počtu knihoven, rozhraní API a modulů. Když řeknete Codex, které z komentáře nebo je naimportujete do kódu, codex na základě nich místo alternativ vytvoří návrhy.
<!-- Use A-Frame version 1.2.0 to create a 3D website -->
<!-- https://aframe.io/releases/1.2.0/aframe.min.js -->
Zadáním verze se můžete ujistit, že Codex používá nejnovější knihovnu.
Poznámka:
Codex může navrhnout užitečné knihovny a rozhraní API, ale vždy nezapomeňte provést vlastní výzkum, abyste měli jistotu, že jsou pro vaši aplikaci bezpečné.
Styl komentáře může ovlivnit kvalitu kódu.
V některých jazycích může styl komentářů zlepšit kvalitu výstupu. Například při práci s Pythonem můžou v některých případech pomocí řetězců dokumentace (komentáře zabalené do trojitých uvozovek) poskytnout vyšší výsledky kvality než použití symbolu libry (#
).
"""
Create an array of users and email addresses
"""
Komentáře uvnitř funkcí můžou být užitečné.
Doporučené kódovací standardy obvykle navrhují umístění popisu funkce do funkce. Použití tohoto formátu pomáhá Codex jasně pochopit, co má funkce dělat.
def getUserBalance(id):
"""
Look up the user in the database ‘UserData' and return their current account balance.
"""
Uveďte příklady pro přesnější výsledky.
Pokud máte určitý styl nebo formát, potřebujete kód codex použít, poskytnutí příkladů nebo jeho předvedení v první části požadavku pomůže Codex přesněji shodovat s tím, co potřebujete.
"""
Create a list of random animals and species
"""
animals = [ {"name": "Chomper", "species": "Hamster"}, {"name":
Nižší teploty poskytují přesnější výsledky
Nastavení teploty rozhraní API na 0 nebo blízko nuly (například 0,1 nebo 0,2) má ve většině případů lepší výsledky. Na rozdíl od modelů GPT-3, kde vyšší teplota může poskytovat užitečné kreativní a náhodné výsledky, vyšší teploty s modely Codex mohou produkovat náhodné nebo erratické odpovědi.
V případech, kdy potřebujete codex k poskytnutí různých potenciálních výsledků, začněte od nuly a potom se 0,1 zvýší o 0,1, dokud nenajdete vhodnou variantu.
Uspořádání úkolů do funkcí
Kód pro psaní funkcí můžeme získat tak, že v komentáři určíme, co má funkce dělat co nejpřesněji. Například napsáním následujícího komentáře codex vytvoří funkci časovače JavaScriptu, která se aktivuje, když uživatel stiskne tlačítko:
Jednoduchý časovač JavaScriptu
// Create a timer that creates an alert in 10 seconds
Vytvoření ukázkových dat
Testování aplikací často vyžaduje použití ukázkových dat. Vzhledem k tomu, že Codex je jazykový model, který rozumí tomu, jak pochopit a psát přirozený jazyk, můžete požádat Codex o vytvoření dat, jako jsou pole tvořených názvů, produktů a dalších proměnných. Tady například požádáme Codex, aby vytvořil pole teplot počasí.
/* Create an array of weather temperatures for San Francisco */
Když požádáte codex o provedení tohoto úkolu, vytvoří se tabulka podobná této:
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 }
];
Složené funkce a malé aplikace
Kódx můžeme poskytnout komentář skládající se ze složitých požadavků, jako je vytvoření generátoru náhodných názvů nebo provádění úkolů se vstupem uživatele a Kódx může vygenerovat zbytek za předpokladu, že existuje dostatek 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
*/
Omezení velikosti dokončení pro přesnější výsledky nebo nižší latenci
Vyžadování delších dokončení v Codex může vést k nepřesné odpovědi a opakování. Omezte velikost dotazu zmenšením max_tokens a nastavením tokenů zastavení. Můžete například přidat \n
jako sekvenci zastavení, která omezí dokončení na jeden řádek kódu. Menší dokončení také způsobuje menší latenci.
Použití streamování ke snížení latence
Dokončení rozsáhlých dotazů codex může trvat desítky sekund. Pokud chcete vytvářet aplikace, které vyžadují nižší latenci, například pomocníky pro kódování, které provádějí automatické dokončování, zvažte použití streamování. Odpovědi se vrátí před dokončením modelu, který vygeneruje celé dokončení. Aplikace, které potřebují pouze část dokončení, mohou snížit latenci tím, že odříznou dokončení buď prostřednictvím kódu programu, nebo pomocí kreativních hodnot pro stop
.
Uživatelé můžou kombinovat streamování s duplikací, aby se snížila latence vyžádáním více řešení z rozhraní API a použitím první vrácené odpovědi. Udělejte to nastavením n > 1
. Tento přístup spotřebovává větší kvótu tokenů, proto používejte pečlivě (například pomocí přiměřeného nastavení pro max_tokens
a stop
).
Vysvětlení kódu pomocí kódu Codex
Schopnost Codexu vytvářet a rozumět kódu nám umožňuje používat ho k provádění úloh, jako je vysvětlení toho, co kód v souboru dělá. Jedním ze způsobů, jak toho dosáhnout, je vložení komentáře za funkci, která začíná na "Tato funkce" nebo "Tato aplikace je". Kódx to obvykle interpretuje jako začátek vysvětlení a dokončí zbytek textu.
/* Explain what the previous function is doing: It
Vysvětlení dotazu SQL
V tomto příkladu použijeme codex k vysvětlení v čitelné podobě člověka, co dělá dotaz 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
--
Psaní testů jednotek
Vytvoření testu jednotek lze provést v Pythonu jednoduše tak, že přidáte komentář "Test jednotek" a spustíte funkci.
# Python 3
def sum_numbers(a, b):
return a + b
# Unit test
def
Kontrola chyb v kódu
Pomocí příkladů můžete ukázat kód, jak identifikovat chyby v kódu. V některých případech nejsou vyžadovány žádné příklady, ale předvedení úrovně a podrobností k zadání popisu může Codexu pomoct pochopit, co hledat a jak ho vysvětlit. (Kontrola chyb kódem by neměla nahradit pečlivou kontrolu uživatelem. )
/* Explain why the previous function doesn't work. */
Použití zdrojových dat k zápisu databázových funkcí
Stejně jako lidský programátor by mohl těžit z pochopení struktury databáze a názvů sloupců, Codex může tato data použít k psaní přesných požadavků na dotazy. V tomto příkladu vložíme schéma pro databázi a řekneme Codex, na co se má databáze dotazovat.
# 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
Převod mezi jazyky
Kód pro převod z jednoho jazyka do jiného můžete získat pomocí jednoduchého formátu, ve kterém vypíšete jazyk kódu, do kterého chcete kód převést, a pak komentář s jazykem, do kterého chcete kód přeložit.
# Convert this from Python to R
# Python version
[ Python code ]
# End
# R version
Přepsání kódu pro knihovnu nebo architekturu
Pokud chcete, aby funkce Codex zefektivnit, můžete ji poskytnout kódu, který se má přepsat a následně instrukci o tom, jaký formát se má použít.
// 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:
Další kroky
Přečtěte si další informace o základních modelech, které power Azure OpenAI.