arch-q: KI-Assistent-Epic (#122) — Tech-Stack-Update, LLM-Distribution, Phasen-Reihenfolge #438
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#438
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?
Kontext
Epic #122 (Persönlicher KI-Assistent, On-Device, Privacy-First) ist im Rahmen der Portfolio-Priorisierung von
type/ideazutype/feature+prio/mediumgehoben worden. Bei der Audit (siehe Kommentar 2026-06-06 in #122) wurde klar: der ursprüngliche Body referenziert eine ONNX-zentrierte 6-Stufen-Pipeline, aberonnxruntime-react-nativeist im OCR-Pivot zu Google ML Kit (v0.6.0) aus dem aktiven Stack geflogen. Damit fehlt die Foundation für PII-Guard, Intent-Router, Extraktoren als ONNX-Modelle.Gleichzeitig hat die GF entschieden (siehe
project_mail_strategy.md), dass #113 (KI-on-Mail) auf diese KI-Foundation wartet — die Reihenfolge ist also: diese Architektur zuerst, KI-on-Mail folgt. Vor Sub-Issue-Eröffnung brauche ich Architekt-Input zu fünf strukturierenden Entscheidungen.Entscheidung 1: ML-Inferenz-Stack für die kleineren Pipeline-Schichten (PII-Guard, Intent-Router, Extraktoren)
Der Epic-Body geht von ONNX aus — das ist jetzt offen. Alternativen für die kleinen NER/Classifier-Modelle:
onnxruntime-react-nativeo.ä.): wir haben es im TrOCR-Spike schon ausprobiert (449ms Latenz war OK), Stack ist gut dokumentiert. Wäre dann „neben ML Kit für OCR" — zwei Inferenz-Engines parallel.Entscheidung 2: LLM-Distribution + Runtime
Epic-Body nennt MLC-LLM mit Phi-3 Mini / Gemma 2B. Offene Fragen:
Entscheidung 3: RAG-Stack — sqlite-vec + Embeddings auf Expo
Epic-Body nennt
sqlite-vec+ MiniLM-Embeddings (~23 MB ONNX). Offene Fragen:sqlite-vecVerfügbarkeit in Expo (managed SDK 54): Native-Extension-Distribution funktioniert viaexpo-sqlitemit Custom Build oder Config-Plugin?multilingual-e5-small,paraphrase-multilingual-MiniLM) macht für DE-User mehr Sinn, ist aber 2-3× größer.Entscheidung 4: E2E-Verschlüsselung für Sync
Epic-Body skizziert AES-256-GCM + Argon2 aus PIN/Biometrie + QR-Code für Multi-Device. Das ist ein eigenes Sub-Epic. Frage:
Ich tendiere zu (c) — Foundation first, Sync ist optional.
Entscheidung 5: Phasen-Reihenfolge
Die 7 Sub-Features im Body in welcher Reihenfolge angehen? Mein Vorschlag (zur Validierung):
Ist die Phase-1-Wahl (Embeddings als sofort nutzbare Foundation) richtig oder gibt es eine bessere Erst-Welle, die schneller User-Wert liefert?
Constraints + Deadline
Was ich brauche
Konkrete Empfehlungen je Entscheidung. Plus: Hinweise auf übersehene Folge-Effekte und falls iOS-LLM-Performance dramatisch schlechter ist — Empfehlung zum Umgang (Android-Erst-Welle? Capability-Degradation? Anders?).
Architekt-Antwort
Alle fünf Entscheidungen verflechten sich um einen einzigen strategischen Kern: wir bauen einen Privacy-First-Stack ohne Drittanbieter-Telemetrie, also keine Google-ML-Kit-Custom-Models für sensible Pipeline-Schichten — und wir testen LLM-Latenz früh, bevor wir die volle Pipeline-Architektur bauen. Daraus folgt: ONNX zurück für die kleinen Schichten, llama.cpp für LLM, sqlite-vec via EAS-Build für RAG, E2E-Sync explizit raus aus dem Foundation-Scope, und eine angepasste Phasen-Reihenfolge mit früher LLM-Validation.
Entscheidung 1: ML-Inferenz-Stack für kleine Schichten → (c) ONNX wieder reinholen
Empfehlung:
onnxruntime-react-nativefür PII-Guard, Intent-Router, Extraktoren-NER. Zwei Inferenz-Engines parallel (ML Kit für OCR, ONNX für KI) ist OK — verschiedene Use-Cases.Begründung:
onnxruntime-react-native+transformers.js-Modell-Export) ist gut dokumentiert. Wir wissen, was wir kriegen.react-native-executorchist Software-Mansion-Projekt — weniger Erfahrung im Team. Lern-Tax ohne klaren Vorteil ggü ONNX.xlm-roberta-base-german-nerals ONNX-Export (~440 MB float32, ~110 MB int8). Für Intent-Router DistilBERT-Tiny oder ein kleiner deutscher Classifier (~25 MB int8).Entscheidung 2: LLM-Distribution + Runtime → (b) llama.cpp via
llama.rnmit Phi-3 Mini Q4Empfehlung: llama.cpp-basierter Runtime (
llama.rnfür RN-Bindings), Phi-3-Mini-4K-Instruct Q4_K_M (~2.3 GB) als Default. Download-on-First-Run, nicht ins APK bundeln.Begründung:
llama.rnist produktiv.expo-file-systemv18 oder Custom-Native), Storage-Permission-UX, Modell-Update-Channel (siehe Folge-Effekt 3). Bundling ist Store-Limit-Verletzung.iOS-Story: llama.cpp auf iPhone 14+ läuft akzeptabel (3-5s für kurze Prompts, Metal-Backend). iPhone 12/13 testen aktiv in Phase 2 (siehe Reihenfolge). Falls iOS dramatisch schlechter: Erst-Release Android-only mit klarer „iOS-Beta in Vorbereitung"-Kommunikation, kein Server-Fallback — das ist Privacy-Premise-Bruch und schon im Body explizit als „kein Drittanbieter-LLM-SDK" ausgeschlossen.
Web-Stack: out-of-scope für die Foundation (separat in Folge-Effekt 1).
Entscheidung 3: RAG-Stack → sqlite-vec via EAS Build Config-Plugin +
multilingual-e5-smallEmpfehlung: sqlite-vec über Custom Dev Client (EAS Build) integrieren,
multilingual-e5-small(~118 MB Q8) als Embedding-Modell. Initial-Indexing als Background-Job (siehe Two-Pass-Kommentar von admin-mrrm).Begründung:
expo-sqlitemit der Extension verlinkt. Funktioniert produktiv (siehe Community-Plugins). Alternative: Bare-Workflow-Migration — aber overkill, wir bleiben managed mit Custom Build.multilingual-e5-small(471 dim, 471 MB float32, ~118 MB Q8 ONNX) ist Stand-2024-best-of-breed für Multilingual-Retrieval, ~5× größer als en-MiniLM aber im Vergleich zum LLM (~2.3 GB) trivial.Entscheidung 4: E2E-Verschlüsselung → (c) Phase-Split, Sync explizit später
Empfehlung: E2E-Sync raus aus dem Foundation-Scope. Foundation läuft lokal-only auf dem Hauptgerät des Users. Sync wird eigenes Sub-Epic, nach der Pipeline-Foundation.
Begründung:
react-native-sodiumfür Krypto-Primitives), nicht Matrix/Signal-Stack — deren Use-Case ist Messaging, nicht Personal-Knowledge-Replikation.Entscheidung 5: Phasen-Reihenfolge → Angepasst: Embeddings + frühe LLM-Validation
Der PM-Vorschlag ist solide, hat aber ein Latenz-Risiko spät: wenn LLM-on-Device-Performance schlecht ist, merken wir es erst nach 4-5 Phasen Investment. Vorschlag eines anderen Pfads:
Key-Punkt: Phase 2 ist ein gezielter Spike (1-2 Wochen Aufwand), der LLM-Latenz auf Android+iOS validiert, bevor wir uns mit Intent-Router/Extraktoren-Pipeline beschäftigen. Wenn iPhone 12 schlecht performt, justieren wir früh — Plattform-Strategie, Modell-Auswahl, oder ggf. doch Server-Fallback (Privacy-Compromise mit User-Opt-In).
Phase-1-Wahl validiert: Embeddings als Erst-Welle ist richtig — sofort User-Wert (Suche besser), niedriger Implementierungsrisiko, Foundation für alles Weitere. Better als PII-Guard zuerst (kein User-facing Wert).
Übersehene Folge-Effekte
Web-Stack ist eine separate Story. Body und arch-question sind Mobile-zentriert. Web-On-Device-LLM (
web-llmvia WebGPU + Wasm) ist andere Tech-Wahl, andere Modell-Distribution. Empfehlung: Web-KI als separates Sub-Epic „[Epic] KI-Assistent — Web-Variante", nach Mobile-Phasen 1-5. Falls Web früher relevant: nur Embeddings/Suche, kein LLM.Battery + Thermal-UX. LLM-Inferenz erhitzt Phones, kostet Akku. Pipeline-Aufrufe brauchen UX-Defaults: „bei Ladung" oder „bei Wifi" mit User-Opt-In-Override. Sonst negative App-Store-Reviews.
Modell-Update-Channel. Wenn Phi-3-v2 mit besserer DE-Performance kommt, brauchen installierte Apps einen Update-Pfad. Empfehlung: API-Endpoint
GET /models/manifest(eigenes Sub-Epic im API-Bereich), App vergleicht installierte Versionen, bietet Update an. Auch für Embedding-Modell und Klassifikatoren.Privacy-Audit-Trail-UI. Wenn Verarbeitung lokal ist, sollte die App das zeigen — Indikator pro Verarbeitungs-Schritt („PII-Guard hat 3 Namen maskiert, lokal", „LLM-Antwort generiert auf-Gerät"). Sonst kein Trust-Building, der Privacy-Vorteil verpufft kommunikativ.
LLM-Download-Fallback. User bricht 2.3-GB-Download ab — was passiert? Empfehlung: graceful degradation auf Regelbasis (Intent-Router + Extraktoren ohne LLM-Reasoning) oder Feature-Toggle aus. Nie silent fail.
DataSource-Interface frühzeitig definieren. Body nennt Mails+Listen+Notizen. Aber Day-Planner (#360), Wissensbasis (#258), Urlaubs-Modul (#323) sind kommend. RAG-Architektur sollte ein
IDataSource-Interface haben (mitextractChunks(),getIndexKey(),subscribeToUpdates()), damit neue Module ohne Pipeline-Umbau dazukommen. Phase 1 sollte das Interface vorwegnehmen — sonst Tech-Debt in Phase 4+.Test-Strategie für probabilistische Outputs. LLM-Antworten sind nicht-deterministisch — Standard-Unit-Tests funktionieren nicht. Empfehlung: Golden-Set + Semantic-Similarity-Assertions (über die Embedding-Distance) statt String-Equality. Frühzeitig im Test-Framework klären, sonst Friction in jeder PR.
Beantwortet von Architekt-Hut (konversationell durch PM in dieser Session; bei strittigen Stellen oder LLM-Performance-Real-Daten aus Phase 2 erneut konsultieren — Phase-3+ hängen davon ab).
Beantwortet — Architekt-Empfehlungen übernommen, Decision Record am Epic #122. Phase-1-Sub-Issues folgen separat. Schließe das arch-question.
multilingual-e5-smallon-device integrieren #439IDataSource-Interface + Adapter für Mails, Listen, Notizen #441Korrektur 2026-06-06 — Stack-Bild im arch-question war unvollständig
Dieses arch-question ist auf einer falschen Stack-Annahme aufgesetzt worden („ONNX im OCR-Pivot rausgeflogen, keine Foundation"). Tatsächlich läuft
onnxruntime-react-nativeproduktiv über NLI-Classifier (Mail-Kategorisierung #251 ff.),llama.rnmit Llama 3.2 3B ist live, Modell-Lifecycle-Patterns existieren. Detail-Korrektur siehe Korrektur-Kommentar an #122.Die hier getroffenen Decisions bleiben strukturell richtig — nur die Begründung zu Decision 1 muss umgekehrt gelesen werden: nicht „ONNX reinholen", sondern „bestehende ONNX-Pipeline nutzen, Embedding-Modell hinzufügen". Decisions 2-5 unverändert.