作者:
侯宇,業務架構師
在深度學習的浪潮下,無論是文本、語音、圖像、時間序列還是消費者特徵,都可以用一組形如 [0.6, 0.3, 0.7,......0.19] 的實數來表徵。這一組實數被稱為特徵向量。
那什麼是向量檢索呢[1]?向量檢索就是在一個給定向量數據集合中,檢索出與查詢向量最相近的Topk個向量。
|常見應用場景
圖片、視頻、語音、文本等非結構化數據可以通過人工智慧技術(深度學習算法)提取特徵向量,然後通過對這些特徵向量的計算和檢索來實現對非結構化數據的分析與檢索。針對向量檢索常見的應用場景有[2]:
圖片識別:以圖搜圖,通過圖片檢索圖片。具體應用如:車輛檢索和商品圖片檢索等。
視頻處理:針對視頻信息的實時軌跡跟蹤。
自然語言處理:基於語義的文本檢索和推薦,通過文本檢索近似文本。
聲紋匹配,音頻檢索。
文件去重:通過文件指紋去除重複文件。
新藥搜索,基因篩選。
|面臨的挑戰
向量檢索麵臨的挑戰主要在以下幾個方面:
高維數據:向量數據維度通常是 256/512 維。
海量數據:在常用的圖片或視頻處理場景中,向量數據通常在億級別。
高召回:為保證檢索效果,精度召回率通常要求 95% 以上。
高性能:為保證用戶體驗,向量檢索的響應要求毫秒級。
|向量檢索服務
目標
我們知道向量的維度很高,並且規模龐大,這就決定了向量數據在計算時會佔用較多內存。比如在 NLP 中,一個詞向量可以表示成一個 256 維的矩陣,內存佔用將是:
一個詞向量:4 (float浮點數) * 256 = 1,024 bytes = 1 K
百萬數據集:1,000,000 * 1 K / 1,024 ≈ 1 G
億級數據集:1 G * 100 ≈ 100 G
可以看出在億級別的詞向量數據規模下,佔用內存達到上百 GB。那麼除了應對以上挑戰,如何減少內存佔用也是向量檢索服務的目標。
本質
向量檢索服務的本質就是把高維空間的數據切分到子空間進行搜索。通過對向量建立索引,減少搜索範圍,實現高性能的向量數據分析。關於向量索引的分類有:
基於量化的索引
通過聚類方法把空間裡的點劃分成多個單元。那麼在查詢時先把目標向量與所有單元的中心做距離比較,選出最近單元,得到最終結果。
基於圖的索引
將圖的中心位置設為導航點,然後通過特定的選邊策略來控制每個點的出度。使得搜索時既能減少內存使用,又能快速定位到目標位置附近。
基於樹的索引
用超平面把高維空間分割成多個子空間,並把這些子空間以樹型結構存儲的索引方式。
基於哈希的索引
基於哈希的索引通過設計一個哈希函數,使特徵向量經過哈希函數映射後得到哈希值。
向量檢索服務
向量檢索的軟體生態目前並不是十分成熟。當前 GitHub 上的向量檢索以向量檢索算法庫為主。然而工業界都需要將向量檢索庫服務化,對其進行封裝和優化,以適應各自的使用場景。
按照向量索引構建與向量查詢是否拆分的原則,可以將向量檢索服務分為兩種:
向量索引構建與向量查詢分離,索引作為離線服務,查詢作為在線服務。優點是查詢與索引構建分離,對於查詢和構建的並發任務而言互相不幹涉;缺點是需要較多的伺服器,並且離線與在線的數據一致性也是一個問題。
向量索引構建與向量查詢不分離,以 Milvus 為例。優點是可以利用較少的硬體資源來完成查詢和索引構建的任務,可以充分利用磁碟資源存儲原始向量,提供查詢原始向量的能力;缺點是向量查詢和索引構建無法並發,會出現資源搶佔,限制了多個業務並發處理的能力。
|基於 Milvus 的文本召回解決方案
Milvus 是一款開源向量相似度搜尋引擎,建立在Faiss、NMSLIB、Annoy等向量索引庫基礎之上,具有功能強大、穩定可靠以及易於使用等特點。本文將介紹一個基於 Milvus 實現的文本召回解決方案。
在推薦系統、搜索系統中,文本召回是整個系統架構的重要組成部分。在深度學習來臨之前,文本召回使用的是倒排索引技術。但是隨著文本內容的增多和場景含義的豐富, 同一個詞在不同文本中的意思可能不盡相同。然而倒排索引中的詞本身是無法表徵文本含義的,導致召回的文本充滿了歧義。
利用文本向量化技術可以對文本含義進行表徵,再利用向量檢索技術來召回相似文本,可以在一定程度上避免倒排召回的缺點。
文本向量化
在本文的應用場景中,用戶問句是最重要的文本形式。問句長度一般情況下為10~30 個詞左右。目前生成句向量的方式有很多種:
Tfidf:此方式同倒排一樣,無法表徵句子的意思。
分詞,訓練詞向量模型,然後將問句中的詞的詞向量相加求平均;這在一定程度上表徵了句子信息,在絕大多數場景下夠用。
利用 Bert 等預訓練模型獲取相關的句向量。
Milvus 提供支持
Milvus 是一個開源的向量檢索中間件,支持常見的向量檢索場景,具備以下特點:
支持基於 Python / Java / Go / C++ 的 SDK 和 RESTful API
支持 Annoy、Faiss、HNSW 等多種算法庫
支持 CPU 和 GPU 運算
以 collection 為基本的管理單元,在 collection 中再劃分 partition 為基準,支持粗粒度與細粒度的數據管理
支持原始向量存儲與查詢
系統方案
本文介紹的文本召回系統主要分為以下幾個步驟:
創建一個 collection,用於插入向量和構建向量索引。
在查詢時,指定 collection 進行向量檢索,返回 Topk 個向量。
當存在索引更新的時候,則建立一個新的 collection,重複步驟1。當新的 collection 及索引建立完畢,手動釋放掉舊的 collection。此步驟一般放在低頻訪問時段。
整體系統架構及流程如下圖所示:
|總結
從向量檢索中間件的角度來衡量,Milvus 是極具市場潛力的開源組件。Milvus 本身的豐富特性就在一定程度上可以靈活地支持業務場景。
從業務場景的角度考慮, 擁有了 Milvus 可以更加專注地做業務邏輯上的處理和適配,而不用擔心向量檢索的速度與讀取。這使得業務開發人員更專注於業務上的邏輯變更,更有利於業務的快速迭代和演進。此外,Milvus 的 RoadMap 能看出它當前是一個向量檢索引擎,但是後續會向混合查詢方向優化,具備更強的非結構化數據的存儲和查詢能力。
參考文獻
[1]https://zhuanlan.zhihu.com/p/90677337
[2]https://milvus.io/cn/docs/v0.6.0/reference/application.md
| 歡迎加入 Milvus 社區
github.com/milvus-io/milvus | 源碼
milvus.io | 官網
zhihu.com/org/zilliz-11/columns | 知乎