干貨:向量檢索庫總結|收藏夾必備
?↓↓↓ 文末 福利↓↓↓
不論是在推薦系統(tǒng),還是信息匹配,都包含召回 和排序兩個階段,而在召回階段,向量檢索庫起著至關重要的作用。 在推薦 系統(tǒng)的召回階段,向量的最近鄰檢索是必不可少的一步。 當在 召回階段使用離線模型訓練好item向量后,通常會存儲至數(shù)據(jù)庫中,在線上推理時,模 型實時計算出user向量,會通過Annoy或Faiss進行最近鄰檢索。 而在基于FAQ的智能問答的召回階段,目標是從知識庫中快速召回一小 批與query相關的候選集。
本文會重點介紹幾種常用的向量檢索庫及使用方式。包括: Annoy、Faiss、Milvus、ElasticSearch等 。
01
Annoy
Annoy 是高維空間求近似最近鄰的一個開源庫 。 全稱: Approximate Nearest Neighbors Oh Yeah,是一種適合實際應用的快速相似查找算法。
Annoy構建一個二叉樹,查詢時間為O(logn)。
github:https://github.com/spotify/annoy
Annoy的使用
直接通過pip install annoy安裝。
from annoy import AnnoyIndex
import random
# 向量的維度
f = 40 # Length of item vector that will be indexed
# 返回一個可讀可寫的存儲 f 維向量的索引
t = AnnoyIndex(f, 'angular')
for i in range(1000):
# random.gauss為隨機生成高斯分布的隨機數(shù)
v = [random.gauss(0, 1) for z in range(f)]
# 在位置 i 添加向量
t.add_item(i, v)
# 建立一棵 n_trees的森林,樹越多,精度越高
t.build(10) # 10 trees
# 保存
t.save('test.ann')
# ...
u = AnnoyIndex(f, 'angular')
# 直接加載
u.load('test.ann') # super fast, will just mmap the file
print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors
上面的例子為官方github提供的例子。
向量檢索時用到的函數(shù)
-
a.get_nns_by_item(i, n, search_k=-1, include_distances=False): 返回最接近 i 的n個item。查詢過程中,將檢查search_k個節(jié)點,默認為n_trees* n。serarch_k實現(xiàn)了準確性和速度之間的運行時間權衡。include_distances為True時將返回一個包含兩個列表的2元素元組:第二個包含所有相應的距離。
-
a.get_nns_by_vector(v, n, search_k=-1, include_distances=False): 和上面的根據(jù)item查詢一樣,只不過這里給定一個查詢向量v,比如給定一個用戶embedding, 返回n個最近鄰的item, 一般這樣用的時候, 后面的距離會帶著,可能作為精排那面的強特。
-
a.get_item_vector(i): 返回索引i對應的向量。
-
a.get_distance(i, j): 返回item_i和item_j的平方距離。
索引屬性函數(shù)
-
a.get_n_items(): 返回索引中的items個數(shù),即詞典大小。
-
a.get_n_trees(): 索引樹的個數(shù)。
-
annoy接口中一般需要調(diào)整的參數(shù)有兩個:樹的數(shù)量n_trees和搜索過程中檢查的節(jié)點數(shù)量search_k
-
n_trees: 在構建期間提供,影響構建時間和索引大小。值越大,結果越準確,但索引越大。
-
search_k: 在運行時提供,并影響搜索性能。值越大,結果越準確,但返回的時間越長。如果不提供,就是n_trees * n, n是最近鄰的個數(shù)。
02
Faiss
Faiss庫是由 Facebook 開發(fā)的適用于稠密向量匹配的開源庫,支持 c++ 與 python 調(diào)用。
Faiss提供了高效的索引類庫。
是向量化檢索開山鼻祖的應用。
Faiss 支持多種向量檢索方式,包括內(nèi)積、歐氏距離等,同時支持精確檢索與模糊搜索。
github: https://github.com/facebookresearch/faiss
tutorial: https://github.com/facebookresearch/faiss/wiki/Getting-started
Faiss 主要特性:
-
支持相似度檢索和聚類;
-
支持多種索引方式;
-
支持CPU和GPU計算;
-
支持Python和C++調(diào)用
Faiss的使用
直接通過pip install faiss-cpu --no-cache進行安裝。
faiss的使用方法也比較簡單,歸納為以下三個步驟:
-
構建向量庫,對已知的數(shù)據(jù)進行向量,最終以矩陣的形式表示
-
為矩陣選擇合適的index,將第一步得到的矩陣add到index中
-
search得到最終結果
import numpy as np
import faiss
d = 64
nb = 100000
nq = 10000
# 構建向量庫
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.
# 關鍵步驟,build index
index = faiss.IndexFlatL2(d)
index.add(xb)
k = 4
D, I = index.search(xq[:5], k) # 分別返回距離和索引
03
Milvus
M ilvus 是一款開源 的 特征向量相似度搜索引擎 ,使用方便、 實用可靠、易于擴展、穩(wěn)定高效和搜索迅速。
-
高性能:涵蓋如Faiss、Annoy和hnswl
ib等主流第三方索引庫,性能高,支持對海量向量數(shù)據(jù)進行相似搜索。
-
高可用、高可靠:Milvus支持使用Kubernetes部署,支持在云上擴展。其容災能力能夠保證服務的高可用。Milvus依照日志及數(shù)據(jù)的理念,使用如Pulsar、Kafka等消息隊列的技術實現(xiàn)組件間的通信,對組件進行解耦,擁抱云原生。
-
混合查詢:Milvus支持在向量檢索過程中進行標量字段過濾,實現(xiàn)混合查詢。
-
開發(fā)者友好:支持多語言、多工具的Milvus生態(tài)。如今Milvus已經(jīng)支持Python、Java、Go和Node.js,未來可能還會擴展對更多語言的支持。Milvus提供了如Attu等工具,幫助用戶簡化操作。
Milvus的更多介紹可以查看:https://gitee.com/milvus-io/milvus
04
ElasticSearch
Elasticsearch 是?個分布式可擴展的實時搜索和分析引擎,?個建?在全?搜索引擎 Apache Lucene(TM)基礎上的搜索引擎,當然 Elasticsearch 并不僅僅是 Lucene 那么簡單,它不僅包括了全?搜索功能,還可以進行以下?作:
-
分布式 實時?件存儲,并將每?個字段都編入索引,使其可以被搜索。
-
實時分析的分布式搜索引擎。
-
可以擴展到上百臺服務器,處理PB級別的結構化或非結構化數(shù)據(jù) 。
ES本質(zhì)上是一個支持全文搜索的分布式內(nèi)存數(shù)據(jù)庫,特別適用于構建搜索系統(tǒng),比如內(nèi)容檢索、文本檢索、日志檢索。 其原因是采用了倒排索引。
什么是倒排索引呢?
倒排索引是一種特別為搜索而設計的索引結構。
先對需要索引的字段進行分詞,然后以分詞為索引組成一個查找樹,這樣就把一個全文匹配的查找轉換成了對樹的查找。
倒排索引相比于一般數(shù)據(jù)庫采用B樹索引,其寫入和更新的性能比較差,因此倒排索引只適合全文搜索,不適合更新頻繁的交易類數(shù)據(jù)。
ES機制
Elasticsearch的?件存儲, Elasticsearch是?向?檔型數(shù)據(jù)庫,?條數(shù)據(jù)在這?就是?個?檔,?JSON作為?檔序列化的格式,比如下面這條用戶數(shù)據(jù):
{
"name" : "John",
"sex" : "Male",
"age" : 25,
"birthDate": "1990/05/01",
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
也就是說Elasticsearch比較適合存儲非結構化或半結構化數(shù)據(jù)。
?Mysql這樣的數(shù)據(jù)庫存儲就會容易想到建??張User表,有?戶信息的字段等,在Elasticsearch?這就是?個?檔,當然這個?檔會屬于?個User的類型,各種各樣的類型存在于?個索引當中。這?有?份將Elasticsearch和關系型數(shù)據(jù)術語對照表:
關系數(shù)據(jù)庫【數(shù)據(jù)庫關系系統(tǒng)】 ? 數(shù)據(jù)庫 ? 表 ? ? ? 列(Columns)
Elasticsearch ? 索引(Index) ? 類型(type) ? ?檔(Docments) ? 字段(Fields)
ES安裝使用
-
官方安裝:https://www.elastic.co/cn/downloads/elasticsearch
-
安裝案例:https://blog.csdn.net/willingtolove/article/details/118017928
-
Python Client:https://elasticsearch-py.readthedocs.io?
本文主要介紹了常用的幾種向量檢索庫,在機器學習集訓營18期中的電商商品檢索系統(tǒng)項目中有更多相關講解,包含基于關鍵詞的檢索和基于向量相似度的檢索。
免費試聽
如果你是應屆生或打算從傳統(tǒng)IT轉型AI,想要系統(tǒng)深入地學習,建議你看下七月在線的 【機器學習集訓營】 。
其集訓營每一期都涌現(xiàn)出了很多offer,或應屆研究生高薪就業(yè),或從Java等傳統(tǒng)IT行業(yè)成功轉型AI拿到年薪三四十萬 ,部分超過四十萬拿到五十萬,有的甚至年薪百萬。

如果你已經(jīng)有一定基礎想要繼續(xù)進行深度學習、挑戰(zhàn)高薪,也可以看一下七月在【高級小班】系列課程,包含CV、NLP、推薦等方向!
??掃碼查看課程 ??
對上面集訓營、高級班感興, 可掃碼 (或找七月在線任一老師)申請免費試聽,每天有5個免費試聽名額!
(掃碼?。合聢D 8本電子書+免費試聽課程 )
需要七月在線內(nèi)部電子書的同學也可找老師要。
?↓以下8本書電子版免費領,直接送↓


