"Bu fonksiyona doğrulama ekle" önemli kararları açıkta bırakır. Geçerli, geçersiz ve sınır girdilerini tanımlayan bir istek Copilot'un tahmin alanını daraltır, size de somut inceleme ölçütleri verir. Kod işi için prompt, sonucu değerlendireceğiniz şartnamedir.
Kod prompt'u bir şartnamedir
Günlük prompt'larda kullandığınız hedef, bağlam, kaynak ve beklenti yapısı kod görevlerinde de geçerlidir. Yazmaya başlamadan önce şu dört soruyu yanıtlayın:
- Hedef: Hangi davranış değişmelidir?
- Bağlam: Uygulama hangi kısıtları korumalıdır ve değişiklik neden gereklidir?
- Kaynak: Doğru davranışı hangi dosyalar tanımlar ve her dosya hangi konuda belirleyicidir?
- Beklenti: Nasıl bir çıktı istiyorsunuz ve doğruluğu hangi kanıtla gösterilecektir?
Hedef prompt'u uzatmak değil, yanlış uygulamaya yol açan varsayımları kaldırmaktır. "parseConfig'e doğrulama ekle" demek yerine fonksiyonun kullanıcı tarafından düzenlenebilen bir yapılandırma dosyasını okuduğunu ve geçersiz verinin çağıranın işleyebileceği bir hata üretmesi gerektiğini yazın. src/config.ts uygulamayı, test/config.test.ts beklenen davranışı tanımlasın. Copilot'tan önce doğrulama kurallarını listelemesini ve public imzayı korumasını isteyin. Böylece hem değişikliğin sınırı hem de incelemede kullanacağınız kanıt belli olur.
Kaynak gösterirken dosyanın neden belirleyici olduğunu da açıklayın. Dosya mevcut uygulamayı, public türü veya beklenen davranışı tanımlıyor olabilir. Bir dosyanın açık olması tek başına onu doğruluk kaynağı yapmaz.
Ne zaman zero-shot, ne zaman few-shot?
Zero-shot prompt, tamamlanmış bir örnek vermeden sonuç ister. Gereksinimler açık ve davranış alışılmış olduğunda iyi bir başlangıçtır. Örneğin normalizeEmail fonksiyonunun baştaki ve sondaki boşlukları temizlemesini, metni küçük harfe çevirmesini, boş sonucu reddetmesini ve imzayı korumasını açıkça belirtebilirsiniz. Zero-shot yaklaşım aynı zamanda şartnamenizi sınar. Yanıt yazmadığınız bir varsayımı ortaya çıkarırsa şartnamenizdeki eksik noktayı bulmuş olursunuz.
Few-shot prompt, bir veya daha fazla girdi ve çıktı örneği içerir. Kurallar birbiriyle etkileşiyorsa, öncelik sırası önemliyse, çıktı biçimi alışılmadıksa veya mevcut örnekler açıklamadan daha belirleyiciyse few-shot kullanın. Örnekler, iki koşul aynı anda doğru olduğunda beklenen kesin sonucu gösterebilir. Verdiğiniz örneklerin birbiriyle uyumlu olması gerekir. Çelişkili davranışlar gösteriyorlarsa kod istemeden önce bu çelişkiyi çözün. Aksi halde Copilot'a hangi kuralı uygulayacağını söylememiş olursunuz.
Pek çok makul görünen uygulama burada hata yapar. Yapı düzgün görünür, iş kuralı yanlıştır. Belirleyici bir örnek, düz yazının açıkta bıraktığı sonucu görünür hale getirir.
Yanlış uygulanan bir kuralı kanıtla düzeltin
Bir indirim hesabı istediğinizi düşünün. Üyeler %15 indirim alıyor. Üye olmayan müşteriler 10+ ürün aldığında %10 indirim kazanıyor. İndirimler birlikte uygulanmıyor ve üyelik kuralı öncelikli. Copilot ise büyük sipariş veren bir üye için iki indirimi birden uygulayıp 1.500 yerine 2.500 cent döndürüyor. İlk tepkiniz kodu elle düzenlemek olabilir. Önce şartnameyi düzeltin. Belirsiz kalan şartname, kodu kaç kez değiştirirseniz değiştirin aynı tür hatayı yeniden üretebilir.
Şu belirleyici örneği ekleyin: { subtotalCents: 10000, isMember: true, itemCount: 10 } → 1500. Bu girdide iki koşul da doğrudur, dolayısıyla sonuç öncelik kuralını görünür hale getirir. Copilot'a üyelik kuralının önce geldiğini söyleyin ve yalnızca kural seçme mantığını değiştirmesini isteyin. Sonra yalnızca üye, yalnızca toplu alım, iki koşulun birlikte olduğu ve hiçbir koşulun sağlanmadığı durumları çalıştırın. Odaklı takip, doğru kalan parçaları koruyup yalnızca hatalı kuralı düzeltmenizi sağlar.
Sözleşmenizi uyguluyor gibi görünen ayrıştırma kısayollarına da dikkat edin. Bir port ayrıştırıcısında kullanılan basit bir parseInt, "12px" veya "1e3" girdisini kabul edebilir. Bu kod normal bir örneği geçse bile şartnameyi ihlal eder. Doğrulamanın chat dışında yapılmasının nedeni budur. Uygulamayı okuyun, her dalı bir gereksinimle eşleştirin ve "80px", "1e3", " 3000 " gibi zor girdileri çalıştırın. Sonuçları beklenen değerler tablosuyla karşılaştırın. Okunaklı görünen kod henüz doğrulanmış değildir.
Chat geçmişi, değişen kuralı açıkça yazdığınızda düzeltmeyi kısaltabilir. "Uygulamayı koru. Üye ve toplu alım indirimlerini birlikte uygulama. Önce üye kuralını değerlendir. Public API'yi ve diğer tüm davranışları koru." isteği, doğru olan parçaları yeniden kullanır. Ancak eski bir kuralın konuşma geçmişinde kalabileceğini unutmayın. Gereksinim değiştiğinde yeni kuralı ve hâlâ geçerli olan kısıtları birlikte yazın. Prompt ile testler çelişiyorsa kararı Copilot'a bırakmayın. Kod değişmeden önce tam girdiyi ve iki farklı beklenen sonucu göstermesini isteyin, ardından hangi kaynağın belirleyici olduğuna siz karar verin.
Cookbook döngüsünü tekrarlanabilir hale getirin
GitHub Copilot Cookbook, geçersiz JSON hatasını ayıklama, test üretme, okunabilirlik için refactor yapma ve eski kodu belgeleme gibi görevler için uygulamalar sunar. Tek tek tariflerden çok, hepsinin altında çalışan döngü işe yarar. Her görevi altı aşamadan geçirin:
İhtiyacınız olan çıktıya uygun uygulamayı Seçin. Görevi belirli dosya, issue, hata günlüğü veya testle Kapsamlayın ve değişmemesi gereken noktaları yazın. Hedef, bağlam, kaynak ve beklentileri içeren bir Prompt Yazın. Yanıtı, kaynakların desteklemediği varsayımlar açısından İnceleyin ve adı geçen dosya ile sembollerin varlığını kontrol edin. Her turda tek bir sorunu İyileştirin. Hata sözleşmesini netleştirin, eksik durumu ekleyin veya diff'i daraltın. Sonucu uygun kanıtla Doğrulayın. Testi çalıştırın, diff'i inceleyin veya kod dışı çıktıyı kaynağıyla karşılaştırın.
İki alışkanlık bu döngüyü güvenilir kılar. Önce üretilecek çıktıyı doğrulama yöntemiyle eşleştirin. Hata ayıklama görevi, hatayı önce yeniden üreten ve düzeltmeden sonra geçen bir testle tamamlanır. Tablo üretme görevi ise her hücrenin kaynak girdiye dayandığını gösteren bir sadakat kontrolüyle biter. Ayrıca prompt'ta bir dosya adının geçmesinin, dosya içeriğinin bağlama eklendiğini kanıtlamadığını unutmayın. O içeriğe dayanan yanıta güvenmeden önce görünür bağlamı kontrol edin. Uygulamayı önünüzdeki göreve benzediği için seçin. Amaç tarif biriktirmek değil, döngünün tamamını doğru yürütmektir.