Kodlamada Yapay Zeka nasıl?
Merhaba,
Kodlama yaparken yapay zekadan faydalandığımızda esasında ne kadar yararlı! bir araç olduğunu farkediyoruz. Ben özellikle son dönemde şirketimizin Amazon ile anlaşması sayesinde Amazon Q Developer'ı deneyimliyorum. Bu noktada özellikle kod tamamlama noktasında başarılı olduğunu bazen tam yazmak istediğimi tahmin ettiğini görmek farklı ve güzel olabilmekte. Ancak sohbet üzerinden birşeyler sorduğumuzda gelen cevapların ne kadar sağlıklı olduğu noktasında çok büyük çekincelerim var. Bu sebeple bu haliyle yapay zekanın şu anki halinin bize belli noktaya kadar faydalı bir asistandan öteye gidemediğini söylemek yanlış olmaz. Bu makalede sizlerle paylaşmak istediğim bir örnek senaryo var. Bu senaryo ile bizim repository katmanında geliştirdiğimiz bir kodun refactoring süreci sırasında karşılaştım. Şöyle ki, kullanmakta olduğumuz bir standart repository metodunun bir senaryoda boşu boşuna veri tabanına gittiğini farkettim. Bunu düzeltmek için bir kod değişikliğini önce kendim yaptım. Sonrada bakalım Amazon Q Developer ve diğer yapay zeka modelleri bu konuda ne yapacak diye düşünerek aynı durumdaki diğer method'da bu değişikliği yapay zekadan istedim. Makalenin devamında sonuçları sizlerle paylaşacağım.
Öncelikle kodun benim değiştirdiğim halini sizlere göstermek istiyorum:
Bu kodda görebileceğiniz gibi ListByIdsAsync metodu bir ids parametresi alıyor. Eğer bu parametre null ve boş ise o zaman sorgu boşu boşuna DB'ye erişip hiç birşey dönmese dahi DB'yi meşkul ediyor. Bu yüzden buradaki işleme bir el atmak gerekiyordu. Bu noktada benim yaptığım müdehale parametreden gelen bilginin dolu olup olmadığını kontrol eden kodları içeri yerleştirmek şeklinde oldu. Bu sayede eğer veri yok ise hiç db'ye gitmeden geriye boş bir list dönebiliyoruz. Bu da işlem zamanımızı azaltıyor.
Bu kodda dikkat etmek gereken bazı noktalar vardı. Şöyle ki, parametre tipimiz IEnumerable türünde olduğu için normalde IEnumerable tipinin forward only bir tip olduğunu unutmamak lazım. Bu şu anlama geliyor. Herhangi bir nedenden dolayı bu tipin içindeki verileri bir kere okursanız, aynı referans üzerinden tekrar işlem yaptığınızda boş bir eleman sizi karşılayabilir. Bu sebeple eğer kontrol yapacak isem bu veriyi korumaya almam şart. Bende bunu sağlamak için yeni koddaki 120. satırı yazdım. ids.ToArray() metodu ile verimizi bir diziye dönüştürüyoruz. Sonrada bu dizi üzerinden istediğimiz işleri istediğimiz kadar tekrar tekrar yapabiliyoruz. Ancak bunun ilave bir memory kullanımı olacağını unutmamak lazım. Bu sebeple core repository'miz içinde benzer bir metot daha eklemek daha iyi sonuçlar verecektir. Neyse konumuz şu anda bu değil.
Biz konumuza döndüğümüzde, koddaki değişikliğimiz böyle. 2. metodumuz olan ListBySourceColumnListAsync isimli metotda benzer bir işlemi Q developer ile yapmaya çalıştığımda şöyle bir sonuç aldım. Burada esasında bir ekrana sığmayan bir görüntü idi. Ben PhotoShop yardımıyla bu parçaları birleştirerek tek bir ekran görüntüsüne dönüştürdüm :
Sonuç böyle olunca hemen ChatGPT ne diyecek diye baktım :
Tabi buradan başlayınca lokalde çalıştırdığım modellere de bir bakayım dedim. Kullandığım prompt şöyle :
Aşağıdaki koddaki sourceItemId parametresi null veya boş ise direk boş liste dönsün istiyorum. Bunu yapmanın en doğru yolu ne olur?
```csharp
public Task<List<TEntity>> ListBySourceColumnListAsync(string sourceProviderKey, IEnumerable<string> sourceItemId)
{
return _dbContext
.Set<TEntity>()
.AsNoTracking()
.Where(x => x.SourceProviderKey == sourceProviderKey
&& sourceItemId.Contains(x.SourceItemId))
.ToListAsync();
}
```
Öncelikle qwen2.5-coder modeli ile denedim: bu model benimle çok muhattap bile olmadı. Tek satırla beni başından savdı:
Bir sonraki denemeyi Llama3.1 ile yaptım, sonuç yine hüsran. Ayrıca Llama daha kötü çünkü her nekadar bu işlem çalıştırılmayacak olsa da(Entity Framework Core bu Linq Expression'ı Sql cümlesine çevireceği için) yaklaşım hem EF içinde hemde normal bir .Net koleksiyonunda olsa gereksiz işlemlere neden olacaktır.
Birde lokalimde olmayan ama başka bir model olsun diye ollama.com üzerinden indirdiğim starcoder2 isimli model ile denedim ve sonuç yine hüsran oldu:
Sonuç olarak;
Bu durumu gördükten sonra yapay zekanın bizim işimizi elimizden alacağı zamanın daha gelmediğini açıkça görebiliyoruz. NVidia CEO'su bence biraz erken konuştu. Neden böyle olduğu ile ilgili daha detaylı bilgi için sizi Evrim Ağacının "Yapay Zeka Balonu Ne Zaman Patlayacak?" isimli videosuna yönlendirebilirim. Ama özet olarak LLM modelleri sizin onlara gönderdiğiniz promptları tam olarak anlamıyorlar. Sadece bu kelimelerin birbirleri ardına gelmesinin istatistiği üzerinde çalışıyorlar. O yüzden de bize verdikleri cevaplar yaratıcılıktan yoksun. Buna bir anlamda düşünmeden ezbere cevap veriyorlar desek daha doğru olur.
Evet işte böyle. Bir makalenin sonuna daha geldik. başka bir makalede görüşmek üzere.
Yorumlar