NLI-Threshold + Hypothese-Template kalibrieren (Folge zu #175) #251

Closed
opened 2026-05-14 11:40:22 +02:00 by admin-mrrm · 1 comment
Owner

Beobachtung (Stand: 2026-05-14)

Nach dem Fix in #250 läuft der NLI-Forward-Pass auf Mobile sauber durch, aber die Confidence-Scores bleiben durchgehend niedrig (Stichprobe aus dem Live-Reader):

NLI uncertain (top 0.176) → Llama fallback
NLI uncertain (top 0.260) → Llama fallback
NLI uncertain (top 0.225) → Llama fallback
NLI uncertain (top 0.224) → Llama fallback
NLI uncertain (top 0.289) → Llama fallback
NLI uncertain (top 0.212) → Llama fallback

Alle ~10 Aufrufe lagen zwischen 0.17 und 0.29. Der Threshold steht in apps/mobile/src/services/model-manager.ts:23 auf NLI_CONFIDENCE_THRESHOLD = 0.7. Konsequenz: NLI wird zwar gerechnet, aber sein Ergebnis nie verwendet — die ~280 MB ONNX-Modell hängt ohne Nutzen am RAM, jede Mail kostet weiterhin Llama-Latenz.

Mögliche Ursachen

  1. Threshold zu konservativ. Bei mDeBERTa-XNLI-Zero-Shot sind Top-Scores von 0.3–0.5 in der Praxis oft schon belastbar — das hängt stark vom Hypothese-Template und der Anzahl Kandidaten ab.
  2. Hypothese-Template generisch. Aktuell: "Diese E-Mail handelt von ${label}." (model-manager.ts: NLI-Pfad). Alternativen wie "Die Kategorie dieser E-Mail ist ${label}." oder "Diese E-Mail ist eine ${label}-Mail." liefern in XNLI-Zero-Shot oft deutlich schärfere Verteilungen.
  3. Snippet-Cleanup zu aggressiv. cleanSnippet() schneidet auf 500 Zeichen, strippt €/$/£-Beträge und Zahlen — gerade bei Rechnungen verschwindet damit ein klares Klassifikations-Signal.

Vorgehen (TDD-iterativ)

  1. Logging erweitern (Quick-Win, eigener Mini-PR): NLI-Top-3 + Score immer loggen, nicht nur den Top-Score. Dann sehen wir, ob der richtige Tag auf #2/#3 mit 0.4-Score steht — das wäre ein klares Threshold-Problem, nicht Template-Problem.
  2. Template-A/B: zwei Hypothesen parallel scoren, max nehmen. Wenn signifikant höher → Default switchen.
  3. Threshold senken: erst nach (1) + (2). Vermutlich auf 0.4 für KEEP, 0.5 für CONFIDENCE.
  4. cleanSnippet re-evaluieren für Rechnungen — Beträge ggf. doch behalten.

Out of Scope (Phase 1 bewusst nicht)

  • Threshold in den Settings-UI ziehen (eigenes Ticket falls gewünscht)
  • Web-MiniLM auf NLI migrieren — erst sinnvoll wenn Mobile-NLI tatsächlich genutzt wird

Abhängigkeit

Gehört zu #175 (Phase 1 abgeschlossen mit #250).

## Beobachtung (Stand: 2026-05-14) Nach dem Fix in #250 läuft der NLI-Forward-Pass auf Mobile sauber durch, **aber** die Confidence-Scores bleiben durchgehend niedrig (Stichprobe aus dem Live-Reader): ``` NLI uncertain (top 0.176) → Llama fallback NLI uncertain (top 0.260) → Llama fallback NLI uncertain (top 0.225) → Llama fallback NLI uncertain (top 0.224) → Llama fallback NLI uncertain (top 0.289) → Llama fallback NLI uncertain (top 0.212) → Llama fallback ``` Alle ~10 Aufrufe lagen zwischen **0.17 und 0.29**. Der Threshold steht in `apps/mobile/src/services/model-manager.ts:23` auf `NLI_CONFIDENCE_THRESHOLD = 0.7`. Konsequenz: NLI wird zwar gerechnet, aber sein Ergebnis nie verwendet — die ~280 MB ONNX-Modell hängt ohne Nutzen am RAM, jede Mail kostet weiterhin Llama-Latenz. ## Mögliche Ursachen 1. **Threshold zu konservativ.** Bei mDeBERTa-XNLI-Zero-Shot sind Top-Scores von 0.3–0.5 in der Praxis oft schon belastbar — das hängt stark vom Hypothese-Template und der Anzahl Kandidaten ab. 2. **Hypothese-Template generisch.** Aktuell: `"Diese E-Mail handelt von ${label}."` (model-manager.ts: NLI-Pfad). Alternativen wie `"Die Kategorie dieser E-Mail ist ${label}."` oder `"Diese E-Mail ist eine ${label}-Mail."` liefern in XNLI-Zero-Shot oft deutlich schärfere Verteilungen. 3. **Snippet-Cleanup zu aggressiv.** `cleanSnippet()` schneidet auf 500 Zeichen, strippt €/$/£-Beträge und Zahlen — gerade bei Rechnungen verschwindet damit ein klares Klassifikations-Signal. ## Vorgehen (TDD-iterativ) 1. **Logging erweitern** (Quick-Win, eigener Mini-PR): NLI-Top-3 + Score immer loggen, nicht nur den Top-Score. Dann sehen wir, ob der richtige Tag auf #2/#3 mit 0.4-Score steht — das wäre ein klares Threshold-Problem, nicht Template-Problem. 2. **Template-A/B**: zwei Hypothesen parallel scoren, max nehmen. Wenn signifikant höher → Default switchen. 3. **Threshold senken**: erst nach (1) + (2). Vermutlich auf 0.4 für KEEP, 0.5 für CONFIDENCE. 4. **`cleanSnippet` re-evaluieren** für Rechnungen — Beträge ggf. doch behalten. ## Out of Scope (Phase 1 bewusst nicht) - Threshold in den Settings-UI ziehen (eigenes Ticket falls gewünscht) - Web-MiniLM auf NLI migrieren — erst sinnvoll wenn Mobile-NLI tatsächlich genutzt wird ## Abhängigkeit Gehört zu #175 (Phase 1 abgeschlossen mit #250).
Author
Owner

Geschlossen nach Kalibrierungs-Session über 36 Mails (PR #252).

Erledigt:

  • Schritt 1 (Logging erweitern) — Debug-Endpoint + Mobile-Hook
  • Schritt 3 (Threshold senken) — 0.7 → 0.30 (CONFIDENCE), 0.5 → 0.25 (KEEP)
  • Zusätzlich: OTTO-Shop aus NLI-Kandidaten (Bias), neue Kategorie Konto, PaketSendung
  • Bonus: HTML-only Mails liefern jetzt bodyText (lazy htmlToText-Fallback)

Deferred (eigene Issues falls relevant):

  • Schritt 2: Hypothese-Template-A/B
  • Schritt 4: cleanSnippet re-evaluieren (insb. Preise/€-Beträge für Rechnungen)
  • Debug-Endpoint (/_debug/nli-log) später wieder entfernen oder dauerhaft hinter NLI_DEBUG_LOG=false
Geschlossen nach Kalibrierungs-Session über 36 Mails (PR #252). **Erledigt:** - ✅ Schritt 1 (Logging erweitern) — Debug-Endpoint + Mobile-Hook - ✅ Schritt 3 (Threshold senken) — 0.7 → 0.30 (CONFIDENCE), 0.5 → 0.25 (KEEP) - Zusätzlich: `OTTO-Shop` aus NLI-Kandidaten (Bias), neue Kategorie `Konto`, `Paket` → `Sendung` - Bonus: HTML-only Mails liefern jetzt bodyText (lazy htmlToText-Fallback) **Deferred** (eigene Issues falls relevant): - Schritt 2: Hypothese-Template-A/B - Schritt 4: `cleanSnippet` re-evaluieren (insb. Preise/€-Beträge für Rechnungen) - Debug-Endpoint (`/_debug/nli-log`) später wieder entfernen oder dauerhaft hinter `NLI_DEBUG_LOG=false`
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#251
No description provided.