PostgreSQL pgvector:如何利用向量數據庫提升搜索效率和精度

LLMs模型實戰教程

文章來源:https://zhuanlan.zhihu.com/p/641516393

Kevin
一、介紹
隨著基礎模型的興起,向量數據庫的受歡迎程度也飆升。事實上,在大型語言模型環境中,向量數據庫也很有用。

在機器學習領域,我們經常處理的是向量嵌入。向量嵌入是通過特定的機器學習模型運行對象的特征,將對象的上下文信息投射到潛在空間中來創建的。

為了在使用向量嵌入時能夠表現得特別好,創建向量數據庫是必要的。這方面的工作包括存儲、更新和檢索向量。當我們談論檢索時,通常是指檢索與查詢最相似的向量,這些向量與嵌入到同一潛在空間并傳遞到向量數據庫中。這個檢索過程被稱為近似最近鄰。

嵌入是由人工智能模型生成的,并且由于它們包含大量屬性或特征,因此管理它們的表示可能很困難。在人工智能和機器學習的背景下,這些特征代表數據的許多元素,所有這些元素對于理解模式、相關性和底層結構都是必要的。

因此,我們需要專門為管理此類信息而開發的數據庫。像Chroma-DB這樣的向量數據庫能夠滿足這一需求,因為它們提供了經過優化的嵌入式存儲和查詢功能,并且具備典型數據庫所不具備的獨立向量索引特性。此外,向量數據庫還具備處理向量嵌入的專門能力,這是傳統基于標量的數據庫所不具備的。

PostgreSQL是一個強大的對象關系數據庫系統,可在開源許可下使用。它已經積極開發了超過35年,這使得它在可靠性、穩健性和性能方面建立了良好的聲譽。好消息是,除了外部擴展之外,PostgreSQL還支持向量。

一些流行的向量數據庫包括:Pinecone、Weviate、Chroma、Milvus、Faiss。盡管Redis、Cassandra等數據庫并非向量數據庫,但越來越多的數據庫提供商開始提供ANN搜索功能。

二、什么是向量數據庫
向量數據庫是一種專門用于存儲、管理和搜索向量數據的數據庫。它以向量的形式存儲數據,其中向量是抽象實體(如圖像、音頻文件、文本等)的數學表示。通過存儲數據向量并使用向量之間的相似度度量,向量數據庫可以實現高效、準確的數據搜索和分析。

下面顯示了一個非常簡單的示例。雖然頂部的兩個句子的含義非常相似,但底部的句子卻截然不同。向量數據庫能夠將這些句子編碼為向量,然后找到接近的句子 - 這意味著它們是相似的。

請記住,在實際應用中,我們擁有的維度遠不止 2 個維度 - OpenAI 嵌入目前使用大約 1500 個維度來進行有意義的語言矢量化。

向量數據庫的核心特點如下:

1)、向量表示:向量數據庫將復雜的數據類型轉換為向量表示,使得高維數據能夠以多維空間中的點的形式表示。這種表示不僅具有高計算效率,還簡化了數據點之間的比較和關聯過程。

2)、基于相似性的搜索:向量數據庫擅長根據向量表示來搜索與給定查詢相似的數據項。它們使用歐氏距離、余弦相似度或曼哈頓距離等相似性度量來確定多維空間中數據點之間的接近程度,從而找到最相關和最相似的結果。

3)、可擴展性:向量數據庫被設計成能夠處理大規模的數據集,并且在數據集大小增長時能夠保持高搜索精度和響應時間。此外,它們通常提供并行處理和分布式計算的機制,以滿足不斷增長的數據需求。

4)、與機器學習和人工智能兼容:隨著人工智能和機器學習應用的迅速增長,向量數據庫的采用也在增加。將復雜數據轉換為向量表示可以與這些算法無縫集成,從而獲得規模化的有價值洞見和預測。

總之,向量數據庫利用向量數據的特性,提供高效、準確的搜索和分析功能。它們在處理高維數據和進行相似性搜索方面具有優勢,并且與機器學習和人工智能應用的兼容性使其在各個領域中變得越來越重要。

三、向量數據庫的應用場景
向量數據庫具有多種應用場景,以下是其中一些突出的應用領域:

