Skip to content

Handleidingen

Slices

Een globaal percentage kan stabiel blijven terwijl één deel van de suite instort. Een slice is een gedeclareerd deel van de suite, op zichzelf gemeten, zodat de instorting zichtbaar is. Slices komen met twee disciplines, omdat naar veel delen van een suite kijken de manier is waarop een evaluatie ruis vindt en het een bevinding noemt.

Slices declareren

Een slice wordt genoemd in oloproof.yaml. De gebruikelijke soort leest een sleutel uit de metadata van elke case:

slices: [metadata.lang, metadata.topic]
min_slice_support: 30
{"id": "c000", "input": {"lang": "en", "topic": "billing", "hard": false, "n": 0}, "expected": {"label": "yes"}, "metadata": {"lang": "en", "topic": "billing"}}

Elke slicesoort die het bestand accepteert:

SliceGroepeert cases opVereist
metadata.<key>de waarde van die sleutel in de metadata van de casede sleutel op de cases
relevant_positionwaar de eerste relevante passage werd opgehaald: top_k, beyond_top_k of not_retrievedeen RAG-systeem en expected.relevant
context_truncatedof een tokenbudget passages uit de context liet valleneen RAG-systeem met een token_budget
first_toolde tool die een agent als eerste aanriepeen agent_trajectory/v1-record
repeated_actionof een agent een identieke aanroep herhaaldeeen agent_trajectory/v1-record
routede agents die de controle hadden, geschreven als triage>billingeen agent_trajectory/v1-record waarvan de stappen hun agents noemen
trajectory_length:4,8aantal stappen, ingedeeld op grenzen die je declareerteen agent_trajectory/v1-record
confidence:0.5de score die een model aan de rij gaf, ingedeeld in banden op grenzen die je declareerteen predictive:-blok

Een naam die het bestand niet herkent, wordt geweigerd voordat er iets draait:

Configuration error: unknown slice 'lang'; declare metadata.<key>, relevant_position, context_truncated, first_tool, repeated_action, route, trajectory_length:<bounds> or confidence:<bounds>

Slices rapporteren en gaten nooit

Een run drukt zijn slices af onder een eigen kop. Een kandidaat die Engels herstelde en Frans brak:

│ metadata.lang=de       │ ok     │ 100.0%   │ [95.4%, 100.0%] │ 80 / 80 observed · 0 missing · 0 excluded · exploratory · support 80    │
│ metadata.lang=en       │ ok     │ 100.0%   │ [95.4%, 100.0%] │ 80 / 80 observed · 0 missing · 0 excluded · exploratory · support 80    │
│ metadata.lang=fr       │ ok     │ 32.5%    │ [22.4%, 43.9%]  │ 26 / 80 observed · 0 missing · 0 excluded · exploratory · support 80    │
│ metadata.topic=account │ ok     │ 88.3%    │ [81.2%, 93.5%]  │ 106 / 120 observed · 0 missing · 0 excluded · exploratory · support 120 │
│ metadata.topic=billing │ ok     │ 66.7%    │ [57.4%, 75.1%]  │ 80 / 120 observed · 0 missing · 0 excluded · exploratory · support 120  │

De titel van de tabel zegt Slices (exploratory; never gated), en dat is gemeend. Het globale percentage van die run was 77.5% en zijn gate liet de release toe, met Frans op een derde daarvan. Een releaseregel op een run noemt een globale metriek, en een regel die beperkt is tot een slice van één run wordt geweigerd:

Configuration error: release rule 'fr-floor' targets slice/metadata.lang=fr; a run's slice results are exploratory, and only a comparison rule gates a slice, inside a family with a correction

Dat is de eerste discipline. Een suite die op tien manieren is opgedeeld, heeft tien kansen om bij toeval een verschil te laten zien, en een gate die slices las, zou releases op ruis blokkeren. Slices zijn om te vinden waar je moet kijken.

Welke slices opvallen

De run rangschikt zijn slices ook tegen het eigen percentage van de run en markeert degene die afwijken, met de Benjamini-Yekutieli-procedure, zodat het aandeel valse markeringen beheerst blijft hoe de slices ook overlappen. De slicetabel in de terminal toont elke slice in de kolom BY mark — marked, not marked, of leeg voor een slice die te dun is om te testen — met de p-waarde waarop ze werd gerangschikt. Ze worden ook in de run opgeslagen en geëxporteerd in de run.json van zijn bundle:

jq -c '.run.slice_metrics[] | {scope, estimate, fdr_marked, fdr_p_value}' .oloproof/bundles/RUN_ID/run.json
{"scope":"slice/metadata.lang=de","estimate":1.0,"fdr_marked":true,"fdr_p_value":0.0001}
{"scope":"slice/metadata.lang=en","estimate":1.0,"fdr_marked":true,"fdr_p_value":0.0001}
{"scope":"slice/metadata.lang=fr","estimate":0.325,"fdr_marked":true,"fdr_p_value":0.0001}
{"scope":"slice/metadata.topic=account","estimate":0.8833333333333333,"fdr_marked":true,"fdr_p_value":0.0037003540039062493}
{"scope":"slice/metadata.topic=billing","estimate":0.6666666666666666,"fdr_marked":true,"fdr_p_value":0.008582189941406249}

