不論是RAG,還是Agent,幾乎每個(gè)LLM 驅(qū)動(dòng)的應(yīng)用程序都可能會(huì)用到向量數(shù)據(jù)庫。那么,向量數(shù)據(jù)庫是什么?與傳統(tǒng)數(shù)據(jù)庫有何不同? 又如何選擇向量數(shù)據(jù)庫呢? 本文是老碼農(nóng)關(guān)于向量數(shù)據(jù)庫的學(xué)習(xí)筆記。 1. 什么是向量數(shù)據(jù)庫?首先,我們需要理解什么是向量? 向量是基于不同特征或?qū)傩詠砻枋鰧ο蟮臄?shù)據(jù)表示。每個(gè)向量代表一個(gè)單獨(dú)的數(shù)據(jù)點(diǎn),例如一個(gè)詞或一張圖片,由描述其許多特性的值的集合組成。這些變量有時(shí)被稱為“特征”或“維度”。例如,一張圖片可以表示為像素值的向量,整個(gè)句子也可以表示為單詞嵌入的向量。 一些常用的數(shù)據(jù)向量如下:
向量數(shù)據(jù)庫是一種將數(shù)據(jù)存儲(chǔ)為高維向量的數(shù)據(jù)庫,高維向量是特征或?qū)傩缘臄?shù)學(xué)表示。每個(gè)向量都有一定數(shù)量的維度,根據(jù)數(shù)據(jù)的復(fù)雜性和粒度,維度可以從幾十到幾千不等。向量通常是通過對原始數(shù)據(jù)(如文本、圖像、音頻、視頻等)應(yīng)用某種變換或嵌入函數(shù)來生成的。嵌入函數(shù)可以基于各種方法,例如機(jī)器學(xué)習(xí)模型、單詞嵌入、特征提取算法。向量數(shù)據(jù)庫采用索引策略來簡化向量相似的特定查詢。這在機(jī)器學(xué)習(xí)應(yīng)用程序中特別有用,因?yàn)橄嗨菩运阉鹘?jīng)常用于發(fā)現(xiàn)可比較的數(shù)據(jù)點(diǎn)或生成建議。 向量數(shù)據(jù)庫的主要功能包括:
向量數(shù)據(jù)庫的主要優(yōu)點(diǎn)是,它允許基于數(shù)據(jù)的向量距離或相似性進(jìn)行快速準(zhǔn)確的相似性搜索和檢索。這意味著,可以使用向量數(shù)據(jù)庫,根據(jù)其語義或上下文含義查找最相似或最相關(guān)的數(shù)據(jù),而不是使用基于精確匹配或預(yù)定義標(biāo)準(zhǔn)查詢數(shù)據(jù)庫的傳統(tǒng)方法。向量數(shù)據(jù)庫可以搜索非結(jié)構(gòu)化數(shù)據(jù),但也可以處理半結(jié)構(gòu)化甚至結(jié)構(gòu)化數(shù)據(jù)。例如,可以使用向量數(shù)據(jù)庫執(zhí)行以下操作,根據(jù)視覺內(nèi)容和風(fēng)格查找與給定圖像相似的圖像,根據(jù)主題和情感查找與給定文檔相似的文檔,以及根據(jù)功能和評級查找與給定產(chǎn)品相似的產(chǎn)品。 2. 向量數(shù)據(jù)庫的工作機(jī)理向量數(shù)據(jù)庫的構(gòu)建是為了適應(yīng)向量嵌入的特定結(jié)構(gòu),并且它們使用索引算法根據(jù)向量與查詢向量的相似性來有效地搜索和檢索向量。 向量數(shù)據(jù)庫的工作原理可以通過CPU和GPU的工作原理進(jìn)行類比。CPU和GPU分別是計(jì)算機(jī)的運(yùn)算和圖形處理核心,而向量數(shù)據(jù)庫則是大模型的記憶和存儲(chǔ)核心。在大模型學(xué)習(xí)階段,向量數(shù)據(jù)庫接收多模態(tài)數(shù)據(jù)進(jìn)行向量化表示,讓大模型在訓(xùn)練時(shí)能夠更高效地調(diào)用和處理數(shù)據(jù)。通過多線程機(jī)制和矩陣運(yùn)算,GPU提供了強(qiáng)大的計(jì)算能力,讓大模型的訓(xùn)練變得更加快速和高效。 區(qū)別于傳統(tǒng)數(shù)據(jù)庫,向量數(shù)據(jù)庫主要有三點(diǎn)不同:數(shù)據(jù)向量化,向量檢索和相似度計(jì)算。數(shù)據(jù)的向量化采用embedding 技術(shù), 嵌入作為一個(gè)橋梁,將非數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為機(jī)器學(xué)習(xí)模型可以使用的形式,使它們能夠更有效地識別數(shù)據(jù)中的模式和關(guān)系。一般的,文本是一維向量,圖像是二維矩陣,視頻相當(dāng)于三維矩陣。這些嵌入實(shí)質(zhì)上是存儲(chǔ)數(shù)據(jù)的上下文表示的數(shù)字列表(即向量)。在存儲(chǔ)層內(nèi),數(shù)據(jù)庫以m個(gè)向量堆棧的形式存儲(chǔ),每個(gè)向量使用n個(gè)維度表示一個(gè)數(shù)據(jù)點(diǎn),總大小為m×n。為了查詢性能的原因,這些堆棧通常通過分片進(jìn)行劃分。 向量檢索是輸入一個(gè)向量,從數(shù)據(jù)庫中查找與輸入向量最相似的topN個(gè)向量返回。要在向量數(shù)據(jù)庫中執(zhí)行相似性搜索和檢索,需要使用表示所需信息或條件的查詢向量。查詢向量可以從與存儲(chǔ)向量相同類型的數(shù)據(jù)導(dǎo)出,或者從不同類型的數(shù)據(jù)導(dǎo)出。使用相似性度量來計(jì)算兩個(gè)向量在向量空間中的距離。相似性度量可以基于各種度量,如余弦相似性、歐氏距離、向量內(nèi)積,hamming距離、jaccard指數(shù)。 其中,向量檢索算法是向量數(shù)據(jù)庫的核心之一。向量檢索可以看為是近似最近鄰搜索,通過預(yù)先的索引構(gòu)建來減小數(shù)據(jù)查詢時(shí)的搜索空間,加快檢索速度。目前主要的幾種檢索算法有:
向量數(shù)據(jù)庫中的索引可以按照數(shù)據(jù)結(jié)構(gòu)和壓縮級別兩個(gè)層次進(jìn)行組織實(shí)現(xiàn)。根據(jù)數(shù)據(jù)結(jié)構(gòu)建立索引的分類如下: 根據(jù)數(shù)據(jù)壓縮方式建立索引, 主要包括平坦壓縮和量化壓縮。平坦壓縮是指以未經(jīng)修改的形式存儲(chǔ)向量的索引,量化中索引的底層向量被分解成由較少字節(jié)組成的塊(通常通過將浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù))以減少內(nèi)存消耗和搜索過程中的計(jì)算成本。 相似性搜索和檢索的結(jié)果通常是與查詢向量具有最高相似性得分的向量的排序列表。然后,您可以訪問與原始源或索引中的每個(gè)向量關(guān)聯(lián)的相應(yīng)原始數(shù)據(jù)。 3. 向量數(shù)據(jù)庫的分類根據(jù)向量數(shù)據(jù)庫的的實(shí)現(xiàn)方式, 我們可以將向量數(shù)據(jù)庫大致分為4類:原生的向量數(shù)據(jù)庫、支持向量的全文檢索數(shù)據(jù)庫、支持向量的NoSQL數(shù)據(jù)庫和支持向量的關(guān)系型數(shù)據(jù)庫。 3.1 原生的向量數(shù)據(jù)庫原生的向量數(shù)據(jù)庫是專門為存儲(chǔ)和檢索向量而設(shè)計(jì)的。包括Chroma, LanceDB, Marqo, Milvus/ Zilliz, Pinecone, Qdrant, Vald, Vespa, Weaviate等, 所管理的數(shù)據(jù)是基于對象或數(shù)據(jù)點(diǎn)的向量表示進(jìn)行組織和索引。這里只介紹其中的三種,具體信息可以參考各自的官網(wǎng)。 FaissFaiss是一個(gè)用于高效相似性搜索和密集向量聚類的開源庫。Faiss是用C++編寫的,帶有完整的Python/numpy包裝器,一些常用算法都有GPU實(shí)現(xiàn),成為了很多開源向量數(shù)據(jù)庫的基礎(chǔ)。 Faiss能構(gòu)建不同的索引類型,并提供了歐式距離或者點(diǎn)積的相似度計(jì)算功能,有些索引類型是簡單的基線,例如精確搜索。大多數(shù)可用的索引結(jié)構(gòu)需要考慮搜索時(shí)間,搜索質(zhì)量,每個(gè)索引向量使用的內(nèi)存等。 Faiss支持多種向量搜索技術(shù),提供了能夠在不同大小的向量集中搜索的算法,甚至可以處理那些超過內(nèi)存容量的向量集。 Faiss的主要優(yōu)勢之一是速度和可擴(kuò)展性,即使在具有數(shù)十億個(gè)向量的數(shù)據(jù)集中也可以進(jìn)行快速搜索。此外,還提供了用于評估和調(diào)整參數(shù)的輔助代碼。 PineconePinecone是一個(gè)基于云的向量數(shù)據(jù)庫,可以開發(fā)實(shí)時(shí)相似性搜索應(yīng)用,能夠以毫秒級的延遲存儲(chǔ)和探索高維向量嵌入,適用于推薦系統(tǒng)、圖片和視頻搜索以及自然語言處理等應(yīng)用。 Pinecone 的主要功能包括自動(dòng)索引、實(shí)時(shí)更新、查詢自動(dòng)調(diào)整和用于與當(dāng)前流程進(jìn)行簡單交互的 REST API。其架構(gòu)專為可擴(kuò)展性和穩(wěn)健性而構(gòu)建,可以輕松管理海量數(shù)據(jù),同時(shí)保持高可用性。 Pinecone是一個(gè)可以托管的向量數(shù)據(jù)庫平臺(tái),也就是說有商用方案,也有免費(fèi)使用方案。其主要特點(diǎn)包括:
Pinecone 采用了多種安全措施來保護(hù)用戶的數(shù)據(jù)安全和隱私。多層次的訪問控制機(jī)制可以控制用戶的訪問權(quán)限和操作權(quán)限,同時(shí)采用了數(shù)據(jù)加密、傳輸加密等技術(shù)來保護(hù)數(shù)據(jù)的安全性,還提供了數(shù)據(jù)備份和恢復(fù)等功能,可以防止數(shù)據(jù)丟失和損壞。 Pinecone 在性能方面表現(xiàn)非常出色,它能夠支持高達(dá) 1 百萬次的QPS,且具有低延遲和高吞吐量的特點(diǎn),還具有分布式部署、實(shí)時(shí)索引構(gòu)建和高效的向量相似度搜索等優(yōu)點(diǎn),可以幫助用戶快速處理大規(guī)模的向量數(shù)據(jù)。 此外,Pinecone 還支持多種編程語言和框架,如 Python、Java、TensorFlow 等,使得用戶可以輕松地將其集成到自己的應(yīng)用程序中。 MilvusMilvus是一個(gè)開源的分布式向量數(shù)據(jù)庫,它具備高可用、高性能、易拓展的特點(diǎn),用于海量向量數(shù)據(jù)的實(shí)時(shí)召回。 Milvus 基于 Faiss、Annoy、HNSW 等向量搜索庫構(gòu)建,可以輕松管理數(shù)百萬個(gè)實(shí)體,可以根據(jù)不同的數(shù)據(jù)特點(diǎn)選擇最合適的索引算法,核心是解決稠密向量相似度檢索的問題。在向量檢索的基礎(chǔ)上,Milvus 支持?jǐn)?shù)據(jù)分區(qū)分片、數(shù)據(jù)持久化、增量數(shù)據(jù)攝取、標(biāo)量向量混合查詢、time travel 等功能,同時(shí)大幅優(yōu)化了向量檢索的性能,可滿足任何向量檢索場景的應(yīng)用需求。 Milvus 還具有分布式部署、高可用性和高擴(kuò)展性等優(yōu)點(diǎn),可以幫助用戶快速處理海量的向量數(shù)據(jù)。它也提供了多種安全措施來保護(hù)用戶的數(shù)據(jù)安全和隱私,支持 SSL/TLS 加密和訪問控制等技術(shù),可以防止數(shù)據(jù)被非法訪問和竊取,還提供了數(shù)據(jù)備份和恢復(fù)等功能,可以保護(hù)數(shù)據(jù)的完整性和可用性。 此外,Milvus 還提供了多種客戶端 SDK,如 Python、Java、C++ 等,使得用戶可以方便地使用不同的編程語言來訪問和操作 Milvus。 3.2 支持向量的全文檢索數(shù)據(jù)庫這類數(shù)據(jù)庫包括Elastic/Lucene、OpenSearch和Solr。它們都具有豐富的文本檢索功能,如可定制的標(biāo)記器,分詞器,停用詞列表和N-grams等,大部分都基于開源庫,且有大型集成的生態(tài)系統(tǒng),包括了向量庫。 例如,Elasticsearch,是一個(gè)支持各種類型數(shù)據(jù)的分布式搜索和分析引擎。Elasticsearch在7.3 版本中,添加了對向量數(shù)據(jù)索引的支持,支持混合查詢,但是向量檢索采用的仍然是暴力計(jì)算,性能損耗較大。在8.0版本引入了knn search其實(shí)就是一種近似最近鄰搜索算法,相似度支持歐式距離,點(diǎn)積和余弦相似性,knn search底層其實(shí)使用的是HNSW。遺憾的是,這種方式無法進(jìn)行混合檢索。 3.3 支持向量的NoSQL 數(shù)據(jù)庫幾乎所有這些NoSQL數(shù)據(jù)庫都是最近才通過添加向量搜索擴(kuò)展而具備向量能力的,所以如果要是使用的話一定要做好測試。Cassandra,Rockset,Azure Cosmos DB和MongoDB等都紛紛宣布了增加向量搜索的計(jì)劃。NoSQL數(shù)據(jù)庫的向量搜索性能可能差別很大,這取決于所支持的向量函數(shù)、索引方法和硬件加速。 例如,RedisVector是一個(gè)向量數(shù)據(jù)庫,專注于向量數(shù)據(jù)的有效處理。它擅長存儲(chǔ)和分析大量向量數(shù)據(jù),包括張量、矩陣和數(shù)值數(shù)組。通過 利用內(nèi)存數(shù)據(jù)存儲(chǔ)Redis,RedisVector可提供高性能的查詢響應(yīng)時(shí)間。它提供內(nèi)置的索引和搜索功能,可以快速搜索和查找相似的載體,RedisVector還支持各種距離測量,用于比較向量和執(zhí)行復(fù)雜的分析操作。通過對向量數(shù)據(jù)的操作,包括元素級算術(shù)和聚合,RedisVector 為處理向量提供了一個(gè)多功能環(huán)境,適用于處理和分析高維向量數(shù)據(jù)的機(jī)器學(xué)習(xí)應(yīng)用,從而能夠創(chuàng)建定制的推薦系統(tǒng)和基于相似性的準(zhǔn)確搜索。 對于支持向量的NoSQL 數(shù)據(jù)庫,探索嘗試未嘗不可,但在生產(chǎn)環(huán)境中使用要慎之又慎。 3.4 支持向量的SQL 數(shù)據(jù)庫這些大都是關(guān)系型數(shù)據(jù)庫并且支持sql查詢,例如SingleStoreDB, PostgreSQL, Clickhouse和Kinetica的pgvector/Supabase Vector等。它們都宣布包含了向量搜索功能,如點(diǎn)積,余弦相似度,歐幾里得距離和曼哈頓距離,并且使用相似度分?jǐn)?shù)找到n個(gè)最近鄰。由于提供了混合查詢,可以將向量與其他數(shù)據(jù)結(jié)合起來以獲得更有意義的結(jié)果。另外,大多數(shù)SQL數(shù)據(jù)庫都可以作為服務(wù)部署,可以在云上進(jìn)行完全的管理。 例如,Postgres 通過 pg_vector 和 pg_embdding 兩個(gè)插件來實(shí)現(xiàn)向量數(shù)據(jù)庫,讓PG數(shù)據(jù)庫支持向量索引檢索的能力。其索引算法使用的是基于Faiss的IVF Flat索引,提供了優(yōu)異的召回率。 4. 向量數(shù)據(jù)庫的一些對比4.1 編程語言支持Chroma是一個(gè)Python/TypeScript包裝器,基于C++編程語言的有OLAP數(shù)據(jù)庫Clickhouse以及開源向量索引HNSWLib。但如今,快速響應(yīng)且可擴(kuò)展的數(shù)據(jù)庫通常使用現(xiàn)代語言如Golang或Rust編寫。在專為向量數(shù)據(jù)庫而構(gòu)建的供應(yīng)商中,唯一使用Java構(gòu)建的是Vespa。 4.2 開源與否Pinecone是完全閉源的,Zilliz也是一個(gè)閉源的完全托管的商業(yè)解決方案,但它完全建立在Milvus之上,其他向量數(shù)據(jù)庫至少在代碼庫方面是源代碼可用的,具體的許可證決定了代碼的可許可性以及如何部署。 4.3 檢索算法眾多向量數(shù)據(jù)庫的檢索算法都采用了HNSW,其中,Milvus 的檢索算法支持最為豐富。 4.4 部署方式向量數(shù)據(jù)庫的典型部署方式包括本地部署和托管/云原生,兩者都遵循CS架構(gòu)。還有一種新的選擇是嵌入式模式,其中數(shù)據(jù)庫本身與應(yīng)用程序代碼緊密耦合,以serverless的方式運(yùn)行。目前,只有Chroma和LanceDB可用作嵌入式數(shù)據(jù)庫。 綜上所述,主流向量數(shù)據(jù)庫的部分指標(biāo)對比如下: 此外,在選擇向量數(shù)據(jù)庫時(shí),還需要特別考量以下因素:
5. 向量數(shù)據(jù)庫與其他類型數(shù)據(jù)庫的對比傳統(tǒng)數(shù)據(jù)庫,如關(guān)系數(shù)據(jù)庫,旨在存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。這意味著數(shù)據(jù)被組織到預(yù)定義的表、行和列中,確保數(shù)據(jù)的完整性和一致性。傳統(tǒng)數(shù)據(jù)庫往往針對CRUD進(jìn)行優(yōu)化,旨在高效地創(chuàng)建、讀取、更新和刪除數(shù)據(jù)條目,使其適用于從 Web 服務(wù)到企業(yè)軟件的各種應(yīng)用程序。但是,一旦定義了數(shù)據(jù)庫結(jié)構(gòu),進(jìn)行更改可能會(huì)非常復(fù)雜且耗時(shí)。這種剛性可確保數(shù)據(jù)一致性,但靈活性可能不如某些現(xiàn)代數(shù)據(jù)庫的無模式或動(dòng)態(tài)模式性質(zhì)。
與在行和列中存儲(chǔ)多種標(biāo)準(zhǔn)數(shù)據(jù)類型(如字符串、數(shù)字和其他標(biāo)量數(shù)據(jù)類型)不同,向量數(shù)據(jù)庫引入了向量這種新的數(shù)據(jù)類型,并圍繞此數(shù)據(jù)類型構(gòu)建優(yōu)化,專門用于實(shí)現(xiàn)快速存儲(chǔ)、檢索和最近鄰搜索語義。在傳統(tǒng)數(shù)據(jù)庫中,使用查找完全匹配項(xiàng)的索引或鍵值對對數(shù)據(jù)庫中的行進(jìn)行查詢,并返回這些查詢的相關(guān)行。 特別地, 向量數(shù)據(jù)庫與圖數(shù)據(jù)庫的對比如下: 6. 向量數(shù)據(jù)庫在大模型中的應(yīng)用基于大模型的應(yīng)用經(jīng)常一些面臨挑戰(zhàn),例如生成不準(zhǔn)確或不相關(guān)的信息;缺乏事實(shí)一致性或常識;重復(fù)或自相矛盾;有偏見的或令人反感等。為了克服這些挑戰(zhàn),可以使用向量數(shù)據(jù)庫來存儲(chǔ)與所需領(lǐng)域的不同主題、關(guān)鍵詞、事實(shí)、觀點(diǎn)和/或來源的信息。然后,在使用一個(gè)大模型時(shí),通過AI插件從向量數(shù)據(jù)庫中傳遞信息,以生成更具信息性和吸引力的內(nèi)容,符合目標(biāo)意圖和指定風(fēng)格。 借助向量數(shù)據(jù)庫,我們能夠快速加載和存儲(chǔ)事件作為嵌入,并使用向量數(shù)據(jù)庫作為為AI模型提供動(dòng)力的大腦,提供上下文信息,長期記憶檢索,語義上的數(shù)據(jù)關(guān)聯(lián)等等。向量數(shù)據(jù)庫的典型使用方式如下: 實(shí)際上,向量數(shù)據(jù)庫在不同的領(lǐng)域和應(yīng)用程序中都有著許多用例,涉及自然語言處理(NLP)、計(jì)算機(jī)視覺(CV)、推薦系統(tǒng)(RS)和其他需要對數(shù)據(jù)進(jìn)行語義理解和匹配的領(lǐng)域。在向量數(shù)據(jù)庫中存儲(chǔ)信息的一個(gè)用例是使大型語言模型(LLM)能夠基于AI插件生成更相關(guān)、更連貫的文本。 由于向量數(shù)據(jù)庫將要查詢的數(shù)據(jù)存儲(chǔ)為嵌入向量,并且語言模型(LLM)也將其內(nèi)部的知識編碼為嵌入向量,因此在生成式問答應(yīng)用中是天生一對。向量數(shù)據(jù)庫充當(dāng)知識庫的功能,而LLM可以直接在嵌入空間中查詢數(shù)據(jù)的子集,一般可以使用以下方法進(jìn)行操作:
結(jié)合LLM和向量數(shù)據(jù)庫可以構(gòu)建許多其他有用的應(yīng)用程序。然而,了解向量數(shù)據(jù)庫的一些潛在限制是必要的。在搜索應(yīng)用中,它們不一定優(yōu)先考慮關(guān)鍵詞短語的精確匹配來確定相關(guān)性。存儲(chǔ)和查詢的數(shù)據(jù)必須適應(yīng)所使用的嵌入模型的最大序列長度(對于類似BERT的模型,這個(gè)長度不超過幾百個(gè)詞)。目前,最好的方法是利用像LangChain和LlamaIndex這樣的框架,將數(shù)據(jù)分塊或壓縮成適合底層模型上下文的固定大小的向量。 同樣,向量數(shù)據(jù)庫也面臨著許多與其他數(shù)據(jù)庫技術(shù)相同的挑戰(zhàn), 需要繼續(xù)努力提高可擴(kuò)展性、近似精度、延遲性能和經(jīng)濟(jì)性。許多向量數(shù)據(jù)庫在核心數(shù)據(jù)庫能力方面需要提升,例如安全性、彈性、運(yùn)營支持和工作負(fù)載支持的多樣化。隨著AI應(yīng)用的成熟,未來需要的不僅僅只限于向量搜索功能。 |
|