ChatGPT盛行的當下,向量數據庫為大模型配備了一個超級大腦
你是否有過這樣的經歷:你在網上看到一張壁紙,畫面中的雪山和湖泊令人心馳神往,你想知道這是哪個國家的美景,卻不知道如何搜索;或者,在閱讀一篇文章時,你想深入了解這個話題,尋找更多的觀點和資料,卻不知道該如何精確描述;又或者,當你在聆聽一首歌曲時,你想尋找更多同樣風格或情感的歌曲,卻不知道如何分類。這時,你需要的是一個能夠理解你的意圖,為你提供最相關的結果,讓你輕松找到你想要的信息的工具。
這就是 Vector Data Base (VectorDB, 向量數據庫),它就像一個超級大腦,幫助你解決這些問題!
Vector DB 的用途遠不止于此,它還能夠幫助像 ChatGPT 這樣的智能系統,從海量的數據中快速檢索出最合適的答案,提高它們的準確性和效率。在當前大家普遍面臨算力不足,難以對大語言模型進行微調的情況下,為大語言模型配備一個知識庫(超級大腦)就顯得尤為重要。這就像給大語言模型提供了一份小抄,使其能夠更好地服務于我們。
Vector 是什么 —— 計算機理解世界的起點
在我們深入了解 Vector DB 之前,讓我們先來簡單理解(或回顧)一下什么是 Vector,其實它也就是我們在高中數學或者大學數學里學到的向量,只不過維度比當時的直角坐標系里的二維多一點而已(或許多到了 512 維)。在許多學術論文中,你可能更熟悉它的另一個名字 —— 嵌入(Embedding)。為了實現我們前面提到的超級大腦,我們首先需要讓這個大腦理解各種信息,而這就是嵌入的作用。
你可能會問,什么是嵌入呢?想象一下,你正在看一部電影,你的大腦會自動將電影中的人物、情節、對話等信息轉化為你可以理解的形式。這就是一種嵌入的過程。很奇妙對吧,大腦就這么理解他們了。同樣,我們也可以讓計算機做類似的事情,將各種類型的數據轉化為它可以理解的形式,而計算機接受的也就是數字,也就是向量。回顧一下高中數學就好了,二維向量可以表征一個直角坐標系里的每個點,也就表征了這個直角坐標系里的所有信息了。那如果我們把維度無限拉大,他就可以表征無限多的信息。你可能在一些科幻電影中看到過,說高等生物可能不會像我們一樣以三維的肉體存在,他們可能存在于更高的維度。比如時間就是第四維,跳脫之后就變成了四維生物。這其實就說明了為什么嵌入可以更好的理解這個世界,因為三維只能容納我們的肉體,而高維的世界,才存在著我們的靈魂。
理解了為什么一串數字可以幫助計算機理解世界之后,你可能會考慮到下一步更實際的問題,如何將數據轉換為向量呢?這就要靠我們在 AI 界做出的進步了,我們研究出了很多模型,可以將任意類型的數據映射到一個高維空間中,生成一個向量,這個向量就是數據的嵌入表示。
嵌入方法有很多種,例如文本嵌入(text embedding),可以將文字轉換為向量;圖像嵌入(image embedding),可以將圖片轉換為向量;音頻嵌入(audio embedding),可以將聲音轉換為向量;視頻嵌入(video embedding),可以將視頻轉換為向量;甚至還有多模態嵌入(multimodal embedding),可以將不同類型的數據轉換為同一個空間中的向量,比如一個電影包含聲音和畫面,那如果要更全面的表征這個電影,我們就需要結合音頻嵌入和視頻嵌入,也就是多模態嵌入了。圖 1 展示了幾組文本嵌入的情況,一個最簡單的例子就是 king - man + woman = queen,簡單的小學加減法。
圖 1. 三維情況下的向量圖解。
有了嵌入方法,我們就可以將各種數據轉換為向量,并存儲在 Vector DB 中。當我們想要搜索某種數據時,我們只需要提供一個查詢向量,這個查詢向量可以是同類型或不同類型的數據,只要它能夠表示我們想要找到的信息或標準。然后,Vector DB 會使用一種相似度度量(similarity measure),來計算查詢向量和存儲向量之間的距離或相似度,并返回最相似或最相關的向量列表。我們就可以從這個列表中找到我們想要的數據,或者進一步縮小范圍。當然,向量檢索近年來的火熱與大模型能力的提升是密切相關的。大模型通常能更好地理解和生成更高維度、更復雜的數據表示,這為向量檢索提供了更精確、更豐富的語義信息。反之,向量檢索也能為大模型提供信息的補充和長上下文的處理能力,從而進一步提高模型的性能。此外,向量檢索在大模型的訓練和應用中起著關鍵作用。雖然向量數據庫不是進行向量檢索的唯一方式,但它確實是所有方式中最高效、最便利的一種。
在后續的文章中,我們將進一步探討為什么向量數據庫在構建未來 AI 系統時是必不可少的關鍵環節。
Vector DB 是什么 —— 一瓶數據庫專有的智慧藥水
在我們了解了 VectorDB 里存的是什么之后,再結合我們引言里的介紹,VectorDB 的真容也就呼之欲出了 —— 它是一種新型的數據庫,它新在它存的是 Embeddings(嵌入)。這個新并不是為了新而新,從傳統的直接存儲內容轉到存儲向量,就像是給數據庫喝了瓶智慧藥水,讓它變得更聰明,更強大。
- Vector DB 就像是一個超級偵探,它可以讓你根據內容或意思來搜索數據,而不是根據標簽或關鍵詞來搜索數據。這就好像你在一個無序的圖書館里找書,不需要知道書的 ISBN 號,只要告訴 Vector DB 你想要的書的內容,它就能幫你找到。
- Vector DB 還可以是一個超級翻譯機,它可以讓你用一種類型的數據來搜索另一種類型的數據。這就好像你只知道一首歌的旋律,但不知道歌名,Vector DB 就能幫你找到這首歌的信息。
- Vector DB 也可以被理解為一個超級搜索引擎,它可以讓你在海量和復雜的數據中進行快速和準確地搜索。這就好像你在一個巨大的迷宮里,Vector DB 就是你的導航,幫你快速找到出口。
如最開始所說,VectorDB 不僅有以上這些好處,還有一個非常重要且熱門的應用場景,那就是與 LLM 結合。LLM 是指大型語言模型(Large Language Models),它們就像是一個超級作家,可以生成自然語言文本,或者理解和回答自然語言問題。但是,LLM 也有一些挑戰,例如缺乏領域知識,缺乏長期記憶,缺乏事實一致性等。
為了解決這些挑戰,Vector DB 就像是給 LLM 提供了一本百科全書,讓 LLM 可以根據用戶的查詢,在 Vector DB 中檢索相關的數據,并根據數據的內容和語義來更新上下文,從而生成更相關和準確的文本。這樣,LLM 就可以擁有一個長期記憶,可以隨時獲取最新和最全面的信息,也可以保持事實一致性和邏輯連貫性。
Vector DB 和 LLM 的結合有很多具體的例子,假設你正在使用一個基于 LLM 的聊天機器人,你問它:“最近有什么好看的電影嗎?”ChatGPT 本身只能回答他數據集里包含的信息(2021 年之前),而有了外接知識庫,機器人可以在 Vector DB 中搜索最近的電影評價向量,并返回一些高評價的電影。就像你問你的朋友推薦電影,他會根據他的記憶和你的口味給你推薦。
ChatGPT 本身像是一個耄耋老人,信息還停留在他年輕的時候,而加入了外界知識庫的 ChatGPT,搖身一變變成了你的同齡人朋友,你們都緊跟時事,只需要隨時去刷刷社交平臺(更新知識庫)就好了。
舉個例子,[1] 想要讓 ChatGPT 擁有 Numpy 的背景知識(如何做各種運算,比如求中位數、平均值等),但是它的文檔有 20 多頁,顯然是不能直接作為知識輸入給 ChatGPT 的(長度太長),然而,建立一個可以簡單查詢的 vectorDB 只需要以下幾行代碼。

