Skip to content

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:

SliceGruppiert Fälle nachBenötigt
metadata.<key>dem Wert dieses Schlüssels in den metadata des Fallsden Schlüssel in den Fällen
relevant_positionder Position, an der die erste relevante Passage abgerufen wurde: top_k, beyond_top_k oder not_retrievedein RAG-System und expected.relevant
context_truncatedob ein Token-Budget Passagen aus dem Kontext entfernt hatein RAG-System mit einem token_budget
first_tooldem Tool, das ein Agent zuerst aufgerufen hateinen agent_trajectory/v1-Datensatz
repeated_actionob ein Agent einen identischen Aufruf wiederholt hateinen agent_trajectory/v1-Datensatz
routeden Agenten, die die Kontrolle hatten, geschrieben als triage>billingeinen agent_trajectory/v1-Datensatz, dessen Schritte ihre Agenten benennen
trajectory_length:4,8der Schrittzahl, gruppiert an Grenzen, die Sie deklariereneinen agent_trajectory/v1-Datensatz
confidence:0.5dem Score, den ein Modell der Zeile gegeben hat, in Bänder an Grenzen geteilt, die Sie deklariereneinen 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 correction

Das 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.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)

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 correction

Wie es weitergeht

Klassifikatoren und Regressoren verwenden die Slices, die nicht auf Metadaten beruhen.