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:
| Slice | Groepeert cases op | Vereist |
|---|---|---|
| metadata.<key> | de waarde van die sleutel in de metadata van de case | de sleutel op de cases |
| relevant_position | waar de eerste relevante passage werd opgehaald: top_k, beyond_top_k of not_retrieved | een RAG-systeem en expected.relevant |
| context_truncated | of een tokenbudget passages uit de context liet vallen | een RAG-systeem met een token_budget |
| first_tool | de tool die een agent als eerste aanriep | een agent_trajectory/v1-record |
| repeated_action | of een agent een identieke aanroep herhaalde | een agent_trajectory/v1-record |
| route | de agents die de controle hadden, geschreven als triage>billing | een agent_trajectory/v1-record waarvan de stappen hun agents noemen |
| trajectory_length:4,8 | aantal stappen, ingedeeld op grenzen die je declareert | een agent_trajectory/v1-record |
| confidence:0.5 | de score die een model aan de rij gaf, ingedeeld in banden op grenzen die je declareert | een 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 correctionDat 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.yamlComparison 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 correctionVerder lezen
- Vergelijkingsregels behandelt de soorten regels waarop een scope kan
worden gezet.
Classifiers en regressors gebruiken de slices die niet op metadata zijn gebaseerd.