Program
Geçen hafta yayımlandığından beri Jev, TypeSafe AI’ın System One Modeli hakkında çok konuşuldu: Pek çok kişinin övdüğünü, bir o kadarının da eleştirdiğini gördüm. Gerçek muhtemelen modelden beklentinize göre ikisinin arasında bir yerde. Ben de denemek için çok merak ediyordum ve bu haftanın başında önizleme erişimi aldım.
Bu eğitimde, Jev’i Python SDK’larıyla nasıl kuracağınızı, Jev’in üç farklı soru türünü nasıl kullanacağınızı ve modelin güçlü olduğu bir kullanım alanı olan bilet yönlendirme katmanını nasıl oluşturacağınızı göstereceğim. Ayrıca Jev’in zorlandığı noktaları ve merak ediyorsanız System One modelinin ne olduğunu da ele alacağız.
Python ile model API’leriyle mi oluşturuyorsunuz? LangChain ile LLM Uygulamaları Geliştirme aynı yığının üretim tarafını, istemleri, zincirleri ve ajanları kapsar.
Kısa Özet
Jev, TypeSafe AI'nin System One modelidir. Metin üretmez. Durumu ve tür tanımlı soruları gönderirsiniz, o da olasılıklarıyla birlikte tür tanımlı yanıtlar döndürür ve sonrasında ne olacağına kodunuz karar verir.
- Üç soru türü. Choice bir kümeden bir seçenek seçer. Score sıralı seviyelere göre derecelendirir. Noul evet/hayır olasılığı döndürür.
- Sorular paraleldir. Altı soru bir çağrının maliyetine gelir ve tek sorudan çok az daha fazla gecikme yaratır; bu yüzden isteyebileceğiniz her şeyi sorarsınız.
- Güven değeri işinize yarayan kısımdır. Üç yol kurmanıza imkân verir: otomatikleştir, insana devret, varsayılan akışa bırak.
- Sayı sayamaz, tarih hesaplayamaz ve sorularınızı kelimesi kelimesine okur. TypeSafe pürüzlü kenarları yayımlıyor ve bunlar önemlidir.
Tek bir çağrıyla bir destek bileti yönlendirici oluşturuyor, ardından Jev’in nerede kırıldığını inceliyoruz.
Jev Neden Metin Üretmiyor?
Zaten beklentilerin modelle eşleşmesi gerektiğinden bahsetmiştim. Bu özellikle Jev için geçerli ve büyük ölçüde System One modelleri olarak anılan model sınıfıyla ilgili.
System One modelleri, belirteçler yerine tür tanımlı kararlar döndürür
Bir System One modeli metin yerine tür tanımlı kararlar döndürür. Bir durum bloğu ile her biri sizin tanımladığınız bir yanıt alanına sahip soru kümesini gönderirsiniz; model de her soru için olasılıkları ekli bir yanıt döndürür. Yanıt belirteç belirteç üretilmez; dolayısıyla ayrıştırılacak bir dize ya da onarılacak bozuk JSON yoktur. TypeSafe bu terimi Daniel Kahneman’ın ünlü ayrımına atıfla ortaya koydu:
- Sistem 1 düşünme: hızlı, sezgisel yargı
- Sistem 2 düşünme: yavaş, kasıtlı akıl yürütme
Yanıt alanı kodunuzun bildirdiği bir şema olduğundan, System One modelleri tasarım gereği asla sizin tanımlamadığınız bir kategoriyi döndüremez. Bu, şema dışına çıkamayacağı anlamına gelir. Yine de yanlış olabilir; ileride bazı zorlayıcı örnekleri göreceğiz.
Jev nerede duruyor
TypeSafe, 15 Eylül 2026’da gizlilikten çıkarak Jev’i erken erişime açtı; 70 ila 500 ms yanıt süreleri ve milyon giriş belirteci başına 0,042 $ fiyat bildirdi, çıkış ücretsiz. Kendi dört iş akışlı kıyaslamasında Jev yaklaşık %68 doğrulukla, maliyetin küçük bir kısmına orta seviye LLM bölgesine yerleşiyor.
Özellikler ve kıyas performansı hakkında daha fazla bilgi için Jev rehberimizi okumanızı öneririm.
Ne zaman Jev, ne zaman bir LLM kullanmalı
Aramayı yapmadan önce geçerli yanıtları yazın. Bunları sıralayabiliyorsanız, Jev’e uygun bir probleminiz var demektir:
- Yönlendirme: altı kuyruktan hangisi, hangi işleyici, hangi model
- Filtreleme: Bu pasaj ilgili mi? Bu bir jailbreak girişimi mi?
- Bir rubriğe göre derecelendirme: ne kadar ciddi, ne kadar acil, ne kadar eksiksiz
- Kapılama: pahalı adımı çalıştır ya da atla
Çıktı düzyazı ya da kod olduğunda, yanıt alanı açık uçlu olduğunda ya da görev birkaç aşamalı akıl yürütme gerektirdiğinde bir LLM kullanın. Jev ayrıca sayısal işler için de yanlış araçtır; nedenine az sonra döneceğim.
TypeSafe AI Playground’da Soru Türlerini İncelemek
Herhangi bir kod yazmadan önce bir TypeSafe hesabı oluşturun ve Playground’u açın. Burada durumu metin olarak yapıştırabilir, sorular ekleyebilir ve hiçbir şey kurmadan tam yanıt nesnelerini görebilirsiniz. Her soru türünün ne döndürdüğünü anlamanın (ve sorunuz kötü yazılmış mı öğrenmenin) en hızlı yoludur.
Üç örneğin tamamında durum olarak tek bir destek biletini kullanacağım:
Export to CSV has been broken since Friday.
It works in Chrome, but half our team is on Safari and they can't pull reports at all.
We have a board meeting Thursday.
Her soru türü instructions alır; yani yanıtlanmasını istediğiniz basit dildeki soruyu. Aralarında değişen şey criteria ve geri dönen yapıdır.
Kategorik yönlendirme için Choice
Bir Choice sizin tanımladığınız bir kümeden bir seçenek seçer.
criteria değerini her seçeneği bir açıklamaya eşleyen bir sözlük nesnesi olarak geçirirsiniz; 1 ile 255 seçenek arasında olabilir. Yanıt şu alanlarla gelir:
- Kazanan seçenek
- Her seçenek için bir olasılık
- Bir güven değeri
{
"department": {
"type": "choice",
"instructions": "Which queue should own this ticket?",
"criteria": {
"bug_triage": "A defect in a specific feature, reproducible, goes into the backlog",
"incident_response": "A live breakage affecting multiple users right now, needs a responder today",
"customer_success": "The account needs managing, not the code"
}
}
}
API ile de alacağınız kod çıktısını görmek için sağ üst köşedeki </> düğmesine tıklayın ve Jev’in soruyu yanıtlaması için Run’a tıklayın.

