Sdílet prostřednictvím


Modely dokončování a kód s využitím Azure OpenAI v modelech Azure AI Foundry

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 však rozhraní API pro dokončování chatu a nejnovější modely GPT-4o a o-series budou poskytovat nejlepší výsledky. Pokud chcete tyto novější modely použít, je potřeba tyto výzvy převést na konverzační styl specifický pro interakci s těmito modely.

Řada modelů Codex byla následníkem naší řady GPT-3, která byla natrénována 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
  • Doplňte další řádek nebo funkci v kontextu
  • Přinášíme vám znalosti, pomocí vyhledání užitečné knihovny nebo volání 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í dokončovacích modelů, které je možné testovat v testovacím prostředí Azure AI Foundry s nasazením gpt-35-turbo-instruct.

Ř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 testovacím prostředí (stylingové pokyny jako komentáře, když je to potřeba.)

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, jak se má funkce jmenovat 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ů. Mnozí sdílejí podobné konvence pro komentáře, funkce a další programovací syntaxi. 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> za naším komentářem dává Codexu jasně najevo, co od něj chceme.

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 mohou v některých případech řetězce dokumentace (komentáře uzavřené do trojitých uvozovek) poskytnout kvalitnější výsledky než použití hash znaku (#).

"""
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, který by měl Codex použít, poskytnutí příkladů nebo ukázka v první části požadavku pomůže Codexu lépe vyhovět vašim potřebám.

"""
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, aby Codex poskytl různé potenciální výsledky, začněte od nuly a potom zvyšte hodnotu 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 budou vráceny dříve, než model vygeneruje celý výstup. 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).

Pomocí Codexu vysvětlovat kód

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 lidsky čitelné podobě, co dělá SQL dotaz.

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í jednotkových testů

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 Codexu ukázat, 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 provedená Codexem by neměla nahradit pečlivou kontrolu prováděnou 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 Codex zefektivnil nějakou funkci, můžete mu poskytnout kód k přepsání a následně instrukci, jaký formát 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

Zjistěte více o základních modelech, které pohánějí Azure OpenAI.