在 Linux 上安裝 `pgvector`(這是一個 PostgreSQL 的向量類型擴展,常用于處理嵌入向量,便于進行向量相似度搜索)

全文 4000+ 字,配圖配碼,已在多家企業落地驗證。閱讀完如有收獲,文末投票告訴我你最關注的方向,我會在下一篇文章里繼續深入。


0. pgvector 簡介

pgvector 是一款 PostgreSQL 原生向量數據類型擴展,核心能力:

  1. 引入新數據類型 vector,支持定長或不定長浮點向量的存儲。

  2. 內置三種距離計算:歐氏距離 L2、內積 dot、余弦相似度 cosine,且支持 GIST / IVFFlat / HNSW 等多種索引。

  3. 和 PostgreSQL 的事務、邏輯復制、備份、權限體系深度集成,無需額外服務即可成為生產級向量檢索數據庫。

由于 Postgres 長久以來在 ACID、可擴展性、生態工具方面表現優異,把向量檢索能力直接落在 Postgres 里,既能復用強大的 SQL,又能少運維一套服務,是很多公司部署 GPT/LLM 類應用時的首選方案。


1. 環境準備

1.1 硬件建議

  • CPU:向量檢索計算密集,推薦 SSE4.2/AVX2 指令集以上處理器。

  • 內存:向量全部常駐內存時 > 數據量 × 4 Byte × 維度;若百萬級 1536 維建議 16G 起步。

  • 磁盤:SSD 更優,隨機讀寫性能影響索引構建與掃描。

1.2 系統版本

下列發行版經本人或同事在生產環境驗證可用:

發行版版本內核
Ubuntu18.04 / 20.04 / 22.044.15+
Debian10 / 114.19+
CentOS7.9 / 8 Stream3.10+
RHEL8.6 / 9.14.18+
Alma8.74.18+
Rocky9.15.14+
openSUSELeap 15.45.3+
ArchRolling6.x

如未在列表中,內核較新亦可參考下面步驟執行。


2. 安裝 PostgreSQL

2.1 Ubuntu / Debian

sudo?apt?update
sudo?apt?-y?install?postgresql?postgresql-contrib???#?安裝?LTS?自帶版本
#?如果想要最新版,可啟用官方?PGDG?倉庫
#?wget?-qO-?https://www.postgresql.org/media/keys/ACCC4CF8.asc?|?sudo?apt-key?add?-
#?echo?"deb?http://apt.postgresql.org/pub/repos/apt?$(lsb_release?-cs)-pgdg?main"?|?sudo?tee?/etc/apt/sources.list.d/pgdg.list
#?sudo?apt?update?&&?sudo?apt?install?postgresql-15

2.2 CentOS / Alma / Rocky / RHEL

