圖像搜索的新紀元:Milvus與CLIP模型相伴的搜圖引擎
1 背景介紹
??作為電商公司的風控部門,承擔著維護平臺內容安全的職責。因為政策的調整,或者一些突發情況,我們需要回溯線上歷史的商品圖片、用戶頭像信息等,確保平臺的圖片內容的合規性。??在以前我們會讓算法同學離線將平臺數據用相關的模型跑一遍,但是這會用到大量的計算資源,并且會花費幾天甚至更長的時間。??我們是否有更便捷的辦法對圖片做搜索,比如像普通的數據庫那樣,通過內容甚至另一張圖去搜索圖片呢?可否將文本、圖片等信息轉換成另一種可以對比,可以計算的形式呢???解決方案:可以通過深度模型提取出圖像的特征向量,建立向量庫,然后用目標文本或圖片的特征向量進行搜索匹配,得出最接近的結果。CLIP模型提供了生成文本和圖片特征向量的能力,Milvus向量數據庫提供了對海量向量的存儲、管理和檢索能力。
圖片
2 CLIP模型
2.1 關于CLIP模型
??CLIP(Contrastive Language-Image Pretraining)模型是一種由OpenAI開發的多模態預訓練模型,結合了圖像和文本的理解能力。CLIP的目標是讓模型能夠理解圖片和文本之間的關聯關系,從而能夠在語言和視覺任務上表現出色。CLIP模型的主要作用是在圖像和文本領域實現多模態的交叉理解能力,拓展了計算機視覺和自然語言處理的邊界,為各種任務提供了更全面和準確的解決方案。
2.2 CLIP模型的應用
??轉轉風控主要使用CLIP對圖像根據文本提示詞進行分類風險識別,同時因為CLIP模型輸出為特征向量,所以同時使用Milvus向量數據庫保存這些圖片的特征向量。
圖片
3 Milvus
3.1 什么是Milvus
??Milvus是一款云原生向量數據庫,它具備高可用、高性能、易拓展的特點,用于海量向量數據的實時召回。Milvus 基于 FAISS、Annoy、HNSW 等向量搜索庫構建,核心是解決稠密向量相似度檢索的問題。
3.2 Milvus核心概念
非結構化數據:非結構化數據指的是數據結構不規則,沒有統一的預定義數據模型,不方便用數據庫二維邏輯表來表現的數據,包括文本、音頻、視頻等。非結構化數據可以使用深度學習模型或者機器學習模型轉化為向量后進行處理。特征向量:向量又稱為embedding vector,是指由embedding技術從離散變量轉變而來的連續向量。在數學表示上,向量是一個由浮點數或者二值型數據組成的n維數組。向量相似度檢索:相似度檢索是指將目標對象與數據庫中數據進行比對,并召回最相似的結果。同理,向量相似度檢索返回的是最相似的向量數據。近似最近鄰搜索(ANN)算法能夠計算向量之間的距離,從而提升向量相似度檢索的速度。如果兩條向量十分相似,這就意味著他們所代表的源數據也十分相似。Collection-集合:包含一組Entity,可以等價于關系型數據庫系統中的表。Entity-實體:包含一組Field。Field與實際對象相對應。對應關系型數據庫中的行。Field-字段:Entity的組成部分。Field可以是結構化數據,例如數字和字符串,也可以是向量。對應關系型數據庫中的表字段。Partition-分區:分區是集合(Collection)的一個分區。Milvus 支持將收集數據劃分為物理存儲上的多個部分。索引:索引基于原始向量數據構建,可以提高對Collection數據搜索的速度。支持倒排列表、k-d樹以及高維哈希等。這種索引結構可以在大規模向量數據集中高效地定位相似向量。
3.3 相似性計算原理
??常用的向量相似度度量方法包括余弦相似度、歐氏距離、漢明距離等。此處以歐氏距離為例:中學學過的二維空間的歐氏距離:
圖片
三維空間的歐式距離:
圖片
以此類推,多維空間的歐式距離:
圖片
3.4 Milvus系統架構
Milvus 2.0 是一款云原生向量數據庫,采用存儲與計算分離的架構設計,所有組件均為無狀態組件,極大地增強了系統彈性和靈活性。
圖片
整個系統分為四個層次:接入層(Access Layer):系統的門面,由一組無狀態 proxy 組成。對外提供用戶連接的 endpoint,負責驗證客戶端請求并合并返回結果。協調服務(Coordinator Service):系統的大腦,負責分配任務給執行節點。協調服務共有四種角色,分別為 root coord、data coord、query coord 和 index coord。執行節點(Worker Node):系統的四肢,負責完成協調服務下發的指令和 proxy 發起的數據操作語言(DML)命令。執行節點分為三種角色,分別為 data node、query node 和 index node。存儲服務 (Storage):系統的骨骼,負責 Milvus 數據的持久化,分為元數據存儲(meta store)、消息存儲(log broker)和對象存儲(object storage)三個部分。各個層次相互獨立,獨立擴展和容災。
3.5 選擇Milvus的理由
高性能:性能高超,可對海量數據集進行向量相似度檢索。Milvus不但集成了業界成熟的向量搜索技術如Faiss和SPTAG,Milvus也實現了高效的NSG圖索引。同時,Milvus團隊針對Faiss IVF索引進行了深度優化,實現了CPU與多GPU的融合計算,大幅提高了向量搜索性能。Milvus可以在單機環境下完成SIFT1b十億級向量搜索任務。高可用、高可靠:Milvus支持在云上擴展,其容災能力能夠保證服務高可用。混合查詢:Milvus支持在向量相似度檢索過程中進行標量字段過濾,實現混合查詢。開發者友好:支持多語言、多工具的Milvus生態系統。Milvus提供了向量數據管理服務,以及集成的應用開發SDK(Java/Python/C++/RESTful API)。相比直接調用Faiss和SPTAG那樣的程序庫,Milvus開發使用更便捷,數據管理更簡單。
4 轉轉風控的實踐
4.1 Milvus的部署方式
??Milvus支持基于Docker Compose的單例部署模式,以及基于k8s的集群部署模式。目前我們使用的是單例部署模式,1是對于我們的使用場景而言,單機性能目前沒有問題;2是單例部署模式更簡單易上手。
4.2 特征向量的生成
??前文已經說過我們使用CLIP模型來進行特征向量的生成。原因主要有2個,1是節省計算資源,CLIP模型已經在線上應用,再用其它模型進行特征向量生成需要再進行一次計算,浪費計算資源;2是CLIP模型本身提供了非常好的文本和圖片交叉理解能力,為文搜圖提供了基礎。
4.3 索引結構的選擇
??索引的選擇對于向量召回的性能至關重要,Milvus支持了Annoy,FAISS,HNSW,DiskANN等多種不同的索引,用戶可以根據對延遲,內存使用和召回率的需求進行選擇。對于我們的使用場景,我們對響應時長要求不高,主要為離線或后臺使用,但是要求100%召回,不能漏召回,所以使用近似查找的壓縮索引都不符合要求,只能使用FAISS的Flat索引。
4.4 數據過濾的實現
??基于產品的使用的數據過濾需求,以及需要對歷史數據進行定期清理的目標,目前我們是根據時間以及數據源類型創建的分區。??為什么沒有使用Milvus的標量過濾特性去做過濾呢???主要是基于性能考量,Milvus使用的是前過濾,即先做標量過濾生成Bitset,在向量檢索的過程中基于Bitset去除掉不滿足條件的Entity。在一些場景下標量過濾不僅不會加速查詢反而會導致性能變差。而且目前我們的過濾場景很確定,用指定分區來實現數據過濾的方式可以獲得更好的性能。
4.5 一次搜索結果展示
圖片
??圖片為以薩摩耶為搜索詞,搜索2023-11-19至2023-11-23的商品數據得出的相似度最高的top20的結果。
關于作者
許作紅,轉轉風控后端研發工程師,主要負責風控模型工程的開發維護。熱愛運動,擁抱生活。