faiss可以類比為一個可以設置索引的數據庫
faiss里面存儲的是海量的向量
只是在faiss中么有數據庫存儲介質這一層的概念,全部都是index,
faiss搜索的基本單位是單個向量,faiss默認輸入的是一個向量x,返回和x最相似的k個向量。
************************** 原理 https://zhuanlan.zhihu.com/p/90768014 ****************************
faiss三個最常見的索引是 indexflatl2 indexivfflat indexivfpq
1 indexflatl2 indexflatip為最基礎的精准查詢
2 indexivfflat稱為倒排文件索引,是使用kmeans建立聚類中心,通過查詢最近的聚類中心,比較聚類中的所有向量得到相似向量,是一種加速搜索方法的索引
3 indexivfpq 是一種減小內存的索引方式,indexflatl2和indexivfflat 都會全量存儲所有的向量在內存中,面對大數據量,faiss提供一種基於 pq的壓縮算法編碼向量到指定字節數來減小內存占用,但這種情況下,存儲的向量是壓縮過的,所以查詢的向量也是近似的。
4 index_factory是faiss實現的一個索引工廠模式,可以通過字符串來靈活的創建索引,pca算法可以將向量降到指定的維度
ivf原理
訓練階段:對訓練樣本進行聚類,選取1024個類,那么1000個訓練樣本平均每個類就只有一個向量,10萬個樣本,每個類有
查詢階段:對查詢樣本計算1024個中心的距離,這里計算了1024次,然后找到它所屬的聚類中心,這里如果有1000個查詢樣本,就計算了1000*1024次,那么對於庫中的樣本,屬於其他聚類中心的,我們就不比較了。
PQ
PQ的原理是拆分向量,各自聚類,假如我們輸入的是一個128維的向量,我們將他拆成4組,每組就是32維的向量
訓練階段,每組的32維向量進行聚類,得到256個中心點,那么4組,一共就有1024個中心,當然這個256*4個中心,實際上將空間划分為256*4個區域,也就是2的32次方個區域,得到每個區域保存本區域的向量。
*************************原文 https://blog.csdn.net/zlb872551601/article/details/103704874 *******************
選擇合適索引的方法,大概需要注意三個方面的知識
1 是否需要精確的結果
flat可以做到精確查詢,indexflatl2 ,他不壓縮向量,不支持添加id,只支持順序添加
2 是否關心內存
由於faiss所有的索引都是存儲在ram中
如果不需要關心內存為HNSWx ----如果有些擔心為 ...FLAT----------相當關心內存為PCARx SQ8 -----非常關系內存為 OPQx_y PQx
3 數據集有多大
如果向量數量低於1百萬:”…,IVFx,…”
如果向量數量位於1百萬-1千萬之間:”…,IMI2x10,…”
如果向量數量位於1千萬-1億之間:”…,IMI2x12,…”
如果向量數量位於1億-10億之間:”…,IMI2x14,…”
faiss快速的原因是 不管庫中的向量有多少,計算次數都是固定的,都是與聚類中心做計算,只不過庫中的向量多,查表的次數就多了。