建立日期:2026-10-07
適用專案:MockExam-CCNA
核心技術:Google DeepMind EmbeddingGemma 2、MRL 降維技術、pgvector、PowerSync Local-First、Flutter Multiplatform
2026 年 10 月 Google DeepMind 正式發表了基於 Gemma 4 架構打造的開放模型 EmbeddingGemma 2(採商業友善的 Apache 2.0 授權)。其核心亮點在於:
本專案支援 Web、Android、iOS、MacOS、Linux、Windows 六大平台,在架構上落實以下分層設計:
flowchart TD
UserQuery["考生自然語言輸入 / 拓撲圖截圖"] --> ES["EmbeddingService 統一門面"]
subgraph MultiPlatformExecution ["多平台安全執行環境"]
ES --> Isolate["Background Isolate (Android / iOS / Desktop)<br/>防止 Samsung GC Pause & 主執行緒 ANR"]
ES --> WebWorker["Async Microtasks (Web 瀏覽器端)<br/>避免阻塞瀏覽器繪製迴圈"]
end
subgraph MultiDbRouter ["多資料庫語意路由層"]
Isolate --> Supabase["Supabase (A) & (B)<br/>PostgreSQL pgvector (768 維)"]
Isolate --> PowerSync["PowerSync 本地端 SQLite / SQLCipher<br/>100% 離線本地 MRL 向量 (128 維)"]
Isolate --> MongoDB["MongoDB Atlas<br/>Atlas Vector Search 管道"]
Isolate --> Firebase["Firebase Realtime Database<br/>輕量節點 /questionEmbeddings (防 OOM)"]
end
MultiDbRouter --> Results["統一語意搜尋結果 (SemanticSearchResult)"]
compute(_computeCosineSimilarityIsolate, params) 背景 Isolate 中執行,禁止在 UI 主執行緒進行大矩陣相乘與點積計算。kIsWeb 條件下透過非同步微任務(Microtask)執行,並支援 Web 上的 Supabase RPC 與 Cloudflare Worker 呼叫。QuestionSearchScreen 點擊相機/相簿圖示,選取網路拓撲圖或 Cisco CLI 輸出截圖。EmbeddingService.getImageEmbedding(bytes) 提取影像的特徵向量,隨即跨模態檢索出最具相關性的 CCNA 題目與官方詳解。本系統支援五大資料庫體系的語意向量檢索,各資料庫的定位與防禦機制如下:
| 資料庫系統 | 向量儲存位置與型態 | 維度規範 (MRL) | 檢索機制 | 離線支援與邊界防禦 |
|---|---|---|---|---|
| Supabase (A) [主庫] | questions.embedding (vector(768)) |
768 維全精度 | match_questions RPC (Cosine Similarity <=>) |
雲端主要檢索管道,具備 RLS 安全存取限制 |
| Supabase (B) [備援庫] | questions.embedding (vector(768)) |
768 維全精度 | match_questions RPC |
主庫異常或維護時,透過 Service Role 快速容錯切換 |
| PowerSync (本地優先) | assets/data/powersync_embeddings_cache.json & 本地 SQLite |
128 維 (MRL 截斷) | 本地 Isolate 向量點積比對 | 100% 離線可用,出廠預載 compact 向量包,0 延遲 |
| MongoDB Atlas | Questions.embedding 陣列欄位 |
768 維 | $vectorSearch 聚合管道 |
透過 Cloudflare Worker 零信任代理隔離直接連線 |
| Firebase RTDB | /questionEmbeddings/$examId/$questionId |
128 維 | 客戶端按需讀取比對 | 嚴禁全量下載,僅讀取輕量索引節點,防 TubeSock OOM |
在 EmbeddingService 與 scripts/sync_multidb_embeddings.py 中,全面導入標準 Matryoshka 截斷與 L2 歐幾里得正規化:
$$\mathbf{v}{\text{compact}} = \frac{\mathbf{v}{1:d}}{|\mathbf{v}{1:d}|2} = \frac{\mathbf{v}{1:d}}{\sqrt{\sum{i=1}^{d} v_i^2}}$$
sync_multidb_embeddings.py)為了維持多資料庫向量一致性,專案提供 scripts/sync_multidb_embeddings.py 批次同步工具。
# 1. 測試單一查詢語意比對 (測試 Supabase pgvector RPC)
python scripts/sync_multidb_embeddings.py --limit 5 --test-query "Spanning Tree Protocol loop prevention"
# 2. 全量生成考題向量並同步至所有資料庫 (Supabase + Firebase RTDB + 本地離線包)
python scripts/sync_multidb_embeddings.py --all --sync-all --mrl-dim 128
# 3. 指定特定考科 (如 300-420 或 300-610)
python scripts/sync_multidb_embeddings.py --exam cisco-300-420 --limit 50
questions.embedding 與 Firebase /questionEmbeddings。assets/data/powersync_embeddings_cache.json,並隨 App 編譯打包至 APK / Web / IPA / Desktop 二進位中,實現真正的出廠即離線語意檢索。ApiKeyService 使用者自備金鑰(BYOK)。