Aracılığıyla paylaş


Azure AI Foundry Modellerinde Azure OpenAI ile tamamlama modelleri ve kodu

Önemli

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 güncel GPT-4o ve o-serisi modelleriyle sohbet tamamlama API'si en iyi sonuçları verir. Bu yeni modelleri kullanmak için bu 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 modeliydi. 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
  • Bilgileri size ulaştırmak, örneğin bir uygulama için yararlı bir kütüphane veya API çağrısı bulmak gibi.
  • Yorum ekleme
  • Verimlilik için kodu yeniden yazma

Tamamlayıcı modelleri kod ile kullanma

Aşağıda, dağıtımıyla Azure AI Foundry oyun alanında test edilebilen tamamlama modellerini kullanmaya yönelik birkaç örnek verilmiştir gpt-35-turbo-instruct.

"Merhaba Demek (Python)"

"""
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'e işlevin adını ve hangi görevi gerçekleştireceğini belirttiğimiz anlatılıyor.

# 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. Yorumda dili ve hangi sürümü belirterek, Codex istediğiniz tamamlamayı daha iyi 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.

Uyarı

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

Yorumda işlevin ne yapacağını mümkün olduğunca kesin terimlerle belirterek Codex'in 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'te daha uzun tamamlamalar istemek, belirsiz yanıtlar ve tekrarlara neden olabilir. 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 stop yaratıcı değerler kullanarak bir tamamlamayı yarıda 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, max_tokens ve stop için 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.