不論是RAG,還是Agent,幾乎每個LLM 驅(qū)動的應(yīng)用程序都可能會用到向量數(shù)據(jù)庫。那么,向量數(shù)據(jù)庫是什么?與傳統(tǒng)數(shù)據(jù)庫有何不同? 又如何選擇向量數(shù)據(jù)庫呢? 本文是老碼農(nóng)關(guān)于向量數(shù)據(jù)庫的學(xué)習(xí)筆記。
1. 什么是向量數(shù)據(jù)庫?
首先,我們需要理解什么是向量?
向量是基于不同特征或?qū)傩詠砻枋鰧ο蟮臄?shù)據(jù)表示。每個向量代表一個單獨(dú)的數(shù)據(jù)點(diǎn),例如一個詞或一張圖片,由描述其許多特性的值的集合組成。這些變量有時被稱為“特征”或“維度”。例如,一張圖片可以表示為像素值的向量,整個句子也可以表示為單詞嵌入的向量。
一些常用的數(shù)據(jù)向量如下:
- 圖像向量,通過深度學(xué)習(xí)模型提取的圖像特征向量,這些特征向量捕捉了圖像的重要信息,如顏色、形狀、紋理等,可以用于圖像識別、檢索等任務(wù);
- 文本向量,通過詞嵌入技術(shù)如word2Vec、BERT等生成的文本特征向量,這些向量包含了文本的語義信息,可以用于文本分類、情感分析等任務(wù);
- 語音向量,通過聲學(xué)模型從聲音信號中提取的特征向量,這些向量捕捉了聲音的重要特性,如音調(diào)、節(jié)奏、音色等,可以用于語音識別、聲紋識別等任務(wù)。
向量數(shù)據(jù)庫是一種將數(shù)據(jù)存儲為高維向量的數(shù)據(jù)庫,高維向量是特征或?qū)傩缘臄?shù)學(xué)表示。每個向量都有一定數(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ù)庫以原始數(shù)據(jù)形式處理數(shù)據(jù),能夠有效地組織和管理數(shù)據(jù),便于AI模型應(yīng)用。
- 存儲:能夠存儲向量數(shù)據(jù),包括各種AI模型需要使用到的高維數(shù)據(jù)。
- 檢索:向量數(shù)據(jù)庫特別擅長高效地檢索數(shù)據(jù),這一個特點(diǎn)能夠確保AI模型在需要的時候快速獲得所需的數(shù)據(jù)。這也是向量數(shù)據(jù)庫能夠在一些推薦系統(tǒng)或者檢索系統(tǒng)中得到應(yīng)用的重要原因。
向量數(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ù)庫則是大模型的記憶和存儲核心。在大模型學(xué)習(xí)階段,向量數(shù)據(jù)庫接收多模態(tài)數(shù)據(jù)進(jìn)行向量化表示,讓大模型在訓(xùn)練時能夠更高效地調(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ù), 嵌入作為一個橋梁,將非數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為機(jī)器學(xué)習(xí)模型可以使用的形式,使它們能夠更有效地識別數(shù)據(jù)中的模式和關(guān)系。一般的,文本是一維向量,圖像是二維矩陣,視頻相當(dāng)于三維矩陣。這些嵌入實(shí)質(zhì)上是存儲數(shù)據(jù)的上下文表示的數(shù)字列表(即向量)。在存儲層內(nèi),數(shù)據(jù)庫以m個向量堆棧的形式存儲,每個向量使用n個維度表示一個數(shù)據(jù)點(diǎn),總大小為m×n。為了查詢性能的原因,這些堆棧通常通過分片進(jìn)行劃分。
向量檢索是輸入一個向量,從數(shù)據(jù)庫中查找與輸入向量最相似的topN個向量返回。要在向量數(shù)據(jù)庫中執(zhí)行相似性搜索和檢索,需要使用表示所需信息或條件的查詢向量。查詢向量可以從與存儲向量相同類型的數(shù)據(jù)導(dǎo)出,或者從不同類型的數(shù)據(jù)導(dǎo)出。使用相似性度量來計(jì)算兩個向量在向量空間中的距離。相似性度量可以基于各種度量,如余弦相似性、歐氏距離、向量內(nèi)積,hamming距離、jaccard指數(shù)。
其中,向量檢索算法是向量數(shù)據(jù)庫的核心之一。向量檢索可以看為是近似最近鄰搜索,通過預(yù)先的索引構(gòu)建來減小數(shù)據(jù)查詢時的搜索空間,加快檢索速度。目前主要的幾種檢索算法有:
- 基于樹的方法,例如KDTree和Annoy
- 基于圖的方法,例如HNSW
- 基于乘積量化的方法,例如SQ和PQ
- 基于哈希的方法,例如LSH
- 基于倒排索引的方法
向量數(shù)據(jù)庫中的索引可以按照數(shù)據(jù)結(jié)構(gòu)和壓縮級別兩個層次進(jìn)行組織實(shí)現(xiàn)。根據(jù)數(shù)據(jù)結(jié)構(gòu)建立索引的分類如下:
圖片
根據(jù)數(shù)據(jù)壓縮方式建立索引, 主要包括平坦壓縮和量化壓縮。平坦壓縮是指以未經(jīng)修改的形式存儲向量的索引,量化中索引的底層向量被分解成由較少字節(jié)組成的塊(通常通過將浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù))以減少內(nèi)存消耗和搜索過程中的計(jì)算成本。
圖片
相似性搜索和檢索的結(jié)果通常是與查詢向量具有最高相似性得分的向量的排序列表。然后,您可以訪問與原始源或索引中的每個向量關(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ù)庫是專門為存儲和檢索向量而設(shè)計(jì)的。包括Chroma, LanceDB, Marqo, Milvus/ Zilliz, Pinecone, Qdrant, Vald, Vespa, Weaviate等, 所管理的數(shù)據(jù)是基于對象或數(shù)據(jù)點(diǎn)的向量表示進(jìn)行組織和索引。這里只介紹其中的三種,具體信息可以參考各自的官網(wǎng)。
Faiss
Faiss是一個用于高效相似性搜索和密集向量聚類的開源庫。Faiss是用C++編寫的,帶有完整的Python/ target=_blank class=infotextkey>Python/numpy包裝器,一些常用算法都有GPU實(shí)現(xiàn),成為了很多開源向量數(shù)據(jù)庫的基礎(chǔ)。
圖片
Faiss能構(gòu)建不同的索引類型,并提供了歐式距離或者點(diǎn)積的相似度計(jì)算功能,有些索引類型是簡單的基線,例如精確搜索。大多數(shù)可用的索引結(jié)構(gòu)需要考慮搜索時間,搜索質(zhì)量,每個索引向量使用的內(nèi)存等。
Faiss支持多種向量搜索技術(shù),提供了能夠在不同大小的向量集中搜索的算法,甚至可以處理那些超過內(nèi)存容量的向量集。
Faiss的主要優(yōu)勢之一是速度和可擴(kuò)展性,即使在具有數(shù)十億個向量的數(shù)據(jù)集中也可以進(jìn)行快速搜索。此外,還提供了用于評估和調(diào)整參數(shù)的輔助代碼。
Pinecone
Pinecone是一個基于云的向量數(shù)據(jù)庫,可以開發(fā)實(shí)時相似性搜索應(yīng)用,能夠以毫秒級的延遲存儲和探索高維向量嵌入,適用于推薦系統(tǒng)、圖片和視頻搜索以及自然語言處理等應(yīng)用。
Pinecone 的主要功能包括自動索引、實(shí)時更新、查詢自動調(diào)整和用于與當(dāng)前流程進(jìn)行簡單交互的 REST API。其架構(gòu)專為可擴(kuò)展性和穩(wěn)健性而構(gòu)建,可以輕松管理海量數(shù)據(jù),同時保持高可用性。
圖片
Pinecone是一個可以托管的向量數(shù)據(jù)庫平臺,也就是說有商用方案,也有免費(fèi)使用方案。其主要特點(diǎn)包括:
- 支持全托管服務(wù)
- 高度可伸縮
- 實(shí)時數(shù)據(jù)攝取
- 低延遲的搜索
- 與LangChain集成
Pinecone 采用了多種安全措施來保護(hù)用戶的數(shù)據(jù)安全和隱私。多層次的訪問控制機(jī)制可以控制用戶的訪問權(quán)限和操作權(quán)限,同時采用了數(shù)據(jù)加密、傳輸加密等技術(shù)來保護(hù)數(shù)據(jù)的安全性,還提供了數(shù)據(jù)備份和恢復(fù)等功能,可以防止數(shù)據(jù)丟失和損壞。
Pinecone 在性能方面表現(xiàn)非常出色,它能夠支持高達(dá) 1 百萬次的QPS,且具有低延遲和高吞吐量的特點(diǎn),還具有分布式部署、實(shí)時索引構(gòu)建和高效的向量相似度搜索等優(yōu)點(diǎn),可以幫助用戶快速處理大規(guī)模的向量數(shù)據(jù)。
此外,Pinecone 還支持多種編程語言和框架,如 Python、JAVA、TensorFlow 等,使得用戶可以輕松地將其集成到自己的應(yīng)用程序中。
Milvus
Milvus是一個開源的分布式向量數(shù)據(jù)庫,它具備高可用、高性能、易拓展的特點(diǎn),用于海量向量數(shù)據(jù)的實(shí)時召回。
Milvus 基于 Faiss、Annoy、HNSW 等向量搜索庫構(gòu)建,可以輕松管理數(shù)百萬個實(shí)體,可以根據(jù)不同的數(shù)據(jù)特點(diǎn)選擇最合適的索引算法,核心是解決稠密向量相似度檢索的問題。在向量檢索的基礎(chǔ)上,Milvus 支持?jǐn)?shù)據(jù)分區(qū)分片、數(shù)據(jù)持久化、增量數(shù)據(jù)攝取、標(biāo)量向量混合查詢、time travel 等功能,同時大幅優(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,是一個支持各種類型數(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是一個向量數(shù)據(jù)庫,專注于向量數(shù)據(jù)的有效處理。它擅長存儲和分析大量向量數(shù)據(jù),包括張量、矩陣和數(shù)值數(shù)組。通過 利用內(nèi)存數(shù)據(jù)存儲Redis,RedisVector可提供高性能的查詢響應(yīng)時間。它提供內(nèi)置的索引和搜索功能,可以快速搜索和查找相似的載體,RedisVector還支持各種距離測量,用于比較向量和執(zhí)行復(fù)雜的分析操作。通過對向量數(shù)據(jù)的操作,包括元素級算術(shù)和聚合,RedisVector 為處理向量提供了一個多功能環(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和K.NETica的pgvector/Supabase Vector等。它們都宣布包含了向量搜索功能,如點(diǎn)積,余弦相似度,歐幾里得距離和曼哈頓距離,并且使用相似度分?jǐn)?shù)找到n個最近鄰。由于提供了混合查詢,可以將向量與其他數(shù)據(jù)結(jié)合起來以獲得更有意義的結(jié)果。另外,大多數(shù)SQL數(shù)據(jù)庫都可以作為服務(wù)部署,可以在云上進(jìn)行完全的管理。
圖片
例如,Postgres 通過 pg_vector 和 pg_embdding 兩個插件來實(shí)現(xiàn)向量數(shù)據(jù)庫,讓PG數(shù)據(jù)庫支持向量索引檢索的能力。其索引算法使用的是基于Faiss的IVF Flat索引,提供了優(yōu)異的召回率。
4. 向量數(shù)據(jù)庫的一些對比
4.1 編程語言支持
Chroma是一個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也是一個閉源的完全托管的商業(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ù)庫時,還需要特別考量以下因素:
- 可擴(kuò)展性:能夠高效處理高維度大數(shù)據(jù)量并能夠根據(jù)數(shù)據(jù)需求的增長進(jìn)行擴(kuò)展。
- 性能:速度和效率對數(shù)據(jù)庫至關(guān)重要,需要在數(shù)據(jù)搜索、搜索性能和執(zhí)行各種向量操作方面表現(xiàn)出色。
- 靈活性:支持廣泛的數(shù)據(jù)類型和格式,并且可以輕松適應(yīng)不同的應(yīng)用場景。
- 易用性。這些數(shù)據(jù)庫易于使用和管理,易于安裝和配置,具有直觀的API,并且有良好的文檔和支持。
- 可靠性:需要有可靠和穩(wěn)定的聲譽(yù)。
5. 向量數(shù)據(jù)庫與其他類型數(shù)據(jù)庫的對比
傳統(tǒng)數(shù)據(jù)庫,如關(guān)系數(shù)據(jù)庫,旨在存儲結(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)行更改可能會非常復(fù)雜且耗時。這種剛性可確保數(shù)據(jù)一致性,但靈活性可能不如某些現(xiàn)代數(shù)據(jù)庫的無模式或動態(tài)模式性質(zhì)。
特性 |
關(guān)系型數(shù)據(jù)庫 |
向量數(shù)據(jù)庫 |
數(shù)據(jù)類型 |
數(shù)值、字符串、時間等傳統(tǒng)數(shù)據(jù)類型 |
向量數(shù)據(jù)不存儲原始數(shù)據(jù) |
數(shù)據(jù)規(guī)模 |
小,1億數(shù)據(jù)量為規(guī)模很大 |
大,千億數(shù)據(jù)是底線 |
數(shù)據(jù)組織方式 |
基于表格,按照行和列組織 |
基于向量,按照向量維度組織 |
查找方式 |
精確查找:點(diǎn)查/范圍查 |
近似查找:對算力要求較高 |
低時延,高并發(fā) |
否 |
是 |
支撐上層應(yīng)用 |
較弱 |
對外提供統(tǒng)一的API,更適合大規(guī)模AI引用程序的部署和使用 |
應(yīng)用場景 |
容錯率低,需提供更為精準(zhǔn)的搜索結(jié)果 |
場景容錯率較高 |
與在行和列中存儲多種標(biāo)準(zhǔn)數(shù)據(jù)類型(如字符串、數(shù)字和其他標(biāo)量數(shù)據(jù)類型)不同,向量數(shù)據(jù)庫引入了向量這種新的數(shù)據(jù)類型,并圍繞此數(shù)據(jù)類型構(gòu)建優(yōu)化,專門用于實(shí)現(xiàn)快速存儲、檢索和最近鄰搜索語義。在傳統(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ù)庫來存儲與所需領(lǐng)域的不同主題、關(guān)鍵詞、事實(shí)、觀點(diǎn)和/或來源的信息。然后,在使用一個大模型時,通過AI插件從向量數(shù)據(jù)庫中傳遞信息,以生成更具信息性和吸引力的內(nèi)容,符合目標(biāo)意圖和指定風(fēng)格。
借助向量數(shù)據(jù)庫,我們能夠快速加載和存儲事件作為嵌入,并使用向量數(shù)據(jù)庫作為為AI模型提供動力的大腦,提供上下文信息,長期記憶檢索,語義上的數(shù)據(jù)關(guān)聯(lián)等等。向量數(shù)據(jù)庫的典型使用方式如下:1. 使用embeding 技術(shù)創(chuàng)建向量2. 將這些向量存儲到向量數(shù)據(jù)庫3. 應(yīng)用索引策略來組織管理向量4. 使用查詢向量執(zhí)行相似性搜索5. 從向量數(shù)據(jù)庫中取得相似的向量
實(shí)際上,向量數(shù)據(jù)庫在不同的領(lǐng)域和應(yīng)用程序中都有著許多用例,涉及自然語言處理(NLP)、計(jì)算機(jī)視覺(CV)、推薦系統(tǒng)(RS)和其他需要對數(shù)據(jù)進(jìn)行語義理解和匹配的領(lǐng)域。在向量數(shù)據(jù)庫中存儲信息的一個用例是使大型語言模型(LLM)能夠基于AI插件生成更相關(guān)、更連貫的文本。
由于向量數(shù)據(jù)庫將要查詢的數(shù)據(jù)存儲為嵌入向量,并且語言模型(LLM)也將其內(nèi)部的知識編碼為嵌入向量,因此在生成式問答應(yīng)用中是天生一對。向量數(shù)據(jù)庫充當(dāng)知識庫的功能,而LLM可以直接在嵌入空間中查詢數(shù)據(jù)的子集,一般可以使用以下方法進(jìn)行操作:
- 用戶通過界面用自然語言提出問題。
- 問題的文本被傳遞給嵌入模型,然后返回一個句子嵌入向量。
- 問題向量被傳遞給向量數(shù)據(jù)庫,通過ANN搜索返回與之最相似的前k個結(jié)果。這一步非常關(guān)鍵,因?yàn)樗蟠罂s小了LLM在下一步中的搜索空間。
- 構(gòu)建一個LLM提示(基于開發(fā)者預(yù)定義的模板),將其轉(zhuǎn)換為嵌入向量,并傳遞給LLM。使用類似LangChain的框架可以方便地執(zhí)行此步驟,因?yàn)榭梢詣討B(tài)構(gòu)建提示語,并調(diào)用LLM的本地嵌入模塊,而無需為每個工作流編寫大量自定義代碼。
- LLM在前k個結(jié)果中搜索信息,并生成問題的答案,答案發(fā)送回用戶。
圖片
結(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ù)庫也面臨著許多與其他數(shù)據(jù)庫技術(shù)相同的挑戰(zhàn), 需要繼續(xù)努力提高可擴(kuò)展性、近似精度、延遲性能和經(jīng)濟(jì)性。許多向量數(shù)據(jù)庫在核心數(shù)據(jù)庫能力方面需要提升,例如安全性、彈性、運(yùn)營支持和工作負(fù)載支持的多樣化。隨著AI應(yīng)用的成熟,未來需要的不僅僅只限于向量搜索功能。
【參考資料】
- https://Github.com/milvus-io/milvus
- Milvus: A Purpose-Built Vector Data Management System, SIGMOD'21
- https://github.com/facebookresearch/faiss
- https://www.pinecone.io