Ölçümler¶
Buradaki her rakam, depodan kimlik bilgisi olmadan tekrar üretilebilir.
Modeller stub, provider değil
Hepsi deterministik stub'lara karşı koşuyor. Stub'lar gerçek iş yapıyor — extraction stub'ı sözleşmeleri regex'le ayrıştırıyor, seçim stub'ı sorguları tool açıklamalarına göre puanlıyor, harness stub'ı yalnızca context'inde olandan cevap veriyor — ama sentetik verinin şeklini bildikleri için doğrulukları iyimser.
Bu bilinçli. Bu tabloların amacı ölçüm altyapısının çalıştığını ve
karşılaştırmaların tekrar üretilebildiğini göstermek. Model hakkında sayı
için aynı komutları --model anthropic:claude-opus-5 ile koştur.
Golden setler sentetik: scripts/generate_golden_set.py (36 sözleşme, 10'u
kasıtlı kenar vaka) ve evals/tool_cases/cases.py (22 vaka, 3'ü tool
çağrılmamasını bekliyor). Gerçek bir değerlendirme için kendi verinle
değiştir.
1. Şema ve prompt sürümleri¶
uv run prompt-lab eval --prompt extract_contract@v2 --schema v2 \
--pricing config/pricing.toml --pricing-model claude-opus-5
36 belge, max_attempts=3. Maliyet sütunu bir projeksiyon: token profili
stub'ın, fiyatlar claude-opus-5'in.
| prompt_ref | şema | İlk denemede geçme | Ort. deneme | Grounding | Girdi tok p50 | Maliyet/belge |
|---|---|---|---|---|---|---|
extract_contract@v1+099030d1 |
v1 | %83,3 | 1,17 | %0,0 | 729 | $0,0080 |
extract_contract@v2+19009d12 |
v2 | %72,2 | 1,28 | %100,0 | 1.982 | $0,0089 |
v2 ilk denemede daha az geçiyor ve bu bir gerileme değil. v2, provider'ın doğrulamadığı çapraz alan kurallarını uyguluyor (bitiş başlangıçtan sonra, yüksek risk gerekçe ister, tutar para birimi ister). v1 hiçbirini uygulamıyor, yani daha zayıf bir sınavdan "geçiyor".
Bedeli belge başına 0,11 fazladan deneme ve %11 daha yüksek maliyet. Karşılığı %0 → %100 grounding.
2. Alan bazlı doğruluk¶
v1* aynı koşunun --no-grounding-drop hâli; "şema bunu ifade edemiyordu" ile
"grounding doğrulayamadı"yı ayırıyor.
| Alan | v1 | v1* (grounding'siz) | v2 | Neden |
|---|---|---|---|---|
jurisdiction |
%0,0 | %0,0 | %100,0 | v1 şemasında alan yok |
amount_minor |
%2,8 | %2,8 | %97,2 | v1'de amount float; kuruş tam sayısı hiç üretilmiyor |
start_date |
%0,0 | %88,9 | %100,0 | v1'in %0'ı tamamen grounding |
end_date |
%2,8 | %88,9 | %100,0 | aynı sebep |
termination_notice_days |
%0,0 | %97,2 | %97,2 | aynı sebep; kalan %2,8 "iki ay" çevrimi |
auto_renewal |
%97,2 | %97,2 | %100,0 | v1 şemasında alan yok |
risk_rationale |
%97,2 | %97,2 | %100,0 | v2 yüksek riskte zorunlu tutuyor |
parties |
%100,0 | %100,0 | %100,0 | değişmedi |
currency |
%100,0 | %100,0 | %100,0 | değişmedi |
risk_level |
%100,0 | %100,0 | %100,0 | v1'de serbest string, v2'de Literal |
Üç bulgu:
- Alıntı alanı olmayan bir şema temellendirilemez. v1'in
start_date'i %88,9'dan %0'a düşüyor, sadece alıntıyı koyacak yer olmadığı için. Ayrım yapılmadan bakılırsa "v1 tarih çıkaramıyor" gibi okunur — yanlış, ve seni yanlış şeyi düzeltmeye gönderir. - Şemada olmayan alan çıkarılamaz.
jurisdictionveauto_renewalbelgelerde var ve modelin koyacağı yer yok. Şema tasarımı bir çıktı kalitesi kararıdır. - En zayıf alan gerçekten en zayıf. v2'de kalan iki hata, tam da olması gereken iki kenar vaka:
fields that failed on edge cases:
notice_in_months -> termination_notice_days
tax_inclusive -> amount_minor
CI kapısı tam olarak o sayıya bağlı:
3. Injection direnci¶
12 kaçış kalıbı, her biri 5 koşu, yalnızca yapısal savunma.
| Kalıp | Koşu | Tuttu |
|---|---|---|
plain_closing, spaced_closing, uppercase, mixed_case |
20 | %100 |
line_break, nested_opening, trailing_space, double_closing |
20 | %100 |
embedded_instruction, role_switch, prompt_leak, format_escape |
20 | %100 |
| toplam | 60 | %100 |
Bu, wrapper'ın delinip delinemeyeceğini ve belge içeriğinin sistem bloğuna ulaşıp ulaşamayacağını ölçüyor. Deterministik, dolayısıyla %100 beklenti ve altına düşmesi bir regresyon.
Davranışsal yarı — gerçek bir model enjekte edilmiş talimatı izliyor mu — ayrı
bir @pytest.mark.live testinde ve olasılıksal. Prompt katmanı ilk siper, tek
savunma değil; gerçek yetkilendirme tool katmanının işi.
4. Tool açıklamaları¶
Tek bir registry'nin üç varyantı. Şemalar özdeş; yalnızca açıklama metni farklı.
| Varyant | Seçim doğruluğu | Yasak tool oranı | Tool'suz doğruluk |
|---|---|---|---|
| tam | %90,9 | %0,0 | %100,0 |
| sınır cümleleri kaldırılmış | %90,9 | %0,0 | %100,0 |
| yalnızca ilk cümle | %90,9 | %4,5 | %100,0 |
Beklenen sonuç çıkmadı ve çıkan daha faydalı. Bu seçiciyle açıklama kalitesi seçim doğruluğunu hiç oynatmadı. Güvenlik sayısını oynattı: açıklamaları tek cümleye indirmek, ajanın doğru tool'u seçme olasılığını aynı bıraktı ve yıkıcı olana uzanma olasılığını ölçülebilir şekilde artırdı.
Bu, panolar hakkında bir şey söylüyor. Seçim doğruluğu bir kalite sinyali; yasak tool oranı bir güvenlik sinyali — ve önce o bozuldu.
5. Döngü tespiti¶
20 senaryolu görev, 5'i takılı koşu. Konfigürasyonlar yalnızca tekrarın koşuyu durdurup durdurmadığında farklı.
| Konfigürasyon | Tamamlanma | p50 adım | p95 adım | Döngü oranı |
|---|---|---|---|---|
| tespit açık | %75,0 | 2,0 | 3,0 | %25,0 |
| tespit kapalı | %100,0 | 2,0 | 7,0 | %0,0 |
Bu senaryolarda takılı koşular altı tekrardan sonra kendiliğinden toparlanıyor — iyimser bir varsayım, ve takası görünür kılan şey. Tespit p95'te 4 adım kazandırıyor ve 25 puan tamamlanma kaybettiriyor.
stop_at bu takasın kadranı. Nereye ayarlanacağı, adımlarının mı yoksa
tamamlanmalarının mı pahalı olduğuna bağlı.
6. Harness konfigürasyonları¶
30 belge oku, biri cevabın ihtiyaç duyduğu gerçeği içeriyor. Model yalnızca context'inde olandan cevap veriyor.
| Konfigürasyon | Adım | Toplam token | p95 doluluk | Compaction | Cevap sağ kaldı |
|---|---|---|---|---|---|
| naif kırpma | 30 | 101.114 | 0,979 | 0 | hayır |
| compaction | 30 | 69.539 | 0,692 | 2 | hayır |
| compaction + alt-ajan | 30 | 12.018 | 0,134 | 0 | evet |
Compaction token'ı %31 ve p95 doluluğu 0,98'den 0,69'a düşürdü. Patlamaya bir uzun sonuç kalmış bir koşu, nefes alanı olan bir koşuya döndü. Cevabı kurtarmadı.
Orta satır için dürüst uyarı: needle bir spill dosyasında duruyor ve
read_spill ile erişilebilir; simülasyondaki ajan referansı takip etmiyor.
Yani satır "spill özeti + compaction, ajan referanslarını takip etmiyorsa
yetmez" diyor — gerçek bir başarısızlık biçimi ama "compaction işe yaramıyor"
iddiasından farklı.
Ders üçüncü satırda: okumayı devretmek token'ı %88 düşürdü ve cevabı korudu, çünkü ana context belgeleri hiç tutmadı. En ucuz context yönetimi, hiç üstlenmediğin context'i yönetmemek.
7. Compaction needle testleri¶
Üç planlanmış gerçek, gürültüyle gömülmüş, iki prompt sürümü.
| Prompt | Sipariş no ORD-88421 |
Tutar 125,000 |
Tarih 2025-03-14 |
|---|---|---|---|
compaction@v1 ("kısa tut") |
kayıp | kayıp | kayıp |
compaction@v2 (neyin kalacağını sayar) |
korundu | korundu | korundu |
Model karşılaştırması¶
Bu tablo kendi koşularınla dolar; harness JSON'u üretiyor.
uv run model-probe --prompt evals/probe/sample-prompt.txt \
--models anthropic:claude-opus-5 anthropic:claude-haiku-4-5 \
-n 5 --json evals/probe/result.json
| model | in~ | in | drift% | out | USD/1k | TTFT p50 | TTFT p95 | total p50 | total p95 | distinct | modal |
|---|---|---|---|---|---|---|---|---|---|---|---|
| (senin koşun) |
in~ yerel tiktoken tahmini, in provider'ın bildirdiği sayı, drift%
aradaki fark. tiktoken OpenAI sözlüğüdür; Anthropic ve Gemini'de bu sapma
%10-20'ye çıkar — context bütçesinin limite kadar doldurmak yerine emniyet
payı taşımasının sebebi bu.
Kimlik bilgisi olmadan da bütçe kapısı gözlenebilir: