什麼是向量數據庫及其運作原理?用例和範例

什麼是向量數據庫?

向量數據庫索引並存儲向量嵌入,以便快速檢索和相似性搜索,具有CRUD操作、元數據過濾、水平擴展和無伺服器等功能。


我們正處於AI革命之中。這場革命正在顛覆它所涉及的任何行業,承諾帶來重大創新,但也帶來了新的挑戰。對於涉及大型語言模型、生成式AI和語義搜索的應用程序而言,高效的數據處理比以往任何時候都更加重要。

所有這些新應用程序都依賴於向量嵌入,這是一種類型的向量數據表示,它包含了AI在執行複雜任務時理解和維持長期記憶所需的語義信息。

嵌入由AI模型(如大型語言模型)生成,具有許多屬性或特徵,使其表示變得難以管理。在AI和機器學習的背景下,這些特徵代表了數據的不同維度,對理解模式、關係和潛在結構至關重要。

這就是為什麼我們需要專門設計的數據庫來處理這種類型的數據。像Pinecone這樣的向量數據庫滿足了這一需求,提供了嵌入的優化存儲和查詢功能。向量數據庫具有傳統數據庫的功能,而單獨的向量索引則缺乏這些功能,傳統基於標量的數據庫也無法處理向量嵌入。

處理向量數據的挑戰在於傳統基於標量的數據庫無法跟上這類數據的複雜性和規模,使得提取見解和進行實時分析變得困難。這就是向量數據庫的用武之地——它們專門設計來處理這種類型的數據,提供了性能、可擴展性和靈活性,使你能夠充分利用數據。

我們正在看到新一代的向量數據庫引入了更複雜的架構,以處理智能的高效成本和擴展能力。這種能力由無伺服器向量數據庫處理,這些數據庫能夠分離存儲和計算的成本,從而為AI提供低成本的知識支持。

通過向量數據庫,我們可以為AI添加知識,如語義信息檢索、長期記憶等。下圖幫助我們更好地理解向量數據庫在這類應用中的作用:

向量數據庫

讓我們分解一下:

  1. 首先,我們使用嵌入模型為我們想要索引的內容創建向量嵌入。
  2. 向量嵌入被插入到向量數據庫中,並參考創建嵌入的原始內容。
  3. 當應用程序發出查詢時,我們使用相同的嵌入模型為查詢創建嵌入,並使用這些嵌入查詢數據庫以獲取_相似_的向量嵌入。如前所述,這些相似的嵌入與用於創建它們的原始內容相關聯。

向量索引和向量數據庫有什麼區別?

FAISS(Facebook AI Similarity Search)這樣的單獨向量索引可以顯著提高向量嵌入的搜索和檢索效率,但它們缺乏任何數據庫中存在的功能。另一方面,向量數據庫專門用於_管理_向量嵌入,提供了比使用單獨向量索引更多的優勢:

  1. 數據管理:向量數據庫提供了知名且易於使用的數據存儲功能,如插入、刪除和更新數據。這使得管理和維護向量數據比使用需要額外工作來與存儲解決方案集成的單獨向量索引(如 FAISS)更容易。
  2. 元數據存儲和過濾:向量數據庫可以存儲與每個向量條目相關的元數據。用戶可以使用額外的元數據過濾器查詢數據庫,以進行更細粒度的查詢。
  3. 可擴展性:向量數據庫設計為能夠隨著數據量和用戶需求的增長而擴展,提供更好的分佈式和並行處理支持。單獨向量索引可能需要定制解決方案才能實現類似的可擴展性(如在 Kubernetes 集群或其他類似系統上部署和管理它們)。現代向量數據庫還使用無伺服器架構來優化成本。
  4. 實時更新:向量數據庫通常支持實時數據更新,允許動態更改數據以保持結果的新鮮,而單獨向量索引可能需要完整的重新索引過程來整合新數據,這可能既費時又耗費計算資源。先進的向量數據庫可以在保持新鮮度的同時使用通過索引重建可用的性能升級。
  5. 備份和集合:向量數據庫處理備份數據庫中存儲的所有數據的例行操作。Pinecone 還允許用戶選擇性地選擇特定索引,並以“集合”的形式進行備份,這些集合將該索引中的數據存儲起來以供日後使用。
  6. 生態系統集成:向量數據庫可以更容易地與數據處理生態系統的其他組件集成,如 ETL 管道(如 Spark)、分析工具(如 TableauSegment)以及可視化平台(如 Grafana)——簡化數據管理工作流程。它還使與其他 AI 相關工具(如 LangChainLlamaIndexCohere等)的集成變得更加容易。
  7. 數據安全和訪問控制:向量數據庫通常提供內置的數據安全功能和訪問控制機制來保護敏感信息,這在單獨的向量索引解決方案中可能無法獲得。通過命名空間實現的多租戶支持允許用戶完全劃分其索引,甚至在其自身索引內創建完全隔離的分區。

簡而言之,向量數據庫通過解決單獨向量索引的限制(如可擴展性挑戰、繁瑣的集成過程以及缺乏實時更新和內置安全措施),提供了一種優越的解決方案來處理向量嵌入,確保更高效和精簡的數據管理體驗。

向量數據庫如何運作?

我們都或多或少了解傳統數據庫的工作原理——它們在行和列中存儲字符串、數字和其他類型的標量數據。另一方面,向量數據庫在向量上運作,因此其優化和查詢的方式完全不同。

在傳統數據庫中,我們通常查詢的是數據庫中值與我們查詢的值完全匹配的行。而在向量數據庫中,我們應用相似性度量來找到與我們查詢最相似的向量。

向量數據庫使用多種不同的算法,這些算法都參與近似最近鄰(ANN)搜索。這些算法通過散列、量化或基於圖的搜索來優化搜索過程。

這些算法組合成一個管道,提供快速且準確的查詢向量鄰居的檢索。由於向量數據庫提供的是近似結果,我們主要考慮的是準確性和速度之間的權衡。結果越準確,查詢速度就越慢。然而,一個好的系統可以提供接近完美準確度的超快搜索。

以下是一個向量數據庫的常見管道:

向量數據庫管道

  1. 索引:向量數據庫使用如 PQ、LSH 或 HNSW 等算法索引向量。這一步將向量映射到一個數據結構,這將使搜索更快。
  2. 查詢:向量數據庫將索引的查詢向量與數據集中索引的向量進行比較,以找到最近鄰居(應用索引使用的相似性度量)。
  3. 後處理:在某些情況下,向量數據庫會從數據集中檢索最終的最近鄰居並對其進行後處理以返回最終結果。這一步可能包括使用不同的相似性度量重新排序最近鄰居。

無伺服器向量數據庫

無伺服器代表了向量數據庫的下一次進化。上面的架構使我們達到了一個準確、快速、可擴展但昂貴的向量數據庫架構。這是我們在第一代向量數據庫中看到的架構。隨著AI應用案例的增加,成本和彈性變得越來越重要,需要第二代無伺服器向量數據庫。

第一代向量數據庫有三個主要的痛點,而無伺服器向量數據庫解決了這些問題:

  • 計算與存儲的分離:為了優化成本,計算應該僅在需要時使用。這意味著將索引存儲與查詢分離,僅搜索所需的部分——這在涉及延遲時變得愈發困難。
  • 多租戶支持:在索引中處理命名空間,以確保不頻繁查詢的命名空間不會增加成本。
  • 新鮮度:向量數據庫需要提供最新數據,這意味著在插入新數據的幾秒鐘內就可以進行查詢。需要注意的是,對於 Pinecone 無伺服器,在插入大量數據時,新鮮度可能會有所延遲。

要將存儲與計算分離,複雜的幾何分區算法可以將索引分解為子索引,使我們能夠將搜索集中在特定分區上:

展示 Voronoi 分區的圖表

搜索空間的分區

有了這些分區,查詢的搜索空間可以僅集中在向量索引的幾個部分,而不是整個搜索空間。典型的搜索行為表明,某些分區的訪問頻率比其他分區高,使我們能夠在計算成本和冷啟動時間之間找到最佳平衡。

當我們進行這種分區時,我們解決了計算與存儲分離的問題。然而,幾何分區在索引構建時是一個較慢的過程。這意味著我們在等待新數據正確存儲在索引中時,可能會遇到_新鮮度_問題。

為了解決這個問題,向量數據庫需要另一個稱為_新鮮度層_的獨立層。新鮮度層充當臨時的“緩存”向量,這些向量可以被查詢。同時,我們等待索引構建器將新向量放入幾何分區的索引中。

展示新鮮度層的圖表,說明查詢被發送到新鮮度層和現有分區索引

新鮮度層保持數據更新,使我們能夠快速開始查詢。

在這個過程中,查詢路由器可以將查詢發送到索引_和_新鮮度層——解決新鮮度問題。然而,值得注意的是,新鮮度層存在於計算實例中,因此我們不能在那裡存儲完整的索引。相反,我們等待新向量被插入索引——一旦完成,它們就會從新鮮度層中移除。

最後是多租戶支持問題。許多第一代向量數據庫處理多租戶支持已經有一段時間了。然而,在無伺服器架構中,多租戶支持更為複雜。

我們必須避免將不同類型的用戶放在同一硬件上,以保持低成本和低延遲。如果我們有用戶A,每天幾乎每秒鐘進行20次查詢,而用戶B每月進行20次查詢,用戶B將被困在需要為用戶A持續低延遲所需的計算硬件上24/7。

為了解決這個問題,向量數據庫必須能夠識別具有相似使用情況的用戶,並在保持完全隔離的同時將它們放在一起。再次,這可以基於用戶使用情況指標和基於使用情況的熱/冷基礎設施自動分配來完成。

將第一代向量數據庫與計算與存儲分離、多租戶支持和新鮮度結合在一起,為我們帶來了新一代現代向量數據庫。這種架構(與向量數據庫基本原理相結合)是現代AI堆棧的首選。

在接下來的章節中,我們將討論一些向量數據庫基本原理背後的算法,並解釋它們如何提高數據庫的整體性能。

演算法

有幾種算法可以促進向量索引的創建。它們的共同目標是通過創建一個可以快速遍歷的數據結構來實現快速查詢。它們通常會將原始向量的表示轉換為壓縮形式,以優化查詢過程。

然而,作為 Pinecone 的用戶,你不需要擔心這些不同算法的複雜性和選擇。Pinecone 設計用來處理所有的複雜性和算法決策,確保你在不費任何力氣的情況下獲得最佳性能和結果。通過利用 Pinecone 的專業知識,你可以專注於真正重要的事情——提取有價值的見解並提供強大的 AI 解決方案。

以下章節將探索幾種算法及其處理向量嵌入的獨特方法。了解這些知識將幫助你做出明智的決策,並在釋放應用程序全部潛力的同時欣賞 Pinecone 提供的無縫性能。

隨機投影

隨機投影的基本思想隨機投影的基本思想是使用隨機投影矩陣將高維向量投影到低維空間。我們創建一個隨機數字矩陣。矩陣的大小將是我們想要的目標低維度值。然後,我們計算輸入向量與矩陣的點積,得到一個投影矩陣,該矩陣的維度比我們的原始向量少,但仍然保留了它們的相似性。

隨機投影

當我們查詢時,我們使用相同的投影矩陣將查詢向量投影到低維空間。然後,我們將投影的查詢向量與數據庫中投影的向量進行比較,以找到最近的鄰居。由於數據的維度減少,搜索過程比在整個高維空間中搜索要快得多。

需要注意的是,隨機投影是一種近似方法,投影質量取決於投影矩陣的性質。一般來說,投影矩陣越隨機,投影的質量越好。但是,生成真正隨機的投影矩陣在計算上可能是昂貴的,特別是對於大數據集。 了解更多關於隨機投影的信息

產品量化

另一種構建索引的方法是產品量化(PQ),這是一種針對高維向量(如向量嵌入)的_有損_壓縮技術。它將原始向量分解為更小的塊,通過創建每個塊的代表性“代碼”來簡化每個塊的表示,然後將所有塊重新組合起來——不會丟失對相似性操作至關重要的信息。PQ 的過程可以分為四個步驟:分割、訓練、編碼和查詢。

產品量化

  1. 分割 – 將向量分解為段。
  2. 訓練 – 我們為每個段構建一個“代碼簿”。簡單地說,算法生成一個潛在“代碼”的池,可以分配給向量。實際上,這個“代碼簿”由通過對每個向量段進行 k-means 聚類創建的聚類中心點組成。我們在段代碼簿中的值數量與用於 k-means 聚類的值相同。
  3. 編碼 – 算法為每個段分配一個特定代碼。實際上,我們在訓練完成後,找到每個向量段最接近的代碼簿中的值。我們的 PQ 代碼將是對應代碼簿中值的標識符。我們可以使用任意多的 PQ 代碼,這意味著我們可以選擇多個代碼簿中的值來表示每個段。
  4. 查詢 – 當我們查詢時,算法將向量分解為子向量,並使用相同的代碼簿對其進行量化。然後,它使用索引的代碼找到最接近查詢向量的向量。

代碼簿中代表性向量的數量是在表示的準確性和搜索代碼簿的計算成本之間的權衡。代碼簿中的代表性向量越多,子空間中向量表示的準確性越高,但搜索代碼簿的計算成本越高。相反,代碼簿中的代表性向量越少,表示的準確性越低,但計算成本越低。 了解更多關於產品量化的信息

局部敏感 Hashing

局部敏感哈希(Locality-Sensitive Hashing, LSH)是一種針對近似最近鄰搜索的索引技術。它優化了速度,同時仍然提供近似的非窮盡結果。LSH 使用一組哈希函數將相似的向量映射到“桶”中,如下所示:

局部敏感哈希

要找到給定查詢向量的最近鄰居,我們使用與將相似向量“分桶”到哈希表中相同的哈希函數。查詢向量被哈希到特定的表中,然後與同一表中的其他向量進行比較,以找到最接近的匹配。這種方法比搜索整個數據集快得多,因為每個哈希表中的向量數量遠少於整個空間中的向量數量。

需要記住的是,LSH 是一種近似方法,近似質量取決於哈希函數的性質。一般來說,使用的哈希函數越多,近似質量越好。然而,使用大量哈希函數在計算上可能是昂貴的,對於大數據集可能不可行。 了解更多關於局部敏感哈希的信息

分層可導航小世界(HNSW)

HNSW 創建了一個分層的、類似樹的結構,其中每個樹節點代表一組向量。節點之間的邊表示向量之間的相似性。該算法首先創建一組節點,每個節點有少量向量。這可以隨機完成,或通過使用 k-means 等算法對向量進行聚類,每個聚類成為一個節點。

分層可導航小世界(HNSW)

該算法然後檢查每個節點的向量,並在該節點與具有最相似向量的節點之間畫一條邊。

分層可導航小世界(HNSW)

當我們查詢 HNSW 索引時,它使用這個圖來導航樹,訪問最有可能包含與查詢向量最接近向量的節點。 了解更多關於 HNSW的信息

相似度度量

基於之前討論的演算法,我們需要了解相似度度量在向量資料庫中的作用。這些度量是向量資料庫比較和識別給定查詢的最相關結果的基礎。

