Skip to content

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 :

SegmentRegroupe les cas selonNécessite
metadata.<key>la valeur de cette clé dans le metadata du casla clé sur les cas
relevant_positionl'endroit où le premier passage pertinent a été récupéré : top_k, beyond_top_k ou not_retrievedun système RAG et expected.relevant
context_truncatedsi un budget de tokens a retiré des passages du contexteun système RAG avec un token_budget
first_tooll'outil qu'un agent a appelé en premierun enregistrement agent_trajectory/v1
repeated_actionsi un agent a répété un appel identiqueun enregistrement agent_trajectory/v1
routeles agents qui ont eu la main, écrits triage>billingun enregistrement agent_trajectory/v1 dont les étapes nomment leurs agents
trajectory_length:4,8le nombre d'étapes, réparti selon des bornes que vous déclarezun enregistrement agent_trajectory/v1
confidence:0.5le score qu'un modèle a donné à la ligne, réparti en tranches selon des bornes que vous déclarezun 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 correction

C'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.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)

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 correction

Pour aller plus loin

peut s'appliquer.

Classifieurs et régresseurs utilisent les segments autres que les métadonnées.