FAISS
FAISS(Facebook AI Similarity Search)是 Meta 的函式庫,不是帶帳號、replication、metadata 查詢的資料庫。它把大量向量編成可搜的索引,Python/C++ 都能呼叫。Chroma、Milvus、pgvector 裡的 HNSW/IVF,觀念幾乎都從這裡來。
所以學 FAISS 有兩個目的:本機做實驗,以及看懂其他產品文件裡的索引名稱。影片見 FAISS 影音。
什麼時候選它
- 研究索引參數、量化(PQ)、GPU 加速。
- 資料可以整包載入記憶體(或自己處理落盤),不需要 SQL/filter/多租戶。
- 要在程式裡嵌入搜尋,而不是開一個資料庫行程。
需要過濾、CRUD、備份與權限時,改用真正的向量資料庫。Pinecone 的學習文章也明確把 FAISS 歸在「standalone vector index」。
核心物件
建索引時就要決定維度 d 與度量。IndexFlatL2 是精確搜尋,當答案的基準。
import numpy as np
import faiss
d = 384
xb = np.random.random((1000, d)).astype("float32")
xq = np.random.random((5, d)).astype("float32")
index = faiss.IndexFlatL2(d)
index.add(xb)
distances, ids = index.search(xq, k=3)
print(ids, distances)
常用組合(名稱在其他資料庫也會遇到):
| 索引 | 意義 |
|---|---|
| Flat | 精確、最慢。用來驗召回。 |
| IVF | 先分群集,只搜幾個桶。要 train 再 add。 |
| HNSW | 圖索引,查詢快。 |
| PQ/OPQ | 壓縮向量、省記憶體,召回會掉一點。 |
IVF 沒有 train 就 add 會失敗或品質很差——這是 FAISS 新手最常見的錯誤。HNSW 通常不需要這步。
跟向量資料庫怎麼分工
許多系統底層或周邊會用 FAISS(或同一類演算法),再自己補 metadata、WAL、replication。你若只在 FAISS 裡搜,就要自己存 id → 原文 的對照表;這也是為什麼 RAG 教學後續會換成 Chroma/Pinecone。
官方學習資源
上游
FAISS GitHub 與 官方 wiki 是 API 與索引公式的來源。Meta 沒有獨立的 FAISS 證照課。
優質 YouTube
James Briggs 的 FAISS 系列(對應他在 Pinecone Learn 寫的 similarity search 文章)是目前最清楚的逐步教學。內嵌見 FAISS 影音。