feat(175): NLI-Classifier auf Mobile mit Llama-Fallback (Phase 1) #241

Merged
admin-mrrm merged 1 commit from feat-175-mobile-nli-classifier into main 2026-05-13 08:39:17 +02:00
Owner

Summary

  • Neuer nli-classifier.ts: mDeBERTa-v3-base-xnli (~280 MB Q8 ONNX), multilingual DE/EN. Lazy-Load, Forward-Pass pro Kandidat, Score = Entailment-Wahrscheinlichkeit.
  • model-manager.ts ist jetzt Orchestrator: rejection-store-Filter → NLI als Fast-Path → Llama als Fallback wenn top.score < 0.7 ODER bei NLI-Error.
  • Aufrufer (use-auto-suggest-tags.ts, mail-batch-categorizer.ts) bleiben unveraendert — selbe suggest()-Signatur.
  • Vitest fuer Mobile neu aufgesetzt (Infra fehlte bisher).

Was sich aendert (Verhalten)

  • Klare Mails (Rechnung, Newsletter, …) ⇒ NLI antwortet in Hundertstelsekunden, Llama wird nie geladen.
  • Mehrdeutige Mails ⇒ Llama kommt wie bisher zum Einsatz, nur dass NLI vorher ein paar ms zum Filtern braucht.
  • Bei NLI-Crash (z. B. ORT-Bindung kaputt) ⇒ Llama-Pfad greift, App funktioniert weiter.

Native Build

onnxruntime-react-native ist eine native Dependency. EAS-Dev-Client muss neu gebaut werden, bevor das auf dem Geraet laeuft. CI bleibt gruen, weil dort nur typecheck/test/install laufen (kein RN-Build).

Refs #175

Test plan

  • pnpm install ok
  • pnpm --filter @mrrmlab/mobile typecheck ok
  • pnpm --filter @mrrmlab/mobile test 11/11 gruen
  • EAS Dev Client neu bauen, App starten
  • Smoke: Newsletter/Rechnung-Mail → Logs zeigen NLI hit ... → [Tag], Llama bleibt idle
  • Smoke: Mehrdeutige Mail → Logs zeigen NLI uncertain ... → Llama fallback
  • Batch-Categorize ueber 30 untagged Mails: Mehrzahl NLI, Gesamtzeit sichtbar kuerzer
## Summary - Neuer `nli-classifier.ts`: mDeBERTa-v3-base-xnli (~280 MB Q8 ONNX), multilingual DE/EN. Lazy-Load, Forward-Pass pro Kandidat, Score = Entailment-Wahrscheinlichkeit. - `model-manager.ts` ist jetzt Orchestrator: rejection-store-Filter → NLI als Fast-Path → Llama als Fallback wenn `top.score < 0.7` ODER bei NLI-Error. - Aufrufer (`use-auto-suggest-tags.ts`, `mail-batch-categorizer.ts`) bleiben unveraendert — selbe `suggest()`-Signatur. - Vitest fuer Mobile neu aufgesetzt (Infra fehlte bisher). ## Was sich aendert (Verhalten) - Klare Mails (Rechnung, Newsletter, …) ⇒ NLI antwortet in Hundertstelsekunden, Llama wird nie geladen. - Mehrdeutige Mails ⇒ Llama kommt wie bisher zum Einsatz, nur dass NLI vorher ein paar ms zum Filtern braucht. - Bei NLI-Crash (z. B. ORT-Bindung kaputt) ⇒ Llama-Pfad greift, App funktioniert weiter. ## Native Build `onnxruntime-react-native` ist eine native Dependency. **EAS-Dev-Client muss neu gebaut werden**, bevor das auf dem Geraet laeuft. CI bleibt gruen, weil dort nur typecheck/test/install laufen (kein RN-Build). Refs #175 ## Test plan - [x] `pnpm install` ok - [x] `pnpm --filter @mrrmlab/mobile typecheck` ok - [x] `pnpm --filter @mrrmlab/mobile test` 11/11 gruen - [ ] EAS Dev Client neu bauen, App starten - [ ] Smoke: Newsletter/Rechnung-Mail → Logs zeigen `NLI hit ... → [Tag]`, Llama bleibt idle - [ ] Smoke: Mehrdeutige Mail → Logs zeigen `NLI uncertain ... → Llama fallback` - [ ] Batch-Categorize ueber 30 untagged Mails: Mehrzahl NLI, Gesamtzeit sichtbar kuerzer
feat(175): NLI-Classifier auf Mobile mit Llama-Fallback
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
ddc4568898
Phase 1 von #175: schneller mDeBERTa-v3-base-xnli (~280 MB Q8 ONNX)
als Default-Pfad, Llama-3.2-3B (~2 GB) nur noch als Fallback wenn
NLI-Confidence < 0.7 oder bei NLI-Error (Resilience).

Neue Datei `nli-classifier.ts`: laedt ONNX-Modell lazy, tokenisiert
mit @huggingface/transformers (Tokenizer-only), Inferenz via
onnxruntime-react-native. Liefert {label, score}[] sortiert nach
Entailment-Score, ein Forward-Pass pro Kandidat.

`model-manager.ts` ist jetzt Orchestrator: filter via rejection-store,
NLI als Fast-Path, Llama als Fallback. Aufrufer (`use-auto-suggest-tags`,
`mail-batch-categorizer`) unveraendert — selbe `suggest()`-Signatur.

`DEFAULT_CATEGORIES` kommt jetzt aus @mrrmlab/shared-types (siehe #240,
PR A).

Vitest fuer Mobile neu eingerichtet — Test-Infra existierte bisher
nicht. Tests mocken ONNX/Tokenizer/Llama vollstaendig, decken
Orchestrator-Logik ab: NLI-Hit → Llama nicht geladen; NLI-Miss →
Llama-Fallback; NLI-Error → Llama-Fallback; rejection-store-Filter
greift in beiden Pfaden.

Native-Bindings (onnxruntime-react-native) erfordern einen neuen
EAS-Dev-Client-Build, bevor das auf dem Geraet laeuft.

Refs #175

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
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!241
No description provided.