然后,如果你想問這個文檔里的問題,所需的代碼依然很簡單:

最后,就會得到這個結果:

看到了吧,在現有大語言模型的理解能力下,我們已經不需要 fine-tune 了,只需要外接一個知識庫,就能很快地得到最新的知識。
簡單,好用。
Vector DB 的發展歷程 —— 好萊塢英雄成長史
Vector DB 的故事就像一部好萊塢大片中的勵志英雄,從默默無聞到大放異彩。它的起源可以追溯到生物技術和基因研究領域的興起。在 20 世紀 70 年代末,DNA 測序作為一個新興的研究領域開始引起人們的關注。為了存儲大量的 DNA 鏈數據,科學家們需要一種新的方法,這種方法需要能夠處理高維向量。這就是 Vector DB 的誕生,它是一種可以將任何類型的數據轉化為向量的數據庫,能夠計算數據之間的相似度,從而實現數據的分類、聚類和檢索等功能。
然而,這個時期的 Vector DB 還相當初級,它只能處理文本數據,無法處理圖像、音頻、視頻等其他類型的數據;它只能計算數據的表面相似度,無法計算數據的深層相似度;它只能處理靜態的數據,無法處理動態的數據。盡管如此,它已經展現出了其獨特的潛力和魅力。
在 Vector DB 出現之前,大家普遍使用的是關系型數據庫,如 MySQL、Oracle 等,這些數據庫以表格的形式存儲數據,適合存儲結構化數據,但對于非結構化數據,如文本、圖像、音頻等,處理起來就相對困難。而且,關系型數據庫在處理大規模數據時,性能會下降,不適合大數據處理。這就像是在一個擁擠的圖書館里找一本書,你知道它在哪個書架上,但是找到它還需要花費大量的時間。但是在當時,這已經足夠了。
隨著時間的推移,我們看到 Vector DB 在不同的領域和應用中不斷成長和進化。從 20 世紀 90 年代末到 2000 年初,美國國立衛生研究院和斯坦福大學都開始使用 Vector DB,他們利用 Vector DB 進行了一系列的基因研究,發表了多篇高質量的論文 [2]。隨著 2005 年到 2015 年間基因研究的深入和加速,Vector DB 也在并行中增長,像 UniVec 數據庫這樣的工具在 2017 年就已經被廣泛使用 [5],它們在基因序列比對、基因組注釋等領域發揮了重要作用 [3,4]。
此時,隨著數據類型和規模的多樣化,關系型數據庫的局限性也逐漸暴露出來。首先,關系型數據庫主要適用于結構化數據,對于非結構化數據,如文本、圖像、音頻等,處理起來就相對困難。其次,關系型數據庫在處理大規模數據時,性能會下降,不適合大數據處理。最后,關系型數據庫的查詢語言(如 SQL)雖然強大,但對于復雜的查詢和分析任務,可能需要編寫復雜的 SQL 語句,這對于非專業的用戶來說,可能是一個挑戰。
在 2017 年和 2019 年之間,我們見證了 Vector DB 的爆炸式增長,它開始被應用于自然語言處理、計算機視覺、推薦系統等領域。這些領域都需要處理大量和多樣化的數據,并從中提取有價值的信息。Vector DB 通過使用諸如余弦相似度、歐氏距離、Jaccard 相似度等度量方法 [6],以及諸如倒排索引、局部敏感哈希、乘積量化等索引技術 [18],實現了高效和準確的向量檢索。大家大多應該聽說過或者用過推薦系統、以圖搜圖 (淘寶的用圖搜產品)、哼唱搜歌、問答機器人等等,這些的內核都是 Vector DB。
就在我們以為故事已經到達高潮的時候,Vector DB 又給我們帶來了一個驚喜。在今年,Vector DB 開始被用于與大語言模型結合的應用。它為大語言模型提供了一個外部知識庫,使得大語言模型可以根據用戶的查詢,在 Vector DB 中檢索相關的數據,并根據數據的內容和語義來更新上下文,從而生成更相關和準確的文本。這些大語言模型通常使用深度神經網絡來學習文本數據中隱含的規律和結構,并能夠生成流暢和連貫的文本。Vector DB 通過使用諸如 BERT、GPT 等預訓練模型將文本轉換為向量,并使用諸如 FAISS、Milvus 等開源平臺來構建和管理向量數據庫。
Vector DB 成功地解決了很多挑戰,并為人們帶來了很多價值。它采用了一種新的數據結構和算法,可以有效地存儲和檢索向量,可以保證檢索的準確性和效率,可以處理大規模和復雜的數據。它還可以與其他工具和平臺結合,提供更多功能和服務。它已經成為了一個不可或缺的工具,為人們提供了更好的信息獲取和交流體驗。它不僅打敗了其他 DB,還贏得了用戶的心。
然而,這部大片依然未完待續,Vector DB 仍有改進的空間。例如,它在處理大規模數據時,可能會面臨存儲和計算資源的挑戰,這就像是在一個無底的大海中尋找一顆珍珠;在處理復雜的查詢時,可能會面臨性能和準確性的挑戰,這就像是在一個復雜的迷宮中尋找出口;在處理動態的數據時,可能會面臨數據更新和同步的挑戰,這就像是在一個不斷變化的沙漠中尋找一個固定的地標。
然而,我們有理由相信,隨著技術的不斷發展和進步,Vector DB 將會越來越強大,越來越完善,為我們的生活帶來更多的便利和價值。就像我們的勵志英雄,無論面臨多大的困難和挑戰,都會不斷地前進,不斷地成長,最終實現自己的目標。這部大片還沒有結束,Vector DB 依然在刻苦努力著,保持著這來之不易的成功。
在介紹 Vector DB 近期做出的努力之前,不得不說的是,Vector DB 和關系型數據庫是各有優勢的,選擇哪種數據庫取決于具體的應用需求。如果你需要處理的是結構化數據,并且數據規模不大,那么關系型數據庫可能是一個好選擇。但如果你需要處理的是非結構化數據,或者需要處理大規模的數據,那么 Vector DB 可能是一個更好的選擇。
Vector DB 的技術內核 —— 超級英雄的武器
為了更加了解我們的超級英雄,我們先從超級英雄的日常生活開始。想象一下,你是一個超級英雄,你的任務是理解和處理海量的信息。你的工具是一種叫做 Vector DB 的新型數據庫,它可以存儲和處理嵌入向量 (Embeddings)。Sounds cool, right? 但是,這并不是一件輕松的事情。你需要處理的問題包括如何將數據轉化為向量 (向量嵌入),如何度量向量之間的相似性 (相似度度量),如何索引和檢索向量 (向量索引和檢索),以及如何壓縮向量以節省存儲空間 (向量壓縮)。這些都是 Vector DB 的核心技術,也是你作為超級大腦的主要煩惱。
那讓我們來一起探索 Vector DB 的技術內核,看看這個超級英雄每天是如何工作的。讓我們用一個例子來更方便的理解這些步驟。假設作為超級英雄,你的任務是管理一個巨大的圖書館。這個圖書館有各種各樣的書,包括小說、詩歌、科學論文、歷史書籍等等。你的目標是讓讀者能夠快速準確地找到他們想要的書。
首先,你需要將每本書轉化為一個向量。這就像是給每本書創建一個獨特的指紋,這個指紋可以反映出書的內容、風格、主題等關鍵信息。這個過程就是向量嵌入。這是一個很大的話題,這篇文章里暫時不會很詳細的涉及,但是得益于 AI 的發展,現在嵌入都能較好的表征他們想要表征的數據了 [7]。
在假設我們能夠得到很好的表征之后,你就需要度量向量之間的相似性了。這就像是比較兩本書的指紋,看看它們有多么相似。這個過程就是相似度度量。在早期,我們可能會使用歐幾里得距離或者余弦相似度來度量相似性。但是,隨著時間的推移,我們發現這些方法在處理高維數據時可能會遇到困難。
因此,現代的相似度度量方法,如最近鄰搜索 (Nearest Neighbor Search) 和局部敏感哈希 (Locality-Sensitive Hashing) 等,被開發出來 [8]。這些方法可以更有效地處理高維數據,提供更準確的相似度度量。接下來,你需要索引和檢索向量。這就像是創建一個圖書館的目錄,讓讀者可以根據他們的需求快速找到他們想要的書。這個過程就是向量索引和檢索。在早期,我們可能會使用線性搜索或者樹形結構來索引和檢索向量。但是,隨著數據量的增長,這些方法可能會變得效率低下。因此,現代的向量索引和檢索方法,如倒排索引 (Inverted Index) 和乘積量化 (Product Quantization) 等,被開發出來 [9]。這些方法可以更有效地處理大規模數據,提供更快速的索引和檢索。
最后,你需要壓縮向量以節省存儲空間。這就像是將書的內容進行壓縮,讓它們占用更少的空間。這個過程就是向量壓縮。在早期,我們可能會使用簡單的壓縮算法,如 Huffman 編碼或者 Run-Length 編碼來壓縮向量。但是,隨著數據量的增長,這些方法可能無法滿足壓縮需求。因此,現代的向量壓縮方法,如乘積量化 (Product Quantization) 和優化乘積量化 (Optimized Product Quantization) 等,被開發出來 [10]。這些方法可以更有效地壓縮向量,提供更高的壓縮比。
讀到這里,如果你是 AI 專業的人,你可能已經意識到,雖然向量嵌入和相似度度量都是重要的問題,但是在 Vector DB 的發展中,得益于 AI 的發展,嵌入已經不算最大的問題了。當下要解決的最主要的問題其實是向量索引和向量檢索。這是因為,隨著數據量的增長,如何有效地索引和檢索向量成為了一個巨大的挑戰。
索引,檢索,壓縮 —— 超級英雄的煩惱
(非技術人員撤離警告)
但是你知道嗎,即使已經成了超級英雄,也有自己的煩惱。超級英雄的故事已經講完了,我們來看看 VectorDB 究竟做了什么努力。首先,我們正式的定義一下這個過程(圖 2):
- 首先,我們用一個嵌入模型把我們要索引的數據轉換成向量嵌入。
- 然后,向量嵌入被存儲到向量數據庫里,并保留了它們對應的原始數據的引用。
- 最后,當應用程序發起一個查詢時,我們用同樣的嵌入模型把查詢變成一個向量嵌入,并用它來在數據庫中搜索最相似的向量嵌入。正如我們所說的,這些相似的向量嵌入反映了它們生成它們的原始數據的含義。

