矢量數(shù)據(jù)庫(kù)是為實(shí)現(xiàn)高維矢量數(shù)據(jù)的高效存儲(chǔ)、檢索和相似性搜索而設(shè)計(jì)的。使用一種稱為嵌入的過(guò)程,將向量數(shù)據(jù)表示為一個(gè)連續(xù)的、有意義的高維向量。
本文將研究存儲(chǔ)/檢索向量數(shù)據(jù)和執(zhí)行相似性搜索的實(shí)用方法,在我們深入研究之前,首先先介紹矢量數(shù)據(jù)庫(kù)的兩個(gè)關(guān)鍵功能:
1、執(zhí)行搜索的能力
當(dāng)給定查詢向量時(shí),向量數(shù)據(jù)庫(kù)可以根據(jù)指定的相似度度量(如余弦相似度或歐幾里得距離)檢索最相似的向量。這允許應(yīng)用程序根據(jù)它們與給定查詢的相似性來(lái)查找相關(guān)項(xiàng)或數(shù)據(jù)點(diǎn)。
2、高性能
矢量數(shù)據(jù)庫(kù)通常使用索引技術(shù),比如近似最近鄰(ANN)算法來(lái)加速搜索過(guò)程。這些索引方法旨在降低在高維向量空間中搜索的計(jì)算復(fù)雜度,而傳統(tǒng)的方法如空間分解由于高維而變得不切實(shí)際。
簡(jiǎn)介
矢量數(shù)據(jù)庫(kù)領(lǐng)域現(xiàn)在正在急速的擴(kuò)展,如何權(quán)衡選擇呢,這里我整理了5個(gè)主要的方向:
像Pinecone這樣的純矢量數(shù)據(jù)庫(kù),比如Pinecone也是建立在下面的FAIss之上的
全文搜索數(shù)據(jù)庫(kù),如ElasticSearch,以前是作為搜索引擎現(xiàn)在增加了矢量存儲(chǔ)和檢索的功能
矢量庫(kù),如Faiss, Annoy和Hnswlib,還不能作為數(shù)據(jù)庫(kù),只是矢量的處理
支持矢量的NoSQL數(shù)據(jù)庫(kù),如MongoDB、Cosmos DB和Cassandra,都是老牌的數(shù)據(jù)存儲(chǔ),但是加入了矢量的功能
支持矢量的SQL數(shù)據(jù)庫(kù),如SingleStoreDB或PostgreSQL,與上面不同的是這些數(shù)據(jù)庫(kù)支持SQL語(yǔ)句
除了上面提到的五種主要方法外,還有如Vertex AI和Databricks,它們的功能超越了數(shù)據(jù)庫(kù),我們不進(jìn)行討論。
1、純矢量數(shù)據(jù)庫(kù)
純矢量數(shù)據(jù)庫(kù)是專門為存儲(chǔ)和檢索矢量而設(shè)計(jì)的。包括Chroma, LanceDB, Marqo, Milvus/ Zilliz, Pinecone, Qdrant, Vald, Vespa, Weaviate等。數(shù)據(jù)是基于對(duì)象或數(shù)據(jù)點(diǎn)的向量表示來(lái)組織和索引。這些向量可以是各種類型數(shù)據(jù)的數(shù)字表示,包括圖像、文本文檔、音頻文件或任何其他形式的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。
優(yōu)點(diǎn)
利用索引技術(shù)進(jìn)行高效的相似度搜索
大型數(shù)據(jù)集和高查詢工作負(fù)載的可伸縮性
支持高維數(shù)據(jù)
支持基于HTTP和json的api
原生支持向量運(yùn)算,包括加法,減法,點(diǎn)積,余弦相似度
缺點(diǎn)
純矢量數(shù)據(jù)庫(kù):純矢量數(shù)據(jù)庫(kù)可以存儲(chǔ)矢量和一些元數(shù)據(jù),但是其他就不行了。對(duì)于大多數(shù)用例,可能還需要包括諸如實(shí)體、屬性和層次結(jié)構(gòu)(圖)、位置(地理空間)等描述的數(shù)據(jù),這就要其他存儲(chǔ)的整合。
有限或沒(méi)有SQL支持:純矢量數(shù)據(jù)庫(kù)通常使用自己的查詢語(yǔ)言,這使得很難對(duì)矢量和相關(guān)信息運(yùn)行傳統(tǒng)的分析,也很難將矢量和其他數(shù)據(jù)類型結(jié)合起來(lái)。
沒(méi)有完整的CRUD:純矢量數(shù)據(jù)庫(kù)并不是真正為創(chuàng)建、更新和刪除操作而設(shè)計(jì)的。所以必須首先對(duì)數(shù)據(jù)進(jìn)行矢量化和索引,這些數(shù)據(jù)庫(kù)的重點(diǎn)是獲取向量數(shù)據(jù),并基于向量相似度查詢最近鄰,而索引是很耗時(shí)的。索引矢量數(shù)據(jù)計(jì)算量大、成本高、耗時(shí)長(zhǎng)。這使得基本上無(wú)法進(jìn)行實(shí)時(shí)的操作。例如,Pinecone的IMI索引(反向多索引,人工神經(jīng)網(wǎng)絡(luò)的一種變體)會(huì)產(chǎn)生存儲(chǔ)開(kāi)銷,并且是計(jì)算密集型。它主要是為靜態(tài)或半靜態(tài)數(shù)據(jù)集設(shè)計(jì)的,如果經(jīng)常添加、修改或刪除向量,基本上不太可能。而Milvus使用的索引被稱為產(chǎn)品量化和分層可導(dǎo)航小世界(HNSW),這是一種近似的技術(shù),在搜索準(zhǔn)確性和效率之間進(jìn)行權(quán)衡。它的索引需要配置各種參數(shù),使用不正確的參數(shù)選擇可能會(huì)影響搜索結(jié)果的質(zhì)量或?qū)е滦实拖隆?/p>
功能性不強(qiáng):許多矢量數(shù)據(jù)庫(kù)在基本特性上嚴(yán)重落后,包括ACID事務(wù)、災(zāi)難恢復(fù)、RBAC、元數(shù)據(jù)過(guò)濾、數(shù)據(jù)庫(kù)可管理性、可觀察性等。這可能會(huì)導(dǎo)致嚴(yán)重的業(yè)務(wù)問(wèn)題,要解決這些問(wèn)題,則需要我們自己來(lái)處理了這會(huì)導(dǎo)致開(kāi)發(fā)量大增。
2、全文檢索數(shù)據(jù)庫(kù)
這類數(shù)據(jù)庫(kù)包括Elastic/Lucene、OpenSearch和Solr。
優(yōu)點(diǎn)
高可伸縮性和性能,特別是對(duì)于非結(jié)構(gòu)化文本文檔
豐富的文本檢索功能,如內(nèi)置的外語(yǔ)支持,可定制的標(biāo)記器,詞干器,停止列表和N-grams
大部分基于開(kāi)源庫(kù)(Apache Lucene)
成熟的且有大型集成生態(tài)系統(tǒng),包括矢量庫(kù)
缺點(diǎn)
沒(méi)有優(yōu)化向量搜索或相似匹配
主要設(shè)計(jì)用于全文搜索,而不是語(yǔ)義搜索,因此基于它構(gòu)建的應(yīng)用程序?qū)⒉痪哂袡z索增強(qiáng)生成(RAG)和其他的完整上下文。為了實(shí)現(xiàn)語(yǔ)義搜索功能,這些數(shù)據(jù)庫(kù)需要使用其他工具以及大量自定義評(píng)分和相關(guān)模型進(jìn)行增強(qiáng)。
其他數(shù)據(jù)格式(圖像、音頻、視頻)的有限應(yīng)用
基本上不支持GPU
一般選擇這些庫(kù)的原因都是因?yàn)樵谝郧绊?xiàng)目上增加新的功能,并且數(shù)據(jù)量小,對(duì)主業(yè)務(wù)也不會(huì)產(chǎn)生多大影響時(shí)使用。如果需要重新構(gòu)架大型項(xiàng)目,不建議使用。
3、開(kāi)源矢量庫(kù)
對(duì)于許多開(kāi)發(fā)者來(lái)說(shuō),F(xiàn)aiss、Annoy和Hnswlib等開(kāi)源矢量庫(kù)是一個(gè)很好的起點(diǎn)。Faiss是一個(gè)用于密集向量相似性搜索和聚類的庫(kù)。Annoy (Approximate Nearest Neighbors Oh Yeah)是一個(gè)用于人工神經(jīng)網(wǎng)絡(luò)搜索的輕量級(jí)庫(kù)。Hnswlib是一個(gè)實(shí)現(xiàn)HNSW ANN搜索算法的庫(kù)。
優(yōu)點(diǎn)
快速近鄰搜索
為高維構(gòu)建
支持面向人工神經(jīng)網(wǎng)絡(luò)的索引結(jié)構(gòu),包括倒排文件,產(chǎn)品量化和隨機(jī)投影
支持推薦系統(tǒng)、圖像搜索和自然語(yǔ)言處理的用例
SIMD(單指令,多數(shù)據(jù))和GPU支持,加快向量相似度搜索操作
缺點(diǎn)
維護(hù)和集成麻煩
與精確方法相比,可能會(huì)犧牲搜索準(zhǔn)確性
需要自己部署和維護(hù):需要你構(gòu)建和維護(hù)復(fù)雜的基礎(chǔ)設(shè)施,為應(yīng)用程序需求提供足夠的CPU、GPU和內(nèi)存資源。
對(duì)元數(shù)據(jù)過(guò)濾、SQL、CRUD操作、事務(wù)、高可用性、災(zāi)難恢復(fù)以及備份和還原的支持有限或不支持
他們之所以稱為庫(kù)(或者包)而不是數(shù)據(jù)庫(kù)是因?yàn)樗鼈冎惶峁┝撕苌俚牡菂s非常專業(yè)功能,如果你想入門學(xué)習(xí)或者做一個(gè)簡(jiǎn)單的demo,它們都是很好開(kāi)始,但不建議直接應(yīng)用到生產(chǎn)中。
4、支持矢量的NoSQL數(shù)據(jù)庫(kù)
這些數(shù)據(jù)庫(kù)包括:NoSQL數(shù)據(jù)庫(kù),如MongoDB, Cassandra/ DataStax Astra, CosmosDB和Rockset。還有像像redis這樣的鍵值數(shù)據(jù)庫(kù)和其他特殊用途的數(shù)據(jù)庫(kù),如Neo4j(圖數(shù)據(jù)庫(kù))
幾乎所有這些NoSQL數(shù)據(jù)庫(kù)都是最近才添加矢量搜索擴(kuò)展而具備矢量能力的,所以如果要是用的話一定要做好測(cè)試。
優(yōu)點(diǎn)
對(duì)于特定的數(shù)據(jù)模型,NoSQL數(shù)據(jù)庫(kù)提供了高性能和可擴(kuò)展性。Neo4j可以與llm一起用于社交網(wǎng)絡(luò)或知識(shí)圖譜。一個(gè)具有矢量能力的時(shí)間序列數(shù)據(jù)庫(kù)(如kdb)可能能夠?qū)⑹噶繑?shù)據(jù)與金融市場(chǎng)數(shù)據(jù)結(jié)合起來(lái)。
缺點(diǎn)
NoSQL數(shù)據(jù)庫(kù)的矢量功能是基本的/新生的/未經(jīng)測(cè)試的。今年,許多NoSQL數(shù)據(jù)庫(kù)添加了向量支持。比如:
今年5月,Cassandra宣布了增加矢量搜索的計(jì)劃。
4月,Rockset宣布支持基本矢量搜索,
5月Azure Cosmos DB宣布支持MongoDB vCore的矢量搜索。
DataStax和MongoDB在本月(6月)宣布了矢量搜索功能(都是預(yù)覽版)!
NoSQL數(shù)據(jù)庫(kù)的矢量搜索性能可能差別很大,這取決于所支持的矢量函數(shù)、索引方法和硬件加速。而且NoSQL數(shù)據(jù)庫(kù)的查詢效率本來(lái)就不高,再加上矢量的功能,一定不會(huì)快。
我的觀點(diǎn)一直沒(méi)有變,那就是如果復(fù)雜數(shù)據(jù)一定要存到關(guān)系型數(shù)據(jù)庫(kù)中,像MongoDB這樣的當(dāng)作輔助存儲(chǔ)是沒(méi)問(wèn)題,但當(dāng)作主要存儲(chǔ)和主要查詢那是所謂的自稱為“全棧”的前端干出來(lái)的事,因?yàn)槭裁炊疾欢杂X(jué)得什么都簡(jiǎn)單。
5、支持矢量的SQL數(shù)據(jù)庫(kù)
這些庫(kù)與上面的類似,但是它們基本都是關(guān)系型數(shù)據(jù)庫(kù)并且支持sql查詢,例如SingleStoreDB, PostgreSQL, Clickhouse和K.NETica的pgvector/Supabase Vector(測(cè)試版)。
在一個(gè)已建立的數(shù)據(jù)庫(kù)中添加基本的矢量功能并不是一件難事。比如矢量數(shù)據(jù)庫(kù)Chroma就是來(lái)自ClickHouse
優(yōu)點(diǎn)
包含矢量搜索功能,如點(diǎn)積,余弦相似度,歐幾里得距離和曼哈頓距離。
使用相似度分?jǐn)?shù)找到k個(gè)最近鄰
多模型SQL數(shù)據(jù)庫(kù)提供混合查詢,并且可以將向量與其他數(shù)據(jù)結(jié)合起來(lái)以獲得更有意義的結(jié)果
大多數(shù)SQL數(shù)據(jù)庫(kù)都可以作為服務(wù)部署,可以在云上進(jìn)行完全管理。
缺點(diǎn)
SQL數(shù)據(jù)庫(kù)是為結(jié)構(gòu)化數(shù)據(jù)而設(shè)計(jì)的。而矢量是非結(jié)構(gòu)化數(shù)據(jù),如圖像、音頻和文本。雖然關(guān)系數(shù)據(jù)庫(kù)通常可以存儲(chǔ)文本和blob,但大多數(shù)數(shù)據(jù)庫(kù)不會(huì)將這些非結(jié)構(gòu)化數(shù)據(jù)矢量化以用于機(jī)器學(xué)習(xí)。
大多數(shù)SQL數(shù)據(jù)庫(kù)(還)沒(méi)有針對(duì)向量搜索進(jìn)行優(yōu)化。關(guān)系數(shù)據(jù)庫(kù)的索引和查詢機(jī)制主要是為結(jié)構(gòu)化數(shù)據(jù)設(shè)計(jì)的,而不是為高維矢量數(shù)據(jù)設(shè)計(jì)的。雖然用于向量數(shù)據(jù)處理的SQL數(shù)據(jù)庫(kù)的性能可能不是特別好,但支持向量的SQL數(shù)據(jù)庫(kù)可能會(huì)添加擴(kuò)展或新功能來(lái)支持向量搜索。
傳統(tǒng)的SQL數(shù)據(jù)庫(kù)不能向外擴(kuò)展,它們的性能會(huì)隨著數(shù)據(jù)的增長(zhǎng)而下降。使用SQL數(shù)據(jù)庫(kù)處理高維向量的大型數(shù)據(jù)集可能需要進(jìn)行額外的優(yōu)化,比如對(duì)數(shù)據(jù)進(jìn)行分區(qū)或使用專門的索引技術(shù)來(lái)保持高效的查詢性能。
總結(jié)
所以,那么如何選擇呢?
1、如果入門或者demo的話可以直接使用開(kāi)源的矢量庫(kù),比如Faiss可以支持本地的億級(jí)數(shù)據(jù),但是無(wú)法提供對(duì)外服務(wù)。
2、對(duì)于產(chǎn)品,如果要開(kāi)發(fā)新的功能并且上線,那就要將矢量存儲(chǔ)和現(xiàn)有的存儲(chǔ)分開(kāi),專業(yè)的人做專業(yè)的事,可選擇純矢量數(shù)據(jù)庫(kù)或開(kāi)源矢量庫(kù)自行開(kāi)發(fā)(如果功能簡(jiǎn)單的話),保證系統(tǒng)的穩(wěn)定性。
3、如果非要在現(xiàn)有系統(tǒng)上使用矢量功能,比如Elastic、MongoDB 上存儲(chǔ)和檢索大量的矢量數(shù)據(jù),那么一定要做好測(cè)試,并且自求多福吧,沒(méi)準(zhǔn)你遇到的問(wèn)題不僅ChatGPT不知道,stackoverflow上也沒(méi)有。
4、現(xiàn)在矢量存儲(chǔ)還是再發(fā)展階段,所以有些功能還不完善,所以盡量使用成熟版本,對(duì)于生產(chǎn)環(huán)境不要冒險(xiǎn)嘗鮮。
最后說(shuō)說(shuō)架構(gòu)的建議:
微服務(wù)架構(gòu)是一種軟件架構(gòu)風(fēng)格,其中應(yīng)用程序被拆分為一組小型、獨(dú)立的服務(wù),每個(gè)服務(wù)都專注于提供特定的業(yè)務(wù)功能,每個(gè)微服務(wù)都應(yīng)該專注于解決一個(gè)具體的業(yè)務(wù)問(wèn)題或提供一項(xiàng)特定的功能。這種精細(xì)化的劃分使得每個(gè)微服務(wù)可以根據(jù)需要進(jìn)行獨(dú)立的擴(kuò)展、部署和維護(hù)。
矢量搜索也不例外應(yīng)該獨(dú)立成單獨(dú)的服務(wù),服務(wù)都獨(dú)立了存儲(chǔ)不是也應(yīng)該獨(dú)立嗎。
當(dāng)然如果非要把矢量存儲(chǔ)和業(yè)務(wù)數(shù)據(jù)放在一起也可以,我沒(méi)有任何意見(jiàn),反正出問(wèn)題又不是我來(lái)解決,我就看個(gè)熱鬧就行了