feat(ai): P1.1 Embedding-Modell multilingual-e5-small on-device integrieren #439

Closed
opened 2026-06-06 16:28:52 +02:00 by pm-bot · 2 comments
Collaborator

Phase-1-Sub-Issue zu #122 (Decision Record 2026-06-06).

Ziel

Deutsches/multilinguales Embedding-Modell intfloat/multilingual-e5-small on-device verfügbar machen — Foundation für RAG-Suche und alle nachfolgenden KI-Phasen.

Scope

  • ONNX-Export des Modells (Q8-quantisiert, ~118 MB) als App-Asset oder Download-on-First-Run.
  • onnxruntime-react-native (zurückgeholt — siehe Decision 1 in #438) als Inferenz-Runtime.
  • TypeScript-Service EmbeddingService mit synchroner Inferenz auf Text-Chunk → Float32Array.
  • E5-spezifisches Input-Formatting: Query-Prefix query: , Passage-Prefix passage: (E5-Konvention).
  • Performance-Targets: <30 ms pro Text-Chunk auf Mid-Range-Android (Pixel 6 / Galaxy A53 Klasse).
  • Web-Variante out-of-scope (separates Sub-Epic später).

Akzeptanzkriterien

  • Modell ist on-device verfügbar (bundled oder downloadable mit Fallback-UX).
  • EmbeddingService.embed(text, kind: 'query'|'passage'): Float32Array funktional getestet.
  • Vitest-Suite mit Golden-Set (5-10 deutsche Beispiel-Strings) gegen erwartete Embedding-Cosine-Similarity-Bounds.
  • Benchmark in einem README: Latenz pro Chunk auf Test-Device dokumentiert.
  • Bundle-Größen-Auswirkung dokumentiert.

Out-of-Scope

  • Indexierung in sqlite-vec (P1.2)
  • Background-Job (P1.4)
  • UI (P1.5)
Phase-1-Sub-Issue zu #122 (Decision Record 2026-06-06). ## Ziel Deutsches/multilinguales Embedding-Modell `intfloat/multilingual-e5-small` on-device verfügbar machen — Foundation für RAG-Suche und alle nachfolgenden KI-Phasen. ## Scope - ONNX-Export des Modells (Q8-quantisiert, ~118 MB) als App-Asset oder Download-on-First-Run. - `onnxruntime-react-native` (zurückgeholt — siehe Decision 1 in #438) als Inferenz-Runtime. - TypeScript-Service `EmbeddingService` mit synchroner Inferenz auf Text-Chunk → Float32Array. - E5-spezifisches Input-Formatting: Query-Prefix `query: `, Passage-Prefix `passage: ` (E5-Konvention). - Performance-Targets: <30 ms pro Text-Chunk auf Mid-Range-Android (Pixel 6 / Galaxy A53 Klasse). - Web-Variante out-of-scope (separates Sub-Epic später). ## Akzeptanzkriterien - [ ] Modell ist on-device verfügbar (bundled oder downloadable mit Fallback-UX). - [ ] `EmbeddingService.embed(text, kind: 'query'|'passage'): Float32Array` funktional getestet. - [ ] Vitest-Suite mit Golden-Set (5-10 deutsche Beispiel-Strings) gegen erwartete Embedding-Cosine-Similarity-Bounds. - [ ] Benchmark in einem README: Latenz pro Chunk auf Test-Device dokumentiert. - [ ] Bundle-Größen-Auswirkung dokumentiert. ## Out-of-Scope - Indexierung in sqlite-vec (P1.2) - Background-Job (P1.4) - UI (P1.5)
Author
Collaborator

Scope-Korrektur 2026-06-06

Der Original-Scope dieses Tickets war zu groß formuliert — „ONNX-Reintegration" war falsche Annahme. Tatsächliches Bild:

Bestehende Foundation (kann wiederverwendet werden)

  • onnxruntime-react-native voll integriert, Custom Expo Plugin with-onnxruntime-package aktiv
  • Hermes-Polyfills für Symbol.for('onnxruntime') und Blob/File in nli-classifier-polyfill.ts
  • @huggingface/transformers mit env.allowLocalModels=false/env.useFSCache=false-Konfiguration
  • Pattern für Model-Download + Lifecycle-Management (siehe nli-classifier.ts Klassen-Struktur)
  • Pattern für ONNX-InferenceSession mit transformers.js-Tokenizer (AutoTokenizer.from_pretrained)

Tatsächlich neuer Scope

Analog zu nli-classifier.ts einen embedding-service.ts anlegen, der:

  • multilingual-e5-small ONNX-Modell (~118 MB Q8) lädt (Download-on-First-Run, gleiches Pattern wie NLI)
  • Tokenizer von intfloat/multilingual-e5-small über AutoTokenizer.from_pretrained lädt
  • embed(text, kind: 'query'|'passage'): Promise<Float32Array> exponiert
  • E5-spezifisches Input-Prefixing (query: , passage: )
  • Mean-Pooling über Token-Embeddings + L2-Normalization (E5-Konvention)

Akzeptanzkriterien unverändert

  • Modell ist on-device verfügbar (Download-on-First-Run gleiches Pattern wie NLI)
  • EmbeddingService.embed(text, kind) funktional getestet
  • Vitest-Suite mit Golden-Set (5-10 deutsche Beispiel-Strings) → erwartete Cosine-Similarity-Bounds
  • Benchmark in einem README: Latenz pro Chunk auf Test-Device
  • Bundle-Größen-Auswirkung dokumentiert (sollte ~0 sein da Download-on-First-Run)

Effort-Schätzung neu

Deutlich kleiner als ursprünglich beschrieben — ~1-2 Tage statt ~1 Woche, weil das ganze Infrastruktur-Setup (ORT, Polyfills, Plugin, Download-Pattern) bereits steht.

## Scope-Korrektur 2026-06-06 Der Original-Scope dieses Tickets war zu groß formuliert — „ONNX-Reintegration" war falsche Annahme. Tatsächliches Bild: ### Bestehende Foundation (kann wiederverwendet werden) - `onnxruntime-react-native` voll integriert, Custom Expo Plugin `with-onnxruntime-package` aktiv - Hermes-Polyfills für `Symbol.for('onnxruntime')` und Blob/File in `nli-classifier-polyfill.ts` - `@huggingface/transformers` mit `env.allowLocalModels=false`/`env.useFSCache=false`-Konfiguration - Pattern für Model-Download + Lifecycle-Management (siehe `nli-classifier.ts` Klassen-Struktur) - Pattern für ONNX-InferenceSession mit transformers.js-Tokenizer (`AutoTokenizer.from_pretrained`) ### Tatsächlich neuer Scope Analog zu `nli-classifier.ts` einen `embedding-service.ts` anlegen, der: - `multilingual-e5-small` ONNX-Modell (~118 MB Q8) lädt (Download-on-First-Run, gleiches Pattern wie NLI) - Tokenizer von `intfloat/multilingual-e5-small` über `AutoTokenizer.from_pretrained` lädt - `embed(text, kind: 'query'|'passage'): Promise<Float32Array>` exponiert - E5-spezifisches Input-Prefixing (`query: `, `passage: `) - Mean-Pooling über Token-Embeddings + L2-Normalization (E5-Konvention) ### Akzeptanzkriterien unverändert - [ ] Modell ist on-device verfügbar (Download-on-First-Run gleiches Pattern wie NLI) - [ ] `EmbeddingService.embed(text, kind)` funktional getestet - [ ] Vitest-Suite mit Golden-Set (5-10 deutsche Beispiel-Strings) → erwartete Cosine-Similarity-Bounds - [ ] Benchmark in einem README: Latenz pro Chunk auf Test-Device - [ ] Bundle-Größen-Auswirkung dokumentiert (sollte ~0 sein da Download-on-First-Run) ### Effort-Schätzung neu Deutlich kleiner als ursprünglich beschrieben — ~1-2 Tage statt ~1 Woche, weil das ganze Infrastruktur-Setup (ORT, Polyfills, Plugin, Download-Pattern) bereits steht.
Author
Collaborator

Implementation komplett — integriert in PR #444 (wireup/ai-foundation-phase1). Device-Pass läuft am übergeordneten Epic #122. Issue wird geschlossen.

Implementation komplett — integriert in PR #444 (`wireup/ai-foundation-phase1`). Device-Pass läuft am übergeordneten Epic #122. Issue wird geschlossen.
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#439
No description provided.