Skip to content

Kılavuzlar

İlerleme ve eşzamanlılık

Canlı bir modele karşı bir paket dakikalar sürer ve bu dakikaların çoğu modeli beklemekle geçer. Bu sayfa Oloproof'un aynı anda kaç çağrıyı sürdürdüğünü, bunlar çalışırken size neyi gösterdiğini ve karar vermemiş bir kuralı netleştirmek için ne kadar daha çalıştırma gerektiğini nasıl öğreneceğinizi anlatır.

Eşzamanlılık

oloproof.yaml içindeki concurrency:, aynı anda kaç çağrının sürdüğünü sınırlar:

concurrency:
  system: 4
  judge: 4

system, test edilen sisteme yapılan çağrıları sınırlar ve varsayılanı 8'dir. judge, LLM hakemlerine yapılan çağrıları sınırlar ve varsayılanı 4'tür. Ayrıdırlar, çünkü ikisi genellikle farklı hız sınırlarının arkasında durur.

Çağrı başına saniyenin onda birini harcayan bir sisteme karşı yüz yirmi vaka:

system:Duvar saati süresi
113,4 sn
161,7 sn
değişmedi, yeniden çalıştırıldı0,4 sn

Son satır eşzamanlılık değil, önbellektir: her yürütme yeniden kullanıldı. Eşzamanlılık bir sistemin kimliğinin parçası değildir; dolayısıyla onu değiştirmek saklananları asla geçersiz kılmaz.

Her vaka kendi çağrısıdır. Oloproof vakaları bir sağlayıcının toplu işlem API'sinde gruplamaz; dolayısıyla bir sağlayıcının toplu işlem indirimi onun üzerinden kullanılamaz. Bir çalıştırmayı hızlandıran, eşzamanlılık ve önbellektir.

Yeniden denemeler

429 ya da bir 5xx yanıtı veren, zaman aşımına uğrayan ya da bağlantıyı düşüren bir hakem sağlayıcısı veya HTTP sistemi, geri çekilmeyle en fazla dört denemeye kadar yeniden denenir ve asla bir Retry-After başlığının istediğinden daha erken denenmez. Çağrılabilir bir sistem, oloproof içinden TransientError değerini retryable=True ile yükselterek buna katılır:

from oloproof import TransientError, system


@system(name="example-support-bot", version="1")
def answer(case):
    ...
    raise TransientError("provider timed out", retryable=True)

retryable varsayılan olarak False değerindedir. Onsuz hata vakada kaydedilir ve vaka yeniden denenmek yerine eksik sayılır. Otuz vakanın her biri için ilk çağrıda bu şekilde istisna yükselten ve ikinci çağrıda yanıt veren bir sistem:

│ exact_label │ 100.0%   │ [88.4%, 100.0%] │ 30 / 30 observed · 0 missing · 0 excluded │

retryable=True kaldırılmış aynı sistem:

│ exact_label │          │ [0.0%, 100.0%] │ 0 / 0 observed · 30 missing · 0 excluded │

Bir çalıştırma çalışırken ne gösterir

Bir terminalde oloproof run, standart hata üzerinde canlı bir görünümü yeniden çizer: tamamlanan vakalar, önbellek isabetleri, hatalar ve her ikili metrik için geçici bir tahmin. Bir kare:

                    56/120 cases · 0 cached · 0 errors
┏━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric      ┃ Estimate ┃ Provisional interval ┃ Cases                   ┃
┡━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ exact_label │ 89.8%    │ [78.2%, 95.6%]       │ 49 observed · 0 missing │
└─────────────┴──────────┴──────────────────────┴─────────────────────────┘
     Provisional Wilson estimates over finished cases; not a decision.

Alt yazı kuralın kendisidir. Geçici bir aralık, o ana kadar biten her şey üzerinde bir Wilson aralığıdır; izlemesi yararlı bir şeydir ama ona dayanarak karar verilmez: vakalar geldikçe yeniden hesaplanır ve iyi görünene kadar tekrar tekrar kontrol edilen bir aralık artık bir %95 aralığı değildir. Hiçbir şey bir çalıştırmayı buna dayanarak erken durdurmaz. Karar bir kez, bitmiş kanıt üzerinde, politikanın adlandırdığı yöntemle verilir.

