Guide
Riferimento dei risultati e dell'esecuzione
Che cosa un'esecuzione invia a un sistema HTTP e che cosa si aspetta in risposta, come ogni caso entra nel denominatore di una metrica, gli stati di decisione e i codici di motivo che li spiegano, i codici di uscita, e quali dati restano in locale o si spostano in uno spazio di lavoro ospitato. Per le idee alla base leggi Concetti; per i campi della policy leggi il Riferimento della configurazione.
Il contratto del sistema HTTP
Un sistema HTTP (system.http in oloproof.yaml) viene chiamato una volta per caso, e una volta per replica.
| Aspetto | Comportamento |
|---|---|
| Richiesta | POST per impostazione predefinita (sono accettati GET e PUT). Il corpo è il valore input del caso come JSON. |
| Header e autenticazione | Nessuno è configurabile. La richiesta porta solo i valori predefiniti del client HTTP. Un endpoint che richiede una chiave va messo dietro un sistema Python callable che la aggiunge. |
| Risposta | Deve essere JSON. output_path seleziona l'output tramite un percorso puntato, come result.answer; senza di esso l'output è l'intero corpo. Un campo output_path mancante viene registrato come errore di esecuzione per quel caso. |
| Artefatti | Ogni voce di http.artifacts legge un percorso puntato dalla risposta. Un campo dichiarato che manca da una risposta è un errore di contratto, e l'esecuzione si ferma con uscita 2. |
| Timeout | http.timeout_s per richiesta, 30 secondi per impostazione predefinita. |
| Tentativi ripetuti | Timeout, errori di connessione e HTTP 408, 429 e 5xx vengono ritentati, fino a quattro tentativi in tutto, con backoff esponenziale con jitter che rispetta Retry-After. Le altre risposte 4xx non vengono ritentate. |
| Dopo l'ultimo tentativo | L'esecuzione del caso viene registrata come errore e il caso conta come mancante (o come fallito, con on_execution_error: fail). L'esecuzione continua. |
| Concorrenza | Al massimo concurrency.system richieste in corso, 8 per impostazione predefinita. |
L'URL, il metodo, il percorso dell'output e la mappatura degli artefatti entrano nella versione del sistema, ma ciò che fa il server no. Cambia system.version ogni volta che cambia il comportamento del server; il Riferimento della configurazione spiega perché.
Tre vocabolari diversi
Un risultato ha tre tipi di stato, e nessuno sostituisce mai un altro.
| Tipo | Valori | Risponde a |
|---|---|---|
| Stato di decisione | PASS, FAIL, INSUFFICIENT_EVIDENCE, MANUAL_REVIEW | Che cosa dicono le evidenze su una regola. |
| Stato di esecuzione | Stato dell'esecuzione RUN_ERROR o CANCELLED; completezza dell'esecuzione PARTIAL; esecuzione del caso ERROR o TIMEOUT | Che cosa è accaduto all'esecuzione o alla chiamata di un caso. Non è un risultato di qualità. |
| Azione di rilascio | ALLOW, WARN, BLOCK | Che cosa fa la tua policy di ogni decisione: gli stati in block_on bloccano, quelli in warn_on avvisano, gli altri lasciano passare. |
Un'esecuzione che termina normalmente è DECIDED, oppure DECIDED_EARLY quando l'arresto anticipato l'ha conclusa. Un'esecuzione interrotta da Ctrl-C o dalla cancellazione del task è CANCELLED; una il cui harness ha sollevato un'eccezione è RUN_ERROR. In entrambi i casi l'esecuzione resta PARTIAL, conserva i casi terminati e permette all'esecuzione successiva di riutilizzarne i record in cache. Vedi Errori.
Per una soglia minima T e un intervallo [L, U], una regola è PASS quando L >= T, FAIL quando U < T, e INSUFFICIENT_EVIDENCE altrimenti. Una soglia massima è simmetrica. Prima di leggere l'intervallo, una regola verifica se debba decidere del tutto: prima i motivi per MANUAL_REVIEW, poi quelli per INSUFFICIENT_EVIDENCE. Decide il primo livello che ha un motivo, ed elenca ogni motivo trovato.
Codici di motivo
Ogni decisione porta uno o più codici di motivo.
MANUAL_REVIEW
| Codice | Significato |
|---|---|
| policy_requires_review | La regola imposta requires_manual_review: true. |
| unsupported_method | Non esiste un intervallo ammesso per questa metrica in questa situazione. Vedi sotto. |
| unsupported_dependence_structure | La suite dichiara cluster (group_id) e nessun metodo ammesso li gestisce per questa metrica. |
| approximate_method_not_permitted | L'unico intervallo è approssimato, e la policy non imposta allow_approximate_methods: true. |
| evaluator_retired | Un valutatore dietro la metrica è stato ritirato. |
INSUFFICIENT_EVIDENCE
| Codice | Significato |
|---|---|
| no_observations | Nessun caso è stato osservato per questa metrica. |
| missingness_exceeds_policy | Mancano più casi idonei di quanti ne consenta il max_missing_fraction della regola. |
| missingness_unbounded | Il metodo scarta i casi mancanti anziché delimitarli, e la regola non dichiara max_missing_fraction. |
| evaluator_not_validated | Un giudice basato su modello dietro la metrica non è stato validato rispetto a etichette umane, e require_validated_evaluators è attivo (l'impostazione predefinita). |
| evaluator_recalibration_required | Il giudice è stato validato su un modello servito da cui non provengono i verdetti di questa esecuzione. |
| interval_unavailable | La metrica non ha un intervallo da leggere. |
| insufficient_clusters | Meno cluster del min_clusters della policy. |
| interval_monte_carlo_uncertain | La soglia cade dentro l'incertezza di simulazione di un limite per cluster. |
| interval_overlaps_threshold | L'intervallo contiene la soglia. Più casi lo restringerebbero. |
| interval_unbounded | L'intervallo non ha un limite dal lato che la regola legge. |
| missing_could_change_outcome | Una regola observed_count: i casi mancanti potrebbero portare i fallimenti oltre max_failures. |
| interval_overlaps_zero, interval_overlaps_margin, interval_overlaps_margins | Un confronto il cui intervallo della differenza sta a cavallo dello zero o di un margine. |
| insufficient_support | Una regola di confronto per slice la cui slice ha meno casi del suo min_support. |
| family_correction_withheld | Una regola in una voce families: prima della quale la correzione di Holm si è fermata. |
PASS e FAIL
| Codice | Stato |
|---|---|
| lower_bound_meets_minimum, upper_bound_meets_maximum | PASS |
| upper_bound_below_minimum, lower_bound_above_maximum | FAIL |
| observed_failures_within_limit | PASS |
| observed_failures_exceed_limit | FAIL |
| difference_above_zero, lower_bound_above_margin, interval_within_margins | PASS (confronto) |
| difference_below_zero, upper_bound_below_margin, interval_outside_margins | FAIL (confronto) |
| cost_ceiling_exceeded | Indicato accanto allo stato di una regola di costo il cui tetto dichiarato è stato superato da un'esecuzione registrata |
Solo spazio di lavoro ospitato
Uno spazio di lavoro che decide da sé un'esecuzione ricevuta via push può trattenere una decisione con ppi_not_verified (non ha verificato l'intervallo su cui la decisione si basa), execution_not_verified (gli output non provengono da un runner registrato) o workspace_cannot_decide (non ha una copia della policy, o non ha potuto leggere le evidenze). Vedi Gating.
Come ogni caso entra nel denominatore
Ogni metrica riporta quattro conteggi: n_total (casi nella suite), n_eligible, n_observed e n_missing, con n_eligible = n_observed + n_missing. I casi fuori da n_eligible sono elencati sotto exclusions con un motivo.
| Che cosa è successo al caso | Conta come | Nel denominatore |
|---|---|---|
| Il valutatore ha restituito successo o fallimento | osservato, successo o fallimento | sì |
| Il valutatore si è dichiarato non applicabile (per esempio, nessun valore atteso da confrontare) | escluso, con il motivo | no |
| La chiamata al sistema è andata in errore o in timeout | mancante, o fallimento con on_execution_error: fail | sì |
| Il valutatore ha sollevato un'eccezione, o la risposta di un giudice non era leggibile | mancante | sì |
| Il caso non è mai stato eseguito perché l'esecuzione è stata interrotta | mancante, e l'esecuzione è PARTIAL | sì |
Un caso mancante viene delimitato, non scartato. Per un tasso di successo il limite inferiore dell'intervallo tratta ogni caso mancante come un fallimento e il limite superiore come un successo, quindi un'esecuzione con molti casi mancanti ha un intervallo ampio che non può superare una regola esigente; una media delimitata sostituisce allo stesso modo gli estremi del suo intervallo dichiarato. Un metodo che non può delimitare i casi mancanti (una statistica di ranking, per esempio) li scarta e registra l'assunzione, e una regola su di esso riporta missingness_unbounded finché non dichiara max_missing_fraction.
Una regola observed_count conta i fallimenti sulla suite eseguita e non legge alcun intervallo. Passa solo quando i fallimenti osservati più ogni caso mancante rientrano ancora in max_failures.
Metriche senza un intervallo ammesso
Una regola decide solo su un intervallo il cui metodo è stato ammesso tramite audit. Dove non ne esiste uno, la metrica viene comunque calcolata e mostrata, e una regola su di essa non prende in prestito un metodo non validato:
| Situazione | Che cosa riporta una regola su di essa |
|---|---|
| Una metrica di punteggio (media) senza intervallo di valori dichiarato, come un valutatore di punteggio personalizzato senza score_range | MANUAL_REVIEW, unsupported_method |
| Una metrica di media, quantile, ranking o costo su una suite che dichiara group_id | MANUAL_REVIEW, unsupported_dependence_structure |
| Un tasso di successo su una suite con cluster | un intervallo approssimato: MANUAL_REVIEW a meno di allow_approximate_methods: true, poi i controlli sui cluster sopra |
| Una metrica di quantile o ranking con replicates sopra 1 | MANUAL_REVIEW, unsupported_method |
| Qualsiasi metrica su una suite con sia group_id sia repliche | MANUAL_REVIEW, unsupported_dependence_structure |
| Un confronto su una suite con cluster | MANUAL_REVIEW |
| Una slice sotto min_slice_support | nessun intervallo, ma le slice non arrivano mai al gate |
| Metriche human_score, human_preference o cost_per_accepted | rifiutate quando il file viene letto, uscita 2 |
Codici di uscita
oloproof gate, oloproof run con una policy e gli altri comandi che decidono usano tutti gli stessi codici.
| Codice | Significato |
|---|---|
| 0 | Nulla su cui la policy blocca: ogni regola è passata, oppure quelle che non lo hanno fatto sono fuori da block_on. |
| 1 | Una regola in block_on è fallita. |
| 2 | La configurazione o l'invocazione era sbagliata, o un sistema ha violato il suo contratto; non è stato deciso nulla. |
| 3 | Una regola in block_on ha riportato INSUFFICIENT_EVIDENCE. |
| 4 | Una regola in block_on ha riportato MANUAL_REVIEW. |
| 5 | L'esecuzione non è stata completata e block_on_partial_run è attivo (l'impostazione predefinita). |
Quando ne valgono diversi, il codice riportato è il primo tra 1, 5, 4, 3. Uno stato lasciato fuori da block_on non può cambiare il codice di uscita: con block_on: [FAIL] e warn_on: [INSUFFICIENT_EVIDENCE], una regola indecisa avvisa e il gate esce con 0. L'uscita 0 significa quindi solo che non si è verificato nulla su cui la tua policy blocca, non che ogni regola è passata. Vedi Gating.
Dove gira il lavoro e dove vanno i dati
In locale, l'impostazione predefinita
oloproof run, oloproof gate e l'SDK girano sulla tua macchina. Ogni record (casi, output, artefatti, giudizi, metriche e decisioni) viene scritto in .oloproof/store.sqlite accanto a oloproof.yaml, o sotto OLOPROOF_HOME quando è impostata. Nulla viene inviato a Oloproof. L'unico traffico di rete è quello causato dalla tua configurazione: le chiamate all'URL del tuo sistema HTTP, e le chiamate che un giudice basato su modello o un classificatore basato su modello fa al proprio provider, che riceve il contenuto dei casi che giudica e te lo fattura.
Push in uno spazio di lavoro ospitato
oloproof push invia le evidenze di un'esecuzione allo spazio di lavoro che hai collegato con oloproof login. Per impostazione predefinita invia metriche, intervalli, decisioni e slice aggregate, e l'identità, lo stato, i tempi e l'utilizzo di ogni record, ma non il suo contenuto. Il contenuto grezzo viene oscurato campo per campo prima che qualsiasi cosa lasci la macchina, e un record oscurato dice quali categorie sono state trattenute. Una categoria viene inviata solo quando egress: in oloproof.yaml la elenca:
| Categoria | Che cosa copre |
|---|---|
| raw_inputs | Input degli scenari, valori attesi e metadati dei casi: le righe del dataset |
| raw_outputs | Ciò che il sistema sotto test ha restituito per ogni caso |
| judge_rationales | Il testo che un giudice ha scritto per spiegare un verdetto, che cita l'output |
| artifacts | Contesto di recupero, citazioni e traiettorie registrati durante un'esecuzione |
| error_detail | Messaggi e dettagli delle eccezioni, che spesso riportano l'input alla lettera |
| system_config | La configurazione dichiarata del sistema sotto test e dei suoi valutatori |
| label_notes | La nota che una persona ha scritto accanto a un'etichetta, che spesso cita l'output |
| span_names | Nomi di trace, span, strumenti e agenti registrati da una strumentazione |
I digest dei record non vengono ricalcolati dopo l'oscuramento, quindi un record ospitato nomina ancora le evidenze originali, che restano sulla tua macchina. L'oscuramento non è cifratura, e una metrica su una slice molto piccola può ancora identificare i casi che vi stanno dietro.
Quando i revisori etichettano casi nella coda di revisione ospitata, il loro browser recupera il contenuto dei casi da oloproof collect in esecuzione dalla tua parte; non passa attraverso lo spazio di lavoro. Le chiavi dei provider che uno spazio di lavoro usa vengono memorizzate con oloproof credentials set, e oloproof credentials list ne mostra i nomi, mai i valori. Un job gestito gira su un worker gestito da Oloproof, che non esegue il tuo codice Python; oloproof job ne riporta il risultato ed esce sul suo gate.
In uno spazio di lavoro ospitato il motore non riutilizza mai esecuzioni, giudizi o analisi in cache, perché un push può scrivere quelle cache; li ricalcola.