圖 2. VectotDB 應用流程。圖源:https://www.pinecone.io/learn/vector-database/
在這里其中對于 Vector DB 來說最主要的瓶頸還是在于第二步和第三步的索引,檢索和壓縮,因為 Vector DB 的目標和優勢就是更好的處理大規模的數據:
- 向量索引與檢索,這就像是超級英雄的重要武器之一,是 Vector DB 處理大規模數據的關鍵。向量索引的任務就是在海量的向量中,快速找到與查詢向量最相似的向量。這就像是在一個巨大的超市里,快速找到你想要的商品。想象一下,如果超市里的商品沒有分類,沒有標簽,你要找到你想要的商品可能需要花費大量的時間。而向量索引就是這個超市的分類標簽,它可以幫助你快速找到你想要的商品。
- 超級英雄的另一個武器是向量壓縮,主要是指對向量進行編碼,以減少其存儲空間和傳輸時間的過程。這個過程通常涉及到兩個方面:壓縮率和失真率。壓縮率是指壓縮后的向量與原始向量的大小比例;失真率是指壓縮后的向量與原始向量的相似度差異。一般來說,提高壓縮率會降低失真率,反之亦然。因此,在不同的應用場景下,需要根據需求選擇合適的壓縮方法和參數。向量壓縮就像是超市在進行商品打包銷售。例如,超市可能會把一些常用的廚房用品(比如鹽、糖、醋、油)打包成一個套餐進行銷售,這樣可以節省顧客購物的時間,也可以節省超市的貨架空間。這就像是壓縮率,即通過打包銷售,我們可以減少商品的存儲空間和顧客的購物時間。然而,打包銷售也可能會帶來一些問題。例如,顧客可能只需要其中的一部分商品,但是他們不得不購買整個套餐。或者,打包的商品可能與顧客原本需要的商品有一些差異。這就像是失真率,即通過打包銷售,我們可能會降低商品的滿足度。因此,超市需要根據顧客的需求和貨架的空間,來選擇合適的打包方法和參數。同樣,向量壓縮也需要根據應用的需求和存儲的空間,來選擇合適的壓縮方法和參數。
超級英雄武器的發展歷程也是這部好萊塢電影的重要組成部分,從最早的線性掃描到現在的復雜的結構,每一步都是為了解決一個問題,為了提高效率,為了更好地服務于用戶。
在最早的時候,人們使用的是線性掃描。這就像是在一個沒有分類的超市里,你需要逐個查看每個商品,直到找到你想要的商品。這種方法簡單直觀,但是效率非常低,特別是當數據量非常大的時候。這就像是在一個超大的超市里找商品,你可能需要花費一整天的時間。
為了解決線性掃描的效率問題,基于哈希 (hash-based) 或者樹 (tree-based) 的方法就出現了。哈希方法是把高維向量映射到低維空間或者二進制編碼,然后用哈希表或者倒排索引來存儲和檢索 [12]。樹方法是把高維空間劃分成若干個子空間或者聚類中心,然后用樹形結構來存儲和檢索 [13]。這些方法都是基于精確距離計算或者近似距離計算的方法。這就像是在超市里,商品被分成了多個區域,每個區域包含一類商品。這樣,你就可以直接去你想要的商品的區域,而不需要查看所有的商品。這大大提高了效率。
但是,這些方法在處理高維數據時,效率會下降,這就像是在一個超大的超市里,商品的種類非常多,區域劃分得非常細,你可能需要花費大量的時間在不同的區域之間穿梭。