相似度度量是用於確定向量空間中兩個向量有多相似的數學方法。相似度度量用於向量資料庫中比較儲存的向量並找到最相似的查詢向量。

幾種相似度度量可以使用,包括:

  • 餘弦相似度:測量向量空間中兩個向量之間的角度的餘弦值。範圍從 -1 到 1,其中 1 表示相同向量,0 表示正交向量,-1 表示完全相反的向量。
  • 歐幾里得距離:測量向量空間中兩個向量之間的直線距離。範圍從 0 到無窮大,其中 0 表示相同向量,較大的值表示越來越不相似的向量。
  • 點積:測量兩個向量的大小和它們之間的角度餘弦值的乘積。範圍從 -∞ 到 ∞,其中正值表示向量指向相同方向,0 表示正交向量,負值表示向量指向相反方向。

相似度度量的選擇將影響從向量資料庫中獲得的結果。還需要注意的是,每種相似度度量都有其優缺點,根據使用情況和需求選擇合適的度量非常重要。

篩選

每個儲存在資料庫中的向量也包含元數據。除了查詢相似向量的能力外,向量資料庫還可以根據元數據查詢來篩選結果。為了實現這一點,向量資料庫通常會維護兩個索引:一個向量索引和一個元數據索引。然後它在向量搜索本身之前或之後執行元數據篩選,但無論哪種情況,都會有導致查詢過程變慢的困難。

Post-filtering and Pre-filtering

篩選過程可以在向量搜索本身之前或之後進行,但每種方法都有自己的挑戰,可能會影響查詢性能:

  • 預篩選:在這種方法中,元數據篩選在向量搜索之前完成。雖然這可以幫助減少搜索空間,但它也可能導致系統忽略不符合元數據篩選標準的相關結果。此外,廣泛的元數據篩選可能會因增加的計算負擔而減慢查詢過程。
  • 後篩選:在這種方法中,元數據篩選在向量搜索之後完成。這可以幫助確保考慮所有相關結果,但它也可能引入額外的負擔,並在搜索完成後需要篩選出不相關的結果,從而減慢查詢過程。

為了優化篩選過程,向量資料庫使用各種技術,例如利用先進的元數據索引方法或使用並行處理來加速篩選任務。在搜索性能和篩選準確性之間取得平衡對於在向量資料庫中提供高效和相關的查詢結果至關重要。

資料庫操作

與向量索引不同,向量資料庫具有一組能力,使其更適合用於大規模生產環境。讓我們來看看運營資料庫所涉及的組件的整體概述。

Database Operations

性能和容錯

性能和容錯是緊密相關的。數據越多,所需的節點就越多——出錯和故障的機會也越大。與其他類型的資料庫一樣,我們希望即使某些底層節點失效,也能盡可能快地執行查詢。這可能是由於硬體故障、網絡故障或其他類型的技術錯誤。這種故障可能導致停機甚至錯誤的查詢結果。

為了確保高性能和容錯性,向量資料庫使用分片和複製來應用以下操作:

  1. 分片 – 將數據分區到多個節點上。數據分區有不同的方法——例如,可以根據不同數據簇的相似性進行分區,使相似向量存儲在同一分區中。進行查詢時,查詢會發送到所有分片,並檢索和合併結果。這稱為“散佈-聚合”模式。
  2. 複製 – 在不同節點上創建數據的多個副本。這確保即使特定節點失效,其他節點也能替代它。有兩種主要的一致性模型:最終 一致性和_強_ 一致性。最終一致性允許不同數據副本之間的暫時不一致,這將提高可用性並降低延遲,但可能導致衝突甚至數據丟失。另一方面,強一致性要求在寫操作被認為完成之前更新所有數據副本。這種方法提供更強的一致性,但可能導致更高的延遲。

監控

