Nedir bu Jev?
Sitemizin ilk teknik yazısı olması vesilesiyle ayrı bir heyecanla ele aldığım bir yazı olacak. Şimdiden keyifli okumalar dilerim.
Peki nedir bu Jev? Eminim son günlerde en az bir defa karşınıza çıkmıştır. Ama tam olarak ne yaptığını anlamak için, yeni nesil bu model ile neyin çözülmek istendiğini anlamamız lazım.
Yazıların birçoğunda gördüğümüz ortak bazı noktalar var: 70 milisaniyeden başlayan cevap süresi, oldukça ucuz input token maliyeti, hatta output token maliyetinin sıfır olması. Özellikle Anthropic ve OpenAI modellerinin fiyatlarıyla kıyaslandığında gerçekten hatırı sayılır rakamlar. Ama buraya gerçekten büyük bir "ama" koymak gerekiyor: Jev modelini Anthropic ve OpenAI modelleriyle kıyaslamak ne kadar doğru?
Burada şunu demek doğru olabilir: Claude, Gemini ve GPT gibi modeller Jev'in yaptığını yapabilir, ama Jev onların yaptığını yapamaz. Eee, o zaman Jev kullanmak nasıl daha mantıklı olabilir? Jev aslında diğer büyük modellerin de yapabildiği karar verme süreçlerini çok daha hızlı, tahmin edilebilir ve ucuz yapıyor. İşte Jev bu noktada bir hype yaratıyor. Maliyeti sayesinde de gerçekten denemeye ve entegre etmeye değer bir model olarak karşımıza çıkıyor.
Nasıl yaptığını anlatmadan önce ne yaptığını anlayalım o halde.
Jev ne yapıyor?
Jev aslında bir karar modeli (decision model). Yani siz Jev'e olasılıklar veya seçenekler verirsiniz, Jev de size sadece hangisinin olması gerektiğini söyler. Bunu yaparken de tahmin edilebilir bir formatta verir; geleneksel LLM'lerin yaptığı gibi düz metin asla vermez.
Aslında günümüzde maliyetli olan bir konuyu çözüyor. Normal şartlarda tool çağrıları veya structured output'lar kullanarak çözdüğümüz, ayrı bir LLM çağrısı döngüsüne girdiğimiz durumlardan Jev bizi çok daha az maliyetle çıkartıyor.
Jev nasıl çalışıyor?
Jev stateless çalışır; diğer modeller gibi bir hafızası (memory) olmasını bekleyemeyiz. Bundan dolayı Jev'e her istekte state ve soru birlikte gönderilir. Jev üç tip soru kabul eder.
Noul
Basitçe evet ya da hayır cevabı almak istediğimiz sorular için kullanabiliriz. Örneğin "Bu işlem zararlı mı?" sorusuna şu şekilde bir çıktı verir:
{ "type": "noul", "noul": 0.99 }noul değeri 0.5'e yaklaştıkça modelin kararsız olduğunu anlarız.
Choice
Jev'e bir seçenek kümesi, nedenleri ve özellikleriyle birlikte verilir ve Jev'in bunlardan birini seçmesi istenir. Buradaki kısıt, en fazla 255 seçenek verebilmemiz. Jev bu modda seçimi ve o seçimin ne kadar güvenilir olduğunu gösteren bir confidence skorunu döner:
{
"type": "choice",
"choice": "technical",
"confidence": 0.97,
"probabilities": {
"technical": 0.98,
"other": 0.02,
"billing": 0.0
}
}Score
Belirli bir olayı veya içeriği, yine belirli seçenekler ve şartlar arasında konumlandırmak istersek bu soruyu kullanıyoruz. Yani Choice gibi net seçenekler sunulamayan, ama belirli durumlar arasında bir yere konumlandırmamız gereken olaylar gibi düşünebiliriz; kendi web sitelerindeki "Bu müşteri ne kadar mutlu?" örneği gibi.
En az 2, en fazla 10 seçeneği açıklamalarıyla birlikte veriyoruz. Jev ise soruyu bu seçenekler arasında bir koordinat düzleminde konumlandırıyormuş gibi düşünebilirsiniz. Cevabın illa bir seçeneğe denk gelmesi gerekmiyor, arada bir noktaya da denk gelebilir.
Müşteri ne kadar mutlu örneğindeki gibi üç seçenek verdiğimizi varsayalım: 0: Üzgün, 1: Nötr, 2: Mutlu. Jev burada bize 0.65 gibi bir çıktı verebilir. Buradan müşterinin Nötr'e yakın ama mutsuz tarafta olduğunu anlarız ve bunu, örneğin çağrı merkezi aramalarını önceliklendirirken kullanabiliriz. Yani niyet okuma gibi işlerde bu soruyu ucuz bir çağrı olarak kullanabiliriz.
Aşağıdaki örnek çıktıda ise müşteri açıkça mutlu, skor 2'ye çok yakın:
{
"type": "score",
"score": 1.97,
"confidence": 0.94,
"legend": {
"0": "Üzgün: hayal kırıklığı, şikayet veya memnuniyetsizlik belirtiyor",
"1": "Nötr: duygu belirtmeden bilgi veriyor veya karışık hisler taşıyor",
"2": "Mutlu: memnuniyetini, teşekkürünü veya sevincini açıkça belirtiyor"
},
"probabilities": {
"0": 0.0,
"1": 0.03,
"2": 0.97
}
}Jev kısaca yukarıdaki üç soruya cevap alınabilen, stateless bir karar modeli. Type-safe çalışır; çıktısı yalnızca sorulan soruya ve seçeneklere göre değişir. Onun dışında klasik modellerdeki gibi düz metin, kod parçası vb. çıktıları Jev'den alamazsınız.
.NET'te Jev nasıl kullanılır?
Çok yakında Elf asistanın içine de implemente etmeyi düşünüyorum; özellikle computer use ve advisor pattern kullanımında işime yarayacağını tahmin ediyorum. Bunun için Rasmus Wulff Jensen'in geliştirdiği JevDotNet kütüphanesi en kolay kullanımı sunuyor. Bir de eğitimlerini severek takip ettiğimden biraz da torpil geçiyorum :)
Önce paketi ekleyelim:
dotnet add package JevDotNetSorular, dönüş nesnesinin özelliklerine attribute olarak yazılıyor. Kütüphane her özelliği bir Jev sorusuna çevirip cevabı aynı özelliğe dolduruyor:
using JevDotNet;
using JevDotNet.Models;
string apiKey = Environment.GetEnvironmentVariable("TYPESAFE_API_KEY")
?? throw new InvalidOperationException("TYPESAFE_API_KEY tanımlı değil.");
JevClient client = new JevClient(apiKey);
JevResponse<MyJevReturnObject> response =
await client.EvaluateAsync<MyJevReturnObject>(
"The device is broken. I need support.");
MyJevReturnObject result = response.Result;
Console.WriteLine($"Kategori: {result.Category?.Choice}");
Console.WriteLine($"Kategori güveni: {result.Category?.Confidence:P0}");
Console.WriteLine($"Şiddet (0-2): {result.Severity?.Score:0.00}");
Console.WriteLine($"Bozuk mu: {result.IsBroken?.Value}");
Console.WriteLine($"Bozukluk olasılığı: {result.IsBroken?.Probability:0.00}");
public class MyJevReturnObject
{
[JevChoiceQuestion<Category>("What type of category fits this message?")]
public JevChoice<Category>? Category { get; set; }
[JevScoreQuestion<Severity>("How bad is it?")]
public JevScore<Severity>? Severity { get; set; }
[JevNoulQuestion("Is the product broken?")]
public JevNoul? IsBroken { get; set; }
}
public enum Severity
{
ALittle,
Somewhat,
ALot
}
public enum Category
{
Support,
Billing,
Other
}Burada üç soruyu tek bir istekte soruyoruz: mesaj hangi kategoriye giriyor (Choice), sorun ne kadar ciddi (Score) ve ürün gerçekten bozuk mu (Noul). Score için kullanılan enum'ın sırası önemli; ALittle 0, ALot 2 olarak ölçeğin iki ucunu oluşturuyor.
İlk yazım şimdilik bu kadardı, umarım faydalı olur. Yazarken ve araştırırken çok şey öğrendim; umarım aklımdakilerin tamamını yazıya dökebilmişimdir. Sağlıcakla kalın.