sudo?yum?-y?install?https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm?-E?%{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo?yum?-y?module?disable?postgresql????????????#?禁用系統自帶舊版
sudo?yum?-y?install?postgresql15-server?postgresql15-contrib
sudo?/usr/pgsql-15/bin/postgresql-15-setup?initdb
sudo?systemctl?enable?--now?postgresql-15

2.3 openSUSE / SLES

sudo?zypper?addrepo?https://download.opensuse.org/repositories/server:database:postgresql/openSUSE_Leap_15.4/server:database:postgresql.repo
sudo?zypper?refresh
sudo?zypper?install?postgresql15-server?postgresql15-contrib
sudo?systemctl?enable?--now?postgresql

2.4 Arch Linux

sudo?pacman?-Syu?postgresql
sudo?-iu?postgres?initdb?--locale=C?-E?UTF8?-D?/var/lib/postgres/data
sudo?systemctl?enable?--now?postgresql.service

3. 安裝編譯環境

pgvector 使用 makePGXS 框架,無論發行版如何,核心依賴只有兩項:

  1. PostgreSQL 的頭文件與 PGXS:包名一般形如 postgresql-server-dev-all / postgresql-devel / postgresql15-devel

  2. 編譯工具:gccmakegit

一鍵腳本(Ubuntu & Debian)

sudo?apt?-y?install?postgresql-server-dev-all?git?build-essential

一鍵腳本(RHEL 系)

sudo?dnf?-y?install?postgresql15-devel?git?gcc?make

使用其他發行版時,把 postgresql15-devel 替換為對應版本的 devel 包即可。


4. 編譯安裝 pgvector

源碼安裝 可拿到最新 master 分支特性,推薦科研與生產灰度使用。若對穩定性要求極高,可選擇發行版倉庫已有的預編譯包。

4.1 從 GitHub 克隆

git?clone?https://github.com/pgvector/pgvector.git
cd?pgvector

4.2 編譯

make???????????????????????#?自動調用?pg_config?生成?Makefile
sudo?make?install??????????#?安裝到?PG?shared?library?路徑

執行完畢會輸出類似:

/bin/mkdir?-p?'/usr/lib/postgresql/15/lib'
/usr/bin/install?-c?-m?755??vector.so?'/usr/lib/postgresql/15/lib/'
/bin/mkdir?-p?'/usr/share/postgresql/15/extension'
/usr/bin/install?-c?-m?644?vector.control?pgvector--0.5.1.sql?'/usr/share/postgresql/15/extension/'

至此,二進制已就位。

4.3 通過發行版倉庫(可選)

#?Ubuntu,如果添加了?PGDG?倉庫
sudo?apt?install?postgresql-15-pgvector#?Fedora(38?以后內置)
sudo?dnf?install?pgvector_15

5. 在數據庫中啟用擴展

sudo?-u?postgres?psql
--?如果你已經有業務數據庫,切換過去
\c?mydb--?創建擴展
CREATE?EXTENSION?IF?NOT?EXISTS?vector;

?? 若提示找不到 vector,請檢查 shared_preload_libraries 是否需要加 pgvector(僅 HNSW 索引需要),然后重啟數據庫。


6. 快速上手示例

6.1 創建表并插入向量

CREATE?TABLE?items?(id?bigserial?PRIMARY?KEY,embedding?vector(3)??--?3?維定長
);INSERT?INTO?items?(embedding)?VALUES
('[1,2,3]'),
('[4,5,6]'),
('[7,8,9]');

6.2 簡單相似度查詢

--?余弦距離最相似?TOP?1
SELECT?*?FROM?items
ORDER?BY?embedding?<=>?'[3,1,2]'???--?<=>?表示?cosine
LIMIT?1;

輸出:

?id?|?embedding
----+--------------1?|?[1,2,3]

6.3 構建 IVFFlat 索引

--?推薦先歸一化或?PCA?壓縮
CREATE?INDEX?ON?items?USING?ivfflat?(embedding?vector_l2_ops)?WITH?(lists?=?8);
ANALYZE?items;

IVFFlat 適合大規模近似搜索,lists 參數應約為 sqrt(行數)


7. Python 調用 Demo

以下示例以 psycopg2 + openai 為例,流程:文本 → OpenAI Embedding → 寫入 PG → 檢索。

import?os,?psycopg2,?openai,?jsonconn?=?psycopg2.connect("dbname=mydb?user=postgres")
cur??=?conn.cursor()openai.api_key?=?os.environ['OPENAI_API_KEY']def?embedding(text):resp?=?openai.Embedding.create(model="text-embedding-ada-002",?input=[text])return?resp["data"][0]["embedding"]??#?長度?1536def?upsert(text):vec?=?embedding(text)cur.execute("insert?into?docs(content,?embedding)?values?(%s,?%s)",?(text,?json.dumps(vec)))conn.commit()def?search(query,?topk=3):vec?=?embedding(query)cur.execute("""select?content,?1?-?(embedding?<=>?%s)?as?scorefrom?docs?order?by?embedding?<=>?%s?limit?%s""",?(vec,?vec,?topk))for?row?in?cur.fetchall():print(row)upsert("pgvector?是什么?")
upsert("Postgres?如何作為向量數據庫?")
search("向量擴展")

可進一步封裝為 FastAPI / Flask 服務,對外提供 HTTP 檢索接口。


8. 高階特性

8.1 HNSW 索引

v0.5.0 引入 HNSW,比 IVFFlat 更高精度、支持動態插入。

--?預先在?postgresql.conf?加入
--?shared_preload_libraries?=?'vectors'
--?然后重啟數據庫CREATE?INDEX?ON?items?USING?hnsw?(embedding?vector_l2_ops)?WITH?(m?=?16,?ef_construction?=?200);
SET?hnsw.ef_search?=?64;??--?session?級別

8.2 Partition + HNSW

百萬級以上數據建議分區:

CREATE?TABLE?items_y2023?PARTITION?OF?items
FOR?VALUES?FROM?('2023-01-01')?TO?('2023-12-31');--?每個分區建獨立?HNSW
CREATE?INDEX?ON?items_y2023?USING?hnsw?(embedding?vector_cosine_ops);

8.3 并行檢索

PostgreSQL 14+ 開啟并行度:

set?max_parallel_workers_per_gather?=?4;
explain?analyze?select?*?from?items?order?by?embedding?<#>?'[0.1,0.2,0.3]'?limit?10;

查看計劃即可看到 Parallel Thread。


9. 性能調優實踐

  1. work_mem 調高(≥16MB)可減少外部排序。

  2. 內存夠用時 shared_buffers 設 25% RAM。

  3. 對向量列加 NOT NULL 減少元組大小。

  4. 大表批量導入前 SET synchronous_commit = off;,導入完 VACUUM ANALYZE;

  5. 常查詢的向量可按相似度熱度建緩存表,定時刷新。


10. 容器化部署

10.1 使用官方 postgres + 手動安裝擴展

Dockerfile:

FROM?postgres:15-bookworm
RUN?apt-get?update?&&?\apt-get?install?-y?postgresql-server-dev-15?git?build-essential?&&?\git?clone?https://github.com/pgvector/pgvector.git?&&?\cd?pgvector?&&?make?&&?make?install?&&?\rm?-rf?/var/lib/apt/lists/*

構建運行:

docker?build?-t?pg-pgvector:latest?.
docker?run?-d?--name?pgvector?-p?5432:5432?-e?POSTGRES_PASSWORD=pass?pg-pgvector:latest

10.2 使用集成鏡像

也可使用社區鏡像 ankane/pgvector,但在企業內網建議自己構建以滿足合規審計。


11. 運維與監控

  1. 備份pg_dump -Fc 支持 vector 類型,常規邏輯備份即可。

  2. 物理備份:使用 pg_basebackup + WAL 歸檔。

  3. 監控:推薦 pg_exporter + Prometheus,監控 pg_stat_all_indexes 里 HNSW / IVFFlat 命中率。

  4. 告警:向量索引膨脹時 index size > table size 需重建,自動告警。


12. 常見錯誤排查

錯誤信息解決方案
ERROR: could not open extension control file "…/vector.control": No such file or directory檢查 make install 是否執行在與數據庫相同版本的 lib 目錄;跨版本需重新編譯。
ERROR: type "vector" does not exist忘記執行 CREATE EXTENSION vector; 或數據庫切換錯了。
FATAL: incompatible toplevel library擴展編譯時用的 PG 版本與運行時不一致,重新編譯。
PANIC: could not open shared memory segmentHNSW 需 preload,確認 shared_preload_libraries='vectors' 并重啟。

13. 真實業務案例

某游戲公司:百萬級角色對話嵌入,單節點 32C64G,IVFFlat lists=100,平均檢索延遲 12ms,99th 45ms。
某銀行客服:HNSW,30M QA 對,3 節點分區并行,內存 256G,查詢延遲穩定 20ms,優于 Milvus 多節點方案。


14. 深入閱讀

  1. PostgreSQL 官網手冊 CH31:擴展機制

  2. pgvector README 中對比現有向量數據庫的優勢與局限

  3. HNSW 論文:Efficient and Robust Approximate Nearest Neighbor Search


15. 和作者互動

我準備了一個小調查,看看大家最關心哪方面,后續文章將根據熱度展開:

  • [ ] A. pgvector 分區 + HNSW 大數據量最佳實踐

  • [ ] B. Streaming ingestion + 實時檢索架構

  • [ ] C. Python / Java ORM 與 pgvector 一站式封裝

  • [ ] D. 內存 + SSD 混合存儲向量冷溫熱分級

投票方式:請在評論區回復選項字母即可,CSDN 的投票組件有時加載緩慢,我會人工統計。
彩蛋:在下篇文章發布前點贊 + 收藏 + 評論,即可私信我獲得完整 pgvector-benchmark Jupyter Notebook。


16. 總結

本文從 0 開始講解了如何在主流 Linux 發行版上安裝 PostgreSQL 及 pgvector,包含源碼編譯、發行版包管理、Docker 鏡像、自定義索引、Python 調用、性能調優、運維監控以及常見問題排查。希望對你的向量檢索項目有所幫助。如果覺得文章有用,(點贊、收藏、評論三連) 讓更多人看到!后續還將發布:

  1. pgvectortimescaledb 結合的時間序列向量檢索實踐

  2. 多租戶 SaaS 場景下的向量安全隔離策略

  3. JSONB + 向量混合檢索在 LlamaIndex 中的落地示例

敬請關注,我們下篇見!

更多AIGC文章

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

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

相關文章

【項目實戰】——深度學習.全連接神經網絡

目錄 1.使用全連接網絡訓練和驗證MNIST數據集 2.使用全連接網絡訓練和驗證CIFAR10數據集 1.使用全連接網絡訓練和驗證MNIST數據集 import torch from torch import nn from torchvision import datasets, transforms from torch.utils.data import DataLoader from torch im…

嵌入式學習的第三十四天-進程間通信-TCP

一、TCPTCP : 傳輸控制協議 傳輸層1. TCP特點(1).面向連接,避免部分數據丟失 (2).安全、可靠 (3).面向字節流 (4).占用資源開銷大2.TCP安全可靠機制三次握手:指建立tcp連接時&#xff0c;需要客戶端和服務端總共發送三次報文確認連接。確保雙方均已做好 收發…

【爬蟲】06 - 自動化爬蟲selenium

自動化爬蟲selenium 文章目錄自動化爬蟲selenium一&#xff1a;Selenium簡介1&#xff1a;什么是selenium2&#xff1a;安裝準備二&#xff1a;元素定位1&#xff1a;id 定位2&#xff1a;name 定位3&#xff1a;class 定位4&#xff1a;tag 定位5&#xff1a;xpath 定位(最常用…

2025年中國移動鴻鵠大數據實訓營(大數據方向)kafka講解及實踐-第2次作業指導

書接上回&#xff0c;第二次作業比較容易解決&#xff0c;我問了ai&#xff0c;讓他對我進行指導&#xff0c;按照它提供的步驟&#xff0c;我完成了本次實驗&#xff0c;接下來我會標注出需要注意的細節&#xff0c;指導大家完成此次任務。 &#x1f3af; 一、作業目標 ??…

三十七、【高級特性篇】定時任務:基于 APScheduler 實現測試計劃的靈活調度

三十七、【高級特性篇】定時任務:基于 APScheduler 實現測試計劃的靈活調度 前言 準備工作 第一部分:后端實現 - `APScheduler` 集成與任務調度 1. 安裝 `django-apscheduler` 2. 配置 `django-apscheduler` 3. 數據庫遷移 4. 創建調度觸發函數 5. 啟動 APScheduler 調度器 6…

RabbitMQ--消息順序性

看本章之前強烈建議先去看博主的這篇博客 RabbitMQ--消費端單線程與多線程-CSDN博客 一、消息順序性概念 消息順序性是指消息在生產者發送的順序和消費者接收處理的順序保持一致。 二、RabbitMQ 順序性保證機制 情況順序保證情況備注單隊列&#xff0c;單消費者消息嚴格按發送順…

.net core接收對方傳遞的body體里的json并反序列化

1、首先我在通用程序里有一個可以接收對象型和數組型json串的反序列化方法public static async Task<Dictionary<string, string>> AllParameters(this HttpRequest request){Dictionary<string, string> parameters QueryParameters(request);request.Enab…

(10)機器學習小白入門 YOLOv:YOLOv8-cls 模型評估實操

YOLOv8-cls 模型評估實操 (1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv &#xff1a;圖片標注實操手冊 (5)機器學習小…

Vue 腳手架基礎特性

一、ref屬性1.被用來給元素或子組件注冊引用信息&#xff08;id的替代者&#xff09;2.應用在html標簽上獲取的是真實DOM元素&#xff0c;用在組件標簽上是組件實例對象3.使用方式&#xff1a;(1).打標識&#xff1a;<h1 ref"xxx">...</h1> 或 <Schoo…

Ubuntu安裝k8s集群入門實踐-v1.31

準備3臺虛擬機 在自己電腦上使用virtualbox 開了3臺1核2G的Ubuntu虛擬機&#xff0c;你可以先安裝好一臺&#xff0c;安裝第一臺的時候配置臨時調高到2核4G&#xff0c;安裝速度會快很多&#xff0c;安裝完通過如下命令關閉桌面&#xff0c;能夠省內存占用&#xff0c;后面我們…

Word Press富文本控件的保存

新建富文本編輯器&#xff0c;并編寫save方法如下&#xff1a; edit方法&#xff1a; export default function Edit({ attributes, setAttributes }) {return (<><div { ...useBlockProps() }><RichTexttagNameponChange{ (value) > setAttributes({ noteCo…

【編程趣味游戲】:基于分支循環語句的猜數字、關機程序

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言學習》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"編程的核心是實踐&#xff0c;而非空談" 目錄 1. 游戲1--猜數字 1.1 rand函數 1.2 sr…

UE5 UI 控件切換器

文章目錄分類作用屬性分類 面板 作用 可以根據索引切換要顯示哪個子UI&#xff0c;可以擁有多個子物體&#xff0c;但是任何時間只能顯示一個 屬性 在這里指定要顯示的UI的索引

scikit-learn 包

文章目錄scikit-learn 包核心功能模塊案例其他用法**常用功能詳解****(1) 分類任務示例&#xff08;SVM&#xff09;****(2) 回歸任務示例&#xff08;線性回歸&#xff09;****(3) 聚類任務示例&#xff08;K-Means&#xff09;****(4) 特征工程&#xff08;PCA降維&#xff0…

Excel 將數據導入到SQLServer數據庫

一般系統上線前期都會導入期初數據&#xff0c;業務人員一般要求你提供一個Excel模板&#xff0c;業務人員根據要求整理數據。SQLServer管理工具是支持批量導入數據的&#xff0c;所以我們可以使用該工具導入期初。Excel格式 第一行為字段1、連接登入的數據庫并且選中你需要導入…

剪枝和N皇后在后端項目中的應用

剪枝算法&#xff08;Pruning Algorithm&#xff09; 生活比喻&#xff1a;就像修剪樹枝一樣&#xff0c;把那些明顯不會結果的枝條提前剪掉&#xff0c;節省養分。 在后端項目中的應用場景&#xff1a; 搜索優化&#xff1a;在商品搜索中&#xff0c;如果某個分類下沒有符合條…

cocos 2d游戲中多邊形碰撞器會觸發多次,怎么解決

子彈打到敵機 一發子彈擊中&#xff0c;碰撞回調多次執行 我碰撞組件原本是多邊形碰撞組件 PolygonCollider2D&#xff0c;我改成盒碰撞組件BoxCollider2D 就好了 用前端的節流方式。或者loading處理邏輯。我測試過了&#xff0c;是可以 本來就是多次啊,設計上貌似就是這樣的…

Kubernetes環境中GPU分配異常問題深度分析與解決方案

Kubernetes環境中GPU分配異常問題深度分析與解決方案 一、問題背景與核心矛盾 在基于Kubernetes的DeepStream應用部署中&#xff0c;GPU資源的獨占性分配是保障應用性能的關鍵。本文將圍繞一個典型的GPU分配異常問題展開分析&#xff1a;多個請求GPU的容器本應獨占各自的GPU&…

Django與模板

我叫補三補四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步今天來講一講視圖Django與模板文件工作流程模板引擎&#xff1a;主要參與模板渲染的系統。內容源&#xff1a;輸入的數據流。比較常見的有數據庫、XML文件和用戶請求這樣的網絡數據。模板&#xff1a…

日本上市IT企業|8月25日將在大連舉辦赴日it招聘會

株式會社GSD的核心戰略伙伴貝斯株式會社&#xff0c;將于2025年8月25日在大連香格里拉大酒店商務會議室隆重舉辦赴日技術人才專場招聘會。本次招聘會面向全國范圍內的優秀IT人才&#xff0c;旨在為貝斯株式會社東京本社長期發展招募優質的系統開發與管理人才。招聘計劃&#xf…