EmbeddingService: use flutter_gemma batch API (generateEmbeddings) for sync-burst throughput
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
この issue はまだ評価されていません。
説明
Problem
EmbeddingService.embed (lib/features/shiv/rag/embedding/embedding_service.dart) calls EmbeddingModel.generateEmbedding(text) once per note. Every call
pays the full LiteRT per-invocation overhead (input/output tensor marshalling, GPU dispatch setup/teardown). The actual model math on Gecko-110M is
tiny — overhead dominates.
This is invisible when a user adds one note at a time, but becomes visible during sync bursts:
- First app open after install / restore (relay backfills 100s of notes)
- Returning online after a few days
- Joining / catching up on a busy channel or long thread
In those windows the embedder lane saturates EmbeddingQueue(Semaphore(2)) for ~tens of seconds, RAG context lags behind the visible feed (Shiv answers
are "incomplete" until the index catches up), and the phone stays warm.
Proposal
Wire flutter_gemma's batch entry point through the service:
Future<List<List>> embedBatch(
List texts, {
bool isDocument = false,
});
Internally calls _model!.generateEmbeddings(texts, taskType: ...) — one native dispatch for the whole list — then L2-normalises each vector. Keep the
existing single-text embed() as a thin wrapper around embedBatch([text]).first so call sites that genuinely embed one string at a time don't change.
Call sites to migrate
- The note-ingest path that embeds inbound Kind 1 events as the Gateway writes them to Isar. Currently iterates and calls embed(...) per note; should
accumulate a small list (e.g. up to N=16 or whatever flushes a Gateway batch) and call embedBatch. - Saved-note / reference-note backfill jobs.
Out of scope — explicitly NOT changing
- The embedding model itself (stay on bundled Gecko-1024 — offline-first, ~25 MB).
- The 1-hop GraphRAG expansion. Edges come from e/t tags, not from the embedder.
- The EmbeddingQueue(Semaphore(2)) parallelism cap — that stays as a backpressure guard.
- Shiv chat query embedding — already single-string, no batching opportunity.
Expected user-visible improvements
No change to single-add latency or retrieval quality.
Acceptance
- New embedBatch(List) lands on EmbeddingService with GPU→CPU fallback preserved.
- Inbound note handler in the Gateway batches embed calls.
- Device test (one app install, integration_test/) ingests N≈100 notes and asserts wall-clock time drops by ≥5× vs. current per-note path on the same
device. - No regression on chat first-token latency or single-note add.
References
- Current implementation: lib/features/shiv/rag/embedding/embedding_service.dart
- flutter_gemma docs: https://pub.dev/documentation/flutter_gemma/latest/ (see generateEmbeddings)
- 主要言語
- Dart
- スター
- 2
- フォーク
- 2
- 平均マージ
- 18時間 53分
- マージ済み PR(30日)
- 35
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
basictech01/uniun のほかの issue
-
bug good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
basictech01/uniun#300 ·
メンテナーはふだん 1 日以内に返信
-
bug good first issue
難易度 3/5 1〜2日 初心者へのやさしさ 52/100
basictech01/uniun#301 ·
メンテナーはふだん 1 日以内に返信
-
enhancement good first issue P2-Medium
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
basictech01/uniun#296 ·
メンテナーはふだん 1 日以内に返信
-
bug good first issue P2-Medium
難易度 4/5 1〜2日 初心者へのやさしさ 22/100
basictech01/uniun#293 ·
メンテナーはふだん 1 日以内に返信
-
bug P1-High
難易度 4/5 3〜5日 初心者へのやさしさ 18/100
basictech01/uniun#286 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
basictech01/uniun の issue をすべて見る
似ている issue
-
bug to check
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 75/100
fzyzcjy/flutter_rust_bridge#3495 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
Not all highlighting kinds have examples in DartColorsAndFontsPage対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンgood-first-issue P3
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
flutter/dart-intellij-third-party#758 ·
メンテナーはふだん 1 日以内に返信