[Epic] Persönlicher KI-Assistent — Privacy-First On-Device Architektur #122
Labels
No labels
app/archiv
app/einkaufslisten
app/imap-client
app/wissensbasis
arch-answered
arch-question
area/api
area/auth
area/infra
area/mobile
area/shared
area/ui
area/web
portfolio-status
prio/high
prio/low
prio/medium
roadmap/public
size/l
size/m
size/s
size/xl
size/xs
status/blocked
status/needs-info
type/bug
type/chore
type/docs
type/feature
type/idea
type/refactor
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
admin-mrrm/mrrmlabapp#122
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Vision
Die App wird langfristig zu einem persönlichen, lernenden Assistenten ausgebaut. Da dabei hochsensible Daten (Mails, Termine, Notizen, Verhalten) verarbeitet werden, gilt:
Architektur: Mehrstufige Pipeline
Kein Monolith-LLM für alles — stattdessen spezialisierte Schichten:
Schichten im Detail
Die Modelle kommunizieren nicht direkt — jedes gibt strukturiertes JSON aus, das die nächste Schicht als Input bekommt.
Persönliches Lernen via RAG (kein LLM-Fine-Tuning)
LLMs on-device zu fine-tunen ist zu rechenintensiv. Stattdessen RAG + Feedback-Loop:
Persönliche Wissensbasis (lokal, verschlüsselt)
all-MiniLM-L6-v2→ ONNX (~23 MB)sqlite-vec(SQLite-Extension, kein Server nötig)Feedback-Signale
Ergebnis
Das LLM „kennt" den User durch Kontext im Prompt — nicht durch veränderte Gewichte.
E2E-Verschlüsselung
user_id,blob_id,encrypted_data,updated_atBeispielablauf
User sagt: „Erinnere mich morgen an das Meeting mit Lisa"
Sub-Features / abhängige Issues
Abhängigkeiten
Ergänzung: Zwei-Gang-Verarbeitung (Echtzeit + Nacht-Batch)
Motivation
Komplexere Auswertungen (Foto-Analyse, Embedding-Aufbau, Klassifikator-Nachtraining) sind zu rechenintensiv für Echtzeit. Lösung: deferred processing — Ausführung nachts, wenn das Gerät lädt und idle ist.
Zwei-Gang-Architektur
Nacht-Tasks (Beispiele)
Architektur-Ergänzung: Job Queue mit Prioritätsstufen
Technische Umsetzung (Android)
WorkManager mit Charging + Idle Constraints — genau dafür gebaut:
In Expo: natives Android-Modul das WorkManager wrапpt (expo-background-fetch reicht für einfache Tasks, für schwere Workloads besser eigenes Modul).
Sub-Feature
Integration in die bestehende App
Analyse der bestehenden Infrastruktur
Der Stack (Expo 54, NestJS, PostgreSQL/Drizzle, ONNX-Pipeline in Vorbereitung) ist gut geeignet. Kein Big-Bang-Umbau nötig — die Architektur wächst inkrementell.
Was direkt passt
ONNX-Modelle (ML-Schichten)
Infrastruktur ist vorbereitet — #79 (ONNX Runtime in EAS Build) ist der einzige Blocker. Sobald das steht, laufen PII-Guard, Intent-Router und Extraktoren direkt in
apps/mobile.Vector Store (RAG-Wissensbasis)
expo-sqliteist bereits im Stack.sqlite-vecist eine SQLite-Extension — lässt sich als Expo-Plugin einbinden. Passt in die bestehende lokale Datenhaltung.E2E-Verschlüsselung
expo-secure-storeist bereits integriert (Schlüsselspeicherung). Encryption-Layer on top der Sync-Logik + neues NestJS-Modul für verschlüsselte Blobs → überschaubar.Pluggable Feature Pattern
Das bestehende
packages/feature-*-Muster ist genau richtig:packages/ai-engine— Abstraktion für alle KI-Operationen (ONNX, LLM, Embeddings)packages/feature-ai-assistant— UI-Komponenten für KI-VorschlägeWas neue Infrastruktur braucht
apps/mobileapps/mobileapps/apiapps/ocr→apps/mlNatürlicher Evolutionspfad
Voraussetzungen: ONNX (#79) und IMAP-Client (Epic #101) sind die natürlichen ersten Schritte — alles andere baut darauf auf.
Audit 2026-06-06 — Epic-Stand + Realitäts-Check
Das Epic ist 6 Wochen alt und wird jetzt im Rahmen einer Portfolio-Priorisierung von
type/ideazutype/feature+prio/mediumgehoben. Bevor wir in Implementierung gehen, ein Stand-Check gegen den ursprünglichen Body — einige Annahmen haben sich durch zwischenzeitliche Entscheidungen verschoben.Veraltete Annahmen im Body
„ONNX Runtime (#79) — bereits integriert" — nicht mehr zutreffend. Im OCR-Pivot zu Google ML Kit (v0.6.0, #423/#424) wurde TrOCR/ONNX als Stack verworfen (IAM-Korpus-Bias).
onnxruntime-react-nativeist nicht mehr im aktiven Mobile-Stack. Damit ist die im Epic-Body zentrale ONNX-basierte 6-Stufen-Pipeline (PII-Guard, Intent-Router, Extraktoren als ONNX) ohne Tech-Stack.„IMAP-Client (Epic #101) — erste Datenquelle" — IMAP-Reader + NLI-Kategorisierung + Paperless-Archiv laufen, aber: GF-Entscheidung 2026-06-06 hat Mail auf
prio/lowgesetzt (siehe #109/#110-Kommentare + Memoryproject_mail_strategy.md). KI-on-Mail (#113) wartet explizit auf diese KI-Foundation hier — die Reihenfolge ist jetzt #122 zuerst, dann #113, nicht parallel.„On-Device KI für Mails (#113) — erster konkreter Use-Case" — bleibt richtig, aber #113 ist explizit Folge-Epic, nicht parallel.
MLC-LLM,sqlite-vec,MiniLM-Embedding-Pipeline — keines davon ist im Repo. Alle Phasen, die das voraussetzen, sind heute Greenfield.Was implizit fehlt
Was bleibt valide
Nächste PM-Schritte
Label-Update auf
type/feature+prio/mediumerfolgt zeitgleich mit diesem Audit.Arch-Question ist eröffnet: #438 — wartet auf @arch-bot. Sub-Issues folgen nach Antwort.
Produkt-Entscheidung (Decision Record 2026-06-06)
Nach Architekt-Antwort in #438 die folgenden Entscheidungen für die KI-Assistent-Foundation. Beziehe mich auf die dort begründeten Empfehlungen.
Entscheidung 1 — ML-Stack für kleine Pipeline-Schichten: ONNX wieder rein ✅
onnxruntime-react-nativefür PII-Guard, Intent-Router, Extraktoren-NER. Zwei Inferenz-Engines parallel (ML Kit für OCR, ONNX für KI) ist bewusster Tradeoff — verschiedene Use-Cases, verschiedene Privacy-Anforderungen. Google ML Kit Custom Models verworfen für sensible Daten.Konkret:
xlm-roberta-base-german-ner(Q8, ~110 MB) für PII/NER, DistilBERT-Tiny für Intent-Router (~25 MB Q8).Entscheidung 2 — LLM-Runtime: llama.cpp via
llama.rn✅Phi-3-Mini-4K-Instruct Q4_K_M (~2.3 GB) als Default-Modell. Download-on-First-Run, nicht Bundle (App-Store-Limit). MLC-LLM verworfen wegen TVM-Compilation-Overhead. iOS-Erst-Release zurückgestellt bis Phase-2-Performance-Validation.
Entscheidung 3 — RAG-Stack: sqlite-vec + multilingual-e5-small ✅
sqlite-vec via Custom EAS Build mit Config-Plugin (managed Workflow bleibt). Embedding-Modell
multilingual-e5-small(~118 MB Q8) — für deutsche User notwendige Multilingual-Foundation, ggü reinem englischen MiniLM. Inkrementelle Re-Indexierung on-the-fly (~15-30 ms), Initial-Indexing als Background-Job.Entscheidung 4 — E2E-Sync: Out-of-scope für Foundation, eigenes Epic später ✅
Foundation läuft lokal-only auf Hauptgerät. E2E-Sync wird separates Sub-Epic „[Epic] KI-Assistent — E2E-Sync" mit libsodium-Basis (
react-native-sodium). Body-Skizze (AES-256-GCM + Argon2 + QR-Pairing) bleibt langfristiges Ziel.Entscheidung 5 — Phasen-Reihenfolge (8 Phasen) ✅
Geänderte Reihenfolge ggü ursprünglichem PM-Vorschlag: LLM-Spike vorgezogen auf Phase 2, um Performance-Risiko früh zu validieren.
Übernommene Folge-Effekte aus #438
web-llm(WebGPU + Wasm).GET /models/manifest, App vergleicht installierte Versionen — eigenes Sub-Issue im API-Bereich.IDataSourcemitextractChunks()/getIndexKey()/subscribeToUpdates()) — damit Day-Planner/Wissensbasis/Urlaub später ohne Pipeline-Umbau plugbar sind.Sub-Issues — Phase 1 zuerst eröffnen
Ich eröffne im nächsten Schritt zunächst nur die Phase-1-Sub-Issues (klare Foundation, geringes Risiko). Spätere Phasen folgen nach Phase-1-Abschluss und ggf. Phase-2-Spike-Ergebnis.
multilingual-e5-smallals ONNX, on-device-Inferenz)IDataSource-Interface + Adapter für vorhandene Quellen (Mails, Shopping-Lists, Notes)#438 schließe ich als beantwortet.
Strategischer Hinweis
#113 (KI-on-Mail) wartet explizit auf Phase 5+. Mail-Stack-Pivot (GF-Entscheidung in #109/#110) und KI-Foundation-Push hier sind komplementär — Mail wird nicht von außen wachsen, sondern durch diese KI-Schicht.
multilingual-e5-smallon-device integrieren #439IDataSource-Interface + Adapter für Mails, Listen, Notizen #441Phase-1-Sub-Issues eröffnet 2026-06-06
multilingual-e5-smallon-deviceIDataSource-Interface + Adapter (Mail/Liste/Notiz)Abhängigkeiten: P1.1 + P1.2 sind parallel umsetzbar. P1.3 ist unabhängig. P1.4 braucht 1+2+3. P1.5 braucht 1+2+4. → empfohlene Reihenfolge: (1, 2, 3 parallel) → 4 → 5.
Korrektur 2026-06-06 — Stack-Reality-Check nachgeholt
Der Audit-Kommentar oben sowie das Decision Record waren auf falscher Basis: Repo-Code wurde nicht ge-grept, nur OCR-Pivot-Memory befragt. Stand korrekt:
Was tatsächlich produktiv läuft
onnxruntime-react-native— voll integriert via NLI-Classifier (apps/mobile/src/services/nli-classifier.ts)llama.rn— produktiv mit Llama 3.2 3B Q4_K_M (~2 GB Download-on-First-Run) für Mail-Kategorisierung@huggingface/transformers— Tokenizationwith-onnxruntime-packageXenova/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7(~280 MB Q8) liveDie KI-Foundation ist also deutlich weiter als der Audit angenommen hat. Mail-Kategorisierung (#251 ff., Mai 2026) hat das produktiv etabliert — der OCR-Pivot zu ML Kit betrifft nur den OCR-Stack, nicht den Mail-/KI-Stack.
Auswirkungen auf die Decisions
xlm-roberta-base-german-nerals ONNX-Modell hinzulegen ist additiv, kein Stack-Wechsel.Auswirkungen auf die Sub-Issues
Was nicht passiert ist
Das Decision Record (Kommentar 2991) bleibt im Ticket-Verlauf stehen — damit ist nachvollziehbar, was wann auf welcher Annahme entschieden wurde. Diese Korrektur ist additiv.
Lerneffekt
Memory-Eintrag
feedback_refresh_repo_code.mdergänzt — Repo-Code-Grep gehört vor jeden Stack-Audit, nicht nur git/Gitea-State.Phase-1-Wireup als PR eröffnet 2026-06-06
PR #444 integriert die fünf Sub-Issues (#439–#443) auf dem Branch
wireup/ai-foundation-phase1und verdrahtet den nativen Stack (op-sqlite + onnxruntime + IndexingService) hinter der Suche-Route.mainPflicht: Physical-Device-Pass nachapps/mobile/docs/ai-foundation-verification.md(Build mitexpo prebuild --clean, sqlite-vec-Smoke, ONNX-Load, End-to-End-Search)Sobald der Device-Pass durch ist und Drone grün ist, kann PR #444 gemerged werden — damit landet Phase 1 der KI-Foundation in
main.multilingual-e5-smallon-device integrieren #439IDataSource-Interface + Adapter für Mails, Listen, Notizen #441Phase 1 Code-Complete + Live auf
main(2026-06-08)PR #444 wurde durch PR #445 ersetzt (Branch-Konsolidierung nach RC2-RC17-Schleife) und am 2026-06-08 in
maingemerged. Alle Phase-1-Sub-Issues sind closed:multilingual-e5-smallon-device (closed 2026-06-06)IDataSource-Adapter Mail/Listen/Notizen (closed 2026-06-06)api-client-context.tsx(closed via PR #445)Release-Stream
17 Release-Candidates (
v0.6.6-rc1–rc17) zum Bring-up auf echter Hardware (Hermes-Quirks bei PreTrainedTokenizer, ONNX-Tensor-Shapes, sqlite-vec EAS-Build).Phase-2 Wireup (Mutation-Observer)
PR #445 enthält bereits 5 deterministische Unit-Tests, die
useCreateList/Update/Delete -> onSourceChangegegen ein gemocktes ApiClient verifizieren — die fragile Maestro-E2E-Validierung wurde durch diese Sperre ersetzt.Heute Mo 2026-06-08
v0.6.6-rc18) gebaut mit Mutation-Observer-Tests + Diagnostik-CleanupALLOW_DEV_USER_HEADER-Env-Var entkoppelt (PR #446 + server-stack #23), weil dev-neu bewusstNODE_ENV=productionfaehrt. Bypass jetzt aktiv aufdev.api.mrrm.de, prod-alt unberuehrt.Was noch aussteht (= Voraussetzung fuer Phase-1-Block-Closure)
phase2-mutation-observer-smokeMaestro-Flow gegen rc18-APK. Build #1017 publish-debug-apk laeuft gerade.roadmap.jsonrc18 statusnext->done.Was Phase 2+ angeht
Dieses Epic bleibt offen. Phase 2 (Multi-Source-Indexing aktiv beim User-Workflow, Re-Index bei Mail-Eingang etc.) und folgende Phasen (PII-Guard, Intent-Router, RAG-Lookup, lokales LLM) sind in der ursprünglichen Architektur-Skizze beschrieben und werden als eigene Sub-Issues angelegt sobald die Phase-1-Device-Validation durch ist.