Bir terminalin dışında, örneğin CI'da, canlı görünüm çizilmez ve tablolar sonda bir kez yazdırılır.

Olay akışı

--json, aynı ilerlemeyi standart çıktıya satır başına bir JSON nesnesi olarak, tabloları ise standart hataya yazar:

oloproof run --json

run.ndjson dosyasına kaydedilen ve jq -r '.type' run.ndjson | sort | uniq -c ile sayılan 120 vakalık bir çalıştırma şunları yayar:

 120 case_executed
 120 case_judged
  11 provisional_metrics
   1 run_finished
   2 run_phase_changed
   1 run_started

Her biri çalıştırma kimliğini ve bir zaman damgasını taşır:

{"run_id":"run_01M3C3ZNXPVQJCDF31DJSBXBHC","timestamp":"2026-09-25T11:07:37.782628Z","type":"run_started","suite_digest":"sha256:c6ae32f25d38ddac175f688c15c40991c1e0ec5348f32bfabd9c493a3f688c28","cases":120}
{"run_id":"run_01M3C3ZNXPVQJCDF31DJSBXBHC","timestamp":"2026-09-25T11:07:37.885640Z","type":"case_executed","scenario_id":"q000","status":"OK","from_cache":false,"latency_ms":102.11420899941004}
{"run_id":"run_01M3C3ZNXPVQJCDF31DJSBXBHC","timestamp":"2026-09-25T11:07:37.885667Z","type":"case_judged","scenario_id":"q000","criterion":"exact_label","status":"OK","passed":true,"score":null,"from_cache":false}
{"run_id":"run_01M3C3ZNXPVQJCDF31DJSBXBHC","timestamp":"2026-09-25T11:07:41.362779Z","type":"run_finished","status":"DECIDED","completeness":"COMPLETE","exit_code":0}

provisional_metrics, her ikili metrik için süregelen Wilson aralığını taşır:

jq -c 'select(.type == "provisional_metrics") | [.cases_done, .metrics[0].estimate, .metrics[0].wilson_lower, .metrics[0].wilson_upper]' run.ndjson
[1,1.0,0.20654931411298355,1.0]
[13,0.8461538461538461,0.5776536895684791,0.9567418216820717]
[25,0.88,0.7004420606159933,0.9583318285288502]
[37,0.8918918918918919,0.7529146844205937,0.9571481006263428]

Boruyu erken kapatmayın. head gibi ilk birkaç satırdan sonra duran bir okuyucu, çalıştırmayı son vakalarını saklamadan önce sonlandırır ve çalıştırma RUN_ERROR/PARTIAL olarak kaydedilir.

Karar için ne kadar daha gerekir

INSUFFICIENT_EVIDENCE okuyan bir kural başarısız olmamıştır; paket, sonucu eşikten ayıramayacak kadar küçüktü. oloproof plan, paketin ne kadar büyük olması gerektiğini, çalıştırmanın zaten harcadığından yola çıkarak fiyatlandırıp söyler. On sekiz vakalık examples/support_bot/ için:

oloproof plan RUN_ID --run
Run run_01M3C3WS0SBTFAG55M7ECM1EZ4
  observed  18 cases

exact-label-floor: about 1614 more cases would decide it, if the observed rate holds (1632 in total)
  time      <1s – 27s
  tokens    none reported by this run's providers
  assuming  the cases to come resemble the 18 already run
            cases run one after another; concurrency divides the time and not the cost

Bir çalıştırma kuralını boyutlandırmak yalnızca geçti/kaldı oranları için kabul edilir. Bir ortalamada plan tahmin yürütmek yerine bunu söyler:

Run run_01M3C3W5YWJY65X9YM6N02F3W4: no sample size can be computed for a rule that did not decide.
  error-budget: sizing a run rule is admitted for binary rates only, and days_error is a MEAN metric: a run stores its summary, not the per-case values sizing one would need

Bunun yerine bir karşılaştırma kimliği verilirse karşılaştırmanın kurallarını planlar ve hiçbir bayrağa gerek duymaz.

Sonraki adımlar

token rakamlarını anlatır.