Bu örnekte incident_response, %91 olasılıkla seçilen choice. Jev’in bu seçim için confidence değeri %86.
Dikkatinizi vermeniz gereken kısım tam dağılımdır.
-
choiceyalnızca hangi seçeneğin kazandığını söyler. -
probabilitiesise ne kadar farkla kazandığını söyler.
Otomatik yönlendirme yapmadan hemen önce bunlar farklı bilgilerdir. 0,41/0,38/0,21 bölünmesi ile aldığımız 0,91/0,09/0 bölünmesi aynı choice’ı döndürebilir.
Sıralı rubrikler için Score
Score, durumu sıralı seviyelere göre derecelendirir. criteria değerini 2 ile 10 arasında seviye açıklaması içeren bir dizi olarak geçirirsiniz; en düşük önce gelir. Yanıt; bir skor, her pozisyonu açıklamanıza eşleyen bir legend, seviye başına olasılıklar ve güven içerir.
{
"goodwill_risk": {
"type": "score",
"instructions": "How much patience does this customer have left?",
"criteria": [
"Reporting a problem, no sign of frustration",
"Mildly annoyed, still collaborative",
"Visibly out of patience, mentions the cost to their work",
"At the point of escalating over our heads or leaving"
]
}
}

Skor seviyeleriniz arasında bir yere düşebilir ve legend’ın amacı tam da budur. Burada score 1,93, yani model "hafif sinirli" ile "gözle görülür şekilde sabrı taşmış" arasında bölünmüş, güçlü biçimde ikincisine meylediyor demektir. Bu da yaklaşan bir son tarihi kaçıracağını belirten, ama üslubunu koruyan bir bilet için makul bir okuma.
Yine de yalnızca sayıya değil, probabilities dağılımına bakın: Olasılığın tek bir seviyede toplanması kesin bir yargı demektir; üç seviye arasında yayılması ise bir yargı yerine ortalama aldığınızı gösterir.
Evet/hayır olasılıkları için Noul
Noul ikili sorular için kullanılan türdür ve adını TypeSafe koymuştur. Burada criteria isteğe bağlıdır; ancak true ve false değerlerinin ne anlama geldiğini tanımlayabilirsiniz. "Evet" iki şekilde de yorumlanabilecekse bunu yapmak faydalıdır.
Soruyu, yüksek değerin evet anlamına gelecek şekilde kurun. TypeSafe dokümanları bu konuda açıktır ve true değeri "hayır" ile eşleşen bir Noul ölçülebilir şekilde daha kötü performans gösterir.
{
"is_time_sensitive": {
"type": "noul",
"instructions": "The customer names a specific deadline",
"criteria": {
"true": "A date, day, or event the work must be done before",
"false": "Urgency is implied but no deadline is given"
}
}
}

Durumda Perşembe günü bir yönetim kurulu toplantısından bahsedildiği için, 0,97’lik yüksek noul değeri bekleniyordu.
Noul’un neden bir confidence alanı yok?
Choice ve Score, olasılıkların yanında güven değeri de döndürür. Noul döndürmez ve bu kafa karıştırabilir; nedenini netleştirmeye değer.
Güven ve olasılık ayrı eksenlerdir. Choice için olasılıklar modelin inancını seçenekler arasında nasıl dağıttığını, güven ise yanıtına ne kadar sıkı tutunduğunu söyler; bu yüzden bir Choice, tepedeki seçenek için 0,85 ve güven için 0,78 döndürebilir. Noul’da yalnızca iki sonuç vardır, dolayısıyla tek olasılık zaten ikisini de taşır: 0,97 kesin bir evet, 0,03 kesin bir hayır, 0,52 ise modelin fikri olmadığını söyler.
Bu da 0,5’ten uzaklığın sizin belirleyicilik sinyaliniz olduğu, ayrı bir alan okumayacağınız anlamına gelir. Ayrıca bu, bir Noul eşiğini Choice’a taşıyamayacağınız anlamına gelir; pürüzler bölümünde buna döneceğim çünkü göründüğünden daha can yakıcıdır.
Jev Python SDK’sını Kurma
Takip etmek için yalnızca Python 3.10+ ve bir TypeSafe erken erişim anahtarına ihtiyacınız olacak.
SDK’yı yükleme
SDK’yı yükleyin:
pip install typesafe-sdk
Ya da uv ile:
uv add typesafe-sdk
Anahtarınızı dışa aktarma
Ardından TypeSafe konsolunda bir anahtar oluşturun ve dışa aktarın. İstemci, TYPESAFE_API_KEY değerini ortam değişkeninden okur; böylece bunu koda hiç geçmezsiniz:
export TYPESAFE_API_KEY="your-key"
Yanıt türlerini ve istemciyi içe aktarma
Aşağıdaki içe aktarmalar size playground’daki her şeyi getirir:
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
client = TypeSafeClient()
Choice, Noul ve Score, az önce tıkladığınız soru türlerinin Python nesneleridir.
TypeSafeClient’ı kullanma
TypeSafeClient eşzamanlı istemcidir ve bir async servisten Jev’i çağırıyorsanız aynı arayüze sahip bir AsyncTypeSafeClient vardır. Her ikisi de bağlam yöneticisi olarak çalışır; betikten daha uzun her şeyde ben bunu kullanırım:
with TypeSafeClient() as client:
...
Jev sürümünü sabitleme
Elle bırakıldığında istemci jev-latest’i çağırır; bu, TypeSafe yeni bir sürüm yayımladığında hareket eder ve bu eğitimin tamamında bunu kullanacağız. Bir eşiği zaten ayarladığınız herhangi bir durumda ise sürümü sabitleyin:
client = TypeSafeClient(model="jev-1.13.0")
Yanıt, her iki durumda da hangi modelin gerçekten yanıt verdiğini söyler ve bunun nedenini kaydetmeniz gerektiğine dair bir bölüm sondadır.
İlk Jev API Çağrınızı Yapma
Jev’e bir API çağrısı yapmak için, TypeSafeClient ve system_one() işlevini kullanarak bir response ögesi tanımlamanız gerekir; bu işlev soru bağlamınızı state parametresi olarak ve questions değerlerini de playground’dakiyle aynı biçimde alır.
Aynı state’i paylaştıkları için, üç playground sorumuzun tamamını yanıtlayan tek bir çağrı oluşturabiliriz:
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
ticket = (
"Export to CSV has been broken since Friday. It works in Chrome, "
"but half our team is on Safari and they can't pull reports at all. "
"We have a board meeting Thursday."
)
with TypeSafeClient() as client:
response = client.system_one(
state=ticket,
questions={
"queue": Choice(
instructions="Which queue should own this ticket",
criteria={
"bug_triage": "A defect in a specific feature, reproducible, goes into the backlog",
"incident_response": "A live breakage affecting multiple users right now, needs a responder today",
"customer_success": "The account needs managing, not the code",
},
),
"goodwill_risk": Score(
instructions="How much patience does this customer have left",
criteria=[
"Reporting a problem, no sign of frustration",
"Mildly annoyed, still collaborative",
"Visibly out of patience, mentions the cost to their work",
"At the point of escalating over our heads or leaving",
],
),
"is_time_sensitive": Noul(
instructions="The customer names a specific deadline",
criteria={
"true": "A date, day, or event the work must be done before",
"false": "Urgency is implied but no deadline is given",
},
),
},
)
Yanıtlar, her soru için seçtiğiniz aynı adlar altında döner; bu da tüm çalışmayı keyifli kılan ayrıntıdır:
print(response.model)
print(response.answers["queue"].choice, response.answers["queue"].confidence)
print(response.answers["goodwill_risk"].score)
print(response.answers["is_time_sensitive"].noul)
jev-1.13.0
Incidence_response 0.95
1.95
0.97
TypeError’lar nasıl giderilir
İlk çağrınız output_buffer_limit hakkında bir TypeError ile başarısız olursa: bu, SDK’nın sıkıştırma arka ucunda bir sürüm uyumsuzluğudur; kodunuzda değil. SDK, yanıtları zstandard ve brotli ile açan kendi HTTP istemcisi httpx2 ile birlikte gelir ve bu ikisinden birinin eski bir kopyasında çağrıldığı argüman eksiktir. pip install -U typesafe-sdk httpx2 zstandard brotli bende sorunu çözdü.
Çıktı bize ne söylüyor
Bu çıktıda durmaya değer iki şey var.
Birincisi, response.model jev-latest değil, jev-1.13.0 döndürdü. Hareketli takma adı istediniz ve Jev size gerçekte hangi sürümün yanıt verdiğini söyledi; bu alanı kaydetmenin değmesini sağlayan tek neden budur.
İkincisi, yanıt nesneleri soru türüne göre tür tanımlıdır; dolayısıyla .choice, .score ve .noul gerçek özniteliklerdir ve düzenleyiciniz bunları bilir. Bu kodda hiçbir yerde JSON dizesi yoktur; ayrıştırılacak bir şey yoktur ve bozuk dönen çağrı için bir dal yoktur. Gruplamayı tercih ederseniz, SDK aynı şekilde anahtarlanan response.choices, response.scores ve response.nouls özniteliklerini de sunar.
response.usage’a da bakın:
print(response.usage.input_tokens, response.usage.output_tokens)
524
78
Çıkış belirteçleri tek hanelidir ve ücretsizdir. Ödeme, durum ve sorular içindir; bu yüzden maliyeti, ne kadar bağlam gönderdiğinize karar vererek tamamen kontrol edebilirsiniz. Bu, göründüğünden daha önemlidir ve pürüzler bölümünde tekrar karşımıza çıkar: Şişkin bir durum hem paraya hem doğruluğa aynı anda mal olur.
Tek Bir Jev Çağrısıyla Bilet Yönlendirici Kurma
Bu, Jev’in tam da bunun için tasarlandığı kullanım alanlarından biridir. Bir destek bileti gelir ve bunun hangi kuyruğa gideceğine, önce bir insanın bakıp bakmayacağına ve ne kadar hızlı ele alınacağına bir şey karar vermelidir. Bunların her biri, bilet gelmeden önce yanıt alanını yazabileceğiniz bir yargıdır.
En baştan söylemeye değer tasarım kuralı: Jev ne olduğunu söyler, ne olacağına kodunuz karar verir. Jev hiçbir şeyi asla yönlendirmez. Sayılar döndürür ve yönlendirme, modeli ellemeye gerek kalmadan okuyabileceğiniz, test edebileceğiniz, değiştirebileceğiniz sıradan bir işlevde yaşar.
Tüm soruları tek istekte sormak
Tek bir istekteki sorular paralel olarak değerlendirilir; dolayısıyla altıncı soru size yalnızca yazıldığı belirteçlerin maliyetine gelir ve neredeyse hiç ek gecikme yaratmaz. Bu, soru sorma şeklinizi değiştirir. Bir LLM ile gidiş-dönüş süresini azaltmak için dikkatle biriktirirsiniz; burada ise belirli bir bağlam hakkında isteyebileceğiniz her şeyi, muhtemelen yok sayacağınız sorular da dahil, sorarsınız.
Önceki sorularımızı, bileti nasıl ele alacağımıza dair önemli bilgiler veren üç ek Noul ile genişletelim:
- Bilet, sorunu yeniden üretmek için yeterli bilgi içeriyor mu?
- Gelir kaybı veya sorunla ilgili ek maliyetlerden bahsediyor mu?
- Biletin insan yanıtına ihtiyacı var mı?
QUESTIONS = {
"queue": Choice(
instructions="Which queue should own this ticket",
criteria={
"bug_triage": "A defect in a specific feature, reproducible, goes into the backlog",
"incident_response": "A live breakage affecting multiple users right now, needs a responder today",
"customer_success": "The account needs managing, not the code",
},
),
"goodwill_risk": Score(
instructions="How much patience does this customer have left",
criteria=[
"Reporting a problem, no sign of frustration",
"Mildly annoyed, still collaborative",
"Visibly out of patience, mentions the cost to their work",
"At the point of escalating over our heads or leaving",
],
),
"is_time_sensitive": Noul(
instructions="The customer names a specific deadline",
criteria={
"true": "A date, day, or event the work must be done before",
"false": "Urgency is implied but no deadline is given",
},
),
"has_reproduction": Noul(
instructions="The ticket contains enough detail to reproduce the problem",
),
"mentions_money": Noul(
instructions="The customer mentions lost revenue, refunds, or cancelling",
),
"is_automated": Noul(
instructions="This ticket is a machine-generated notification, not a person writing in",
),
}
with TypeSafeClient() as client:
response = client.system_one(state=ticket, questions=QUESTIONS)
Altı soru, tek çağrı ve tek fatura ile yanıtlandı. is_automated olanı spekülatiftir: Gerçek biletlerin neredeyse hepsinde yanlıştır ve yine de sormaya değerdir; çünkü bir kez doğru olduğunda birinin mailer daemon sıçramasını açmasını önler.
Burada edineceğim iki alışkanlık var.
-
Soru kümesini, eşiklerinizle birlikte sürümleyeceğiniz şey olduğundan satır içine inşa etmek yerine modül düzeyinde sabit olarak tutun.
-
Ve soruları, yanıtla ne yapacağınıza göre değil, neyi ölçtüklerine göre adlandırın; çünkü
is_time_sensitivebir politika değişikliğinden sağ çıkar,route_to_incidentçıkmaz. -
Soruları olumlu çerçeveleyin:
is_automatediçinneeds_no_replygibi bir ad da verebilirdik; ancak TypeSafe’e göre, olumlu formüle edilmiş soruların performansı daha iyidir.
Yanıtları güven eşikleriyle eyleme dönüştürmek
Şimdi Jev’in yapmadığı kısım. Her yanıt bir güven değeri ya da olasılık ile gelir ve bu ikinci sayı, iki yerine üç yol kurmanızı sağlar:
- Yüksek güven: otomatik hareket et
- Orta bant: yanıtı modelin önerisiyle birlikte bir insana yönlendir
- Politikanın kapsamadığı her şey: varsayılan kuyruğa düşür

