?
向量:AI核心
向量伴隨著 AI 模型的發(fā)展而發(fā)展。
向量:AI 理解世界的通用數(shù)據(jù)形式,是多模態(tài)數(shù)據(jù)的壓縮。
比如大模型輸入輸出都是文字文本,但模型實(shí)際接觸和學(xué)習(xí)數(shù)據(jù)是向量化文本。
這個(gè)步驟叫 Embedding(嵌入),將文字文本轉(zhuǎn)化為保留語(yǔ)義關(guān)系的向量文本。
embedding 模型對(duì)自然語(yǔ)言的壓縮和總結(jié),將高維數(shù)據(jù)映射到低維空間。
不僅文字,圖像也是向量化之后進(jìn)行處理:
?
向量庫(kù):語(yǔ)義近似搜索
傳統(tǒng)數(shù)據(jù)庫(kù)是基于文本的精確匹配、SQL語(yǔ)言查找符合條件的數(shù)據(jù),適合關(guān)鍵字搜索。
向量庫(kù):專(zhuān)門(mén)存儲(chǔ)和查詢(xún)向量的數(shù)據(jù)庫(kù),適合語(yǔ)義搜索。
向量數(shù)據(jù)庫(kù)步驟:
- 向量數(shù)據(jù)的存儲(chǔ):向量數(shù)據(jù)通常是高維的數(shù)值型數(shù)據(jù),如圖像特征向量、文本詞向量等;向量數(shù)據(jù)庫(kù)使用基于向量的存儲(chǔ)結(jié)構(gòu),以便快速查詢(xún)和處理;
- 向量索引:向量數(shù)據(jù)庫(kù)使用PQ、LSH或HNSW等算法為向量編制索引,并將向量映射到數(shù)據(jù)結(jié)構(gòu),以便更快地進(jìn)行搜索;
- 向量查詢(xún):向量數(shù)據(jù)庫(kù)將查詢(xún)向量與數(shù)據(jù)庫(kù)中的向量進(jìn)行比較,從而找到最近鄰的向量;
- 查詢(xún)結(jié)果的返回:向量數(shù)據(jù)庫(kù)返回查詢(xún)結(jié)果,通常包括與給定向量最相似的向量列表、向量之間的相似度得分等信息;該環(huán)節(jié)可以使用不同的相似性度量對(duì)最近鄰重新排序。
傳統(tǒng)數(shù)據(jù)庫(kù)索引是精確匹配,要么符合查詢(xún)要求(返回?cái)?shù)據(jù)),要么不符合查詢(xún)要求(無(wú)數(shù)據(jù)返回)。
向量搜索
- 在海量存儲(chǔ)的向量中找到最符合要求的 Top N 個(gè)目標(biāo)。
- 向量搜索是模糊匹配,返回的是相對(duì)最符合要求的N個(gè)數(shù)據(jù),并沒(méi)有精確標(biāo)準(zhǔn)答案
向量數(shù)據(jù)庫(kù)
- 時(shí)間上:用以高效存儲(chǔ)和搜索向量,自帶語(yǔ)義理解(向量位置之間的相關(guān)性,距離越近越相關(guān)),為AI模型提供長(zhǎng)期記憶功能
- 空間上:向量數(shù)據(jù)庫(kù)本地部署后可以存儲(chǔ)企業(yè)有關(guān)的大量隱私數(shù)據(jù),通過(guò)特別的Agent大模型可以在有保護(hù)的情況下訪問(wèn)向量數(shù)據(jù)庫(kù)
- 成本上:更低成本的搜索、查詢(xún)、存儲(chǔ)向量
- 速度上:保證100%信息完整的情況下,通過(guò)向量嵌入函數(shù)(embedding)精準(zhǔn)描寫(xiě)非結(jié)構(gòu)化數(shù)據(jù)的特征,從而提供查詢(xún)、刪除、修改、元數(shù)據(jù)過(guò)濾等操作,同時(shí)實(shí)現(xiàn)極高效率的近似搜索
- 功能上:跨模態(tài)搜索,例如讓用戶(hù)用文字來(lái)搜索圖片,因?yàn)橄蛄磕軌虿蹲降秸Z(yǔ)義相似性,使來(lái)自不同語(yǔ)言的查詢(xún)和內(nèi)容能夠相互匹配。
傳統(tǒng)數(shù)據(jù)庫(kù)無(wú)法滿(mǎn)足此類(lèi)操作和需求,只能實(shí)現(xiàn)部分向量數(shù)據(jù)的存儲(chǔ),且無(wú)法高效搜索向量。
向量搜索能夠?qū)崿F(xiàn)對(duì)語(yǔ)義更為精準(zhǔn)的理解,在多模態(tài)、不同語(yǔ)言等環(huán)境下能夠輸出更為準(zhǔn)確的結(jié)果。
如:英文的Capital可以指“資本”或者“首都”,“從中國(guó)去美國(guó)”和“從美國(guó)去中國(guó)”存在方向,傳統(tǒng)的數(shù)據(jù)庫(kù)不能很好解決這些問(wèn)題。
-
已知傳統(tǒng)數(shù)據(jù)庫(kù),適合關(guān)鍵字搜索。
-
已知向量庫(kù),適合語(yǔ)義搜索。
那是不是還可以組合倆者,提供更加全面和精準(zhǔn)的搜索?
或者加速搜索速度,先使用向量庫(kù)進(jìn)行初步的語(yǔ)義搜索以縮小搜索范圍,然后在這個(gè)范圍內(nèi)使用傳統(tǒng)數(shù)據(jù)庫(kù)進(jìn)行精確的關(guān)鍵字搜索。
?
大模型 + 向量庫(kù)
Step 1 語(yǔ)料庫(kù)準(zhǔn)備:
- 將與行業(yè)相關(guān)的大量知識(shí)或語(yǔ)料上傳至向量數(shù)據(jù)庫(kù),儲(chǔ)存為向量化文本;
Step 2 問(wèn)題輸入:
- 輸入的問(wèn)題被Embedding引擎變成帶有向量的提問(wèn);
Step 3 向量搜索:
- 向量化問(wèn)題進(jìn)入提前準(zhǔn)備好的向量數(shù)據(jù)庫(kù)中,通過(guò)向量搜索引擎計(jì)算向量相似度,匹配出Top N條語(yǔ)義最相關(guān)的答案
Step 4 Prompt優(yōu)化:
- 輸出的Top N條Facts,和用戶(hù)的問(wèn)題一起作為prompt輸入給模型。
Step 5 結(jié)果返回:
- 有記憶交互下得到的生成內(nèi)容更精準(zhǔn)且緩解了幻覺(jué)問(wèn)題。
?
YOLO + 向量數(shù)據(jù)庫(kù)
假設(shè)你正在使用YOLO模型來(lái)識(shí)別和分類(lèi)眼底圖像中的疾病,比如糖尿病性視網(wǎng)膜病變、青光眼等。
不使用向量數(shù)據(jù)庫(kù)的情況:
- 每次識(shí)別都需要YOLO模型從頭開(kāi)始處理圖像,并實(shí)時(shí)輸出分類(lèi)結(jié)果。
- 對(duì)于歷史數(shù)據(jù)的搜索和比較可能需要重新運(yùn)行模型或手動(dòng)檢查。
- 難以進(jìn)行大規(guī)模的相似案例搜索,比如尋找有相似視網(wǎng)膜特征的病例進(jìn)行對(duì)比分析。
- 每次查詢(xún)都是獨(dú)立的,不利用先前的計(jì)算結(jié)果和數(shù)據(jù)。
使用向量數(shù)據(jù)庫(kù)的情況:
- YOLO模型可以將識(shí)別到的特征(例如視盤(pán)、視杯、血管異常等)轉(zhuǎn)換為向量,并存儲(chǔ)在向量數(shù)據(jù)庫(kù)中。
- 一旦存儲(chǔ)了特征向量,就可以快速進(jìn)行相似性搜索,找到具有類(lèi)似病理特征的其他眼底圖像。
- 可以實(shí)現(xiàn)快速的案例檢索,幫助醫(yī)生進(jìn)行診斷對(duì)比,或者用于研究和教育目的。
- 可以跟蹤病情的進(jìn)展,通過(guò)比較新舊圖像的特征向量來(lái)觀察病變的變化。
- 可以更高效地管理和利用存儲(chǔ)的數(shù)據(jù),為大數(shù)據(jù)分析和機(jī)器學(xué)習(xí)提供支持,可能還能發(fā)現(xiàn)新的疾病模式或趨勢(shì)。
假設(shè)一個(gè)醫(yī)院收集了數(shù)千張眼底圖像,并使用YOLO模型來(lái)識(shí)別各種疾病標(biāo)志。
如果沒(méi)有向量數(shù)據(jù)庫(kù),每次新的病例來(lái)臨時(shí),醫(yī)生可能需要手動(dòng)查找和比較歷史病例來(lái)輔助診斷。
這不僅費(fèi)時(shí),而且無(wú)法保證一致性和準(zhǔn)確性,特別是在病例數(shù)量龐大時(shí)。
如果使用向量數(shù)據(jù)庫(kù),YOLO模型可以將每張圖像中識(shí)別出的疾病標(biāo)志轉(zhuǎn)換為特征向量并存儲(chǔ)。
當(dāng)新病例來(lái)臨時(shí),模型會(huì)對(duì)新眼底圖像進(jìn)行分析,并將其特征向量與數(shù)據(jù)庫(kù)中現(xiàn)有的向量進(jìn)行比較。
這樣可以迅速找到歷史病例中與新病例具有相似特征的圖像,為醫(yī)生提供即時(shí)的、數(shù)據(jù)驅(qū)動(dòng)的參考。
此外,醫(yī)生還可以追蹤特定患者的病情變化,通過(guò)比較同一患者不同時(shí)間點(diǎn)的眼底圖像的特征向量。
用與不用向量數(shù)據(jù)庫(kù)的具體區(qū)別:
- 診斷速度和效率:使用向量數(shù)據(jù)庫(kù)可以大大加快診斷過(guò)程,因?yàn)橄嗨菩运阉骺梢约磿r(shí)完成。
- 診斷一致性:數(shù)據(jù)庫(kù)可以幫助醫(yī)生獲得一致的比較結(jié)果,而不是依賴(lài)個(gè)人的記憶或手動(dòng)搜索。
- 數(shù)據(jù)驅(qū)動(dòng)的洞見(jiàn):通過(guò)分析存儲(chǔ)的特征向量,可能發(fā)現(xiàn)新的疾病模式或趨勢(shì),這對(duì)于醫(yī)學(xué)研究和臨床實(shí)踐都是非常寶貴的。
- 患者跟蹤和管理:醫(yī)生可以更容易地跟蹤患者的病情進(jìn)展,并根據(jù)歷史數(shù)據(jù)進(jìn)行有效管理。
那倆者怎么結(jié)合呢?
使用YOLO模型和向量數(shù)據(jù)庫(kù)進(jìn)行目標(biāo)檢測(cè)和檢索涉及幾個(gè)步驟:
-
數(shù)據(jù)準(zhǔn)備:
- 收集并標(biāo)注眼底圖像數(shù)據(jù)集。
- 對(duì)圖像進(jìn)行預(yù)處理,如調(diào)整大小、歸一化等。
-
YOLO模型訓(xùn)練:
- 使用標(biāo)注好的眼底圖像數(shù)據(jù)集訓(xùn)練YOLO模型。
- 訓(xùn)練完成后,模型應(yīng)能夠在眼底圖像中識(shí)別出疾病標(biāo)志。
-
特征提取:
- 將訓(xùn)練好的YOLO模型應(yīng)用于眼底圖像。
- 模型將輸出每個(gè)檢測(cè)到的對(duì)象的邊界框、類(lèi)別標(biāo)簽和特征向量。
-
構(gòu)建向量數(shù)據(jù)庫(kù):
- 設(shè)計(jì)數(shù)據(jù)庫(kù)架構(gòu),用于存儲(chǔ)特征向量以及與之關(guān)聯(lián)的元數(shù)據(jù)(如圖像ID、診斷結(jié)果等)。
- 選擇適合高維向量檢索的數(shù)據(jù)庫(kù)系統(tǒng),如使用Faiss、Annoy、Elasticsearch等。
-
存儲(chǔ)特征向量:
- 將YOLO提取出的特征向量存儲(chǔ)到向量數(shù)據(jù)庫(kù)中。
- 確保數(shù)據(jù)庫(kù)有適當(dāng)?shù)乃饕Y(jié)構(gòu),以支持高效的檢索。
-
實(shí)現(xiàn)檢索功能:
- 開(kāi)發(fā)一個(gè)界面或API,允許用戶(hù)提交新的眼底圖像。
- 使用YOLO模型提取新圖像的特征向量。
- 將提取出的特征向量與數(shù)據(jù)庫(kù)中存儲(chǔ)的向量進(jìn)行比較,找出最相似的匹配項(xiàng)。
-
使用檢索結(jié)果:
- 將檢索結(jié)果(相似的眼底圖像或案例)展示給醫(yī)生或研究人員。
- 結(jié)合醫(yī)生的專(zhuān)業(yè)知識(shí)和模型的檢索結(jié)果進(jìn)行診斷或研究分析。
假設(shè)醫(yī)生想要診斷一個(gè)新的眼底圖像,以確定是否有糖尿病性視網(wǎng)膜病變的跡象。
醫(yī)生通過(guò)界面上傳圖像,系統(tǒng)自動(dòng)進(jìn)行以下步驟:
- 使用YOLO模型對(duì)上傳的圖像進(jìn)行處理,模型檢測(cè)圖像中的特征并生成特征向量。
- 特征向量被送到向量數(shù)據(jù)庫(kù)進(jìn)行檢索,數(shù)據(jù)庫(kù)快速返回最相似的歷史案例。
- 醫(yī)生收到系統(tǒng)提供的相似案例,這些案例包含歷史圖像、診斷信息和其他相關(guān)數(shù)據(jù)。
- 醫(yī)生可以查看匹配的案例并參考這些信息,輔助自己作出診斷決策。
使用向量數(shù)據(jù)庫(kù)可以大大加快醫(yī)生訪問(wèn)和比較歷史案例的速度,提高工作效率,并可能提高診斷的準(zhǔn)確性。
?
嵌入(Embedding)設(shè)計(jì)
嵌入的核心思想是將每個(gè)單詞或短語(yǔ)映射到一個(gè)高維空間(通常是數(shù)百到數(shù)千維)中的點(diǎn)。
這些點(diǎn)的相對(duì)位置可以表示不同單詞之間的語(yǔ)義關(guān)系,例如同義詞會(huì)在高維空間中彼此靠近,而無(wú)關(guān)的詞則會(huì)相距較遠(yuǎn)。
舉個(gè)例子:假設(shè)我們有三個(gè)單詞:“貓”、“狗”和“汽車(chē)”。
在一個(gè)良好構(gòu)建的嵌入空間中,“貓”和“狗”的向量會(huì)比“貓”和“汽車(chē)”的向量更為接近,因?yàn)椤柏垺焙汀肮贰痹谡Z(yǔ)義上更相關(guān)(都是寵物),而“汽車(chē)”則與這兩者在語(yǔ)義上相距較遠(yuǎn)。
設(shè)計(jì)步驟:
-
預(yù)處理文本數(shù)據(jù):
- 清洗文本:去除無(wú)關(guān)字符、標(biāo)點(diǎn)符號(hào)、HTML標(biāo)簽等。
- 分詞(Tokenization):將文本分解成單詞、短語(yǔ)或其他有意義的字符序列。
- 歸一化(Normalization):轉(zhuǎn)換為統(tǒng)一的大小寫(xiě),進(jìn)行詞干提取(Stemming)或詞形還原(Lemmatization)。
-
構(gòu)建詞匯表:
- 根據(jù)預(yù)處理后的文本,創(chuàng)建一個(gè)唯一單詞的集合,稱(chēng)為詞匯表。
- 可能會(huì)設(shè)置最小出現(xiàn)頻率,排除出現(xiàn)次數(shù)過(guò)少的單詞。
- 特殊標(biāo)記:如未知詞(UNK)、句子開(kāi)始(SOS)、句子結(jié)束(EOS)等。
-
選擇嵌入方法:
- One-hot Encoding:最簡(jiǎn)單的方法,每個(gè)單詞由一個(gè)大向量表示,該向量中只有一個(gè)元素是1,其余都是0。
-
Word Embeddings:
- 預(yù)訓(xùn)練嵌入(如Word2Vec、GloVe):使用大型文本語(yǔ)料庫(kù)訓(xùn)練得到的,能夠捕捉語(yǔ)義關(guān)系的密集向量。
- 自定義訓(xùn)練嵌入:在特定任務(wù)上從頭開(kāi)始訓(xùn)練得到的嵌入向量。
- 上下文嵌入(如BERT、GPT):生成的嵌入向量不僅取決于單詞本身,還取決于單詞在句子中的上下文。
-
嵌入向量的維度選擇:
- 嵌入向量的維度通常是超參數(shù),需要根據(jù)問(wèn)題的復(fù)雜性和訓(xùn)練數(shù)據(jù)的大小進(jìn)行調(diào)整。
- 維度越大,模型的表達(dá)能力越強(qiáng),但計(jì)算量也越大,且可能導(dǎo)致過(guò)擬合。
-
訓(xùn)練嵌入層:
- 如果使用預(yù)訓(xùn)練的嵌入,可以直接加載到模型中,也可以進(jìn)一步在特定任務(wù)上進(jìn)行微調(diào)。
- 如果是自定義訓(xùn)練,將嵌入層作為模型的一部分,通過(guò)誤差反向傳播進(jìn)行訓(xùn)練,學(xué)習(xí)到最適合當(dāng)前任務(wù)的嵌入向量。
-
處理OOV(Out-of-Vocabulary)問(wèn)題:
- 對(duì)于在詞匯表中不存在的單詞,通常會(huì)用特殊的UNK向量表示。
- 可以通過(guò)子詞嵌入(如Byte-Pair Encoding)處理未知單詞,將單詞分解為更小的單位。
-
優(yōu)化和評(píng)估:
- 使用驗(yàn)證集評(píng)估嵌入層對(duì)于任務(wù)的有效性。
- 調(diào)整嵌入層的參數(shù)或訓(xùn)練策略,以提高模型性能。
- 可視化嵌入向量,檢查語(yǔ)義關(guān)系是否符合預(yù)期(如使用t-SNE技術(shù))。
最近鄰搜索
在D維空間中的查詢(xún)向量q
與一組向量x_1, x_2, ..., x_N
進(jìn)行比較,以找到最近的向量。
數(shù)學(xué)表達(dá)式是查詢(xún)向量q
與每個(gè)數(shù)據(jù)庫(kù)向量x_n
之間的平方歐幾里得距離的argmin。
結(jié)果是查詢(xún)q
的最近向量x_74
。
?
兩種尋找最近鄰的實(shí)現(xiàn)方式:
- 一種是簡(jiǎn)單的樸素實(shí)現(xiàn)
- 另一種是使用Facebook AI Research (FAIR)的Faiss庫(kù)的快速實(shí)現(xiàn)。
樸素實(shí)現(xiàn)非常直接,使用簡(jiǎn)單的循環(huán)計(jì)算q
和x
之間的平方差。
Faiss實(shí)現(xiàn),對(duì)查詢(xún)數(shù)量較少的情況(M <= 20
)使用SIMD(單指令多數(shù)據(jù))以及對(duì)查詢(xún)數(shù)量較多的情況使用BLAS(基本線性代數(shù)子程序)進(jìn)行計(jì)算。
?
上圖介紹了,向量如何組裝進(jìn)SIMD寄存器以及計(jì)算過(guò)程以達(dá)到結(jié)果。
如何使用SIMD指令計(jì)算平方歐幾里得距離,這些指令允許并行計(jì)算,可以顯著加快計(jì)算速度。
?
如何利用SIMD和BLAS進(jìn)行大規(guī)模矩陣計(jì)算。
上圖展示了如何將查詢(xún)向量和數(shù)據(jù)庫(kù)向量堆疊成矩陣,并使用sgemm
函數(shù)(BLAS的矩陣乘法函數(shù))來(lái)高效計(jì)算內(nèi)積。
它還指出了不同BLAS實(shí)現(xiàn)之間的性能差異,比如Intel MKL和OpenBLAS,其中Intel MKL報(bào)告稱(chēng)比OpenBLAS快30%。
主要主題是最近鄰搜索的優(yōu)化,特別關(guān)注如何使用高級(jí)技術(shù)如SIMD和優(yōu)化的庫(kù)如BLAS高效計(jì)算高維向量之間的距離。
結(jié)論是,通過(guò)使用這些高級(jí)技術(shù),可以在最近鄰搜索中實(shí)現(xiàn)顯著的性能提升,這對(duì)于機(jī)器學(xué)習(xí)和數(shù)據(jù)檢索中的許多應(yīng)用至關(guān)重要。
近似近鄰搜索
在不同數(shù)據(jù)規(guī)模下,原始數(shù)據(jù)與壓縮數(shù)據(jù)處理的對(duì)比。
左側(cè)是為原始數(shù)據(jù)設(shè)計(jì)的方法,如局部敏感哈希(LSH)、樹(shù)/空間劃分和圖遍歷,這些方法在較小規(guī)模的數(shù)據(jù)集上表現(xiàn)良好。
右側(cè)是為壓縮數(shù)據(jù)設(shè)計(jì)的方法,包括查找表和哈明距離基礎(chǔ)上的線性掃描,適用于更大規(guī)模的數(shù)據(jù)集。
幾乎與上圖相同,但它標(biāo)記了局部敏感哈希(LSH)方法,可能是為了強(qiáng)調(diào)這種方法在處理原始數(shù)據(jù)時(shí)的重要性。
MinHash-LSH 哈希模糊去重:如何解決醫(yī)學(xué)大模型的大規(guī)模數(shù)據(jù)去重?
詳細(xì)介紹了局部敏感哈希(LSH)的工作原理,它是一種通過(guò)哈希函數(shù)將相似項(xiàng)映射到相同符號(hào)的概率很高的技術(shù)。
圖中展示了數(shù)據(jù)記錄時(shí)如何應(yīng)用多個(gè)哈希函數(shù),并在搜索時(shí)如何使用相同的哈希函數(shù)來(lái)定位可能的候選項(xiàng),然后通過(guò)歐幾里得距離進(jìn)行比較。
?
FLANN(Fast Library for Approximate Nearest Neighbors)是一個(gè)用于近似最近鄰搜索的庫(kù),支持如隨機(jī)化KD樹(shù)和k均值樹(shù)等數(shù)據(jù)結(jié)構(gòu)。
它在2000年代末到2010年代初非常流行,已經(jīng)被集成到OpenCV和PCL庫(kù)中。
但FLANN的缺點(diǎn)是內(nèi)存消耗大,且需要存儲(chǔ)原始數(shù)據(jù),目前也不再積極維護(hù)。
輸入輸出:
輸入:一個(gè)查詢(xún)向量和一個(gè)高維數(shù)據(jù)集。
輸出:數(shù)據(jù)集中與查詢(xún)向量最近的一個(gè)或多個(gè)最近鄰向量。
import numpy as np
import pyflann
# 創(chuàng)建一個(gè)FLANN對(duì)象
flann = pyflann.FLANN()
# 生成隨機(jī)樣本數(shù)據(jù)
num_data = 1000
dim = 10
data = np.random.rand(num_data, dim).astype(np.float32)
# 訓(xùn)練數(shù)據(jù)集
flann.build_index(data, algorithm='kdtree')
# 生成一個(gè)查詢(xún)向量
query = np.random.rand(dim).astype(np.float32)
# 搜索最近鄰
result, _ = flann.nn_index(query, num_neighbors=5)
# 輸出最近鄰的索引
print(result)
?
Annoy 是另一個(gè)用于近似最近鄰搜索的庫(kù),使用“2均值樹(shù)”和“多樹(shù)”以及“共享優(yōu)先隊(duì)列”來(lái)提高搜索的效率和準(zhǔn)確度。
它隨機(jī)選擇兩點(diǎn)來(lái)劃分空間,并遞歸地重復(fù)這個(gè)過(guò)程,以構(gòu)建出層次化的樹(shù)結(jié)構(gòu)。
通過(guò)這種方式,Annoy能夠快速定位查詢(xún)點(diǎn)所在的單元格,并比較距離以找到最近鄰。
from annoy import AnnoyIndex
# 初始化AnnoyIndex
f = 40 # 維度
t = AnnoyIndex(f, 'angular') # 使用Angular距離
# 添加數(shù)據(jù)到索引
for i in range(1000):
v = [np.random.gauss(0, 1) for z in range(f)]
t.add_item(i, v)
# 構(gòu)建索引
t.build(10) # 10棵樹(shù)
# 保存索引
t.save('test.ann')
# 加載索引
u = AnnoyIndex(f, 'angular')
u.load('test.ann') # 快速加載
# 查詢(xún)
print(u.get_nns_by_item(0, 3)) # 查詢(xún)與第0個(gè)向量最近的3個(gè)鄰居
PQ是一種將向量分割成子向量,并對(duì)每個(gè)子向量進(jìn)行量化的方法,它簡(jiǎn)單且內(nèi)存高效。
PQ通常通過(guò)對(duì)訓(xùn)練數(shù)據(jù)執(zhí)行k均值聚類(lèi)來(lái)事先訓(xùn)練,然后使用編碼本來(lái)量化新的向量。
例如,在圖像檢索系統(tǒng)中,有一個(gè)高維的特征向量表示每個(gè)圖像的內(nèi)容。
PQ 可以用來(lái)減少這些特征向量的存儲(chǔ)空間,同時(shí)保持能夠快速檢索相似圖像的能力。
使用方法:
- 將高維向量分解為較小的子向量。
- 對(duì)每個(gè)子向量執(zhí)行k均值聚類(lèi),創(chuàng)建一個(gè)編碼本。
- 每個(gè)子向量由其在編碼本中的索引表示。
- 用這些索引替換原始向量,以壓縮數(shù)據(jù)。
在實(shí)際應(yīng)用中,PQ通常與倒排索引結(jié)合使用,以在大型數(shù)據(jù)庫(kù)中快速檢索最近鄰。
倒排索引允許系統(tǒng)只搜索與查詢(xún)向量具有相似PQ編碼的那些數(shù)據(jù)點(diǎn),從而大大減少計(jì)算量。
?
主流向量數(shù)據(jù)庫(kù)
全球主流向量數(shù)據(jù)庫(kù):Pinecone、Milvus、Vespa、Weaviate、Qdrant。
超過(guò)70%的向量數(shù)據(jù)庫(kù)選擇了開(kāi)源,超過(guò)一半的向量數(shù)據(jù)庫(kù)具有云化部署的能力。
大部分向量數(shù)據(jù)庫(kù)產(chǎn)品在進(jìn)行ANN相似性搜索時(shí)采用HNSW(Hierarchical Navigable Small World)算法。
對(duì)比每個(gè)向量數(shù)據(jù)庫(kù)的特點(diǎn)、能力和架構(gòu)選擇。
-
Pinecone:
- 網(wǎng)站:pinecone.io
- 這是一個(gè)托管的向量數(shù)據(jù)庫(kù),是封閉源代碼的。
- 價(jià)值主張包括:
- 完全托管的向量數(shù)據(jù)庫(kù)
- 單階段過(guò)濾
- 水平擴(kuò)展
- 實(shí)時(shí)索引更新
- 架構(gòu)圖展示了數(shù)據(jù)輸入通過(guò)嵌入模型,到通過(guò)API網(wǎng)關(guān)、負(fù)載均衡器處理查詢(xún)和更新,以及圍繞Kubernetes pods結(jié)構(gòu)化的向量數(shù)據(jù)庫(kù)的工作流程。
Pinecone適用場(chǎng)景:
適合需要完全托管解決方案的企業(yè),不愿意或沒(méi)有資源自己維護(hù)和管理數(shù)據(jù)庫(kù)基礎(chǔ)設(shè)施。
由于其支持水平擴(kuò)展和實(shí)時(shí)索引更新,Pinecone非常適合動(dòng)態(tài)數(shù)據(jù)集和實(shí)時(shí)搜索應(yīng)用,如個(gè)性化推薦系統(tǒng)和實(shí)時(shí)監(jiān)測(cè)系統(tǒng)。
-
Milvus:
- 網(wǎng)站:milvus.io
- 它是一個(gè)自托管的向量數(shù)據(jù)庫(kù),并且是開(kāi)源的。
- 價(jià)值主張包括:
- 整個(gè)搜索引擎的可擴(kuò)展性
- 使用多種近似最近鄰(ANN)算法索引數(shù)據(jù)的能力
- 圖表展示了架構(gòu),包括SDK、負(fù)載均衡器、協(xié)調(diào)服務(wù)、代理以及數(shù)據(jù)、索引和查詢(xún)處理的不同節(jié)點(diǎn)。
Milvus 適用場(chǎng)景:
適合希望自主托管和擁有更大控制權(quán)的企業(yè),特別是那些需要高度可擴(kuò)展的搜索引擎和支持多種ANN算法的場(chǎng)合。
這可能包括大規(guī)模的相似性搜索任務(wù),如圖像或視頻檢索,以及在選擇最佳算法方面需要靈活性的場(chǎng)景。
-
Vespa:
- 網(wǎng)站:vespa.ai
- 可以托管或自托管,代碼是開(kāi)源的。
- 價(jià)值主張包括:
- 在大型數(shù)據(jù)集上進(jìn)行低延遲計(jì)算
- 存儲(chǔ)和索引數(shù)據(jù),以便在服務(wù)時(shí)間進(jìn)行查詢(xún)、選擇和處理
- 可定制的功能性和深度數(shù)據(jù)結(jié)構(gòu),適用于數(shù)據(jù)科學(xué)和深度學(xué)習(xí)
- 架構(gòu)概覽顯示了HTTP請(qǐng)求處理、無(wú)狀態(tài)Java容器集群和內(nèi)容集群等組件。
Vespa 適用場(chǎng)景:
由于其低延遲處理大數(shù)據(jù)集的能力,Vespa適合需要高性能和實(shí)時(shí)查詢(xún)的應(yīng)用,如新聞文章、廣告和推薦系統(tǒng)。
Vespa的可定制性和深度數(shù)據(jù)結(jié)構(gòu)使其適合于復(fù)雜查詢(xún)的場(chǎng)景,例如金融服務(wù)中的風(fēng)險(xiǎn)分析和實(shí)時(shí)決策支持。
-
Weaviate:
- 網(wǎng)站:semi.technology/developers/weaviate/current/
- 可以托管或自托管,且是開(kāi)源的。
- 價(jià)值主張包括:
- 表達(dá)式查詢(xún)語(yǔ)法和類(lèi)GraphQL的接口
- 向量搜索、對(duì)象存儲(chǔ)和倒排索引的組合
- 令人印象深刻的問(wèn)答組件,尤其適用于演示
- 圖表顯示了包含推理模塊、API、業(yè)務(wù)邏輯和持久化層的系統(tǒng)級(jí)概覽。
Weaviate 適用場(chǎng)景:
Weaviate的GraphQL-like接口和強(qiáng)大的問(wèn)答組件使其非常適合需要復(fù)雜查詢(xún)和自然語(yǔ)言處理能力的應(yīng)用,如知識(shí)圖譜、語(yǔ)義搜索和客戶(hù)支持自動(dòng)化。
它的接口友好性可能特別適合需要快速原型設(shè)計(jì)和演示的研發(fā)團(tuán)隊(duì)。
-
Qdrant:
- 網(wǎng)站:qdrant.tech
- 它是一個(gè)自托管的向量數(shù)據(jù)庫(kù),云服務(wù)在規(guī)劃路線中,并且是開(kāi)源的。
- 價(jià)值主張包括:
- 帶有擴(kuò)展過(guò)濾支持的向量相似性引擎
- 動(dòng)態(tài)查詢(xún)規(guī)劃和負(fù)載數(shù)據(jù)索引
- 字符串匹配、數(shù)值范圍、地理位置等
- 度量深度學(xué)習(xí)
- 架構(gòu)圖描述了數(shù)據(jù)庫(kù)分割成多個(gè)段的情況,有優(yōu)化器、搜索器、索引器以及各種數(shù)據(jù)和索引存儲(chǔ)組件。
Qdrant 適用場(chǎng)景:
Qdrant的優(yōu)化器和擴(kuò)展過(guò)濾支持使其適合需要高度優(yōu)化和靈活查詢(xún)規(guī)劃的應(yīng)用,如電子商務(wù)中的個(gè)性化推薦和多維度過(guò)濾。
其對(duì)動(dòng)態(tài)查詢(xún)規(guī)劃和負(fù)載數(shù)據(jù)索引的支持還適用于需要處理各種類(lèi)型數(shù)據(jù)的應(yīng)用程序,包括地理位置數(shù)據(jù)和文本。
?
Milvus 實(shí)踐
教程:https://milvus.io/docs
代碼:https://github.com/milvus-io/milvus
基于您提供的描述,Milvus是一個(gè)強(qiáng)大的向量數(shù)據(jù)庫(kù)系統(tǒng),具有以下特點(diǎn)和架構(gòu)層次:
特點(diǎn):
-
易于使用:
- 快速部署:可以迅速創(chuàng)建大規(guī)模的相似性搜索服務(wù)。
- 簡(jiǎn)單直觀的SDK:支持多種編程語(yǔ)言,降低學(xué)習(xí)曲線。
-
速度:
- 硬件效率高:充分利用硬件資源,提高性能。
- 高級(jí)索引算法:加速檢索速度,比傳統(tǒng)方法快10倍。
-
高可用性:
- 實(shí)戰(zhàn)測(cè)試:在超過(guò)一千名企業(yè)用戶(hù)中經(jīng)過(guò)測(cè)試,證明了其實(shí)用性和穩(wěn)定性。
- 系統(tǒng)組件廣泛隔離:提高了系統(tǒng)的彈性和可靠性。
-
高度可擴(kuò)展性:
- 分布式和高通量:適合處理大規(guī)模向量數(shù)據(jù),保持高效服務(wù)。
- 適應(yīng)大規(guī)模數(shù)據(jù)集:能夠擴(kuò)展以處理龐大的數(shù)據(jù)量。
-
云原生:
- 計(jì)算與存儲(chǔ)分離:增加了靈活性,方便擴(kuò)展。
- 系統(tǒng)化云原生方法:支持橫向和縱向擴(kuò)展。
-
功能豐富:
- 數(shù)據(jù)類(lèi)型支持:可以處理各種類(lèi)型的數(shù)據(jù)。
- 增強(qiáng)向量搜索:具有屬性過(guò)濾等功能。
- UDF(用戶(hù)定義函數(shù))支持:為搜索和索引提供自定義功能。
- 可配置的一致性級(jí)別:適應(yīng)不同的數(shù)據(jù)一致性要求。
- 時(shí)間旅行:能夠訪問(wèn)數(shù)據(jù)的歷史版本。
架構(gòu)層次:
-
接入層(Access Layer):
- 由無(wú)狀態(tài)代理組成,作為用戶(hù)系統(tǒng)的接入點(diǎn)。
-
協(xié)調(diào)器服務(wù)(Coordinator Service):
- 分配任務(wù),管理工作流程,是系統(tǒng)的中心神經(jīng)系統(tǒng)。
-
工作節(jié)點(diǎn)(Worker Nodes):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-830696.html
- 執(zhí)行操作,處理DML和DDL命令,是系統(tǒng)的執(zhí)行部分。
-
存儲(chǔ)(Storage):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-830696.html
- 數(shù)據(jù)持久性保障,包括元數(shù)據(jù)存儲(chǔ)、日志代理和對(duì)象存儲(chǔ)。
到了這里,關(guān)于【大模型 向量庫(kù)】從向量搜索到向量數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!