NLI: Subject-Weighting im Premise (2× prepend) für besseren Score-Anker #292

Closed
opened 2026-05-14 23:51:49 +02:00 by admin-mrrm · 1 comment
Owner

Hintergrund

In der Kalibrierungs-Reihe (#251, #254, #255, #268, #290) bleibt nach Lever 1 (#290 — verworfen, weil spezifische Hypothesen schaden) folgender struktureller Befund:

  • Default fast-path Hit-Rate liegt bei 64 % (Baseline .tmp/nli-debug.pre-290.jsonl)
  • 36 % der Mails fallen in die Llama-Fallback-Phase, viele davon mit Top-Scores 0.15–0.24
  • cleanSnippet cappt auf 500 Zeichen — bei langen Mails verdrängt der Body-Footer den eigentlich aussagekräftigen Subject-Inhalt

Hypothese (Lever 2)

Das Subject ist semantisch das stärkste Einzelsignal für die Kategorisierung — typische deutsche E-Mails tragen die Kategorie quasi im Subject ("Ihre Rechnung", "Versandbestätigung", "Sicherheitswarnung"). Wenn wir das Subject 2× vor den Body prependen, gewichtet die NLI-Premise dieses Signal stärker, ohne dass wir an den Hypothesen oder am Modell drehen müssen.

Vorteile gegenüber Lever 1:

  • Snippet-Länge bleibt konstant (500-Cap) → keine Modell-Reload-Effekte
  • Keine Hypothesen-Asymmetrie (User-Tags / Default-Kategorien)
  • Rein im Mobile-Code lokalisierbar (mail-batch-categorizer.ts + model-manager.ts)

Scope

  1. Helper buildPremise(subject, bodyText) in model-manager.ts, der das Subject 2× voranstellt (mit Längen-Cap für ungewöhnlich lange Subjects, damit der Body nicht ausgehungert wird)
  2. mail-batch-categorizer.ts benutzt buildPremise statt manueller Konkatenation
  3. Tests für buildPremise (Subject doppelt, Edge-Cases: null/leer/zu lang)

Out of scope

  • Subject-Splitting in eigene Hypothese (separate NLI-Premise) — bewahrt für späteres Lever
  • Snippet-Cap-Erhöhung (separate Diskussion)

Akzeptanzkriterien

  • Tests grün
  • Mobile NLI klassifiziert weiter ohne Crash
  • Vergleich gegen Baseline: messbare Veränderung der Fast-Path-Hit-Rate (positiv oder negativ — beides erlaubt, Entscheidung im PR)
## Hintergrund In der Kalibrierungs-Reihe (#251, #254, #255, #268, #290) bleibt nach Lever 1 (#290 — verworfen, weil spezifische Hypothesen schaden) folgender struktureller Befund: - Default fast-path Hit-Rate liegt bei **64 %** (Baseline `.tmp/nli-debug.pre-290.jsonl`) - 36 % der Mails fallen in die Llama-Fallback-Phase, viele davon mit Top-Scores 0.15–0.24 - `cleanSnippet` cappt auf 500 Zeichen — bei langen Mails verdrängt der Body-Footer den eigentlich aussagekräftigen Subject-Inhalt ## Hypothese (Lever 2) Das **Subject** ist semantisch das stärkste Einzelsignal für die Kategorisierung — typische deutsche E-Mails tragen die Kategorie quasi im Subject ("Ihre Rechnung", "Versandbestätigung", "Sicherheitswarnung"). Wenn wir das Subject 2× vor den Body prependen, gewichtet die NLI-Premise dieses Signal stärker, ohne dass wir an den Hypothesen oder am Modell drehen müssen. Vorteile gegenüber Lever 1: - Snippet-Länge bleibt konstant (500-Cap) → keine Modell-Reload-Effekte - Keine Hypothesen-Asymmetrie (User-Tags / Default-Kategorien) - Rein im Mobile-Code lokalisierbar (`mail-batch-categorizer.ts` + `model-manager.ts`) ## Scope 1. Helper `buildPremise(subject, bodyText)` in `model-manager.ts`, der das Subject 2× voranstellt (mit Längen-Cap für ungewöhnlich lange Subjects, damit der Body nicht ausgehungert wird) 2. `mail-batch-categorizer.ts` benutzt `buildPremise` statt manueller Konkatenation 3. Tests für `buildPremise` (Subject doppelt, Edge-Cases: null/leer/zu lang) ## Out of scope - Subject-Splitting in eigene Hypothese (separate NLI-Premise) — bewahrt für späteres Lever - Snippet-Cap-Erhöhung (separate Diskussion) ## Akzeptanzkriterien - [ ] Tests grün - [ ] Mobile NLI klassifiziert weiter ohne Crash - [ ] Vergleich gegen Baseline: messbare Veränderung der Fast-Path-Hit-Rate (positiv oder negativ — beides erlaubt, Entscheidung im PR)
Author
Owner

Lever 2 verworfen — Regression 64% → 30%

Manueller A/B-Test gegen nli-debug.pre-290.jsonl (Baseline, 101 Mails, 64% Fast-Path-Hit):

Metrik Baseline Lever 2 (Subject 2×)
Mails (unique) 101 67
Fast-path Hit (≥0.25) 64% 30%
Low (<0.25) 36% 70%
Mean snippet len 485 481

Hypothese zur Ursache

Subject ist oft kurz & rauschhaft (Re:-Präfixe, Absender-Branding, Urgency-Marker). Verdoppeln verstärkt dieses Rauschen relativ zum Body und drückt nützlichen Body-Text aus dem 500-Zeichen-Fenster von cleanSnippet.

Konsequenz

  • PR #293 ohne Merge geschlossen
  • Branch verworfen, zurück auf main
  • Failed-Run archiviert als apps/api/.tmp/nli-debug.failed-292.jsonl

Was offen bleibt

Nach Lever 1 (#290, Label-Wording) und Lever 2 (#292, Subject-Weighting) beide negativ → die einfachen manuellen Hebel an Premise/Hypothese funktionieren so nicht. Nächste Optionen für #268:

  • Threshold-Tuning (0.25 → ?) basierend auf Score-Verteilung
  • Subject+Body als getrennte NLI-Runs, Max-Score
  • Komplett auf Online-Feedback-Loop (User-Korrekturen) umschwenken
## Lever 2 verworfen — Regression 64% → 30% Manueller A/B-Test gegen `nli-debug.pre-290.jsonl` (Baseline, 101 Mails, 64% Fast-Path-Hit): | Metrik | Baseline | Lever 2 (Subject 2×) | |---|---|---| | Mails (unique) | 101 | 67 | | Fast-path Hit (≥0.25) | **64%** | **30%** | | Low (<0.25) | 36% | **70%** | | Mean snippet len | 485 | 481 | ### Hypothese zur Ursache Subject ist oft kurz & rauschhaft (Re:-Präfixe, Absender-Branding, Urgency-Marker). Verdoppeln verstärkt dieses Rauschen relativ zum Body und drückt nützlichen Body-Text aus dem 500-Zeichen-Fenster von `cleanSnippet`. ### Konsequenz - PR #293 ohne Merge geschlossen - Branch verworfen, zurück auf main - Failed-Run archiviert als `apps/api/.tmp/nli-debug.failed-292.jsonl` ### Was offen bleibt Nach Lever 1 (#290, Label-Wording) und Lever 2 (#292, Subject-Weighting) beide negativ → die einfachen manuellen Hebel an Premise/Hypothese funktionieren so nicht. Nächste Optionen für #268: - Threshold-Tuning (0.25 → ?) basierend auf Score-Verteilung - Subject+Body als getrennte NLI-Runs, Max-Score - Komplett auf Online-Feedback-Loop (User-Korrekturen) umschwenken
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp#292
No description provided.