一、介紹
随着基礎模型的興起,向量資料庫的受歡迎程度也飙升。事實上,在大型語言模型環境中,向量資料庫也很有用。
在機器學習領域,我們經常處理的是向量嵌入。向量嵌入是通過特定的機器學習模型運作對象的特征,将對象的上下文資訊投射到潛在空間中來建立的。
為了在使用向量嵌入時能夠表現得特别好,建立向量資料庫是必要的。這方面的工作包括存儲、更新和檢索向量。當我們談論檢索時,通常是指檢索與查詢最相似的向量,這些向量與嵌入到同一潛在空間并傳遞到向量資料庫中。這個檢索過程被稱為近似最近鄰。
嵌入是由人工智能模型生成的,并且由于它們包含大量屬性或特征,是以管理它們的表示可能很困難。在人工智能和機器學習的背景下,這些特征代表資料的許多元素,所有這些元素對于了解模式、相關性和底層結構都是必要的。
是以,我們需要專門為管理此類資訊而開發的資料庫。像Chroma-DB這樣的向量資料庫能夠滿足這一需求,因為它們提供了經過優化的嵌入式存儲和查詢功能,并且具備典型資料庫所不具備的獨立向量索引特性。此外,向量資料庫還具備處理向量嵌入的專門能力,這是傳統基于标量的資料庫所不具備的。
PostgreSQL是一個強大的對象關系資料庫系統,可在開源許可下使用。它已經積極開發了超過35年,這使得它在可靠性、穩健性和性能方面建立了良好的聲譽。好消息是,除了外部擴充之外,PostgreSQL還支援向量。
一些流行的向量資料庫包括:Pinecone、Weviate、Chroma、Milvus、Faiss。盡管Redis、Cassandra等資料庫并非向量資料庫,但越來越多的資料庫提供商開始提供ANN搜尋功能。
二、什麼是向量資料庫
向量資料庫是一種專門用于存儲、管理和搜尋向量資料的資料庫。它以向量的形式存儲資料,其中向量是抽象實體(如圖像、音頻檔案、文本等)的數學表示。通過存儲資料向量并使用向量之間的相似度度量,向量資料庫可以實作高效、準确的資料搜尋和分析。
下面顯示了一個非常簡單的示例。雖然頂部的兩個句子的含義非常相似,但底部的句子卻截然不同。向量資料庫能夠将這些句子編碼為向量,然後找到接近的句子 - 這意味着它們是相似的。
請記住,在實際應用中,我們擁有的次元遠不止 2 個次元 - OpenAI 嵌入目前使用大約 1500 個次元來進行有意義的語言矢量化。
向量資料庫的核心特點如下:
1)、:向量資料庫将複雜的資料類型轉換為向量表示,使得高維資料能夠以多元空間中的點的形式表示。這種表示不僅具有高計算效率,還簡化了資料點之間的比較和關聯過程。
2)、:向量資料庫擅長根據向量表示來搜尋與給定查詢相似的資料項。它們使用歐氏距離、餘弦相似度或曼哈頓距離等相似性度量來确定多元空間中資料點之間的接近程度,進而找到最相關和最相似的結果。
3)、:向量資料庫被設計成能夠處理大規模的資料集,并且在資料集大小增長時能夠保持高搜尋精度和響應時間。此外,它們通常提供并行處理和分布式計算的機制,以滿足不斷增長的資料需求。
4)、:随着人工智能和機器學習應用的迅速增長,向量資料庫的采用也在增加。将複雜資料轉換為向量表示可以與這些算法無縫內建,進而獲得規模化的有價值洞見和預測。
總之,向量資料庫利用向量資料的特性,提供高效、準确的搜尋和分析功能。它們在處理高維資料和進行相似性搜尋方面具有優勢,并且與機器學習和人工智能應用的相容性使其在各個領域中變得越來越重要。
三、向量資料庫的應用場景
向量資料庫具有多種應用場景,以下是其中一些突出的應用領域:
- :向量資料庫可以有效處理詞嵌入或文檔向量,促進語義搜尋和文本分析。它們可以用于文檔分類、情感分析、關鍵詞提取等任務,幫助組織了解來自社交媒體、論壇、客戶互動等資料源的大量文本資料。
- :圖像資料庫受益于向量資料庫的向量表示和基于相似性的搜尋功能。通過識别高維資料的相似性和模式,它們可以有效處理反向圖像搜尋、對象檢測、人臉識别等任務。
- :強大的推薦引擎是現代電子商務和内容平台的關鍵組成部分之一。通過使用向量資料庫,這些系統可以分析使用者偏好和内容特征,實時生成個性化且高度相關的推薦。
- :特定領域的資料點(如金融交易或使用者行為)可以轉換為向量表示,進行實時分析。基于相似性的搜尋功能可以快速識别異常模式或潛在欺詐,幫助組織減少風險。
- :在基因組學領域,研究人員處理複雜的生物資料,并經常需要識别相似的基因序列或結構。向量資料庫的強大搜尋功能可以加速這一過程,更準确地進行關鍵發現和進展。
- :向量資料庫可以通過将音頻和視訊轉換為向量表示來處理各種内容。這種能力使得内容搜尋和分析變得更加普遍,實作了基于相似性、模式識别或自動内容标記的媒體無縫檢索。
除了上述應用領域,向量資料庫在許多其他行業和領域中也有廣泛的應用。随着對向量資料庫潛力認識的增加,其在資料管理和分析方面的采用和探索将繼續推動創新和發展。
四、PostgreSQL 向量擴充-pgvector
pgvector 是一個基于 PostgreSQL 的擴充,為使用者提供了一套強大的功能,用于高效地存儲、查詢和處理向量資料。它具有以下特點:
- :pgvector 可以作為擴充直接添加到現有的 PostgreSQL 環境中,友善新使用者和長期使用者獲得矢量資料庫的好處,無需進行重大系統更改。
- :pgvector 内置支援多種距離度量,包括歐幾裡德距離、餘弦距離和曼哈頓距離。這樣的多功能性使得可以根據具體應用需求進行高度定制的基于相似性的搜尋和分析。
- :pgvector 擴充為矢量資料提供高效的索引選項,例如 k-最近鄰 (k-NN) 搜尋。即使資料集大小增長,使用者也可以實作快速查詢執行,并保持較高的搜尋準确性。
- :作為 PostgreSQL 的擴充,pgvector 使用熟悉的 SQL 查詢文法進行向量操作。這簡化了具有 SQL 知識和經驗的使用者使用矢量資料庫的過程,并避免了學習新的語言或系統。
- :pgvector 經常更新,以確定與最新的 PostgreSQL 版本和功能相容,并且開發者社群緻力于增強其功能。使用者可以期待一個受到良好支援的解決方案,滿足其矢量資料的需求。
- :通過與 PostgreSQL 的內建,pgvector 繼承了相同級别的穩健性和安全性功能,使使用者能夠安全地存儲和管理其矢量資料。
總之,pgvector 是一個功能強大的 PostgreSQL 擴充,為使用者提供了高效、靈活和可靠的方式來處理向量資料。它的直接內建、多種距離度量支援、索引支援和易于通路的查詢語言使其成為處理矢量資料的理想選擇。
4.1、如何使用 pgvector
- 在資料庫伺服器上安裝 pgvector
cd /tmp
git clone --branch v0.4.2 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # 可能需要sudo
- 在您的資料庫中,運作此指令以啟用擴充
CREATE EXTENSION IF NOT EXISTS vector;
- 建立一個存儲向量的表
CREATE TABLE items (id bigserial PRIMARY KEY, name, features vector(3));
- 添加資料的工作原理如下
INSERT INTO items (features) VALUES ('[1,2,3]'), ('[4,5,6]');
- 由于 pgvector 建構在 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 中,可以使用各種查詢運算符對矢量資料進行不同的操作。這些運算符主要用于計算向量之間的相似度或距離,其中一些運算符使用不同的距離度量。以下是一些常用的 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 表示無關,-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 距離或城市街區距離)。曼哈頓距離是每個次元對應坐标差的絕對值之和。相對于歐幾裡德距離而言,曼哈頓距離更加強調沿着次元的較小移動。
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
在選擇适當的運算符時,您應該考慮您的應用需求和資料特性。這可能涉及保持相對距離、強調大小或方向以及關注特定次元等因素。請注意,根據您的資料和用例,運算符的選擇可能會對搜尋結果的品質以及最終應用程式的有效性産生重大影響。
4.3、pgvector索引
在 pgvector 中,可以通過添加索引來使用近似最近鄰搜尋,以提高查詢性能。以下是一些關于 pgvector 索引的建議:
1)、在表中有一定數量的資料後建立索引:在建立索引之前,確定表中有足夠的資料,以便索引能夠提供更好的查詢性能。
2)、選擇适當數量的清單:可以根據表的大小來選擇适當數量的清單。一般來說,可以使用表的行數除以 1000(最多 1M 行)和平方根(rows)(超過 1M 行)作為起點。
3)、指定适當的探針數量:在執行查詢時,可以指定适當的探針數量來平衡查詢速度和召回率。一般來說,可以使用清單數量除以 10(最多 1M 行)和平方根(lists)(超過 1M 行)作為起點。
這些建議可以幫助您在近似最近鄰搜尋中獲得良好的準确性和性能。請注意,具體的索引配置可能需要根據您的資料和查詢需求進行調整,以達到最佳性能。
BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;
為您要使用的每個距離函數添加一個索引。
- L2距離
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
- 内積
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);
五、總結
在這篇文章中,我們探讨了矢量資料庫在管理高維資料和其在各個行業中的應用中的重要性。我們介紹了 pgvector,這是一個功能強大的 PostgreSQL 擴充,支援矢量資料的存儲和搜尋,并提供了一個易于通路的矢量資料庫解決方案。通過實用指南,我們示範了如何使用 pgvector 建立表、插入資料和查詢相似項。此外,我們還讨論了 pgvector 中用于計算相似性度量的不同查詢運算符,如歐幾裡得距離、餘弦相似度和曼哈頓距離。
通過使用 pgvector,我們可以輕松地處理高維資料,并根據具體需求進行相似性搜尋和分析。pgvector 的直接內建、索引支援和易于查詢的語言使其成為處理矢量資料的理想選擇。無論是新使用者還是長期使用者,都可以從中獲得矢量資料庫的好處,而無需進行重大系統改動。
在選擇适當的查詢運算符和索引配置時,我們應該考慮資料特性、查詢需求以及平衡準确性和性能的要求。通過合理地配置和使用 pgvector,我們可以獲得高效、準确且可靠的矢量資料解決方案,滿足不同行業和應用的需求。
項目位址:https://github.com/pgvector/pgvector