Guides
Référence des résultats et de l’exécution
Ce qu’une exécution envoie à un système HTTP et attend en retour, comment chaque cas entre dans le dénominateur d’une métrique, les états de décision et les codes de raison qui les expliquent, les codes de sortie, et quelles données restent en local ou partent vers un espace de travail hébergé. Pour les idées qui les sous-tendent, lisez les Concepts ; pour les champs de la politique, lisez la Référence de configuration.
Le contrat d’un système HTTP
Un système HTTP (system.http dans oloproof.yaml) est appelé une fois par cas, et une fois par réplique.
| Aspect | Comportement |
|---|---|
| Requête | POST par défaut (GET et PUT sont acceptés). Le corps est la valeur input du cas, en JSON. |
| En-têtes et authentification | Aucun ne peut être configuré. La requête ne porte que les valeurs par défaut du client HTTP. Un point de terminaison qui exige une clé doit se placer derrière un système appelable Python qui l’ajoute. |
| Réponse | Doit être du JSON. output_path sélectionne la sortie par un chemin pointé, comme result.answer ; sans lui, le corps entier est la sortie. Un champ output_path absent est enregistré comme une erreur d’exécution pour ce cas. |
| Artefacts | Chaque entrée de http.artifacts lit un chemin pointé dans la réponse. Un champ déclaré absent d’une réponse est une erreur de contrat, et l’exécution s’arrête avec le code de sortie 2. |
| Délai d’attente | http.timeout_s par requête, 30 secondes par défaut. |
| Nouvelles tentatives | Les délais dépassés, les échecs de connexion et les réponses HTTP 408, 429 et 5xx sont retentés, jusqu’à quatre tentatives au total, avec un recul exponentiel aléatoire qui respecte Retry-After. Les autres réponses 4xx ne sont pas retentées. |
| Après la dernière tentative | L’exécution du cas est enregistrée comme une erreur et le cas compte comme manquant (ou comme échoué, avec on_execution_error: fail). L’exécution continue. |
| Concurrence | Au plus concurrency.system requêtes en cours, 8 par défaut. |
L’URL, la méthode, le chemin de sortie et la correspondance des artefacts entrent dans la version du système, mais pas ce que fait le serveur. Changez system.version chaque fois que le comportement du serveur change ; voyez la Référence de configuration pour comprendre pourquoi.
Trois vocabulaires différents
Un résultat a trois sortes d’état, et aucune ne remplace une autre.
| Sorte | Valeurs | Répond à |
|---|---|---|
| État de décision | PASS, FAIL, INSUFFICIENT_EVIDENCE, MANUAL_REVIEW | Ce que disent les preuves sur une règle. |
| État d’exécution | Statut d’exécution RUN_ERROR ou CANCELLED ; complétude d’exécution PARTIAL ; exécution d’un cas ERROR ou TIMEOUT | Ce qui est arrivé à l’exécution ou à l’appel d’un cas. Ce n’est pas un résultat de qualité. |
| Action de publication | ALLOW, WARN, BLOCK | Ce que votre politique fait de chaque décision : les états de block_on bloquent, ceux de warn_on avertissent, les autres autorisent. |
Une exécution qui se termine normalement est DECIDED, ou DECIDED_EARLY quand l’arrêt anticipé l’a terminée. Une exécution interrompue par Ctrl-C ou par l’annulation de la tâche est CANCELLED ; celle dont le harnais a levé une exception est RUN_ERROR. L’un comme l’autre laisse l’exécution PARTIAL, conserve les cas terminés, et permet à l’exécution suivante de réutiliser leurs enregistrements en cache. Voyez Erreurs.
Pour un seuil minimum T et un intervalle [L, U], une règle est PASS quand L >= T, FAIL quand U < T, et INSUFFICIENT_EVIDENCE sinon. Un seuil maximum est symétrique. Avant de lire l’intervalle, une règle vérifie si elle doit décider tout court : d’abord les raisons de MANUAL_REVIEW, puis celles de INSUFFICIENT_EVIDENCE. Le premier niveau qui a une raison décide, et liste toutes les raisons qu’il a trouvées.
Codes de raison
Chaque décision porte un ou plusieurs codes de raison.
MANUAL_REVIEW
| Code | Signification |
|---|---|
| policy_requires_review | La règle fixe requires_manual_review: true. |
| unsupported_method | Aucun intervalle admis n’existe pour cette métrique dans cette situation. Voyez plus bas. |
| unsupported_dependence_structure | La suite déclare des grappes (group_id) et aucune méthode admise ne les traite pour cette métrique. |
| approximate_method_not_permitted | Le seul intervalle est approché, et la politique ne fixe pas allow_approximate_methods: true. |
| evaluator_retired | Un évaluateur derrière la métrique a été retiré. |
INSUFFICIENT_EVIDENCE
| Code | Signification |
|---|---|
| no_observations | Aucun cas n’a été observé pour cette métrique. |
| missingness_exceeds_policy | Il manque une part des cas éligibles supérieure à ce que permet le max_missing_fraction de la règle. |
| missingness_unbounded | La méthode écarte les cas manquants au lieu de les borner, et la règle ne déclare aucun max_missing_fraction. |
| evaluator_not_validated | Un juge modèle derrière la métrique n’a pas été validé contre des étiquettes humaines, et require_validated_evaluators est actif (par défaut). |
| evaluator_recalibration_required | Le juge a été validé sur un modèle servi dont les verdicts de cette exécution ne proviennent pas. |
| interval_unavailable | La métrique n’a aucun intervalle à lire. |
| insufficient_clusters | Moins de grappes que le min_clusters de la politique. |
| interval_monte_carlo_uncertain | Le seuil tombe dans l’incertitude de simulation d’une borne en grappes. |
| interval_overlaps_threshold | L’intervalle contient le seuil. Davantage de cas le resserreraient. |
| interval_unbounded | L’intervalle n’a pas de borne du côté que lit la règle. |
| missing_could_change_outcome | Une règle observed_count : les cas manquants pourraient porter les échecs au delà de max_failures. |
| interval_overlaps_zero, interval_overlaps_margin, interval_overlaps_margins | Une comparaison dont l’intervalle de différence chevauche zéro ou une marge. |
| insufficient_support | Une règle de comparaison de segment dont le segment a moins de cas que son min_support. |
| family_correction_withheld | Une règle d’une entrée families: devant laquelle la correction de Holm s’est arrêtée. |
PASS et FAIL
| Code | État |
|---|---|
| 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 (comparaison) |
| difference_below_zero, upper_bound_below_margin, interval_outside_margins | FAIL (comparaison) |
| cost_ceiling_exceeded | Indiqué à côté de l’état d’une règle de coût dont une exécution enregistrée a dépassé le plafond déclaré |
Espace de travail hébergé uniquement
Un espace de travail qui décide lui-même d’une exécution poussée peut retenir une décision avec ppi_not_verified (il n’a pas vérifié l’intervalle sur lequel repose la décision), execution_not_verified (les sorties ne viennent pas d’un exécuteur enregistré) ou workspace_cannot_decide (il ne détient aucune copie de la politique, ou n’a pas pu lire les preuves). Voyez Porte de CI.
Comment chaque cas entre dans le dénominateur
Chaque métrique rapporte quatre effectifs : n_total (cas de la suite), n_eligible, n_observed et n_missing, avec n_eligible = n_observed + n_missing. Les cas hors de n_eligible sont listés sous exclusions avec une raison.
| Ce qui est arrivé au cas | Compte comme | Dans le dénominateur |
|---|---|---|
| L’évaluateur a rendu réussite ou échec | observé, réussite ou échec | oui |
| L’évaluateur s’est déclaré non applicable (par exemple, aucune valeur attendue à comparer) | exclu, avec la raison | non |
| L’appel au système a échoué ou dépassé son délai | manquant, ou échec avec on_execution_error: fail | oui |
| L’évaluateur a levé une exception, ou la réponse d’un juge n’a pas pu être lue | manquant | oui |
| Le cas n’a jamais été exécuté parce que l’exécution a été interrompue | manquant, et l’exécution est PARTIAL | oui |
Un cas manquant est borné, pas écarté. Pour un taux de réussite, la borne inférieure de l’intervalle traite chaque cas manquant comme un échec et sa borne supérieure comme une réussite, si bien qu’une exécution avec beaucoup de cas manquants a un intervalle large qui ne peut pas satisfaire une règle exigeante ; une moyenne bornée substitue de la même façon les extrémités de sa plage déclarée. Une méthode qui ne peut pas borner les cas manquants (une statistique de classement, par exemple) les écarte et enregistre l’hypothèse, et une règle qui s’y appuie lit missingness_unbounded tant qu’elle ne déclare pas max_missing_fraction.
Une règle observed_count compte les échecs sur la suite exécutée et ne lit aucun intervalle. Elle ne passe que lorsque les échecs observés plus tous les cas manquants tiennent encore dans max_failures.
Métriques sans intervalle admis
Une règle ne décide que sur un intervalle dont la méthode a été admise par audit. Là où il n’en existe pas, la métrique est quand même calculée et affichée, et une règle qui s’y appuie n’emprunte pas une méthode non validée :
| Situation | Ce que lit une règle qui s’y appuie |
|---|---|
| Une métrique de score (moyenne) sans plage déclarée, comme un évaluateur de score personnalisé sans score_range | MANUAL_REVIEW, unsupported_method |
| Une métrique de moyenne, de quantile, de classement ou de coût sur une suite qui déclare group_id | MANUAL_REVIEW, unsupported_dependence_structure |
| Un taux de réussite sur une suite en grappes | un intervalle approché : MANUAL_REVIEW sauf avec allow_approximate_methods: true, puis les vérifications de grappes ci-dessus |
| Une métrique de quantile ou de classement avec replicates supérieur à 1 | MANUAL_REVIEW, unsupported_method |
| Toute métrique sur une suite qui a à la fois group_id et des répliques | MANUAL_REVIEW, unsupported_dependence_structure |
| Une comparaison sur une suite en grappes | MANUAL_REVIEW |
| Un segment sous min_slice_support | aucun intervalle, mais les segments n’atteignent jamais la porte |
| Les métriques human_score, human_preference ou cost_per_accepted | refusées à la lecture du fichier, code de sortie 2 |
Codes de sortie
oloproof gate, oloproof run avec une politique, et les autres commandes qui décident utilisent tous les mêmes codes.
| Code | Signification |
|---|---|
| 0 | Rien sur quoi la politique bloque : chaque règle a réussi, ou celles qui n’ont pas réussi sont hors de block_on. |
| 1 | Une règle de block_on a échoué. |
| 2 | La configuration ou l’invocation était erronée, ou un système a rompu son contrat ; rien n’a été décidé. |
| 3 | Une règle de block_on a lu INSUFFICIENT_EVIDENCE. |
| 4 | Une règle de block_on a lu MANUAL_REVIEW. |
| 5 | L’exécution ne s’est pas terminée et block_on_partial_run est actif (par défaut). |
Quand plusieurs s’appliquent, le code rapporté est le premier de 1, 5, 4, 3. Un état absent de block_on ne peut pas changer le code de sortie : avec block_on: [FAIL] et warn_on: [INSUFFICIENT_EVIDENCE], une règle indécise avertit et la porte sort avec 0. Le code 0 signifie donc seulement que rien de ce sur quoi votre politique bloque ne s’est produit, et non que chaque règle a réussi. Voyez Porte de CI.
Où le travail s’exécute et où vont les données
En local, par défaut
oloproof run, oloproof gate et le SDK s’exécutent sur votre machine. Chaque enregistrement (cas, sorties, artefacts, jugements, métriques et décisions) est écrit dans .oloproof/store.sqlite à côté de oloproof.yaml, ou sous OLOPROOF_HOME s’il est défini. Rien n’est envoyé à Oloproof. Le seul trafic réseau est celui que provoque votre configuration : les appels à l’URL de votre système HTTP, et les appels qu’un juge modèle ou un classifieur modèle fait à son fournisseur, qui reçoit le contenu des cas qu’il juge et vous le facture.
Pousser vers un espace de travail hébergé
oloproof push envoie les preuves d’une exécution à l’espace de travail que vous avez connecté avec oloproof login. Par défaut, il envoie les métriques, les intervalles, les décisions et les segments agrégés, ainsi que l’identité, le statut, les durées et l’usage de chaque enregistrement, mais pas son contenu. Le contenu brut est expurgé champ par champ avant que quoi que ce soit ne quitte la machine, et un enregistrement expurgé indique quelles catégories ont été retenues. Une catégorie ne part que lorsque egress: dans oloproof.yaml la liste :
| Catégorie | Ce qu’elle couvre |
|---|---|
| raw_inputs | Les entrées des scénarios, les valeurs attendues et les métadonnées des cas : les lignes du jeu de données |
| raw_outputs | Ce que le système évalué a renvoyé pour chaque cas |
| judge_rationales | Le texte qu’un juge a écrit pour expliquer un verdict, qui cite la sortie |
| artifacts | Le contexte de récupération, les citations et les trajectoires enregistrés pendant une exécution |
| error_detail | Les messages et détails d’exception, qui portent souvent l’entrée mot pour mot |
| system_config | La configuration déclarée du système évalué et de ses évaluateurs |
| label_notes | La note qu’une personne a écrite à côté d’une étiquette, qui cite souvent la sortie |
| span_names | Les noms de traces, de spans, d’outils et d’agents qu’une instrumentation a enregistrés |
Les empreintes des enregistrements ne sont pas recalculées après l’expurgation, si bien qu’un enregistrement hébergé désigne toujours les preuves d’origine, qui restent sur votre machine. L’expurgation n’est pas un chiffrement, et une métrique sur un très petit segment peut encore identifier les cas qui la composent.
Quand des relecteurs étiquettent des cas dans la file de relecture hébergée, leur navigateur récupère le contenu des cas auprès de oloproof collect qui tourne de votre côté ; il ne passe pas par l’espace de travail. Les clés de fournisseur qu’utilise un espace de travail sont stockées avec oloproof credentials set, et oloproof credentials list affiche leurs noms, jamais leurs valeurs. Une tâche gérée s’exécute sur un worker qu’exploite Oloproof, qui n’exécute pas votre code Python ; oloproof job rapporte son résultat et sort selon sa porte.
Dans un espace de travail hébergé, le moteur ne réutilise jamais les exécutions, jugements ou analyses en cache, parce qu’un push peut écrire dans ces caches ; il les recalcule.