自然語言處理(NLP):向量數據庫可以有效處理詞嵌入或文檔向量,促進語義搜索和文本分析。它們可以用于文檔分類、情感分析、關鍵詞提取等任務,幫助組織理解來自社交媒體、論壇、客戶互動等數據源的大量文本數據。
圖像搜索和識別:圖像數據庫受益于向量數據庫的向量表示和基于相似性的搜索功能。通過識別高維數據的相似性和模式,它們可以有效處理反向圖像搜索、對象檢測、人臉識別等任務。
推薦系統:強大的推薦引擎是現代電子商務和內容平臺的關鍵組成部分之一。通過使用向量數據庫,這些系統可以分析用戶偏好和內容特征,實時生成個性化且高度相關的推薦。
異常檢測和欺詐預防:特定領域的數據點(如金融交易或用戶行為)可以轉換為向量表示,進行實時分析。基于相似性的搜索功能可以快速識別異常模式或潛在欺詐,幫助組織減少風險。
基因組研究:在基因組學領域,研究人員處理復雜的生物數據,并經常需要識別相似的基因序列或結構。向量數據庫的強大搜索功能可以加速這一過程,更準確地進行關鍵發現和進展。
多媒體內容管理:向量數據庫可以通過將音頻和視頻轉換為向量表示來處理各種內容。這種能力使得內容搜索和分析變得更加普遍,實現了基于相似性、模式識別或自動內容標記的媒體無縫檢索。
除了上述應用領域,向量數據庫在許多其他行業和領域中也有廣泛的應用。隨著對向量數據庫潛力認識的增加,其在數據管理和分析方面的采用和探索將繼續推動創新和發展。

四、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

發布于 2023-07-04 23:33?IP 屬地廣東

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210859.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

天池SQL訓練營(三)-復雜查詢方法-視圖、子查詢、函數等

-天池龍珠計劃SQL訓練營 SQL訓練營頁面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 3.1 視圖 我們先來看一個查詢語句&#xff08;僅做示例&#xff0c;未提供相關數據&#xff09; SELECT stu_name FROM view_students_info;單從表面上看起來…

C#反射加載程序集并使用

具體實現參考&#xff1a; C# 動態加載DLL通過反射調用參數、方法、窗體_c#反射加載dll并傳入參數-CSDN博客 C#進階學習--反射(Reflection) - 知乎 走進C#反射機制 - 知乎 1.使用過程 //創建數據集 Assembly outerAsm Assembly.LoadFile("D:/your.dll");//獲取…

rancher harvester deploy demo 【部署 harvester v1.2.1】

簡介 Harvester 是一個現代的、開放的、可互操作的、基于Kubernetes的超融合基礎設施(HCI)解決方案。它是一種開源替代方案&#xff0c;專為尋求云原生HCI解決方案的運營商而設計。Harvester運行在裸機服務器上&#xff0c;提供集成的虛擬化和分布式存儲功能。除了傳統的虛擬機…

pgsql存儲過程

由于部分企業數據庫從aws遷移到騰訊云&#xff0c;導致有一個定時任務&#xff08;從詳情表匯總數據到統計表中&#xff09;錯過了觸發&#xff0c;所以這部分企業的數據需要觸發重新刷一下&#xff0c;但是又有規定白天不允許上線&#xff0c;只能把定時任務的邏輯用存儲過程&…

SQL SELECT 語句

SELECT 語句用于從數據庫中選取數據。 SQL SELECT 語句 SELECT 語句用于從數據庫中選取數據。 結果被存儲在一個結果表中&#xff0c;稱為結果集。 SQL SELECT 語法 SELECT column1, column2, ... FROM table_name; 與 SELECT * FROM table_name; 參數說明&#xff1a; …

五花八門客戶問題(BUG) - 用好strace

strace簡介 strace是一個用于跟蹤系統調用和信號傳遞的Linux命令,它是一個集診斷、調試、統計于一體的工具。strace可以監控用戶空間進程和內核的交互,比如系統調用、信號傳遞、進程狀態變更等。它底層使用內核的ptrace特性來實現其功能。 strace最簡單的用法是執行一個指定…

二分查找|雙指針:LeetCode:2398.預算內的最多機器人數目

作者推薦 本文涉及的基礎知識點 二分查找算法合集 滑動窗口 單調隊列&#xff1a;計算最大值時&#xff0c;如果前面的數小&#xff0c;則必定被淘汰&#xff0c;前面的數早出隊。 題目 你有 n 個機器人&#xff0c;給你兩個下標從 0 開始的整數數組 chargeTimes 和 runnin…

Django回顧7

一.Django緩存 1.緩存介紹 在動態網站中,用戶所有的請求,服務器都會去數據庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最后生成用戶看到的頁面. 當一個網站的用戶訪問量很大的時候,每一次的的后臺操作,都會消耗很多的服務端資源,所以必須使用緩存來減輕后端服務器的壓力…

算法:最長公共前綴(橫向掃描和縱向掃描)

