這是關(guān)于向量數(shù)據(jù)庫的系列文章中的第二篇。正如本系列的第一篇所提到的套蒂,2023年上半年關(guān)于向量數(shù)據(jù)庫的營銷(不幸的是钞支,有些是炒作)非常多,如果你正在閱讀這篇文章操刀,你可能對向量數(shù)據(jù)庫在底層是如何工作的烁挟,以及如何在高效的向量存儲之上構(gòu)建搜索功能感興趣。
為什么現(xiàn)在大家都在談?wù)撓蛄繑?shù)據(jù)庫呢骨坑?在深入探討向量數(shù)據(jù)庫是什么之前撼嗓,有什么可以解釋這個領(lǐng)域的活動和投資熱潮嗎?
大型語言模型(LLM)的時代
在2022年11月卡啰,OpenAI發(fā)布了ChatGPT的早期演示(它是GPT 3.5及以上版本的OpenAI接口)静稻,隨后它迅速成為歷史上增長最快的應(yīng)用程序警没,在僅僅5天內(nèi)就獲得了一百萬用戶??匈辱!事實上,如果你查看一些主要的開源向量數(shù)據(jù)庫存儲庫在GitHub上的歷史記錄杀迹,可以清楚地看到在2022年11月發(fā)布ChatGPT以及隨后在2023年3月發(fā)布ChatGPT插件后亡脸,其中一些存儲庫的星標計數(shù)出現(xiàn)了明顯的增長。這些因素以及它們在Hacker News和流行媒體等網(wǎng)站上的相關(guān)帖子,是為什么在這個領(lǐng)域出現(xiàn)了如此多的活動的重要原因之一浅碾。
依賴大型語言模型的問題
大型語言模型(LLMs)是生成型的大州,意味著它們根據(jù)用戶的提示以順序方式生成有意義、連貫的文本垂谢。然而厦画,當(dāng)使用LLMs回答人類的問題時,它們經(jīng)常會產(chǎn)生與問題無關(guān)或事實上不正確的結(jié)果滥朱。
LLMs經(jīng)常會產(chǎn)生幻覺根暑,即虛構(gòu)信息,例如指向不存在的URL或編造不存在的數(shù)字徙邻。
LLMs學(xué)習(xí)/記憶其訓(xùn)練數(shù)據(jù)的壓縮版本排嫌,雖然它們學(xué)習(xí)得很好,但并不完美—模型對數(shù)據(jù)的內(nèi)部表示總是會“丟失”一些信息缰犁。
LLMs無法知道其訓(xùn)練完成后發(fā)生的事實淳地。
向量數(shù)據(jù)庫有助于解決這些問題,它們作為底層存儲層帅容,可以被LLMs高效地查詢以檢索事實颇象。與傳統(tǒng)數(shù)據(jù)庫不同,向量數(shù)據(jù)庫專門將數(shù)據(jù)以向量的形式進行本地表示丰嘉。因此夯到,我們現(xiàn)在可以構(gòu)建應(yīng)用程序,讓LLMs位于包含最新饮亏、最新的事實數(shù)據(jù)(遠遠超過LLMs的訓(xùn)練日期)的向量存儲層之上耍贾,并使用它們來“基于事實”地約束模型,緩解幻覺問題路幸。 盡管向量數(shù)據(jù)庫(如Vespa荐开、Weaviate、Milvus)在LLMs之前就已經(jīng)存在简肴,但自ChatGPT發(fā)布以來晃听,開源社區(qū)以及向量數(shù)據(jù)庫供應(yīng)商的營銷團隊迅速意識到它們在搜索和檢索等主流用例中與高質(zhì)量文本生成的結(jié)合中的潛力。這解釋了為什么在向量數(shù)據(jù)庫領(lǐng)域出現(xiàn)了絕對的風(fēng)投資金熱潮砰识!
什么是嵌入?
向量數(shù)據(jù)庫不僅存儲原始數(shù)據(jù)(可以是圖像能扒、音頻或文本),還存儲其編碼形式:嵌入(embeddings)辫狼。這些嵌入實質(zhì)上是存儲數(shù)據(jù)的上下文表示的數(shù)字列表(即向量)初斑。直觀地說,當(dāng)我們提到“嵌入”時膨处,我們指的是實際存在于更高維度中的數(shù)據(jù)(圖像见秤、文本砂竖、音頻)的壓縮、低維表示鹃答。 在存儲層內(nèi)乎澄,數(shù)據(jù)庫以m個向量堆棧的形式存儲,每個向量使用n個維度表示一個數(shù)據(jù)點测摔,總大小為m×n置济。為了查詢性能的原因,這些堆棧通常通過分片進行劃分锋八。
嵌入是如何生成的?
在自然語言處理(NLP)中舟肉,Transformer的革命為工程師們提供了高效且可擴展地生成這些壓縮表示或嵌入的豐富手段。
一種流行的方法是使用開源庫Sentence Transformers查库,可以通過Hugging Face模型中心或直接從源代碼的reposentence-transformers獲取路媚。
另一種(更昂貴的)方法是使用許多API服務(wù):OpenAI嵌入API或者Cohere嵌入API
需要記住的是,底層向量的維度越低樊销,嵌入空間中的表示就越緊湊整慎,這可能會影響下游任務(wù)的質(zhì)量。Sentence Transformers(sbert)提供了維度在384围苫、512和768范圍內(nèi)的嵌入模型裤园,而且這些模型完全免費且開源。OpenAI和Cohere嵌入則需要付費的API調(diào)用來生成剂府,由于維度在幾千維拧揽,因此可以認為它們具有更高的質(zhì)量。使用付費API生成嵌入的一個合理原因是如果數(shù)據(jù)是多語言的(Cohere被認為擁有高質(zhì)量的多語言嵌入模型腺占,其性能優(yōu)于開源變體)淤袜。注:選擇嵌入模型通常是在質(zhì)量和成本之間進行權(quán)衡。在大多數(shù)情況下衰伯,對于英文文本數(shù)據(jù)铡羡,可以直接使用開源模型,適用于不太長的文本(文本序列約300-400個詞)意鲸。對于超過模型上下文長度的文本烦周,可以使用更多的外部工具來處理,但這個話題將在另一篇文章中討論怎顾!
將嵌入存儲在矢量數(shù)據(jù)庫中
由于向量數(shù)據(jù)庫在嵌入空間中的可操作性读慎,它們對于多種形式的數(shù)據(jù)(文本、圖像槐雾、音頻)的語義或相似性搜索非常有用夭委。在語義搜索中,用戶發(fā)送的輸入查詢(通常是自然語言)被轉(zhuǎn)換為向量形式蚜退,與數(shù)據(jù)本身在相同的嵌入空間中闰靴,以便返回與輸入查詢最相似的前k個結(jié)果。下面是這個過程的可視化示例钻注。
如何計算相似度?
不同的向量數(shù)據(jù)庫提供不同的相似度計算指標蚂且,但對于文本數(shù)據(jù),最常用的兩個指標如下:
- 點積(Dot product):產(chǎn)生一個非歸一化的任意大小的值幅恋。
- 余弦距離(Cosine distance):產(chǎn)生一個歸一化的值(介于-1和1之間)杏死。
考慮一個簡化的例子,我們將紅葡萄酒和白葡萄酒的標題在二維空間中進行向量化捆交,其中水平軸表示紅葡萄酒淑翼,垂直軸表示白葡萄酒。在這個空間中品追,距離較近的點表示具有相似單詞或概念的葡萄酒玄括,而距離較遠的點則沒有太多共同之處。余弦距離被定義為連接每個葡萄酒在嵌入空間中位置與原點之間的線之間的夾角的余弦值肉瓦。
一幅可視化圖將使這更加直觀遭京。
在左邊,兩種葡萄酒(Reserve White和Toscana Red)在詞匯和概念上幾乎沒有共同之處泞莉,因此它們的余弦距離接近零(在向量空間中它們是正交的)哪雕。在右邊,來自納帕谷的兩種Zinfandel葡萄酒有更多的共同之處鲫趁,因此它們的余弦相似度更接近1斯嚎。極限情況下,余弦距離為1挨厚;當(dāng)然堡僻,在實際情況中,實際數(shù)據(jù)存在于更高維的向量空間中(除了葡萄酒的品種之外還有許多其他軸)疫剃,無法在二維平面上可視化苦始,但余弦相似度的原理仍然適用。
可擴展的最近鄰搜索
一旦向量被生成并存儲慌申,當(dāng)用戶提交一個搜索查詢時陌选,相似性搜索的目標是提供與輸入查詢向量最相似的前k個向量。再次蹄溉,我們可以在簡化的二維空間中可視化這一過程咨油。
最簡單的方法是使用所謂的k最近鄰(kNN)方法,將查詢向量與數(shù)據(jù)庫中的每個向量進行比較柒爵。然而役电,隨著數(shù)據(jù)規(guī)模擴大到數(shù)百萬(甚至數(shù)十億)個數(shù)據(jù)點,這種方法很快變得過于昂貴棉胀,因為所需的比較次數(shù)與數(shù)據(jù)呈線性增長關(guān)系法瑟。
近似最近鄰(ANN)
每個現(xiàn)有的向量數(shù)據(jù)庫都專注于通過一類稱為近似最近鄰(ANN)搜索的算法冀膝,使搜索在數(shù)據(jù)集的大小上高效無論如何。與在數(shù)據(jù)庫中的每個向量之間進行詳盡比較不同霎挟,近似搜索會尋找最近鄰窝剖,從而在結(jié)果的準確性上有一定的損失(可能并不總是返回真正的最近鄰),但使用ANN算法可以獲得巨大的性能提升酥夭。
索引
通過索引將數(shù)據(jù)存儲在向量數(shù)據(jù)庫中赐纱,索引是指創(chuàng)建稱為索引的數(shù)據(jù)結(jié)構(gòu),通過快速縮小搜索空間來實現(xiàn)對向量的高效查找熬北。通常使用的嵌入模型將向量存儲在維度約為102到103的范圍內(nèi)疙描,而ANN算法則盡可能高效地在時間和空間上捕捉數(shù)據(jù)的實際復(fù)雜性。 在各種可用的向量數(shù)據(jù)庫中使用了許多索引算法讶隐,它們的詳細信息超出了本文的范圍(我將在以后的文章中學(xué)習(xí)這些)起胰。但是為了參考,下面列出了其中一些算法巫延。
倒排文件索引(IVF)
分層可導(dǎo)航小世界(HNSW)圖
Vamana(在DiskANN實現(xiàn)中使用)
簡而言之待错,最先進的索引技術(shù)是由HNSW和Vamana等新算法實現(xiàn)的,但只有少數(shù)數(shù)據(jù)庫供應(yīng)商提供了Vamana的DiskANN實現(xiàn)(截至2023年)烈评。
Milvus
Weaviate(正在進行中...)
LanceDB(正在進行中...)
把它們放在一起
我們可以將上述所有想法結(jié)合起來火俄,形成一個關(guān)于向量數(shù)據(jù)庫實際是什么的概念圖 。
對于從業(yè)者來說讲冠,每個數(shù)據(jù)庫供應(yīng)商如何實現(xiàn)可擴展性(通過Kubernetes瓜客、分片、流式處理等)的具體細節(jié)并不重要 - 這取決于每個供應(yīng)商在延遲竿开、成本和可擴展性之間權(quán)衡的系統(tǒng)架構(gòu)谱仪。
存儲層和數(shù)據(jù)攝入
數(shù)據(jù)(存儲在本地或云端)經(jīng)過嵌入模型轉(zhuǎn)換為向量形式,并通過API網(wǎng)關(guān)攝入到向量數(shù)據(jù)庫的存儲層中否彩。
數(shù)據(jù)在索引過程中進行分區(qū)/分片疯攒,以實現(xiàn)可擴展性和更快的查找。
查詢引擎與存儲層緊密集成列荔,通過數(shù)據(jù)庫的ANN實現(xiàn)快速檢索最近鄰敬尺。
應(yīng)用程序?qū)?/strong>
- 用戶通過應(yīng)用程序的用戶界面向嵌入模型發(fā)送查詢,該模型將輸入查詢轉(zhuǎn)換為與數(shù)據(jù)處于相同嵌入空間的向量贴浙。
- 向量化的查詢通過API網(wǎng)關(guān)發(fā)送到查詢引擎:多個傳入的查詢被異步處理砂吞,并將前k個結(jié)果發(fā)送回用戶。
擴展矢量數(shù)據(jù)庫以服務(wù)其他功能
上述用例展示了向量數(shù)據(jù)庫如何在規(guī)模上實現(xiàn)了語義搜索崎溃,這在幾年前是不可能的蜻直,除非你是一家擁有龐大資源的大型科技公司。然而,這只是冰山一角:向量數(shù)據(jù)庫用于支持許多下游功能概而。
混合搜索系統(tǒng)
在Colin Harman的優(yōu)秀評論文章中呼巷,他描述了許多公司由于當(dāng)前存在大量的向量數(shù)據(jù)庫營銷材料,對于搜索和檢索領(lǐng)域存在“隧道視野”赎瑰。作為從業(yè)者王悍,我們必須記住,向量數(shù)據(jù)庫并不是搜索的萬靈藥 乡范,它們在語義搜索方面非常出色,但在許多情況下啤咽,傳統(tǒng)的關(guān)鍵字搜索可以產(chǎn)生更相關(guān)的結(jié)果并提高用戶滿意度晋辆。為什么會這樣?這主要是因為基于余弦相似度等指標進行排名會導(dǎo)致具有更高相似度分數(shù)的結(jié)果出現(xiàn)在可能包含特定輸入關(guān)鍵字的部分匹配之上宇整,從而降低了它們對最終用戶的相關(guān)性瓶佳。 然而,純關(guān)鍵字搜索也有其局限性 鳞青, 如果用戶輸入的術(shù)語在語義上與存儲的數(shù)據(jù)相似(但不完全相同)霸饲,則可能有用和相關(guān)的結(jié)果將不會返回。由于這種權(quán)衡臂拓,搜索和檢索的實際應(yīng)用案例需要關(guān)鍵字和向量搜索的結(jié)合厚脉,其中向量數(shù)據(jù)庫是關(guān)鍵組成部分(因為它們存儲了嵌入向量,實現(xiàn)了語義相似性搜索胶惰,并能夠擴展到非常大的數(shù)據(jù)集)傻工。 總結(jié)以上觀點:
關(guān)鍵字搜索:當(dāng)用戶知道自己在尋找什么并期望結(jié)果與搜索詞中的確切短語匹配時,可以找到相關(guān)孵滞、有用的結(jié)果中捆。不需要向量數(shù)據(jù)庫。
向量搜索:當(dāng)用戶不確定自己在尋找什么時坊饶,可以找到相關(guān)的結(jié)果泄伪。需要向量數(shù)據(jù)庫。
混合關(guān)鍵字+向量搜索:通常結(jié)合全文關(guān)鍵字搜索和向量搜索的候選結(jié)果匿级,并使用交叉編碼器模型重新排序它們(見下文)蟋滴。需要文檔數(shù)據(jù)庫和向量數(shù)據(jù)庫。
可以通過下面的圖表有效地進行可視化:
BM25是某些數(shù)據(jù)庫(如Elasticsearch痘绎、Opensearch脓杉、MongoDB)中用于關(guān)鍵字搜索的最常見的索引算法。它通過考慮關(guān)鍵字詞頻與其逆文檔頻率(IDF)的關(guān)系來生成稀疏向量简逮。相比之下球散,向量數(shù)據(jù)庫通常使用稠密向量來編碼和存儲文本嵌入(與BM25不同,向量中的所有術(shù)語都不為零)散庶,通常通過類似BERT的雙編碼器模型來實現(xiàn)蕉堰,該模型為一對文檔生成一個句子嵌入凌净,然后可以進行比較以生成余弦相似度分數(shù)。
理解雙編碼器和交叉編碼器之間的區(qū)別
為了有效地進行混合搜索屋讶,需要通過BM25(關(guān)鍵字搜索)和余弦相似度(向量搜索)獲得的搜索結(jié)果候選項進行組合冰寻,這需要使用交叉編碼器。如下圖所示皿渗,這是一個下游步驟斩芭,允許將兩個句子同時傳遞給像BERT這樣的編碼器模型。與用于生成句子嵌入的雙編碼器不同乐疆,交叉編碼器不會生成嵌入向量划乖,而是通過softmax層為一對句子分配一個介于0和1之間的分數(shù),從而對其進行分類挤土。這被稱為重新排序琴庵,是一種非常強大的方法,可以獲得結(jié)合了關(guān)鍵字搜索和向量搜索優(yōu)勢的結(jié)果仰美。
需要注意的是:通過交叉編碼器進行重新排序是一個昂貴的步驟迷殿,因為它在查詢時需要使用一個Transformer模型。這種方法在搜索質(zhì)量對于使用案例至關(guān)重要時使用咖杂,并且需要更多的計算資源(通常是GPU)和調(diào)優(yōu)時間庆寺,以確保應(yīng)用程序按預(yù)期運行。
生成式問答:“與數(shù)據(jù)聊天”
隨著強大的語言模型(如GPT-4)的出現(xiàn)诉字,我們可以有效地將應(yīng)用程序的用戶體驗與存儲在向量數(shù)據(jù)庫中的干凈止邮、事實性信息進行整合,使用戶能夠通過自然語言查詢他們的數(shù)據(jù)奏窑。因為問答可能涉及的不僅僅是信息檢索(可能需要對數(shù)據(jù)的部分進行分析导披,而不僅僅是查詢),在應(yīng)用程序界面和向量數(shù)據(jù)庫之間包含一個基于代理的框架(如LangChain7)可能比直接連接向量數(shù)據(jù)庫更加強大埃唯。
由于向量數(shù)據(jù)庫將要查詢的數(shù)據(jù)存儲為嵌入向量撩匕,并且語言模型(LLM)也將其內(nèi)部的知識編碼為嵌入向量,因此它們在生成式問答應(yīng)用中是天然的配對墨叛。向量數(shù)據(jù)庫充當(dāng)知識庫的功能止毕,而LLM可以直接在嵌入空間中查詢數(shù)據(jù)的子集∧茫可以使用以下方法進行操作:
用戶通過界面用自然語言提出問題扁凛。
問題的文本被傳遞給嵌入模型(雙編碼器),然后返回一個句子嵌入向量闯传。
問題向量被傳遞給向量數(shù)據(jù)庫谨朝,通過ANN搜索返回與之最相似的前k個結(jié)果。這一步非常關(guān)鍵,因為它大大縮小了LLM在下一步中的搜索空間字币。
構(gòu)建一個LLM提示(基于開發(fā)者預(yù)定義的模板)则披,將其轉(zhuǎn)換為嵌入向量,并傳遞給LLM洗出。使用類似LangChain的框架可以方便地執(zhí)行此步驟士复,因為可以動態(tài)構(gòu)建提示,并調(diào)用LLM的本地嵌入模塊翩活,而無需為每個工作流編寫大量自定義代碼阱洪。
LLM在前k個結(jié)果中搜索信息,并生成問題的答案菠镇。
答案發(fā)送回用戶冗荸。
上述工作流程可以以許多方式進行擴展。例如辟犀,如果用戶的問題涉及從數(shù)據(jù)庫中獲取的數(shù)字進行一些算術(shù)運算(LLM在這方面的表現(xiàn)往往不好)俏竞,LangChain代理可以確定首先需要進行算術(shù)運算绸硕。然后堂竟,它將從前k個結(jié)果中提取的數(shù)值信息傳遞給計算器API,執(zhí)行計算玻佩,然后將答案發(fā)送回用戶出嘹。通過這種可組合的工作流程,可以看到向量數(shù)據(jù)庫為生成式問答聊天界面提供了強大的支持咬崔。
結(jié)論
結(jié)合LLM和向量數(shù)據(jù)庫可以構(gòu)建許多其他有用的應(yīng)用程序税稼。然而,了解向量數(shù)據(jù)庫的一些潛在限制是很重要的:
在搜索應(yīng)用程序中垮斯,它們不一定優(yōu)先考慮關(guān)鍵詞短語的精確匹配來確定相關(guān)性郎仆。
存儲和查詢的數(shù)據(jù)必須適應(yīng)所使用的嵌入模型的最大序列長度(對于類似BERT的模型,這個長度不超過幾百個詞)兜蠕。目前扰肌,最好的方法是利用像LangChain和LlamaIndex這樣的框架,將數(shù)據(jù)分塊或壓縮成適合底層模型上下文的固定大小的向量熊杨。
向量數(shù)據(jù)庫非常強大曙旭,但正如Harman所說,最重要的是:如果您對向量數(shù)據(jù)庫以及搜索和信息檢索領(lǐng)域不太了解晶府,以下材料不應(yīng)成為您選擇技術(shù)棧進行決策的主要信息來源:
來自超級聰明的風(fēng)險投資公司的基礎(chǔ)設(shè)施堆棧桂躏。
流行的LLM應(yīng)用程序框架的教程。
就像在任何其他領(lǐng)域一樣川陆,明確定義業(yè)務(wù)案例并研究手頭的工具剂习,可以有效地將它們結(jié)合起來解決現(xiàn)實世界的問題。在這方面,希望這個關(guān)于向量數(shù)據(jù)庫的系列有所幫助进倍!
作者:Prashanth Rao
更多技術(shù)干貨盡在wx“云原生數(shù)據(jù)庫”