897 words
4 minutes
每日Skill学习 - pgvector
每日Skill学习 - pgvector
这是什么 ✨
pgvector 是一个让 PostgreSQL 原生支持向量操作的扩展。换句话说——你不用单独部署一套 Milvus/Qdrant/Pinecone,直接在已有的 Postgres 数据库里就能做向量相似度搜索、RAG 存储、语义检索。
对于已经在用 PostgreSQL 的团队来说,这是成本最低的向量数据库方案。
核心功能 🔧
1. 向量存储与索引
pgvector 支持最多 16,000 维的向量,存储格式为 vector(n)。关键是有两种高效索引算法:
- HNSW(Hierarchical Navigable Small World):高准确率,适合对精度要求高的场景。参数
m=16, ef_construction=64 - IVFFlat:构建快,适合超大规模数据集。参数
lists=100
CREATE TABLE IF NOT EXISTS documents ( id BIGSERIAL PRIMARY KEY, content TEXT NOT NULL, embedding vector(1536) NOT NULL, -- OpenAI text-embedding-3-small 是1536维 metadata JSONB, created_at TIMESTAMPTZ DEFAULT NOW());
-- HNSW 索引CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops)WITH (m = 16, ef_construction = 64);2. 相似度搜索
三种距离计算方式,按场景选用:
| 操作符 | 名称 | 适用场景 |
|---|---|---|
<-> | 欧氏距离 | 通用,推荐作为默认选择 |
<=> | 余弦距离 | 文本嵌入场景最常用 |
<#> | 内积 | 归一化向量,或需要快速粗排 |
-- 余弦相似度搜索(最常用)SELECT id, content, (1 - (embedding <=> '[query_embedding]')) AS similarityFROM documentsORDER BY embedding <=> '[query_embedding]'LIMIT 5;3. 混合搜索(向量 + 关键词)
这是 pgvector 相比纯向量数据库的独特优势——可以结合 PostgreSQL 强大的全文搜索能力:
SELECT id, content, (1 - (embedding <=> '[query_embedding]')) AS vector_score, ts_rank(to_tsvector('english', content), plainto_tsquery('english', 'search terms')) AS text_scoreFROM documentsWHERE content ILIKE '%search terms%'ORDER BY (vector_score * 0.7 + text_score * 0.3) DESCLIMIT 10;4. RAG 流水线支持
典型 RAG 场景:文档分块 → 嵌入 → 存储 → 检索:
CREATE TABLE document_chunks ( id BIGSERIAL PRIMARY KEY, document_id BIGINT REFERENCES documents(id), chunk_text TEXT NOT NULL, chunk_embedding vector(1536) NOT NULL, chunk_index INT NOT NULL);
-- 检索相关块作为 LLM 上下文SELECT chunk_textFROM document_chunksWHERE document_id = 42ORDER BY chunk_embedding <=> '[question_embedding]'LIMIT 5;使用场景 🎯
- 语义搜索:不用分词器和同义词表,直接按语义匹配
- RAG 存储:文档嵌入持久化,支持实时检索
- 推荐系统:找相似商品/内容/用户
- 异常检测:嵌入空间里的孤立点
- 多模态搜索:图片/视频嵌入存储和查询
快速上手 🚀
连接数据库
# 默认端口 5433psql -h localhost -p 5433 -U damien -d postgres
# 或设置环境变量export PGHOST=localhostexport PGPORT=5433export PGUSER=damienexport PGDATABASE=postgresPython 批量插入
import psycopg2import numpy as np
conn = psycopg2.connect( host="localhost", port=5433, user="damien", database="postgres")cur = conn.cursor()
for text, embedding in documents: cur.execute( "INSERT INTO documents (content, embedding) VALUES (%s, %s)", (text, embedding.tolist()) )conn.commit()亮点 🌟
- 零迁移成本:已有的 Postgres 直接开扩展,不用搭新服务
- 混合搜索原生支持:向量 + 全文搜索一条 SQL搞定
- ACID 事务保障:向量数据库里罕见的能力
- HNSW 索引:准确率高,召回率有保障
- JSONB 元数据:向量和业务数据共存,简化架构
值得注意的点 ⚠️
- 向量维度必须和嵌入模型一致(OpenAI
text-embedding-3-small是 1536 维,text-embedding-3-large是 3072 维) - HNSW 索引占用内存较多,大规模场景注意
maintenance_work_mem配置 - IVFFlat 对数据量敏感,数据不足时索引反而拖累性能
- 删除和更新操作会降低 IVFFlat 索引效率,需要定期
REINDEX
总结 📝
pgvector 是”一个扩展解决向量检索”的经典案例。如果你已经在用 PostgreSQL,想做语义搜索或 RAG,pgvector 几乎是最快最低成本的路径。哪怕将来需要迁移到专用向量数据库,SQL 接口的迁移成本也很低。
推荐指数:⭐⭐⭐⭐⭐(PostgreSQL 用户必学)
每日Skill学习 - pgvector
https://maomaoz.org/posts/daily-skill-2026-05-03/