為了有效地管理和維護向量資料庫,我們需要一個強大的監控系統來跟蹤資料庫性能、健康狀況和整體狀態的關鍵方面。監控對於檢測潛在問題、優化性能和確保生產操作的順利進行至關重要。監控向量資料庫的一些方面包括:

  1. 資源使用 – 監控資源使用情況,例如 CPU、內存、磁盤空間和網絡活動,有助於識別可能影響資料庫性能的潛在問題或資源限制。
  2. 查詢性能 – 查詢延遲、吞吐量和錯誤率可能表明需要解決的潛在系統問題。
  3. 系統健康 – 整體系統健康監控包括單個節點的狀態、複製過程和其他關鍵組件。

存取控制

存取控制是管理和規範用戶對數據和資源的訪問的過程。它是數據安全的重要組成部分,確保只有授權用戶才能查看、修改或與向量資料庫中儲存的敏感數據進行交互。

存取控制的重要性有以下幾個原因:

  1. 數據保護:由於 AI 應用通常涉及敏感和機密信息,實施嚴格的存取控制機制有助於保護數據免受未經授權的訪問和潛在的洩露。
  2. 合規性:許多行業,如醫療保健和金融,受到嚴格的數據隱私法規的約束。實施適當的存取控制有助於組織遵守這些法規,保護它們免受法律和財務後果。
  3. 問責和審計:存取控制機制使組織能夠維持向量資料庫中用戶活動的記錄。這些信息對於審計目的至關重要,並在發生安全漏洞時有助於追溯任何未經授權的訪問或修改。
  4. 可擴展性和靈活性:隨著組織的成長和發展,其存取控制需求可能會發生變化。一個強大的存取控制系統允許無縫修改和擴展用戶權限,確保在組織增長過程中數據安全保持完整。

備份和集合

當所有方法都失效時,向量資料庫提供依賴定期創建的備份的能力。這些備份可以儲存在外部存儲系統或基於雲的存儲服務中,確保數據的安全性和可恢復性。如果數據丟失或損壞,這些備份可以用來將資料庫恢復到之前的狀態,將停機時間和對整個系統的影響降到最低。使用 Pinecone,用戶還可以選擇備份特定的索引並將其保存為“集合”,這些集合可以用來填充新的索引。

API 和 SDK

這是實踐的關鍵:與資料庫互動的開發者希望使用易於使用的 API,並使用熟悉和舒適的工具集。通過提供用戶友好的界面,向量資料庫的 API 層簡化了高性能向量搜索應用的開發。

除了 API,向量資料庫通常還提供特定編程語言的 SDK,這些 SDK 封裝了 API,使開發者更容易在應用中與資料庫互動。這使開發者可以專注於其具體的用例,例如語義文本搜索、生成問題回答、混合搜索、圖像相似性搜索或產品推薦,而不必擔心底層基礎設施的複雜性。

總結

向量嵌入在 NLP、計算機視覺和其他 AI 應用領域的指數增長,導致向量資料庫的出現,成為允許我們在應用中有效地與向量嵌入互動的計算引擎。

向量資料庫是專門針對在生產場景中管理向量嵌入的問題而設計的專用資料庫。因此,它們相比傳統的基於純量的資料庫和獨立的向量索引具有顯著優勢。

在這篇文章中,我們回顧了向量資料庫的關鍵方面,包括它是如何工作的、使用了哪些演算法以及使其在生產場景中運行所需的額外功能。我們希望這有助於您了解向量資料庫的內部工作原理。幸運的是,使用 Pinecone 不需要了解這些複雜性。Pinecone 處理所有這些考量(以及更多),讓您可以專注於應用的其他部分。

Author

  • Pladora Maria

    Crafting seamless user experiences with a passion for headless CMS, Vercel deployments, and Cloudflare optimization. I'm a Full Stack Developer with expertise in building modern web applications that are blazing fast, secure, and scalable. Let's connect and discuss how I can help you elevate your next project!

    View all posts
Click here