Guides
Segments
Un taux global peut rester stable alors qu'une partie de la suite s'effondre. Un segment est une partie déclarée de la suite, mesurée à part, afin que l'effondrement soit visible. Les segments s'accompagnent de deux disciplines, car examiner de nombreuses parties d'une suite est précisément la manière dont une évaluation trouve du bruit et le prend pour un résultat.
Déclarer des segments
Un segment est nommé dans oloproof.yaml. Le type le plus courant lit une clé dans le metadata de chaque cas :
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"}}Tous les types de segment que le fichier accepte :
| Segment | Regroupe les cas selon | Nécessite |
|---|---|---|
| metadata.<key> | la valeur de cette clé dans le metadata du cas | la clé sur les cas |
| relevant_position | l'endroit où le premier passage pertinent a été récupéré : top_k, beyond_top_k ou not_retrieved | un système RAG et expected.relevant |
| context_truncated | si un budget de tokens a retiré des passages du contexte | un système RAG avec un token_budget |
| first_tool | l'outil qu'un agent a appelé en premier | un enregistrement agent_trajectory/v1 |
| repeated_action | si un agent a répété un appel identique | un enregistrement agent_trajectory/v1 |
| route | les agents qui ont eu la main, écrits triage>billing | un enregistrement agent_trajectory/v1 dont les étapes nomment leurs agents |
| trajectory_length:4,8 | le nombre d'étapes, réparti selon des bornes que vous déclarez | un enregistrement agent_trajectory/v1 |
| confidence:0.5 | le score qu'un modèle a donné à la ligne, réparti en tranches selon des bornes que vous déclarez | un bloc predictive: |
Un nom que le fichier ne reconnaît pas est refusé avant toute exécution :
Configuration error: unknown slice 'lang'; declare metadata.<key>, relevant_position, context_truncated, first_tool, repeated_action, route, trajectory_length:<bounds> or confidence:<bounds>Les segments rendent compte et ne servent jamais de gate
Une exécution affiche ses segments sous leur propre titre. Un candidat qui a corrigé l'anglais et cassé le français :
│ 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 │Le titre du tableau indique Slices (exploratory; never gated), et il faut le prendre au mot. Le taux global de cette exécution était de 77,5 % et son gate a autorisé la publication, avec le français au tiers de ce taux. Une règle de publication sur une exécution nomme une métrique globale, et une règle limitée à un segment d'une exécution unique est refusée :
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 correctionC'est la première discipline. Une suite découpée de dix façons a dix occasions de montrer une différence par hasard, et un gate qui lirait les segments bloquerait des publications sur du bruit. Les segments servent à trouver où regarder.
Quels segments se démarquent
L'exécution classe aussi ses segments par rapport à son propre taux et marque ceux qui s'en écartent, avec la procédure de Benjamini-Yekutieli, de sorte que la proportion de fausses marques reste contrôlée quelle que soit la manière dont les segments se recoupent. Le tableau des segments du terminal indique chacun dans sa colonne BY mark — marked, not marked, ou vide pour un segment trop mince pour être testé — avec la valeur p selon laquelle il a été classé. Ces marques sont aussi stockées dans l'exécution et exportées dans le run.json de son paquet :
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}Un segment non marqué n'est pas montré conforme à l'exécution ; il n'est simplement pas signalé. Une marque oriente l'attention et n'atteint aucun gate.
Effectif
min_slice_support est le nombre minimal de cas dont un segment a besoin pour obtenir un intervalle. En dessous, l'estimation est affichée et l'intervalle est retenu. Dans un projet qui l'a fixé à 4 :
│ metadata.topic=account │ answer_correct │ 100.0% │ │ 1 / 1 observed · 0 missing · 0 excluded · exploratory · support 1 │
│ │ │ │ │ < 4, no interval │La valeur par défaut est 30. Une petite suite qui l'abaisse obtient des intervalles sur des segments minces, et ces intervalles sont assez larges pour le dire d'eux-mêmes.
Un gate sur un segment, dans une comparaison
Lorsqu'un segment ne doit vraiment pas régresser, une règle de comparaison peut lui être limitée. La portée est le nom du segment précédé de slice/, et la règle énonce l'effectif dont elle a besoin avant la lecture de toute preuve :
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]}Écrite sans le préfixe, la portée est refusée :
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>Avec le préfixe, le candidat ci-dessus face à sa référence :
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)C'est la seconde discipline. Une règle limitée à un segment ne sert de gate qu'à l'intérieur d'une entrée families:, qui liste les règles dont les faux échecs sont contrôlés ensemble. holm est la correction : une règle de la famille qui échoue est testée de nouveau à un niveau plus strict, dimensionné selon le nombre de règles de la famille, afin que trois occasions d'échouer par hasard ne s'additionnent pas en trois fois le risque. Avec un niveau de confiance de 0,95 et trois règles, l'échec le plus net est testé de nouveau à 0.05 / 3, le suivant à 0.05 / 2, et le dernier à 0.05. Seuls les échecs sont testés de nouveau : un succès n'est pas un rejet et ne demande aucune correction. Ici, une règle a échoué, elle a été testée de nouveau à 0.01667, et le français échoue toujours. La règle globale n'a pas pu trancher, et le conseil affiché en dessous indique que davantage de cas ne feraient que la pousser vers FAIL.
Une règle de segment hors de toute famille est refusée :
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 correctionPour aller plus loin
- Règles de comparaison couvre les types de règle auxquels une portée
peut s'appliquer.
Classifieurs et régresseurs utilisent les segments autres que les métadonnées.