向量資料庫 (Vector Database)
傳統資料庫擅長精確查詢(user_id = 123);向量資料庫擅長相似度搜尋(「找出和這篇文章語意最接近的 10 篇」)。
本質:它是一種索引,不是真理來源。核心技術是 ANN(Approximate Nearest Neighbor)。
什麼是 Embedding(向量)
把任意東西(字、句、圖、用戶、商品)丟進 ML 模型 → 轉成一組數字陣列。
"The cat sat on the mat" → [0.12, -0.34, 0.78, ...] (1536 維)
"A feline rested on a rug" → [0.11, -0.32, 0.79, ...] 幾何上非常接近 → 語意相似
"The stock market crashed" → [-0.89, 0.12, -0.45, ...] 差很遠
- 常見維度 128–1536(OpenAI
text-embedding-3-large為 3072)。 - 重點不在單一維度的意義,而在幾何關係反映語意關係。
- 「相似」由模型決定:文字模型學「語意相似」;推薦系統可訓練模型學「共購行為」(尿布↔奶瓶,語意不像但很相關)。
相似度怎麼算
| 度量 | 機制 | 備註 |
|---|---|---|
| Euclidean (L2) | 高維畢氏定理,距離越小越相似 | 考慮方向與大小 |
| Cosine Similarity | 看夾角(同向 1 / 垂直 0 / 反向 -1) | 多數 embedding 已 normalize,最常用 |
| Dot Product | 類 cosine 但不 normalize | 計算稍快 |
| Hamming | binary 向量 XOR 後數 bit 差異 | 非常快 |
infra 型題目只要說「我們用 cosine similarity 或適合該模型的 metric」通常就夠了。
KNN → ANN:核心取捨
KNN(K-Nearest Neighbors)暴力解:對每個向量算相似度、排序、取前 K → O(n)。
1M 向量 × 1536 維,每次 query 約 60 億次浮點運算,即使 SIMD/GPU 也不夠。
ANN:容忍「不是完全準確」,找到 95%+ 就夠。向量資料庫本質就是讓你在三者間平滑調整:
Recall(準確率)
▲
│ 三者互相拉扯,
Latency │ 向量 DB = 在這個三角形裡找平衡點
(延遲)────┴──── Memory(索引記憶體)
索引演算法
| 演算法 | 概念 | 優點 | 缺點 |
|---|---|---|---|
| HNSW | 高維 skip list;多層 graph,稀疏層當高速通道 | O(log n)、95%+ recall、低延遲 | 記憶體大(≈原始 ×2)、建索引慢、插入貴 |
| IVF | k-means 分群,查詢只搜最近的幾個 cluster | 建索引快、插入簡單、記憶體小 | recall 通常比 HNSW 低 |
| LSH | 隨機 hyperplane 讓相似向量落同 bucket | 建索引快、適合 streaming | 實務 recall 不如 HNSW |
「使用 HNSW,多層 graph,從稀疏層往密集層 greedy search。」除非有特定限制(寫入極頻繁、規模極大、記憶體受限),HNSW 通常是正解。IVF 的 nprobe 越高 → recall 越高但越慢。
Filtering 與 Hybrid Search
實務查詢很少是「找最相似的 10 個」,通常加條件:「而且 in stock、價格 < $100、今年發布」。
| 策略 | 做法 | 問題 |
|---|---|---|
| Post-filter | 先找 top-N 再過濾 | 過濾後可能不足 K 個 |
| Pre-filter | 先過濾再向量搜尋 | 索引可能無法有效套用 |
各系統做法:pgvector 走 query planner(可能 brute force);Elasticsearch 在 HNSW traversal 中整合 filter,支援 BM25 + vector hybrid search;Pinecone 把 metadata 當 first-class,索引內同時處理。
實務選型:先簡單
很多人低估了多維運一套新系統的複雜度。
| 規模 / 需求 | 選擇 |
|---|---|
| 已有 Postgres | pgvector(支援 HNSW/IVF、可 JOIN、ACID) |
| 需要 hybrid search | Elasticsearch kNN |
| 低延遲 | Redis Vector Search |
| 專門(> 100M 向量) | Pinecone(managed)/ Weaviate / Milvus(billions)/ Qdrant(過濾強)/ Chroma(prototype/RAG) |
面試常見場景(幾乎必用向量 DB)
- 語意搜尋:文件/程式碼搜尋(自然語言 query → 相關文件)
- 推薦系統:找與互動過內容相似的項目(常搭 collaborative filtering)
- 以圖搜圖 / 相似影片:媒體 → embedding → 搜相似向量
- RAG:向量搜尋找相關文件,LLM 綜合生成
- 去重:近似重複偵測(抄襲、重複工單/商品)
- 異常偵測:交易 → embedding,找與正常模式「不相似」的
三種架構模式
| 模式 | 做法 |
|---|---|
| 獨立服務 | 應用送 embedding → 向量服務回 ID → 再去主 DB 查完整資料(關注點分離,最常見) |
| Hybrid search | 同時送關鍵字索引 + 向量索引,用排序函數合併 |
| Two-stage | 第一階段向量搜回 top-1000 候選,第二階段用較慢的 reranker 重排 |
關鍵設計決策
- 一致性:通常可接受最終一致——「插入後不需要立刻搜得到」。
- 更新策略:即時產生 vs 每小時 batch;對即時性不高就 batch。
- 過濾策略:pre / post / hybrid,過濾條件越具選擇性越重要。
Numbers to Know
| 指標 | 數字 |
|---|---|
| 維度 | 常見 128–1536(OpenAI 1536,開源常 384/768) |
| 單向量記憶體 | float32 每維 4 bytes → 1536 維 ≈ 6KB(比直覺大) |
| 100 萬向量 | 原始 ≈ 6GB,HNSW 索引再 ×2 |
| 查詢延遲 | 調校良好 < 10ms,常見 1–5ms |
| Recall 目標 | 95%+ 通常可接受(99%+ 要犧牲延遲/記憶體) |
| 吞吐 | 索引常駐記憶體時,每節點每秒數萬次查詢合理 |
常見陷阱
不要當系統唯一 source of truth。權威資料放主 DB,向量 DB 只是索引。
- Embedding drift:換 embedding 模型 → 舊向量全失效不相容,要全部重產(成本高)或維護多套索引。API 要帶「哪個模型產生此 embedding」。
- Cold start:用行為產生 embedding 的推薦,新用戶無資料 → 需 fallback。
- 索引建構慢:1000 萬筆 HNSW 可能要一小時+,影響部署/災難復原速度。
- 不是精確匹配:要用 ID 找文件就用一般 DB;向量搜的是「相似」不是「相同」。
Related Notes
- 08-Search-and-AI/02-RAG — RAG 的 retrieval 就是向量搜尋(Ingestion → vector DB)
- 08-Search-and-AI/03-Elasticsearch — ES kNN 支援向量 + BM25 hybrid search
- 08-Search-and-AI/01-Search-System — 傳統關鍵字搜尋(hybrid 的另一半)
- 04-Database-Indexing/06-Inverted-Index — lexical 搜尋的索引基礎
- 06-Database-Tech/02-PostgreSQL — pgvector:先用既有 Postgres 做向量搜尋
- 07-Caching-Storage/02-Blob-Storage — 以圖搜圖:S3 存圖、向量 DB 存語義表示
- 08-Search-and-AI/Practice-Search-and-AI