Bunu bilet yönlendirme için birkaç kurala dönüştürelim:
- Bilet büyük olasılıkla makine tarafından oluşturulmuşsa, bileti arşivleyin ve otomatik hareket edin
- Müşteri sinirli görünüyor ve mali kayıplardan bahsediyorsa, bileti müşteri başarısı ekibinde bir insana yönlendirin
- Model hangi kuyruğun geçerli olduğundan yeterince emin değilse, en olası kuyruğa bir insana yönlendirin
- Bilet muhtemelen acilse, bugün ele alınacak şekilde işaretleyin
AUTO_ROUTE_CONFIDENCE = 0.75
YES = 0.8
FRUSTRATED = 2.0
def route(answers):
if answers["is_automated"].noul > YES:
return "archive", "auto"
queue = answers["queue"]
urgent = answers["is_time_sensitive"].noul > YES
unhappy = answers["goodwill_risk"].score >= FRUSTRATED
if unhappy and answers["mentions_money"].noul > YES:
return "customer_success", "human_first"
if queue.confidence < AUTO_ROUTE_CONFIDENCE:
return queue.choice, "human_first"
priority = "today" if urgent else "normal"
return queue.choice, priority
Bu işlevin ne yaptığına bakın. Model altı yargı sağladı ve politika, bunlardan birinin, yani sinirli bir müşteride mentions_money ile kesişen yargının, Jev’in seçtiği kuyruğun önüne geçmesine karar verdi. Bu geçersiz kılma bir iş kararıdır; koda aittir ve bir Cuma öğleden sonra modeli yeniden test etmeden değiştirebilirsiniz.
has_reproduction hiç kullanılmıyor. Bunu bilerek bıraktım; çünkü pratikte fan-out deseni böyle görünür: Geçerli politikanın tükettiğinden daha fazlasını istersiniz, hepsini kaydedersiniz ve biri bug_triage biletlerinin yeniden üretim adımları olmadan kapanmasının daha uzun sürüp sürmediğini sorarsa, zaten altı haftalık yanıta sahipsinizdir.
Yukarıdaki eşikler sadece örnektir. Doğru olanları bulmak kalibrasyon meselesidir ve bunları sezgiyle değil verilerle nasıl ayarlayacağınıza dair bir bölüm sonda yer alıyor.
Betik çalıştırma
Tam betiğe bu eşlik eden GitHub deposundan erişebilirsiniz. Senaryomuzla Python betiğini çalıştırdığımda, yargı bileti bugün olay müdahale ekibine yönlendirmek oldu.
python routing.py
('incident_response', 'today')
Jev’in Kırıldığı Yerler: Pürüzlülük Listesini Okumak
TypeSafe, her model sürümü için bilinen arıza kiplerini listeleyen bir pürüzlülük sayfası yayımlar. Keşke daha çok laboratuvar bunu yapsa. Bir şey inşa etmeden önce okuyun ve yükselttiğinizde tekrar okuyun; çünkü liste sürümlüdür ve kenarlar hareket eder.
Bana en çok zaman kaybettirecek beş tanesi burada.
Noul ve Choice anlaşmıyor
Bir eşik değerini soru türleri arasında taşıyamazsınız. TypeSafe’in kendi örneği, aynı bilette "Müşteri geri ödeme mi istiyor?" sorusunu iki biçimde sorar: Noul 0,22 döndürür; evet/hayır Choice ise evet için 0,01 döndürür ve güven 0,97’dir. Aynı soru, iki sayı, iki büyüklük mertebesi fark.
Olumsuzluklar da işbirliği yapmaz. Bir Noul ve onun tersi 0,72 ve 0,47 olarak döndü; toplamları 1,19.
Sebep, iki türün farklı şeyler sormasıdır. Choice nispi olup hangi seçeneğin kazandığını saptarken, her Noul mutlak olup hepsi için düşük olabilir. Eşikleri, göndereceğiniz biçimde, soru başına ayarlayın ve asla P(yes) ile 1 - P(no) değerlerinin aynı sayı olduğunu varsaymayın.
Score bir ölçüm değil, sıralamadır
Score seviyeleri sıralıdır, aralıklı değildir. 1,6 size, modelin ikinci ve üçüncü seviyeniz arasında, üçüncüye meylederek yer aldığını söyler; hepsi bu.
Yapamayacağınız şey, buradan gerçek bir nicelik enterpole etmektir. Seviyeleriniz "bir saatten az", "birkaç saat" ve "bir gün" ise, 1,5 beş saat anlamına gelmez. Skoru bir eşiği test etmek için kullanın, ardından gerçek sayıların tamamını kodda tutun.
Durum kendi yanıtı için argüman yazabilir
Jev durumu veri olarak görür; ancak onu yönlendirmek için durum içine yazılmış talimatlara karşı sertleştirilmemiştir. Enjekte edilmiş bir yönerge, yanıltıcı bir çerçeveleme ya da kendi sınıflandırmasını savunan bir metin yanıtı etkileyebilir ve TypeSafe burada iyileşme beklediğini söylüyor. Saldırı yüzeyi size yeniyse, genel durumu prompt injection rehberimizde ele alıyoruz.
Bu en çok, durumun kullanıcı tarafından gönderildiği yerlerde önemlidir ki bir bilet yönlendirici için bu her zaman böyledir. Ölçütleri, biletin kendisi hakkında yaptığı iddiaların sonucu belirlemeyeceği kadar hassas yazın ve herhangi bir şeyi otomatik yönlendirmeden önce düşmanca girdilerle test edin.
Jev sayamaz, tarih veya sayı hesabı yapamaz
Sayı sayma güvenilmezdir ve sayılan şey büyüdükçe daha da kötüleşir; çünkü model toplamaktan ziyade bir yanıtın şeklini tanır. Tarihler metin olarak okunur; bu yüzden sıralama, uzaklık ve pencereler başarısız olur. Sayısal kodlamalar, anlamsal eşdeğerlerinden daha kötü performans gösterir; bu yüzden #FF0000 yerine "kırmızı"yı sorun.
Çözüm her üç durumda da aynıdır: işi bölün.
- Çıkarma bir yargıdır; bu yüzden bunu, sıralanmış seçenekler üzerinden bir Choice olarak Jev’e verin.
- Aritmetiği yalnızca kodda tutun.
Bir sayıya ihtiyacınız varsa, kodda yineleyin ve öğe başına bir Noul sorun:
count = sum(
result.nouls[f"item_{i}"].noul > 0.5
for i in range(len(items))
)
Harfi harfine okuma, dolaylılık ve şişirilmiş durum
Aynı nedene bağlanan üç küçük mesele. Jev, yazdığınız soruyu yanıtlar; demek istediğinizi değil; dolayısıyla kapsamlayıcı kelimeler ve olumsuzluklar olduğu gibi okunur. Çifte olumsuzluklar ve bir özelliğin özelliği hakkında sorular doğruluğa mal olur. Alakasız ayrıntılarla şişirilmiş büyük bir durum ise, ilgisiz malzeme dikkat dağıtıcı olarak davrandığından doğruluk ve paraya birlikte mal olur.
İlkinin işareti: Yanlış bir yanıta bakıp aslında ne demek istediğinizi açıklarken yakalıyorsanız kendinizi, o açıklama talimatlarınızın eksik kalan yarısıdır.
Jev’i Üretime Almadan Önce Ne Yapmalı
Şimdiye kadar öğrendiklerimize dayanarak, Jev’den en iyi şekilde yararlanmak için birkaç iyi uygulama:
Jev’in iyi yanıtladığı sorular yazmak
Niyeti değil, koşulu yazın. Yanlış bir yanıtı incelerken ne demek istediğinizi açıklıyorsanız, o açıklama talimatlara aittir. Bunun anlamı:
- Soru başına bir yargıyla sınırlayın.
- Sınır durumlarını kapsayan ölçütler seçin.
- Yüksek değerin evet anlamına geldiği bir ifadeyi tercih edin.
- Sadece sorunun ihtiyaç duyduğu durumu gönderin.
Sürümü sabitlemek ve Jev’in verdiği yanıtı kaydetmek
jev-latest hareketlidir. Bir eşik model davranışına bağlı hâle geldiğinde sürümü sabitleyin:
client = TypeSafeClient(model="jev-1.13.0")
Her çağrıda response.model alanını, yalnızca eyleme döktüğünüz değeri değil, tam yanıtlarla birlikte kaydedin. Bir eşik sapıtmaya başladığında bu kayıt, model değişimini biletlerinizdeki kaymadan ayırt etmenin tek yoludur.
Eşikleri güvenmeden önce test etmek
Son olarak, eşikler verili değil; deneyin sonucudur.
- İsteyeceğiniz yanıtlarla birlikte 20 veya daha fazla gerçek bilet toplayın. Davranışı değiştirmeden Jev’i mevcut yönlendirmenizin yanında çalıştırın ve karşılaştırın.
- Önce soruları düzeltin, sonra eşikleri. Ardından yanlış yapılması en ucuz yolu otomatikleştirin ve geri kalanını bir insana bırakın.
- Soruları, ölçütleri ve eşikleri birlikte sürümleyin. Üçünden herhangi biri değiştiğinde seti tekrar oynatın.
Son Düşünceler
Jev dar bir araçtır ve bu aslında amacıdır. Yanıtlarını sıralayabildiğiniz soruları, onları kısmayı bırakacak kadar ucuza yanıtlar ve kararı kodunuza geri verir.
"Halüsinasyon yapamaz" çerçevesine itiraz ederim. Modelin şema dışı yanıt verememesi dar anlamda doğrudur; ancak yanıtın doğru olup olmadığı hakkında hiçbir şey söylemez. Bir Choice her zaman geçerli bir kuyruk döndürür. Yine de 0,9 güvenle yanlış kuyruk olabilir ve tür tanımlı çıktı bu hatayı daha sessiz kılar.
Kendi işiniz için test etmek adına, kodunuzun kırılgan bir kuralla ya da yavaş bir LLM çağrısıyla verdiği tek bir kararı bulun ve geçerli yanıtları yazmayı deneyin. Yazabiliyorsanız bu, Jev şeklindedir. Yazamıyorsanız, ne kadar soru mühendisliği yapsanız da bu değişmez.
Yapay zekâyı kullanan sistemler kurmaya başlamak istiyorsanız, Geliştiriciler için Associate AI Engineer kariyer yoluna kaydolmanızı şiddetle öneririm. OpenAI API, MCP, LangChain ve çok daha fazlasıyla nasıl çalışılacağını öğretir.
SSS
Hangi Jev soru türünü kullanmalıyım?
Seçenekleri sıralayabiliyorsanız Choice, yanıtlar sıralı seviyeler oluşturuyorsa Score, tek bir evet/hayır için Noul. Kural: Yanıtların bir sırası varsa Score kullanın; çünkü Choice bu sırayı atar. "Düşük", "orta", "yüksek" gibi seçeneklerle bir Choice yazarken yakalıyorsanız kendinizi, Score istiyorsunuz demektir.
Jev’e tek bir API çağrısında birden çok soru sorabilir miyim?
Evet ve yapmalısınız. Tek bir istekteki sorular tek bir paralel geçişte değerlendirilir; bu yüzden altıncı soru yazıldığı belirteçlerin maliyetine gelir ve neredeyse hiç ek gecikme yaratmaz. Durum için bir kez ödersiniz, soru başına bir kez değil; bu da isteyebileceğiniz her şeyi sormayı ve kullanmadığınız yanıtları yok saymayı daha ucuza getirir.
Noul bir güven skoru döndürür mü?
Hayır. Choice ve Score yanıtları bir confidence alanı içerir; ancak Noul yalnızca olasılık döndürür; çünkü iki sonuçla o tek sayı zaten ikisini de taşır. Değerin 0,5’ten ne kadar uzakta olduğu belirleyicilik sinyalinizdir; dolayısıyla 0,97 kesin evet, 0,52 ise modelin fikri olmadığı anlamına gelir.
Jev sayabilir veya aritmetik yapabilir mi?
Hayır. Sayma güvenilmezdir ve sayı büyüdükçe bozulur; tarihler sıralı değerler yerine metin olarak okunur ve sayısal kodlamalar yalın dildeki karşılıklarından daha kötü performans gösterir. İşi bölün: Yargıyı Jev yapsın, aritmetiği kendi kodunuzda tutun.
Jev model sürümünü sabitlemeli miyim?
Evet; kodunuzdaki herhangi bir eşik model davranışına bağlı hâle geldiğinde. jev-latest, TypeSafe yeni bir sürüm yayımladığında hareket eder ve TypeSafe her sürüm için ayrı bir pürüzlülük listesi yayımlar; dolayısıyla arıza kipleri de değişir. İstemciye açık bir sürüm geçin ve her çağrıda response.model değerini kaydedin.
Tom bir veri bilimci ve teknik eğitmendir. DataCamp'in veri bilimi eğitim içerikleri ve blog yazılarını yazar ve yönetir. Daha önce Tom, Deutsche Telekom'da veri bilimi alanında çalıştı.