Van een niet-gemarkeerde slice is niet aangetoond dat ze overeenkomt met de run; ze is alleen niet gemarkeerd. Een markering richt de aandacht en bereikt geen enkele gate.

Ondersteuning

min_slice_support is het kleinste aantal cases dat een slice nodig heeft voordat ze een interval krijgt. Daaronder wordt de schatting getoond en het interval achtergehouden. Uit een project dat het op 4 zette:

│ metadata.topic=account          │ answer_correct  │ 100.0%   │                 │ 1 / 1 observed · 0 missing · 0 excluded · exploratory · support 1 │
│                                 │                 │          │                 │ < 4, no interval                                                  │

De standaard is 30. Een kleine suite die het verlaagt, krijgt intervallen op dunne slices, en die intervallen zijn breed genoeg om dat zelf te zeggen.

Gaten op een slice, in een vergelijking

Waar een slice echt niet mag achteruitgaan, kan een vergelijkingsregel ertoe worden beperkt. De scope is de naam van de slice voorafgegaan door slice/, en de regel vermeldt de ondersteuning die ze nodig heeft voordat er bewijs wordt gelezen:

version: 1
rules:
  - {id: overall, metric: ok, kind: non_inferiority, margin: 0.05}
  - {id: fr-not-worse, metric: ok, kind: non_inferiority, margin: 0.05, scope: slice/metadata.lang=fr, min_support: 30}
  - {id: en-not-worse, metric: ok, kind: non_inferiority, margin: 0.05, scope: slice/metadata.lang=en, min_support: 30}
  - {id: de-not-worse, metric: ok, kind: non_inferiority, margin: 0.05, scope: slice/metadata.lang=de, min_support: 30}
families:
  - {id: languages, correction: holm, rules: [fr-not-worse, en-not-worse, de-not-worse]}

Zonder het voorvoegsel geschreven, wordt de scope geweigerd:

Configuration error: rule 'fr-not-worse' has unknown scope 'metadata.lang=fr'; a comparison rule decides on the global scope or on slice/<name>=<value>

Met het voorvoegsel, de kandidaat hierboven tegen zijn baseline:

oloproof compare CANDIDATE_RUN_ID BASELINE_RUN_ID --policy compare.yaml
Comparison sha256:cd2693b505e645919d397e8d7a87eaf0a841ab0c11c0b95484912363381b72e0 of run_01M3C46CYA163JSMSA5QZ6KAZA against run_01M3C46B3PSNP1ZTC8X05AG0GE · 240 paired cases
ok: -5.0 points [-15.2, +4.9] · 240 paired · 0 missing · 0 excluded
ok [slice/metadata.lang=de]: +8.8 points [-0.5, +21.5] · 80 paired · 0 missing · 0 excluded · exploratory · support 80
ok [slice/metadata.lang=en]: +18.8 points [+7.0, +34.4] · 80 paired · 0 missing · 0 excluded · exploratory · support 80
ok [slice/metadata.lang=fr]: -42.5 points [-60.3, -26.8] · 80 paired · 0 missing · 0 excluded · exploratory · support 80
ok [slice/metadata.topic=account]: +7.5 points [+0.9, +17.1] · 120 paired · 0 missing · 0 excluded · exploratory · support 120
ok [slice/metadata.topic=billing]: -17.5 points [-35.0, -0.1] · 120 paired · 0 missing · 0 excluded · exploratory · support 120
Decisions
  overall  ok  non-inferiority, margin 5.0 points  INSUFFICIENT_EVIDENCE  interval_overlaps_margin
    no sample size would make this PASS: the difference itself (-5.0 points) is outside the margin, so more cases would move it toward FAIL
  fr-not-worse  ok  non-inferiority, margin 5.0 points  FAIL  upper_bound_below_margin
  en-not-worse  ok  non-inferiority, margin 5.0 points  PASS  lower_bound_above_margin
  de-not-worse  ok  non-inferiority, margin 5.0 points  PASS  lower_bound_above_margin
Family languages: Holm over 3 rules; adjusted levels 0.01667
Gate: BLOCK (exit 1)

Dat is de tweede discipline. Een regel die beperkt is tot een slice gatet alleen binnen een families:-item, dat de regels opsomt waarvan de valse mislukkingen samen worden beheerst. holm is de correctie: een regel in de familie die faalt, wordt opnieuw getest op een strenger niveau, afgestemd op hoeveel regels de familie bevat, zodat drie kansen om bij toeval te falen niet optellen tot drie keer het risico. Bij een betrouwbaarheidsniveau van 0.95 en drie regels wordt de sterkste mislukking opnieuw getest op 0.05 / 3, de volgende op 0.05 / 2, en de laatste op 0.05. Alleen mislukkingen worden opnieuw getest: een geslaagde regel is geen verwerping en heeft geen correctie nodig. Hier faalde één regel, die werd opnieuw getest op 0.01667, en Frans faalt nog steeds. De globale regel kon niet beslissen, en het advies eronder zegt dat meer cases hem alleen richting FAIL zouden bewegen.

Een sliceregel buiten elke familie wordt geweigerd:

Configuration error: slice rule 'fr-not-worse' belongs to no family; slice rules multiply the chances of a false FAIL, so they gate only inside a family with a correction

Verder lezen

worden gezet.

Classifiers en regressors gebruiken de slices die niet op metadata zijn gebaseerd.