Skip to content

Guide

Slice

Un tasso globale può restare stabile mentre una parte della suite crolla. Una slice è una parte dichiarata della suite, misurata a sé, così il crollo diventa visibile. Le slice hanno due discipline, perché guardare molte parti di una suite è il modo in cui una valutazione trova rumore e lo chiama scoperta.

Dichiarare le slice

Una slice si indica in oloproof.yaml. Il tipo più comune legge una chiave dal metadata di ciascun caso:

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"}}

Ogni tipo di slice accettato dal file:

SliceRaggruppa i casi perRichiede
metadata.<key>il valore di quella chiave nel metadata del casola chiave sui casi
relevant_positiondove è stato recuperato il primo passaggio rilevante: top_k, beyond_top_k o not_retrievedun sistema RAG e expected.relevant
context_truncatedse un budget di token ha scartato passaggi dal contestoun sistema RAG con un token_budget
first_toollo strumento che un agente ha chiamato per primoun record agent_trajectory/v1
repeated_actionse un agente ha ripetuto una chiamata identicaun record agent_trajectory/v1
routegli agenti che hanno avuto il controllo, scritti triage>billingun record agent_trajectory/v1 i cui passi indicano i propri agenti
trajectory_length:4,8numero di passi, suddiviso in fasce ai limiti che dichiariun record agent_trajectory/v1
confidence:0.5il punteggio che un modello ha dato alla riga, suddiviso in fasce ai limiti che dichiariun blocco predictive:

Un nome che il file non riconosce viene rifiutato prima che venga eseguito qualsiasi cosa:

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

Le slice riportano e non fanno mai da gate

Un'esecuzione stampa le proprie slice sotto un'intestazione dedicata. Un candidato che ha corretto l'inglese e rotto il francese:

│ 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  │

Il titolo della tabella dice Slices (exploratory; never gated), e lo intende davvero. Il tasso globale di quell'esecuzione era 77,5% e il suo gate ha consentito il rilascio, con il francese a un terzo di quel valore. Una regola di rilascio su un'esecuzione indica una metrica globale, e una regola limitata a una slice di una singola esecuzione viene rifiutata:

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

Questa è la prima disciplina. Una suite suddivisa in dieci modi ha dieci occasioni di mostrare una differenza per caso, e un gate che leggesse le slice bloccherebbe i rilasci sul rumore. Le slice servono a capire dove guardare.

Quali slice spiccano

L'esecuzione classifica anche le proprie slice rispetto al tasso dell'esecuzione stessa e contrassegna quelle che se ne discostano, con la procedura di Benjamini-Yekutieli, così la quota di contrassegni falsi resta controllata comunque si sovrappongano le slice. La tabella delle slice nel terminale mostra ciascuna nella colonna BY mark — marked, not marked, o vuota per una slice troppo esigua per essere testata — con il p-value in base al quale è stata classificata. Sono anche memorizzate nell'esecuzione ed esportate nel run.json del suo 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}

Una slice non contrassegnata non è dimostrata in linea con l'esecuzione; semplicemente non è segnalata. Un contrassegno indirizza l'attenzione e non raggiunge alcun gate.

Supporto

min_slice_support è il numero minimo di casi di cui una slice ha bisogno per ottenere un intervallo. Al di sotto, la stima viene mostrata e l'intervallo viene omesso. Da un progetto che lo ha impostato a 4:

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

Il valore predefinito è 30. Una suite piccola che lo abbassa ottiene intervalli su slice esigue, e quegli intervalli sono abbastanza ampi da dirlo da soli.

Gating su una slice, in un confronto

Dove una slice non deve davvero regredire, una regola di confronto può essere limitata a essa. L'ambito è il nome della slice preceduto da slice/, e la regola dichiara il supporto di cui ha bisogno prima che venga letta qualsiasi evidenza:

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]}

Scritto senza il prefisso, l'ambito viene rifiutato:

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>

Con il prefisso, il candidato precedente rispetto alla sua 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)

Questa è la seconda disciplina. Una regola limitata a una slice fa da gate solo all'interno di una voce families:, che elenca le regole i cui falsi fallimenti vengono controllati insieme. holm è la correzione: una regola della famiglia che fallisce viene ritestata a un livello più severo, dimensionato in base a quante regole contiene la famiglia, così tre occasioni di fallire per caso non si sommano in un rischio tre volte maggiore. Con un livello di confidenza di 0.95 e tre regole, il fallimento più forte viene ritestato a 0.05 / 3, il successivo a 0.05 / 2 e l'ultimo a 0.05. Vengono ritestati solo i fallimenti: un pass non è un rifiuto e non richiede correzione. Qui una regola è fallita, è stata ritestata a 0.01667, e il francese fallisce ancora. La regola globale non ha potuto decidere, e il consiglio sotto di essa dice che più casi non farebbero che spostarla verso FAIL.

Una regola su una slice al di fuori di qualsiasi famiglia viene rifiutata:

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

Dove andare dopo

ambito.

Classificatori e regressori usano le slice non basate sui metadati.