隨著基礎(chǔ)模型的興起,向量數(shù)據(jù)庫的受歡迎程度也飆升。事實上,在大型語言模型環(huán)境中,向量數(shù)據(jù)庫也很有用。
在機(jī)器學(xué)習(xí)領(lǐng)域,我們經(jīng)常處理的是向量嵌入。向量嵌入是通過特定的機(jī)器學(xué)習(xí)模型運行對象的特征,將對象的上下文信息投射到潛在空間中來創(chuàng)建的。
為了在使用向量嵌入時能夠表現(xiàn)得特別好,創(chuàng)建向量數(shù)據(jù)庫是必要的。這方面的工作包括存儲、更新和檢索向量。當(dāng)我們談?wù)摍z索時,通常是指檢索與查詢最相似的向量,這些向量與嵌入到同一潛在空間并傳遞到向量數(shù)據(jù)庫中。這個檢索過程被稱為近似最近鄰。
嵌入是由人工智能模型生成的,并且由于它們包含大量屬性或特征,因此管理它們的表示可能很困難。在人工智能和機(jī)器學(xué)習(xí)的背景下,這些特征代表數(shù)據(jù)的許多元素,所有這些元素對于理解模式、相關(guān)性和底層結(jié)構(gòu)都是必要的。
因此,我們需要專門為管理此類信息而開發(fā)的數(shù)據(jù)庫。像Chroma-DB這樣的向量數(shù)據(jù)庫能夠滿足這一需求,因為它們提供了經(jīng)過優(yōu)化的嵌入式存儲和查詢功能,并且具備典型數(shù)據(jù)庫所不具備的獨立向量索引特性。此外,向量數(shù)據(jù)庫還具備處理向量嵌入的專門能力,這是傳統(tǒng)基于標(biāo)量的數(shù)據(jù)庫所不具備的。
PostgreSQL是一個強(qiáng)大的對象關(guān)系數(shù)據(jù)庫系統(tǒng),可在開源許可下使用。它已經(jīng)積極開發(fā)了超過35年,這使得它在可靠性、穩(wěn)健性和性能方面建立了良好的聲譽。好消息是,除了外部擴(kuò)展之外,PostgreSQL還支持向量。
一些流行的向量數(shù)據(jù)庫包括:Pinecone、Weviate、Chroma、Milvus、Faiss。盡管Redis、Cassandra等數(shù)據(jù)庫并非向量數(shù)據(jù)庫,但越來越多的數(shù)據(jù)庫提供商開始提供ANN搜索功能。
二、什么是向量數(shù)據(jù)庫
向量數(shù)據(jù)庫是一種專門用于存儲、管理和搜索向量數(shù)據(jù)的數(shù)據(jù)庫。它以向量的形式存儲數(shù)據(jù),其中向量是抽象實體(如圖像、音頻文件、文本等)的數(shù)學(xué)表示。通過存儲數(shù)據(jù)向量并使用向量之間的相似度度量,向量數(shù)據(jù)庫可以實現(xiàn)高效、準(zhǔn)確的數(shù)據(jù)搜索和分析。
下面顯示了一個非常簡單的示例。雖然頂部的兩個句子的含義非常相似,但底部的句子卻截然不同。向量數(shù)據(jù)庫能夠?qū)⑦@些句子編碼為向量,然后找到接近的句子 - 這意味著它們是相似的。
請記住,在實際應(yīng)用中,我們擁有的維度遠(yuǎn)不止 2 個維度 - OpenAI 嵌入目前使用大約 1500 個維度來進(jìn)行有意義的語言矢量化。
向量數(shù)據(jù)庫的核心特點如下:
1)、向量表示:向量數(shù)據(jù)庫將復(fù)雜的數(shù)據(jù)類型轉(zhuǎn)換為向量表示,使得高維數(shù)據(jù)能夠以多維空間中的點的形式表示。這種表示不僅具有高計算效率,還簡化了數(shù)據(jù)點之間的比較和關(guān)聯(lián)過程。
2)、基于相似性的搜索:向量數(shù)據(jù)庫擅長根據(jù)向量表示來搜索與給定查詢相似的數(shù)據(jù)項。它們使用歐氏距離、余弦相似度或曼哈頓距離等相似性度量來確定多維空間中數(shù)據(jù)點之間的接近程度,從而找到最相關(guān)和最相似的結(jié)果。
3)、可擴(kuò)展性:向量數(shù)據(jù)庫被設(shè)計成能夠處理大規(guī)模的數(shù)據(jù)集,并且在數(shù)據(jù)集大小增長時能夠保持高搜索精度和響應(yīng)時間。此外,它們通常提供并行處理和分布式計算的機(jī)制,以滿足不斷增長的數(shù)據(jù)需求。
4)、與機(jī)器學(xué)習(xí)和人工智能兼容:隨著人工智能和機(jī)器學(xué)習(xí)應(yīng)用的迅速增長,向量數(shù)據(jù)庫的采用也在增加。將復(fù)雜數(shù)據(jù)轉(zhuǎn)換為向量表示可以與這些算法無縫集成,從而獲得規(guī)模化的有價值洞見和預(yù)測。
總之,向量數(shù)據(jù)庫利用向量數(shù)據(jù)的特性,提供高效、準(zhǔn)確的搜索和分析功能。它們在處理高維數(shù)據(jù)和進(jìn)行相似性搜索方面具有優(yōu)勢,并且與機(jī)器學(xué)習(xí)和人工智能應(yīng)用的兼容性使其在各個領(lǐng)域中變得越來越重要。
三、向量數(shù)據(jù)庫的應(yīng)用場景
向量數(shù)據(jù)庫具有多種應(yīng)用場景,以下是其中一些突出的應(yīng)用領(lǐng)域:
自然語言處理(NLP):向量數(shù)據(jù)庫可以有效處理詞嵌入或文檔向量,促進(jìn)語義搜索和文本分析。它們可以用于文檔分類、情感分析、關(guān)鍵詞提取等任務(wù),幫助組織理解來自社交媒體、論壇、客戶互動等數(shù)據(jù)源的大量文本數(shù)據(jù)。
圖像搜索和識別:圖像數(shù)據(jù)庫受益于向量數(shù)據(jù)庫的向量表示和基于相似性的搜索功能。通過識別高維數(shù)據(jù)的相似性和模式,它們可以有效處理反向圖像搜索、對象檢測、人臉識別等任務(wù)。
推薦系統(tǒng):強(qiáng)大的推薦引擎是現(xiàn)代電子商務(wù)和內(nèi)容平臺的關(guān)鍵組成部分之一。通過使用向量數(shù)據(jù)庫,這些系統(tǒng)可以分析用戶偏好和內(nèi)容特征,實時生成個性化且高度相關(guān)的推薦。
異常檢測和欺詐預(yù)防:特定領(lǐng)域的數(shù)據(jù)點(如金融交易或用戶行為)可以轉(zhuǎn)換為向量表示,進(jìn)行實時分析?;谙嗨菩缘乃阉鞴δ芸梢钥焖僮R別異常模式或潛在欺詐,幫助組織減少風(fēng)險。
基因組研究:在基因組學(xué)領(lǐng)域,研究人員處理復(fù)雜的生物數(shù)據(jù),并經(jīng)常需要識別相似的基因序列或結(jié)構(gòu)。向量數(shù)據(jù)庫的強(qiáng)大搜索功能可以加速這一過程,更準(zhǔn)確地進(jìn)行關(guān)鍵發(fā)現(xiàn)和進(jìn)展。
多媒體內(nèi)容管理:向量數(shù)據(jù)庫可以通過將音頻和視頻轉(zhuǎn)換為向量表示來處理各種內(nèi)容。這種能力使得內(nèi)容搜索和分析變得更加普遍,實現(xiàn)了基于相似性、模式識別或自動內(nèi)容標(biāo)記的媒體無縫檢索。
除了上述應(yīng)用領(lǐng)域,向量數(shù)據(jù)庫在許多其他行業(yè)和領(lǐng)域中也有廣泛的應(yīng)用。隨著對向量數(shù)據(jù)庫潛力認(rèn)識的增加,其在數(shù)據(jù)管理和分析方面的采用和探索將繼續(xù)推動創(chuàng)新和發(fā)展。
四、PostgreSQL 向量擴(kuò)展-pgvector
pgvector 是一個基于 PostgreSQL 的擴(kuò)展,為用戶提供了一套強(qiáng)大的功能,用于高效地存儲、查詢和處理向量數(shù)據(jù)。它具有以下特點:
直接集成:pgvector 可以作為擴(kuò)展直接添加到現(xiàn)有的 PostgreSQL 環(huán)境中,方便新用戶和長期用戶獲得矢量數(shù)據(jù)庫的好處,無需進(jìn)行重大系統(tǒng)更改。
支持多種距離度量:pgvector 內(nèi)置支持多種距離度量,包括歐幾里德距離、余弦距離和曼哈頓距離。這樣的多功能性使得可以根據(jù)具體應(yīng)用需求進(jìn)行高度定制的基于相似性的搜索和分析。
索引支持:pgvector 擴(kuò)展為矢量數(shù)據(jù)提供高效的索引選項,例如 k-最近鄰 (k-NN) 搜索。即使數(shù)據(jù)集大小增長,用戶也可以實現(xiàn)快速查詢執(zhí)行,并保持較高的搜索準(zhǔn)確性。
易于查詢語言訪問:作為 PostgreSQL 的擴(kuò)展,pgvector 使用熟悉的 SQL 查詢語法進(jìn)行向量操作。這簡化了具有 SQL 知識和經(jīng)驗的用戶使用矢量數(shù)據(jù)庫的過程,并避免了學(xué)習(xí)新的語言或系統(tǒng)。
積極的開發(fā)和支持:pgvector 經(jīng)常更新,以確保與最新的 PostgreSQL 版本和功能兼容,并且開發(fā)者社區(qū)致力于增強(qiáng)其功能。用戶可以期待一個受到良好支持的解決方案,滿足其矢量數(shù)據(jù)的需求。
穩(wěn)健性和安全性:通過與 PostgreSQL 的集成,pgvector 繼承了相同級別的穩(wěn)健性和安全性功能,使用戶能夠安全地存儲和管理其矢量數(shù)據(jù)。
總之,pgvector 是一個功能強(qiáng)大的 PostgreSQL 擴(kuò)展,為用戶提供了高效、靈活和可靠的方式來處理向量數(shù)據(jù)。它的直接集成、多種距離度量支持、索引支持和易于訪問的查詢語言使其成為處理矢量數(shù)據(jù)的理想選擇。
4.1、如何使用 pgvector
在數(shù)據(jù)庫服務(wù)器上安裝 pgvector
cd /tmp
git clone --branch v0.4.2 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # 可能需要sudo
在您的數(shù)據(jù)庫中,運行此命令以啟用擴(kuò)展
CREATE EXTENSION IF NOT EXISTS vector;
創(chuàng)建一個存儲向量的表
CREATE TABLE items (id bigserial PRIMARY KEY, name, features vector(3));
添加數(shù)據(jù)的工作原理如下
INSERT INTO items (features) VALUES ('[1,2,3]'), ('[4,5,6]');
由于 pgvector 構(gòu)建在 postgres 之上,因此許多 PG DML 可用。例如。要更新插入,您可以運行
INSERT INTO items (id, features) VALUES (1, '[1,2,3]'), (2, '[4,5,6]')
2ON CONFLICT (id) DO UPDATE SET features = EXCLUDED.features;
4.2、pgvector 查詢運算符
在 pgvector 中,可以使用各種查詢運算符對矢量數(shù)據(jù)進(jìn)行不同的操作。這些運算符主要用于計算向量之間的相似度或距離,其中一些運算符使用不同的距離度量。以下是一些常用的 pgvector 查詢運算符:
<->:該運算符計算兩個向量之間的歐幾里德距離。歐幾里德距離是多維空間中向量表示的點之間的直線距離。較小的歐幾里德距離表示向量之間的相似性較大,因此該運算符在查找和排序相似項目時非常有用。
SELECT id, name, features, features <-> '[0.45, 0.4, 0.85]' as distance
2FROM items
3ORDER BY features <-> '[0.45, 0.4, 0.85]';
<=>:該運算符計算兩個向量之間的余弦相似度。余弦相似度比較兩個向量的方向而不是它們的大小。余弦相似度的范圍在 -1 到 1 之間,1 表示向量相同,0 表示無關(guān),-1 表示向量指向相反方向。
SELECT id, name, features, features <=> '[0.45, 0.4, 0.85]' as similarity
2FROM items
3ORDER BY features <=> '[0.45, 0.4, 0.85]' DESC;
<#>:該運算符計算兩個向量之間的曼哈頓距離(也稱為 L1 距離或城市街區(qū)距離)。曼哈頓距離是每個維度對應(yīng)坐標(biāo)差的絕對值之和。相對于歐幾里德距離而言,曼哈頓距離更加強(qiáng)調(diào)沿著維度的較小移動。
SELECT id, name, features, features <#> '[0.45, 0.4, 0.85]' as distance
2FROM items
3ORDER BY features <#> '[0.45, 0.4, 0.85]';p
在選擇適當(dāng)?shù)倪\算符時,您應(yīng)該考慮您的應(yīng)用需求和數(shù)據(jù)特性。這可能涉及保持相對距離、強(qiáng)調(diào)大小或方向以及關(guān)注特定維度等因素。請注意,根據(jù)您的數(shù)據(jù)和用例,運算符的選擇可能會對搜索結(jié)果的質(zhì)量以及最終應(yīng)用程序的有效性產(chǎn)生重大影響。
4.3、pgvector索引
在 pgvector 中,可以通過添加索引來使用近似最近鄰搜索,以提高查詢性能。以下是一些關(guān)于 pgvector 索引的建議:
1)、在表中有一定數(shù)量的數(shù)據(jù)后創(chuàng)建索引:在創(chuàng)建索引之前,確保表中有足夠的數(shù)據(jù),以便索引能夠提供更好的查詢性能。
2)、選擇適當(dāng)數(shù)量的列表:可以根據(jù)表的大小來選擇適當(dāng)數(shù)量的列表。一般來說,可以使用表的行數(shù)除以 1000(最多 1M 行)和平方根(rows)(超過 1M 行)作為起點。
3)、指定適當(dāng)?shù)奶结様?shù)量:在執(zhí)行查詢時,可以指定適當(dāng)?shù)奶结様?shù)量來平衡查詢速度和召回率。一般來說,可以使用列表數(shù)量除以 10(最多 1M 行)和平方根(lists)(超過 1M 行)作為起點。
這些建議可以幫助您在近似最近鄰搜索中獲得良好的準(zhǔn)確性和性能。請注意,具體的索引配置可能需要根據(jù)您的數(shù)據(jù)和查詢需求進(jìn)行調(diào)整,以達(dá)到最佳性能。
BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;
為您要使用的每個距離函數(shù)添加一個索引。
L2距離
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
內(nèi)積
CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);
余弦距離
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
五、總結(jié)
在這篇文章中,我們探討了矢量數(shù)據(jù)庫在管理高維數(shù)據(jù)和其在各個行業(yè)中的應(yīng)用中的重要性。我們介紹了 pgvector,這是一個功能強(qiáng)大的 PostgreSQL 擴(kuò)展,支持矢量數(shù)據(jù)的存儲和搜索,并提供了一個易于訪問的矢量數(shù)據(jù)庫解決方案。通過實用指南,我們演示了如何使用 pgvector 創(chuàng)建表、插入數(shù)據(jù)和查詢相似項。此外,我們還討論了 pgvector 中用于計算相似性度量的不同查詢運算符,如歐幾里得距離、余弦相似度和曼哈頓距離。
通過使用 pgvector,我們可以輕松地處理高維數(shù)據(jù),并根據(jù)具體需求進(jìn)行相似性搜索和分析。pgvector 的直接集成、索引支持和易于查詢的語言使其成為處理矢量數(shù)據(jù)的理想選擇。無論是新用戶還是長期用戶,都可以從中獲得矢量數(shù)據(jù)庫的好處,而無需進(jìn)行重大系統(tǒng)改動。
在選擇適當(dāng)?shù)牟樵冞\算符和索引配置時,我們應(yīng)該考慮數(shù)據(jù)特性、查詢需求以及平衡準(zhǔn)確性和性能的要求。通過合理地配置和使用 pgvector,我們可以獲得高效、準(zhǔn)確且可靠的矢量數(shù)據(jù)解決方案,滿足不同行業(yè)和應(yīng)用的需求。
項目地址:https://github.com/pgvector/pgvector
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。