在 Apple Silicon 上,ANN 成敗多半取決於入庫衛生:批次、執行緒、磁碟路徑與統一記憶體——而非查詢時才找的魔術參數。
假設嵌入已在本機或閘道後方穩定產出,聚焦 CPU 向近似最近鄰。請對齊本機 RAG 分塊、Embedding 批次與向量配額,檢索服務可接到遠端 Mac 的 Haystack 管線;推論預算請併讀MLX-LM 與 Transformers 批次/KV 矩陣。下列表可直接貼入 runbook。
痛點拆解
- 記憶體斷崖:HNSW/大規模 IVF 建索引峰值常高於穩態查詢;除活動監視器外應看交換檔趨勢。
- 路徑踩雷:索引勿置於下載或雲端同步夾,節流寫入易毀損。
- 租金換算:批次過小又執行緒過載會拉長牆鐘,時租分攤變貴。
決策矩陣(M4、fp32、維度約 768 占位)
| 維度 | USearch | FAISS-CPU | sqlite-vec |
|---|---|---|---|
| 首選場景 | 精簡 API、HNSW 類服務 | 多種索引與實驗室基線 | 交易式刪除、單檔備份 |
| 批次匯入 | 4096~16384 向量/批 | IVF 訓練後 8192~32768 附加 | SSD 上每交易 500~2000 列 |
| 建索引執行緒 | 效能核心數減一(例:M4 Pro 約 9) | 同上;omp_set_num_threads |
單一寫入者大量載入 |
| 記憶體直覺 | 峰值約 2~3× 原始向量位元組 | IVFPQ 較省 RAM、召回風險較高 | 分頁快取友善、元資料開銷明顯 |
| 建議磁碟根路徑 | ~/Library/Caches/LlmMac/vec/usearch/<corpus> |
~/Library/Caches/LlmMac/vec/faiss/<corpus> + 清單 JSON |
~/Library/Caches/LlmMac/vec/sqlite/<tenant>.sqlite |
可執行環境預設
變數可寫入 launchd、tmux 或 CI 對齊筆電與租用主機,再依嵌入吞吐微調批次。
export VEC_INDEX_ROOT="${HOME}/Library/Caches/LlmMac/vec"
export VEC_CACHE_ROOT="${HOME}/Library/Caches/LlmMac/vec/tmp"
export VEC_INGEST_BATCH=8192
export VEC_BUILD_THREADS=9
export VEC_QUERY_THREADS=4
mkdir -p "${VEC_INDEX_ROOT}/usearch" "${VEC_INDEX_ROOT}/faiss" "${VEC_INDEX_ROOT}/sqlite" "${VEC_CACHE_ROOT}"嵌入與索引共置內建 SSD;外接 APFS 建議關 Spotlight。工單註磁碟序號以免遠端重播混卷。
五步上線
步驟一:保留千筆查詢+暴力近鄰切片作凍結召回集。
步驟二:跨引擎鎖度量與正規化,索引旁存 manifest 雜湊。
步驟三:固定執行緒掃批次 4096~32768,記憶體壓力黃燈即降。
步驟四:暖機五分鐘,記錄 top-k p50/p95 與對暴力基準召回。
步驟五:校驗和打包索引、環境檔、bench JSON 供租用節點簽核。
遠端節點成本驗收清單
| 關卡 | 通過條件(建議) |
|---|---|
| 成本真實性 | 二十四小時浸泡無人工重啟;時租×牆鐘優於本機電費+工程師時間 |
| 延遲對齊 | 同 top-k、efSearch/probe 下 p95 與筆電 ≤10% |
| 召回 | 對暴力保留集召回與筆電差 ≤2 百分點 |
| 溫度與時脈 | 入庫+查詢重播無持續降頻致牆鐘劣化 |
| 稽核 | 日誌含 corpus 版、參數、環境快照、tarball 校驗和 |
可引用門檻(簡報用)
- 8192~16384 批常先吃滿 fp32 768 維入庫頻寬再撞 RAM。
- 建索引執行緒=效能核心減一,降換頁與熱節流。
- 二十四小時浸泡較十分鐘 demo 易暴露洩漏與守護行程互搶。
FAQ
sqlite-vec 會取代 FAISS 嗎?合規刪除、單檔交付較順;極致吞吐仍多看 USearch/FAISS。
小結:依維運選引擎;鎖批次、執行緒與 Caches 路徑;遠端清單簽核後再常駐檢索於租用 Mac。