Anleitungen
Slices
Eine globale Rate kann stabil bleiben, während ein Teil der Suite einbricht. Ein Slice ist ein deklarierter Teil der Suite, der für sich gemessen wird, sodass der Einbruch sichtbar wird. Slices kommen mit zwei Disziplinen, denn der Blick auf viele Teile einer Suite ist genau der Weg, auf dem eine Evaluation Rauschen findet und es für einen Befund hält.
Slices deklarieren
Ein Slice wird in oloproof.yaml benannt. Die übliche Art liest einen Schlüssel aus den metadata jedes Falls:
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"}}Jede Slice-Art, die die Datei akzeptiert:
| Slice | Gruppiert Fälle nach | Benötigt |
|---|---|---|
| metadata.<key> | dem Wert dieses Schlüssels in den metadata des Falls | den Schlüssel in den Fällen |
| relevant_position | der Position, an der die erste relevante Passage abgerufen wurde: top_k, beyond_top_k oder not_retrieved | ein RAG-System und expected.relevant |
| context_truncated | ob ein Token-Budget Passagen aus dem Kontext entfernt hat | ein RAG-System mit einem token_budget |
| first_tool | dem Tool, das ein Agent zuerst aufgerufen hat | einen agent_trajectory/v1-Datensatz |
| repeated_action | ob ein Agent einen identischen Aufruf wiederholt hat | einen agent_trajectory/v1-Datensatz |
| route | den Agenten, die die Kontrolle hatten, geschrieben als triage>billing | einen agent_trajectory/v1-Datensatz, dessen Schritte ihre Agenten benennen |
| trajectory_length:4,8 | der Schrittzahl, gruppiert an Grenzen, die Sie deklarieren | einen agent_trajectory/v1-Datensatz |
| confidence:0.5 | dem Score, den ein Modell der Zeile gegeben hat, in Bänder an Grenzen geteilt, die Sie deklarieren | einen predictive:-Block |
Ein Name, den die Datei nicht kennt, wird abgelehnt, bevor irgendetwas läuft:
Configuration error: unknown slice 'lang'; declare metadata.<key>, relevant_position, context_truncated, first_tool, repeated_action, route, trajectory_length:<bounds> or confidence:<bounds>Slices berichten und gaten niemals
Ein Lauf gibt seine Slices unter einer eigenen Überschrift aus. Ein Kandidat, der Englisch korrigiert und Französisch kaputt gemacht hat:
│ 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 │Der Titel der Tabelle lautet Slices (exploratory; never gated), und das ist ernst gemeint. Die globale Rate dieses Laufs lag bei 77,5 %, und sein Gate ließ das Release zu, mit Französisch bei einem Drittel davon. Eine Release-Regel auf einem Lauf benennt eine globale Metrik, und eine Regel, die auf einen Slice eines einzelnen Laufs beschränkt ist, wird abgelehnt:
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 correctionDas ist die erste Disziplin. Eine in zehn Richtungen geschnittene Suite hat zehn Gelegenheiten, zufällig einen Unterschied zu zeigen, und ein Gate, das Slices liest, würde Releases wegen Rauschen blockieren. Slices dienen dazu, herauszufinden, wo man hinsehen sollte.
Welche Slices auffallen
Der Lauf ordnet seine Slices außerdem gegenüber der eigenen Rate des Laufs und markiert diejenigen, die abweichen, mit dem Benjamini-Yekutieli-Verfahren, sodass der Anteil falscher Markierungen kontrolliert bleibt, wie auch immer sich die Slices überschneiden. Die Slice-Tabelle im Terminal zeigt jeden in ihrer Spalte BY mark — marked, not marked oder leer für einen Slice, der zu dünn für einen Test ist — zusammen mit dem p-Wert, nach dem er geordnet wurde. Sie werden außerdem im Lauf gespeichert und in der run.json seines Bundles exportiert:
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}Von einem nicht markierten Slice ist nicht gezeigt, dass er dem Lauf entspricht; er ist lediglich nicht gekennzeichnet. Eine Markierung lenkt die Aufmerksamkeit und erreicht kein Gate.
Support
min_slice_support ist die Mindestzahl an Fällen, die ein Slice braucht, bevor er ein Intervall erhält. Darunter wird die Schätzung angezeigt und das Intervall zurückgehalten. Aus einem Projekt, das den Wert auf 4 gesetzt hat:
│ metadata.topic=account │ answer_correct │ 100.0% │ │ 1 / 1 observed · 0 missing · 0 excluded · exploratory · support 1 │
│ │ │ │ │ < 4, no interval │Der Standard ist 30. Eine kleine Suite, die ihn senkt, erhält Intervalle auf dünnen Slices, und diese Intervalle sind breit genug, um das selbst auszudrücken.
Auf einem Slice gaten, in einem Vergleich
Wo ein Slice wirklich nicht zurückfallen darf, kann eine Vergleichsregel auf ihn beschränkt werden. Der Geltungsbereich ist der Name des Slices mit vorangestelltem slice/, und die Regel gibt den Support an, den sie benötigt, bevor irgendeine Evidenz gelesen wird:
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]}Ohne das Präfix geschrieben, wird der Geltungsbereich abgelehnt:
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>Mit ihm, der obige Kandidat gegen seine Baseline:
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)Das ist die zweite Disziplin. Eine auf einen Slice beschränkte Regel gatet nur innerhalb eines families:-Eintrags, der die Regeln auflistet, deren falsche Fehlschläge gemeinsam kontrolliert werden. holm ist die Korrektur: Eine Regel der Familie, die fehlschlägt, wird auf einem strengeren Niveau erneut getestet, bemessen daran, wie viele Regeln die Familie enthält, sodass sich drei Gelegenheiten, zufällig zu scheitern, nicht zum dreifachen Risiko aufsummieren. Bei einem Konfidenzniveau von 0.95 und drei Regeln wird der stärkste Fehlschlag bei 0.05 / 3 erneut getestet, der nächste bei 0.05 / 2 und der letzte bei 0.05. Nur Fehlschläge werden erneut getestet: Ein Bestehen ist keine Ablehnung und braucht keine Korrektur. Hier ist eine Regel gescheitert, sie wurde bei 0.01667 erneut getestet, und Französisch scheitert weiterhin. Die globale Regel konnte nicht entscheiden, und der Hinweis darunter sagt, dass mehr Fälle sie nur in Richtung FAIL verschieben würden.
Eine Slice-Regel außerhalb jeder Familie wird abgelehnt:
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 correctionWie es weitergeht
- Vergleichsregeln behandelt die Arten von Regeln, auf die ein Geltungsbereich gelegt werden kann.
- RAG-Evaluation, Agenten und Tools und
Klassifikatoren und Regressoren verwenden die Slices, die nicht auf Metadaten beruhen.