Aracılığıyla paylaş


Codex modelleri ve Azure OpenAI Hizmeti

Not

Bu makale, eski kod oluşturma modellerine göre yazıldı ve test edildi. Bu modeller tamamlama API'sini ve etkileşim istemi/tamamlama stilini kullanır. Bu makalede açıklanan teknikleri ayrıntılı olarak test etmek istiyorsanız tamamlamalar API'sine erişime izin veren modeli kullanmanızı gpt-35-turbo-instruct öneririz. Ancak kod oluşturma için sohbet tamamlama API'si ve en son GPT-4 modelleri genellikle en iyi sonuçları verir, ancak istemlerin bu modellerle etkileşime özgü konuşma stiline dönüştürülmesi gerekir.

Codex model serisi, hem doğal dil hem de milyarlarca kod satırı üzerinde eğitilen GPT-3 serimizin bir alt modelidir. Python'da en yetenekli ve C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL ve hatta Shell gibi bir düzineden fazla dilde yetkindir.

Codex'i aşağıdakiler gibi çeşitli görevler için kullanabilirsiniz:

  • Açıklamaları koda dönüştürme
  • Bağlam içinde bir sonraki satırınızı veya işlevinizi tamamlayın
  • Bir uygulama için yararlı bir kitaplık veya API çağrısı bulma gibi bilgileri size getirme
  • Yorum ekleme
  • Verimlilik için kodu yeniden yazma

Codex modellerini kullanma

Aşağıda Azure OpenAI Studio'nun oyun alanında, gibi bir Codex serisi modelinin dağıtımıyla test edilebilen Codex kullanımına birkaç örnek verilmiştircode-davinci-002.

"Merhaba" (Python) Deyiş

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

