使用 Milvus 向量資料庫進行可擴展且快速的相似性搜尋
封面圖片
簡介
在這篇文章中,我們將介紹一些與向量資料庫和大規模相似性搜尋相關的有趣方面。在現今快速發展的世界中,我們看到了新的技術、新的業務、新的資料來源,因此我們需要不斷使用新的方式來儲存、管理和利用這些資料以獲得洞察力。數十年來,結構化的表格資料一直儲存在關聯式資料庫中,而商業智慧 (Business Intelligence) 的興盛則在於分析這些資料並從中擷取洞察力。然而,考慮到目前的資料狀況,「超過 80-90% 的資料是文字、視訊、音訊、Web 伺服器日誌、社交媒體等非結構化資訊」。機構一直在利用機器學習和深度學習的力量來嘗試從這些資料中擷取洞察力,因為傳統的基於查詢的方法可能並不足夠,甚至無法實現。從這些資料中萃取有價值的洞察力有著尚未開發的巨大潛力,而我們才剛剛起步!
「由於世界上大多數的資料都是非結構化的,因此分析這些資料並對其採取行動的能力帶來了巨大的商機」。- Mikey Shulman,Kensho ML 主管
非結構化資料,顧名思義,沒有隱含的結構,就像由行和列組成的表格(因此稱為表格或結構化資料)。與結構化資料不同的是,沒有簡單的方法將非結構化資料的內容儲存在關聯性資料庫中。利用非結構化資料進行洞察有三大挑戰:
- 儲存:一般的關聯式資料庫適合儲存結構化資料。雖然您可以使用 NoSQL 資料庫來儲存這些資料,但若要處理這些資料以擷取正確的表達方式,從而為大規模的 AI 應用程式提供動力,則會增加額外的開銷。
- 表達方式:電腦無法像我們一樣理解文字或影像。它們只能理解數字,因此我們需要將未建構的資料轉換成一些有用的數字表示,通常是向量或嵌入。
- 查詢:您無法像結構化資料的 SQL 一樣,直接根據確定的條件語句來查詢非結構化資料。試想一個簡單的例子:您嘗試在一張您最喜歡的鞋子照片中搜尋相似的鞋子!您無法使用原始像素值進行搜尋,也無法表示鞋子的形狀、尺寸、款式、顏色等結構性特徵。現在試想一下,要對數百萬雙鞋子進行搜尋!
因此,為了讓電腦能夠理解、處理和表示非結構化資料,我們通常會將它們轉換成密集向量,也就是常說的嵌入。
圖一
目前有多種方法,特別是利用深度學習的方法,包括用於影像等視覺資料的卷繞神經網路 (CNN),以及用於文字資料的 Transformers,這些方法可用於將此類非結構化資料轉換為嵌入式資料。Zilliz有一篇很好的文章,涵蓋了不同的嵌入技術!
僅儲存這些嵌入向量是不夠的。我們還需要能夠查詢並找出相似的向量。為什麼這麼問?大多數的實際應用程式都是以向量相似性搜尋為基礎的 AI 解決方案。這包括 Google 的視覺 (影像) 搜尋、Netflix 或 Amazon 的推薦系統、Google 的文字搜尋引擎、多模式搜尋、資料重複刪除等等!
以大規模儲存、管理和查詢向量並不是一件簡單的工作。您需要專門的工具,而向量資料庫是最有效的工具!在本文中,我們將介紹以下幾個方面:
讓我們開始吧
矢量和矢量相似性搜索
之前,我們已經確認將圖像和文字等非結構化資料表示為向量的必要性,因為電腦只能理解數字。我們通常會利用人工智能模型,更明確地說是深度學習模型,將非結構化資料轉換為機器可以讀取的數值向量。一般而言,這些向量基本上是浮點數的清單,合起來代表底層項目 (影像、文字等)。
瞭解向量
考慮到自然語言處理 (NLP) 的領域,我們有許多單字嵌入模型,例如Word2Vec、GloVe 和 FastText,這些模型可以幫助我們將單字表示成數字向量。隨著時間的推移,我們看到了Transformer模型的崛起,例如BERT,它可以用來學習上下文嵌入向量以及整個句子和段落的更好表示。
同樣地,在電腦視覺領域中,我們也有卷積神經網路 (CNN)等模型,可以協助從影像和視訊等視覺資料中學習表達。隨著 Transformers 的興起,我們也有了視覺 Transformers,它可以比一般的 CNN 有更好的表現。
圖二
這種向量的優勢在於,我們可以利用它們來解決實際世界的問題,例如視覺搜尋,您通常上傳一張照片,然後獲得包括視覺相似圖片的搜尋結果。Google 將此作為其搜尋引擎中非常受歡迎的功能,如下圖所示。
圖三
這類應用程式的動力來自於資料向量和向量相似性搜尋。如果您考慮 X-Y 直角坐標空間中的兩個點。兩點之間的距離可以用簡單的歐氏距離(euclidean distance)來計算,如下式所示。
圖四
現在假設每個資料點都是具有 D 維度的向量,您仍然可以使用歐氏距離或其他距離指標 (例如 hamming 或余弦距離) 來找出兩個資料點彼此之間的距離。這有助於建立一個接近性或相似性的概念,而這個概念可以用來做為一個可量化的指標,使用向量找出給定參考項目的相似項目。
瞭解向量類似性搜尋
向量類似性搜尋通常稱為最近鄰 (NN) 搜尋,基本上是計算參考項目(我們要尋找類似項目)與現有項目集合(通常在資料庫中)之間的成對類似性(或距離),並傳回前 'k「 個最近鄰,也就是前 」k' 個最相似的項目。計算相似性的關鍵元件是相似性公制,可以是歐氏距離、內積、余弦距離、漢明距離等。距離越小,向量就越相似。
精確近鄰 (NN) 搜尋的挑戰在於可擴展性。您需要每次計算 N 個距離 (假設有 N 個現有項目),才能得到相似的項目。這可能會變得超慢,尤其是如果您沒有在某處儲存資料並編入索引 (例如向量資料庫!)。為了加快計算速度,我們通常會利用近似近鄰搜尋 (approximate nearest neighbor search),也就是常說的 ANN 搜尋,最後將向量儲存到索引中。索引有助於以智慧的方式儲存這些向量,以便快速檢索參考查詢項目的「近似」近鄰。典型的 ANN 索引方法包括
- 向量變換:這包括對向量增加額外的變換,例如降維(例如 PCA \ t-SNE)、旋轉等。
- 向量編碼:這包括應用基於資料結構的技術,例如區域敏感切分 (LSH)、量化、樹狀等,有助於更快速地檢索相似項目。
- 非窮盡搜尋方法:這主要是用來防止窮盡搜尋,包括鄰近圖表、倒轉索引等方法。
要建立任何向量類似性搜尋應用程式,您需要一個資料庫,以協助您進行有效率的儲存、索引和大規模查詢(搜尋)。進入向量資料庫!
什麼是向量資料庫?
既然我們現在瞭解向量如何用來表示非結構化資料,以及向量搜尋如何運作,我們就可以將這兩個概念結合起來,建立向量資料庫。
向量資料庫是可擴充的資料平台,用來儲存、索引和查詢使用深度學習模型從非結構化資料(影像、文字等)產生的嵌入向量。
處理大量向量進行相似性搜尋 (即使有索引) 的成本可能超高。儘管如此,除了指定您所選擇的索引演算法和相似度指標之外,最好、最先進的向量資料庫應該可以讓您在數百萬或數十億個目標向量中進行插入、索引和搜尋。
矢量資料庫主要應滿足以下關鍵需求,以考量在企業中使用的強大資料庫管理系統:
- 可擴充:向量資料庫應該能夠為數十億個嵌入向量建立索引並執行近似近鄰搜尋。
- 可靠:矢量資料庫應該能夠處理內部故障,而不會造成資料丟失,並將操作影響降至最低,即具有容錯性。
- 快速:查詢和寫入速度對向量資料庫非常重要。對於 Snapchat 和 Instagram 等平台而言,每秒可上傳數百張或上千張新圖片,因此速度成為極為重要的因素。
向量資料庫不只是儲存資料向量。它們還要負責使用有效率的資料結構來索引這些向量,以便快速擷取,並支援 CRUD (建立、讀取、更新及刪除) 作業。向量資料庫最好也能支援屬性篩選,也就是基於元資料欄位(通常是標量欄位)進行篩選。一個簡單的例子是根據特定品牌的影像向量來擷取相似的鞋子。在此,品牌就是篩選所依據的屬性。
圖五
上圖展示了我們即將討論的向量資料庫Milvus 如何使用屬性篩選。Milvus將位元掩碼 (bitmask) 的概念引進篩選機制,在滿足特定屬性篩選條件的基礎上,保留位元掩碼為 1 的類似向量。更多相關詳情請參閱這裡。
Milvus - 全球最先進的向量資料庫
Milvus是一個開放原始碼的向量資料庫管理平台,專為大規模向量資料和簡化機器學習作業 (MLOps) 而打造。
圖六
Zilliz 是建立世界上最先進向量資料庫Milvus 背後的組織,以加速下一代資料結構的發展。Milvus 目前是LF AI & Data Foundation的畢業專案,專注於管理海量非結構化資料集的儲存與搜尋。該平台的效率和可靠性簡化了大規模部署 AI 模型和 MLOps 的過程。Milvus 的應用範圍廣泛,涵蓋藥物發現、電腦視覺、推薦系統、聊天機器人等。
Milvus 的主要功能
Milvus 擁有許多實用的特色與功能,例如
- 在萬億向量資料集上的驚人搜尋速度:在萬億向量資料集上,向量搜尋與擷取的平均延遲時間以毫秒為單位。
- 簡化非結構化資料管理:Milvus 擁有專為資料科學工作流程設計的豐富 API。
- 可靠、永續的向量資料庫:Milvus 內建的複製與故障移轉/故障回復功能,可確保資料與應用程式永遠維持業務連續性。
- 高度可擴充與彈性:元件層級的擴充能力可依需求擴充或縮小。
- 混合搜尋:除了向量之外,Milvus 還支援 Boolean、String、整數、浮點數等資料類型。Milvus 將標量篩選與強大的向量相似性搜尋結合在一起 (如前面的鞋子相似性範例所示)。
- 統一的 Lambda 架構:Milvus 結合了資料儲存的串流處理與批次處理,以平衡及時性與效率。
- 時間旅行:Milvus 會為所有資料插入和刪除作業維持時間線。它允許使用者在搜尋中指定時間戳記,以擷取指定時間點的資料檢視。
- 社群支援及業界認可:Milvus 擁有超過 1,000 家企業用戶,在GitHub 上有 10.5K+ 顆星星,並且是一個活躍的開放原始碼社群,因此當您使用 Milvus 時,您並不孤單。作為LF AI & Data 基金會下的畢業專案,Milvus 獲得了機構的支持。
向量資料管理與搜尋的現有方法
以向量相似性搜尋為動力建立 AI 系統的常見方法,是將近似近鄰搜尋 (Approximate Nearest Neighbor Search, ANNS) 等演算法與開放原始碼程式庫搭配使用,例如
- Facebook AI 類似性搜尋 (FAISS):此架構可對密集向量進行有效率的相似性搜尋與聚類。它所包含的演算法可在任何大小的向量集中進行搜尋,甚至可搜尋到可能無法放入 RAM 的向量。它支援倒轉多重索引和乘積量化等索引功能。
- Spotify 的 Annoy (Approximate Nearest Neighbors Oh Yeah):此架構使用隨機投影並建立一棵樹,以針對密集向量的規模啟用 ANNS。
- Google 的 ScaNN (Scalable Nearest Neighbors):此架構可在規模上執行有效率的向量相似性搜尋。包含實作,其中包括最大內積搜尋 (MIPS) 的搜尋空間剪枝與量化。
雖然這些函式庫各有其用處,但由於一些限制,這些演算法與函式庫的組合並不等同於完整的向量資料管理系統,例如 Milvus。現在我們將討論其中一些限制。
現有方法的限制
上一節所討論的現有向量資料管理方法有以下的限制:
- 彈性:現有系統通常會將所有資料儲存在主記憶體中,因此無法輕鬆地在多台機器上以分散式模式執行,也不適合處理大量資料集。
- 動態資料處理:一旦將資料輸入現有系統,通常會假設資料是靜態的,這使得動態資料的處理變得複雜,也使得近乎即時的搜尋變得不可能。
- 進階查詢處理:大多數工具都不支援進階查詢處理 (例如:屬性過濾、混合搜尋和多向量查詢),而這對於建立支援進階過濾的真實世界相似性搜尋引擎是非常重要的。
- 異質運算最佳化:很少有平台能同時在 CPU 和 GPU(FAISS 除外)上為異質系統架構提供最佳化,導致效率上的損失。
Milvus 嘗試克服所有這些限制,我們將在下一節詳細討論。
Milvus 的優勢 - 瞭解 Knowhere
Milvus 嘗試以下列方式來處理並成功解決建立在低效向量資料管理和相似性搜尋演算法之上的現有系統的限制:
- 提供多種應用程式介面的支援(包括 Python、Java、Go、C++ 的 SDK 和 RESTful API),增強了靈活性。
- 它支援多種向量索引類型 (例如:基於量化的索引和基於圖的索引),以及進階的查詢處理
- Milvus 使用日誌結構化的合併樹 (LSM tree) 來處理動態向量資料,保持資料插入和刪除的效率,並能即時進行搜尋。
- Milvus 還針對現代 CPU 和 GPU 上的異質運算架構提供最佳化,讓開發人員可針對特定場景、資料集和應用環境調整系統。
Knowhere 是 Milvus 的向量執行引擎,它是一個操作介面,用來存取系統上層的服務,以及系統下層的向量相似性搜尋程式庫,例如 Faiss、Hnswlib、Annoy。此外,Knowhere 也負責異質運算。Knowhere 控制在哪個硬體 (例如 CPU 或 GPU) 上執行索引建立和搜尋請求。這就是 Knowhere 名字的由來 - 知道在哪裡執行作業。未來的版本將支援更多的硬體類型,包括 DPU 和 TPU。
圖七
Milvus 中的計算主要涉及向量和標量運算。Knowhere 只處理 Milvus 中向量的運算。上圖說明了 Milvus 中的 Knowhere 架構。最底層是系統硬體。第三方索引庫在硬體之上。然後,Knowhere 透過 CGO 與上面的索引節點和查詢節點互動。Knowhere 不僅進一步擴展了 Faiss 的功能,還優化了性能,並擁有多項優勢,包括支援 BitsetView、支援更多類似性指標、支援 AVX512 指令集、自動 SIMD 指令選擇以及其他性能優化。詳細資訊請見此處。
Milvus 架構
下圖展示 Milvus 平台的整體架構。Milvus 將資料流與控制流分開,並分為四層,在可擴充性及災難復原方面獨立運作。
圖八
- 存取層:存取層由一組無狀態代理伺服器組成,是系統的前端層,也是使用者的端點。
- 協調器服務:協調器服務負責叢集拓樸節點管理、負載平衡、時戳生成、資料宣告和資料管理。
- 工作節點:工作節點(或稱執行節點)執行由協調器服務發出的指令,以及由代理啟動的資料處理語言 (DML) 指令。Milvus 中的工作節點類似於Hadoop 中的資料節點或 HBase 中的區域伺服器。
- 儲存:這是 Milvus 的基石,負責資料的持久性。存儲層由元存儲、日誌代理和物件存儲組成。
請在這裡查看更多關於架構的詳細資訊!
使用 Milvus 執行視覺影像搜尋 - 使用案例藍圖
Milvus 等開放原始碼向量資料庫可讓任何企業以最少的步驟建立自己的視覺影像搜尋系統。開發人員可以使用預先訓練好的 AI 模型,將自己的圖像資料集轉換成向量,然後再利用 Milvus 來透過圖像搜尋類似產品。讓我們看看以下如何設計和建立這樣一個系統的藍圖。
圖九
在這個工作流程中,我們可以使用像towhee之類的開放原始碼架構,利用像 ResNet-50 之類的預先訓練模型,從圖片中萃取向量,然後輕鬆地在 Milvus 中儲存這些向量並建立索引,同時在 MySQL 資料庫中儲存圖片 ID 到實際圖片的映射。一旦資料被編入索引,我們就可以輕鬆地上傳任何新的圖片,並使用 Milvus 執行規模化的圖片搜尋。下圖顯示了一個可視化圖片搜尋範例。
圖十
感謝 Milvus,您可以查看 GitHub 上已開源的詳細教學。
總結
我們在這篇文章中涵蓋了相當多的內容。我們從表示未經建構的資料的挑戰開始,利用向量和向量相似性搜尋與 Milvus(一個開放源碼的向量資料庫)進行大規模搜尋。我們討論了 Milvus 結構的細節、驅動它的關鍵元件,以及如何使用 Milvus 解決真實世界問題的藍圖,也就是視覺影像搜尋。請嘗試使用Milvus 來解決您自己的實際問題!
喜歡這篇文章嗎?歡迎與我聯繫,討論更多內容或提供意見!
關於作者
Dipanjan (DJ) Sarkar 是資料科學領導人、Google 開發人員專家 - 機器學習、作家、顧問和 AI 顧問。連線:http://bit.ly/djs_linkedin
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word