圖 3. 樹(tree-based)。圖源:https://www.displayr.com/how-is-splitting-decided-for-decision-trees/
為了解決這個問題,基于乘積量化(Product Quantization, PQ)的向量索引算法也被提了出來 [14]。PQ 方法是把高維向量分割成若干個子向量,然后對每個子向量進行獨立的標量量化(Scalar Quantization, SQ),即用一個有限集合中最接近的值來近似表示每個子向量。這樣做可以大大減少存儲空間和計算時間,并且可以用乘積距離(Product Distance, PD)來近似表示原始距離。這就像是在超市里,商品不僅按照區域分類,還按照品牌分類,你可以直接去你喜歡的品牌的區域,而不需要在所有的區域之間穿梭。這大大提高了效率。
圖 4. 乘積量化(Product Quantization, PQ)圖源:https://www.displayr.com/how-is-splitting-decided-for-decision-trees/
然后,為了解決樹處理高維數據的問題,人們提出了 BBF(Best Bin First)算法 [15]。BBF 算法是一種基于優先隊列的搜索算法,它可以在 KD 樹中更快地找到最近鄰。根據 KD 樹 (樹結構的一種) 的搜索過程我們可以知道,在搜索時首先沿著 kd 樹找到葉子節點,然后依次回溯,而回溯的路程就是前面我們查找葉子節點時逆序,因此進行回溯時并沒有利用這些點的信息。BBF 就是利用這些信息,回溯時給各個需要回溯的結點以優先級,這樣找到最近鄰會更快。
其實 BBF 算法的思想比較簡單,通過對回溯可能需要的路過的結點加入隊列,并按照查找點到該結點確 定的超平面的距離進行排序,然后每次首先遍歷的是優先級最高(即距離最短的結點),直到隊列為空算法結束。同時 bbf 算法也設立了一個時間限制,如果算法運行時間超過該限制,不管是不是為空, 一律停止運行,返回當前的最近鄰點作為結果。應用了 BBF 之后,就像是在超市里,你不僅知道每個商品的區域,還知道每個區域的熱門商品,你可以直接去找這些熱門商品,而不需要在區域內逐個查看商品。這進一步提高了效率。但是,BBF 算法在處理大規模數據時,效率仍然不高,這就像是在一個超大的超市里,即使你知道每個區域的熱門商品,你仍然需要在大量的區域之間穿梭。
同時,在 20 世紀 10 年代中期,一種改進版的 PQ 方法出現了,它叫做倒排多重索引(Inverted Multi-Index, IMI)[11]。IMI 方法是把高維向量分割成兩個子向量,然后對每個子向量進行獨立的 PQ,得到兩個子碼本(sub-codebook)。然后,把所有的向量按照它們的第一個子碼本的索引分組,得到若干個列表,每個列表中的向量都有相同的第一個子碼本的索引。這樣做可以把高維空間劃分成更細粒度的子空間,并且可以用倒排索引來存儲和檢索。例如,在 2014 年 CVPR 提出的基于 IMI 的最近鄰搜索方法,它可以用于處理百萬級別的高維數據集。IMI 方法將高維向量分割成兩個子向量,然后對每個子向量進行獨立的 PQ,得到兩個子碼本。這就像在超市里,我們不僅按照商品類型(如食品、飲料、日用品等)來分類,還進一步按照品牌來分類。這樣,顧客可以更精確地找到他們需要的商品,提高了購物效率。
同時,除了數據維度高以外,還有一個數據量大的問題。為了解決處理大規模數據的問題,人們提出了局部敏感哈希(LSH)。LSH 是一種基于哈希的索引方法,它可以將相似的向量哈希到同一個桶中。這就像在一個大型超市里,我們不僅按照商品類型和品牌來分類,還進一步按照價格區間來分類。這樣,顧客可以更快地找到他們的目標商品。然而,當超市的規模變得非常大時,即使有這樣的分類系統,顧客仍然需要在大量的商品之間進行選擇,這就增加了購物的復雜性。同樣,當處理高維數據時,LSH 的效率仍然面臨挑戰。
此時,在 IMI 的基礎上,一種更先進的向量索引算法出現了,它叫做各向異性向量量化(AVQ)[17]。AVQ 方法是把高維向量分割成若干個子空間,然后對每個子空間進行獨立的 PQ,得到若干個子碼本。然后,把所有的向量按照它們的子碼本的組合分組,得到若干個列表,每個列表中的向量都有相同的子碼本的組合。這樣做可以根據數據的分布自適應地劃分高維空間,并且可以用多重倒排索引來存儲和檢索。這就像是在超市里,商品不僅按照區域分類,還按照品牌分類,還按照價格分類,你可以直接去你喜歡的品牌和價格的區域,而不需要在所有的區域之間穿梭。這大大提高了效率。
雖然這個武器一直在進化,但是它都存在一個比較大的問題,就是召回精度不夠,隨著維度變大,召回精度可能會變得越來越低。所以時間拉到現在,最近的向量索引大多是基于圖(graph-based)或者深度學習(deep learning-based)的方法。
基于圖(graph-based)的方法則與上述算法有所不同。圖方法是把高維空間看作是一個圖,每個節點是一個向量,每條邊是一個距離或者相似度。然后用一些啟發式或者優化的算法來構建和遍歷這個圖,從而找到最相似的向量。例如,在 2018 年發表在 NIPS 上的論文《Hierarchical Navigable Small World Graphs》中,作者提出了一種基于分層可導航小世界(Hierarchical Navigable Small World, HNSW)圖的最近鄰搜索方法,它可以用于處理任意度量空間的數據。HNSW 方法是把高維向量分層地組織成一個圖,每個節點是一個向量,每條邊是一個距離或者相似度。每一層都是一個可導航小世界(Navigable Small World, NSW)圖,即一個具有短路徑和局部連通性的圖。每一層的節點數目隨機地減少,從而形成一個金字塔狀的結構。這樣做可以利用不同層次的邊來加速搜索過程,并且可以用貪心算法來遍歷圖。這就像是在超市里,你有一個詳細的地圖,這個地圖上標記了每個商品的位置,你可以通過這個地圖來找到你想要的商品,而不需要在所有的區域之間穿梭。這也大大提高了效率。
最后,深度學習方法是用一個神經網絡來學習一個映射函數,把高維向量映射到低維空間或者二進制編碼,然后用哈希表或者倒排索引來存儲和檢索。這就像是在超市里,你有一個智能助手,這個助手可以根據你的需求,快速地找到你想要的商品,而不需要你自己去尋找。這個智能助手就是神經網絡,它可以學習和理解你的需求,然后幫助你找到你想要的商品。一個具體的例子 [16] 提出了一種基于圖神經網絡(Graph Neural Network, GNN)的最近鄰搜索方法,它可以用于學習任意圖結構數據的表示。GNN 方法是用一個神經網絡來學習一個映射函數,把高維向量映射到低維空間,并且保留圖結構信息。然后用哈希表或者倒排索引來存儲和檢索。這樣做可以利用神經網絡的強大表達能力來捕捉復雜的圖特征,并且可以用哈希或者倒排技術來加速搜索過程。
向量索引面臨的問題是如何在保證檢索質量和效率的同時,適應不同類型和領域的數據,以及不同場景和需求的應用。不同的數據可能有不同的分布、維度、密度、噪聲等特征,不同的應用可能有不同的準確性、速度、可擴展性、可解釋性等指標。因此,沒有一種通用的向量索引算法可以滿足所有情況,而需要根據具體情況選擇或者設計合適的向量索引算法。這就像是在超市里,不同的顧客可能有不同的需求,需要不同的商品,所以超市需要提供各種各樣的商品,以滿足不同顧客的需求。
基于現在這些問題,我們未來還是有很多方向可以去探索:
- 動態向量索引:大多數現有的向量索引算法都是針對靜態數據集設計的,即數據集在建立索引后不會發生變化。然而,在實際應用中,數據集往往是動態變化的,即會有新的數據加入或者舊的數據刪除。如何在保持高效檢索性能的同時,支持動態更新數據集是一個重要而困難的問題。這就像是在超市里,新的商品會不斷上架,舊的商品會被售完或者下架,如何在保持高效服務的同時,支持動態更新商品是一個重要而困難的問題。
- 分布式向量索引:隨著數據規模和維度的增長,單機內存和計算能力可能無法滿足向量索引和檢索的需求。如何把數據集和索引結構分布到多臺機器上,并且實現高效并行檢索是另一個重要而困難的問題。這就像是在超市里,隨著商品種類和數量的增長,單個超市可能無法滿足顧客的需求,需要開設多個分店,并且實現高效并行服務。
- 多模態向量索引:在實際應用中,數據往往是多模態(multimodal)的,即由不同類型或者來源的信息組成,如文本、圖像、音頻、視頻等。如何把不同模態的數據映射到統一或者兼容的向量空間,并且實現跨模態(cross-modal)或者聯合模態(joint-modal)的檢索是一個有趣而有挑戰的問題。這就像是在超市里,商品不僅有食品、飲料、日用品、電器等不同類型,還有中文、英文、日文、韓文等不同來源的標簽,如何把不同類型和來源的商品分類到統一或者兼容的區域,并且實現跨類型或者聯合類型的服務是一個有趣而有挑戰的問題。
總的來說,向量索引就像是超市的分類標簽,它可以幫助我們快速找到我們想要的商品,即最相似的向量。雖然現有的向量索引算法已經取得了很大的進步,但是還有很多問題需要解決,還有很多方向可以探索。
Vector DB 產品展示會
看完 Vector DB 的技術,歡迎來到我們的向量數據庫產品展示會!在這里,我們將帶你走進五個主要的向量數據庫產品的世界,包括開源和商業的 vector DB,例如 Milvus, Pinecone, Chroma, Weaviate, Zilliz 等。我們將比較它們的特性,性能,和應用場景。而且,我們將幫你輕松的獲取各個產品的不同,以及什么時候應該選用什么產品。那么,讓我們開始吧!
Milvus
首先,讓我們來看看 Milvus。Milvus 就像是一個開源的向量數據庫超市,提供了各種各樣的向量索引算法,如 IVF-Flat、IVF-SQ8、HNSW 等,以及多種相似度度量,如 L2、IP、Hamming 等。它就像是一個多語言的世界公民,提供了 Python、Java、Go 等多種語言的客戶端接口,以及與 TensorFlow、PyTorch 等深度學習框架的集成。如果你是圖像檢索、視頻檢索、語音識別、自然語言處理等基于向量檢索的場景的粉絲,那么 Milvus 就是你的不二之選。而且,它還有一個可視化工具叫做 Milvus Insight,可以讓你像在游樂園一樣方便地查看和管理向量數據。
Pinecone
接下來,我們來看看 Pinecone。Pinecone 就像是一個高級的向量數據庫餐廳,提供了一個簡單易用的 API 菜單,讓你可以快速地創建和部署向量數據庫。它的廚師使用了一種基于圖的向量索引算法,稱為 Hierarchical Navigable Small World (HNSW),它可以在保證高精度的同時提供高效率和可擴展性。如果你是推薦系統、個性化廣告、內容匹配等需要實時和準確的相似度搜索的場景的食客,那么 Pinecone 就是你的理想之選。而且,它還有一個控制臺,可以讓你像在舞臺后臺一樣方便地監控和管理向量數據庫的狀態和性能。
Chroma
然后,我們來看看 Chroma。Chroma 就像是一個專業的向量數據庫實驗室,專注于提供高性能和高可靠性的向量搜索和分析功能。它的科學家使用了一種基于乘積量化的向量壓縮算法,稱為 Optimized Product Quantization (OPQ),它可以在減少存儲空間和傳輸時間的同時保持高精度。如果你是生物信息學、醫療影像、金融風控等需要處理海量和高維的向量數據的場景的研究者,那么 Chroma 就是你的最佳之選。而且,它還有一個查詢語言,可以讓你像在圖書館一樣方便地構建復雜和靈活的查詢條件。
Weaviate
接著,我們來看看 Weaviate。Weaviate 就像是一個創新的向量數據庫工廠,不僅可以存儲和查詢向量數據,還可以自動地為任何類型的數據生成向量表示。它的工程師使用了一種基于深度學習的向量嵌入算法,稱為 Universal Sentence Encoder (USE),它可以將文本、圖像、音頻等數據轉換成語義相關的向量。如果你是知識圖譜、問答系統、智能搜索等需要對復雜和多模態的數據進行語義理解和匹配的場景的創新者,那么 Weaviate 就是你的首選。而且,它還有一個 GraphQL 風格的查詢語言,可以讓你像在設計工作室一樣方便地構建復雜和靈活的查詢條件。
Zilliz
再來看看 Zilliz。Zilliz 就像是一個強大的向量數據庫運動場,支持多種硬件加速技術,如 GPU、TPU 等,以提高向量搜索和分析的速度。它的教練提供了多種應用場景的解決方案,如人臉識別、商品檢索、文本分類等。如果你是安防監控、電子商務、社交媒體等需要利用強大的計算資源來處理大規模和高質量的向量數據的場景的運動員,那么 Zilliz 就是你的冠軍之選。而且,它還有一個可視化工具叫做 Zilliz Insight,可以讓你像在體育館一樣方便地查看和管理向量數據。
Tencent Cloud VectorDB
最后,我們來看看國內騰訊云發布的AI 原生(AI Native)向量數據庫 Tencent Cloud VectorDB。該數據庫能夠被廣泛應用于大模型的訓練、推理和知識庫補充等場景,是國內首個從接入層、計算層、到存儲層提供全生命周期 AI 化的向量數據庫,重新定義了 AI Native 的開發范式,使用戶在使用向量數據庫的全生命周期都能應用到 AI 能力。Tencent Cloud VectorDB 最高支持 10 億級向量檢索規模,延遲控制在毫秒級,相比傳統單機插件式數據庫檢索規模提升 10 倍,同時具備百萬級每秒查詢(QPS)的峰值能力。
那么,這就是我們的向量數據庫產品展示會。希望你能在這里找到你的理想之選,讓你的向量數據管理和分析更加輕松和高效。如果你希望及時的看到當前大家對各個產品的偏愛度,DB-engines 每個月都會更新排名。
圖 5. 當前 vectorDB 排名結果(2023.07)
為了幫助你更好地選擇適合你的 Vector DB 產品,我們為你準備了這個 Cheat Sheet。在這里,你可以快速地比較各個產品的主要特性和適用場景。