Rastgele adlar oluşturma (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
"""

MySQL sorgusu oluşturma (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 =

Kodu açıklama (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?

En iyi yöntemler

Açıklama, veri veya kodla başlayın

Oyun alanımızdaki Codex modellerinden birini kullanarak denemeler yapabilirsiniz (gerektiğinde stil yönergelerini açıklama olarak kullanabilirsiniz.)

Codex'un yararlı bir tamamlama oluşturmasını sağlamak için programcının bir görevi gerçekleştirmek için hangi bilgilere ihtiyaç duyacağını düşünmek yararlı olur. Bu yalnızca açık bir açıklama veya değişkenlerin adları veya bir işlevin işlediği sınıf gibi yararlı bir işlev yazmak için gereken veriler olabilir.

Bu örnekte Codex'a işlevin ne çağrılacağını ve hangi görevi gerçekleştireceğini anlatacağız.

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

Bu yaklaşım, çeşitli veritabanları için yararlı sorgu istekleri yazmasını sağlamak üzere Codex'a bir açıklama ve veritabanı şeması örneği sağlayabileceğiniz noktaya kadar ölçeklendirilir. Burada, sorgunun sütunlarını ve tablo adlarını sağladığımız bir örnek verilmiş.

# 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

Codex'a veritabanı şemasını gösterdiğinizde, sorgunun nasıl biçimlendirilir konusunda bilinçli bir tahminde bulunabilirsiniz.

Programlama dilini belirtme

Codex onlarca farklı programlama dilini anlar. Birçoğu açıklamalar, işlevler ve diğer programlama söz dizimi için benzer kuralları paylaşır. Codex, bir açıklamada dili ve hangi sürümü belirterek istediğiniz için bir tamamlama sağlayabilir. Bununla birlikte, Codex stil ve söz dizimi konusunda oldukça esnektir. R ve Python örneği aşağıda verilmiştir.

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

Codex'a ne yapmak istediğinizi sor

Codex'un bir web sayfası oluşturmasını istiyorsanız, açıklamanızdan sonra kodun ilk satırını bir HTML belgesine (<!DOCTYPE html>) yerleştirmek Codex'a bundan sonra ne yapması gerektiğini söyler. Aynı yöntem, bir açıklamadan işlev oluşturmak için de çalışır (açıklamayı func veya def ile başlayan yeni bir satırla takip etme).

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

Açıklamamızın arkasına yerleştirmek <!DOCTYPE html> , Codex'a ne yapmak istediğimizi çok net bir şekilde gösterir.

Ya da bir işlev yazmak istiyorsak istemi aşağıdaki gibi başlatabiliriz ve Codex bundan sonra ne yapması gerektiğini anlayacaktır.

# Create a function to count to 100

def counter

Kitaplıkların belirtilmesi Codex'un ne istediğinizi anlamasına yardımcı olur

Codex çok sayıda kitaplık, API ve modülün farkındadır. Codex'a yorumdan hangilerinin kullanılacağını söyleyerek veya bunları kodunuz içine aktararak, Codex alternatifler yerine bunları temel alan önerilerde bulunur.

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

Sürümü belirterek Codex'un en güncel kitaplığı kullandığından emin olabilirsiniz.

Not

Codex yararlı kitaplıklar ve API'ler önerebilir, ancak uygulamanız için güvenli olduklarından emin olmak için her zaman kendi araştırmanızı yaptığınızdan emin olun.

Açıklama stili kod kalitesini etkileyebilir

Bazı dillerde açıklamaların stili çıkışın kalitesini artırabilir. Örneğin, Python ile çalışırken bazı durumlarda belge dizelerini (üç tırnak içine alınmış açıklamalar) kullanmak, pound (#) simgesinden daha yüksek kaliteli sonuçlar verebilir.

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

İşlevlerin içindeki açıklamalar yararlı olabilir

Önerilen kodlama standartları genellikle işlevin içine bir işlevin açıklamasının yerleştirilmesini önerir. Bu biçimin kullanılması Codex'un işlevin ne yapmak istediğinizi daha net anlamasına yardımcı olur.

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

Daha kesin sonuçlar için örnekler sağlayın

Codex'un kullanmak için belirli bir stiliniz veya biçiminiz varsa, örnekleri sağlamak veya isteğin ilk bölümünde göstermek Codex'un ihtiyacınız olanla daha doğru eşleşmesine yardımcı olur.

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

Düşük sıcaklıklar daha hassas sonuçlar verir

API sıcaklığını 0 veya sıfıra yakın (0,1 veya 0,2 gibi) ayarlamak çoğu durumda daha iyi sonuçlar verme eğilimindedir. Daha yüksek bir sıcaklığın yararlı yaratıcı ve rastgele sonuçlar sağlayabildiği GPT-3 modellerinden farklı olarak, Codex modelleriyle daha yüksek sıcaklıklar rastgele veya düzensiz yanıtlar üretebilir.

Farklı olası sonuçlar sağlamak için Codex'a ihtiyacınız varsa sıfırdan başlayın ve uygun varyasyonu bulana kadar 0,1'e kadar yukarı doğru artırmanız gerekir.

Görevleri işlevler halinde düzenleme

İşlevin yorumda mümkün olduğunca kesin terimlerle ne yapacağını belirterek Codex'un işlevleri yazmasını sağlayabiliriz. Örneğin, Codex aşağıdaki açıklamayı yazarak kullanıcı bir düğmeye bastığında tetiklenen bir JavaScript zamanlayıcı işlevi oluşturur:

Basit bir JavaScript zamanlayıcı

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

Örnek veriler oluşturma

Uygulamaların test edilmesi için genellikle örnek verilerin kullanılması gerekir. Codex, doğal dilin nasıl kavranacağını ve yazıldığını anlayan bir dil modeli olduğundan Codex'dan, oluşturulmuş adlar, ürünler ve diğer değişkenler gibi veriler oluşturmasını isteyebilirsiniz. Örneğin burada Codex'dan bir dizi hava sıcaklığı oluşturmasını istiyoruz.

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

Codex'un bu görevi gerçekleştirmesini istemek aşağıdakine benzer bir tablo oluşturur:

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

Bileşik işlevler ve küçük uygulamalar

Codex'a rastgele ad oluşturucu oluşturma veya kullanıcı girişiyle görevler gerçekleştirme gibi karmaşık bir istekten oluşan bir açıklama sağlayabiliriz ve Codex yeterli belirteç olması koşuluyla geri kalanını oluşturabilir.

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

Daha hassas sonuçlar veya daha düşük gecikme süresi için tamamlanma boyutunu sınırlayın

Codex'ta daha uzun süre tamamlanmasını istemek, kesin olmayan yanıtlara ve tekrarlara yol açabilir. max_tokens küçülterek ve durdurma belirteçlerini ayarlayarak sorgunun boyutunu sınırlayın. Örneğin, tamamlamaları bir kod satırıyla sınırlamak için durdurma dizisi olarak ekleyin \n . Daha küçük tamamlamalar da daha az gecikme süresine neden olur.

Gecikme süresini azaltmak için akış kullanma

Büyük Codex sorgularının tamamlanması on saniye sürebilir. Otomatik tamamlama gerçekleştiren kodlama yardımcıları gibi daha düşük gecikme süresi gerektiren uygulamalar oluşturmak için akış kullanmayı göz önünde bulundurun. Yanıtlar, modelin tamamlanması tamamlanmadan önce döndürülür. Tamamlamanın yalnızca bir parçasına ihtiyaç duyan uygulamalar, program aracılığıyla veya için stopyaratıcı değerler kullanarak bir tamamlanmayı keserek gecikme süresini azaltabilir.

Kullanıcılar, API'den birden fazla çözüm isteyerek ve döndürülen ilk yanıtı kullanarak gecikme süresini azaltmak için akışı yineleme ile birleştirebilir. Ayarını n > 1yaparak bunu yapın. Bu yaklaşım daha fazla belirteç kotası kullandığı için dikkatli kullanın (örneğin, ve stopiçin max_tokens makul ayarları kullanarak).

Kodu açıklamak için Codex kullanma

Codex'un kod oluşturma ve anlama özelliği, bir dosyadaki kodun ne yaptığını açıklama gibi görevleri gerçekleştirmek için bunu kullanmamıza olanak tanır. Bunu gerçekleştirmenin bir yolu, "Bu işlev" veya "Bu uygulamadır" ile başlayan bir işlevin arkasına açıklama koymaktır. Codex bunu genellikle bir açıklamanın başlangıcı olarak yorumlar ve metnin geri kalanını tamamlar.

/* Explain what the previous function is doing: It

SQL sorgusunu açıklama

Bu örnekte Codex kullanarak bir SQL sorgusunın ne yaptığını okunabilir bir biçimde açıklayacağız.

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

Birim testleri yazma

Birim testi oluşturma işlemi Python'da yalnızca "Birim testi" açıklamasını ekleyip bir işlev başlatarak gerçekleştirilebilir.

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

# Unit test
def

Kodda hatalar denetleniyor

Örnekleri kullanarak Codex'a koddaki hataları tanımlamayı gösterebilirsiniz. Bazı durumlarda örnek gerekmez, ancak açıklama sağlamak için düzeyi ve ayrıntıları göstermek, Codex'un ne arayabileceğini ve nasıl açıklayacağını anlamasına yardımcı olabilir. (Codex tarafından yapılan hata denetimi, kullanıcının dikkatli gözden geçirmesinin yerini almamalıdır. )

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

Veritabanı işlevleri yazmak için kaynak verileri kullanma

Tıpkı bir insan programcının veritabanı yapısını ve sütun adlarını anlamasından yararlanabileceği gibi Codex da doğru sorgu istekleri yazmanıza yardımcı olması için bu verileri kullanabilir. Bu örnekte, veritabanının şemasını ekleyip Codex'a veritabanını ne için sorgulayacağımızı söyleriz.

# 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

Diller arasında dönüştürme

Codex'un bir dilden diğerine dönüştürmesini sağlamak için, dönüştürmek istediğiniz kodun dilini bir açıklama içinde listeleyip ardından kodu ve ardından çevrilmesini istediğiniz dili içeren bir açıklamayı listeleyebilirsiniz.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Kitaplık veya çerçeve için kodu yeniden yazma

Codex'un bir işlevi daha verimli hale getirmesini istiyorsanız, yeniden yazacak kodu ve ardından hangi biçimin kullanılacağına ilişkin bir yönerge sağlayabilirsiniz.

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

Sonraki adımlar

Azure OpenAI'yi destekleyen temel modeller hakkında daha fazla bilgi edinin.