橫向掃描 時間復雜度 O(m * n)&#xff0c;空間復雜度O(1) /*** param {string[]} strs* return {string}*/ var longestCommonPrefix function(strs) {// 先把第一個字符串拿出來let str strs[0]// 用 startsWith 檢查數組中每個字符串是否以當前字符串為前綴while(!strs.e…

聽GPT 講Rust源代碼--src/tools(11)

File: rust/src/tools/rust-analyzer/crates/hir/src/lib.rs 在Rust源代碼中&#xff0c;rust/src/tools/rust-analyzer/crates/hir/src/lib.rs文件的作用是定義了Rust語言的高級抽象層次&#xff08;Higher-level IR&#xff0c;HIR&#xff09;。它包含了Rust語言的各種結構和…

Python:核心知識點整理大全10-筆記

目錄 5.4 使用 if 語句處理列表 5.4.1 檢查特殊元素 toppings.py 5.4.2 確定列表不是空的 5.4.3 使用多個列表 5.5 設置 if 語句的格式 5.6 小結 第6章 字 典 6.1 一個簡單的字典 alien.py 6.2 使用字典 6.2.1 訪問字典中的值 6.2.2 添加鍵—值對 6.2.3 先創建一…

智能優化算法應用:基于蜉蝣算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于蜉蝣算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于蜉蝣算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.蜉蝣算法4.實驗參數設定5.算法結果6.參考文獻7.MA…

JAVA+SSM+springboot+MYSQL企業物資庫存進銷存管理系統

。該系統從兩個對象&#xff1a;由管理員和員工來對系統進行設計構建。主要功能包括首頁、個人中心、員工管理、項目信息管理、倉庫信息管理、供應商管理、項目計劃管理、物資庫存管理、到貨登記管理、物資出庫管理、物資入庫管理等功能進行管理。本企業物資管理系統方便員工快…

linux 定時任務

使用 crontab Usage: crontab [-u user] [-e|-l|-r] Crontab 的格式說明如下: * 逗號(‘,’) 指定列表值。如: “1,3,4,7,8″ * 中橫線(‘-’) 指定范圍值 如 “1-6″, 代表 “1,2,3,4,5,6″ * 星號 (‘*’) 代表所有可能的值 */15 表示每 15 分鐘執行一次 # Use the ha…

C++編程法則365天一天一條(24)RTTI運行時類型信息typeid和type_info

文章目錄 基本用法編譯時或運行時判定 基本用法 typeid 是 C 的一個運算符&#xff0c;它用于獲取表達式的類型信息。它返回一個 std::type_info 對象引用&#xff0c;該對象包含有關表達式的類型的信息。 要使用 typeid 運算符&#xff0c;需要包含 <typeinfo> 頭文件…

關于振動試驗

這是試驗的說明&#xff08;來自gbt4710-2009&#xff09; 這是試驗的參數&#xff1a; 一、試驗方向&#xff1a; 振動試驗中有幾個方向 除有關規范另有規定外&#xff0c;應在產品的三個互相垂直方向上進行振動試驗。 一般定義產品長邊為X軸向&#xff0c;短邊為Y軸向&…

飛書面試題匯總

面試相關經驗 Interview | JavaGuide(Java面試 學習指南) 同學1 7次面試 編程題匯總&#xff1a; 有序鏈表找中位數 &#xff08;飛書1面&#xff09; m個有序數組合并 &#xff08;飛書1面&#xff09; 海量數據尋找TopK&#xff08;口述&#xff09; &#xff08;飛書…

Android 10(Q) 以上普通 APP 隱藏應用圖標問題探究及解決方案

1、實驗環境 aosp 版本 10.0 系統 aosp 版本 13.0 系統 2、驗證結果 2.1 方式一 APP AndroidManifest.xml 中通過 activity-alias 配置帶 LAUNCHER 屬性 category&#xff0c;并且 android:enabled“true” 10.0 系統中可安裝后正常顯示 icon&#xff0c;通過 setComponen…

idea中run和debug是灰色的

【現象】idea中run和debug是灰色的 點擊 旁邊的Add Configuration…一看都是空白 【解決方法】&#xff1a; npm點開之后 【結果】

文本轉圖像 學習筆記

VQGAN (Vector Quantized Generative Adversarial Network) 是一種基于 GAN 的生成模型&#xff0c;可以將圖像或文本轉換為高質量的圖像。 VQ &#xff08;Vector Quantization&#xff09;是一種數據壓縮技術&#xff0c;是指將連續數據表示為離散化的向量。輸入的圖像或文本…