VectorDB —— 未完待續
在我們深入探討了 Vector DB 的現狀之后,讓我們把目光投向未來,探索一下作為研究者我們可以關注的一些研究方向。
首先,向量算法的優化和創新將是一個重要的研究方向。隨著數據規模和維度的增加,我們需要開發出更高效和精確的向量索引和壓縮算法。此外,深度學習技術的發展也為我們提供了新的機會,我們可以研究如何利用深度學習來生成更好的向量表示,這將對于各種類型的數據,如文本、圖像、音頻等,都有重要的意義。
其次,向量數據庫的功能增強也是一個值得關注的研究方向。隨著用戶需求和應用場景的多樣化,我們需要研究如何提供更豐富和完善的向量功能。例如,如何更好地支持各種數據源和數據格式,以方便地導入和導出向量數據;如何設計更靈活的查詢語言和相似度度量,以滿足復雜和靈活的查詢需求;如何開發更有效的數據管理和監控工具,以方便地查看和管理向量數據。
然后,向量數據庫的應用擴展也是一個重要的研究方向。隨著人工智能和大數據技術的發展,我們可以研究如何利用 Vector DB 來實現更多的基于相似度搜索和匹配的應用場景。例如,在推薦系統中,我們可以研究如何利用 Vector DB 實現基于用戶興趣或商品特征的個性化推薦;在內容匹配中,我們可以研究如何利用 Vector DB 實現基于文本或圖像內容的智能搜索;在安防監控中,我們可以研究如何利用 Vector DB 實現基于人臉或聲紋特征的身份識別。
深入的向量研究也會是一個長期且深遠的研究方向。隨著 Vector DB 技術的成熟和普及,我們需要更深入的理論探索和實踐探索。例如,在理論方面,我們需要更好地理解、度量和優化向量空間中的相似度問題;在實踐方面,我們需要更好地結合、應用和評估 Vector DB 技術在不同領域中的效果。
作為研究者,我們有很多可以探索和研究的方向,包括向量算法的優化和創新,向量數據庫的功能增強,向量數據庫的應用擴展,以及深入的向量研究。讓我們一起期待 Vector DB 的未來,一起探索向量數據的無限可能!

































