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 similarity
FROM documents
ORDER 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_score
FROM documents
WHERE content ILIKE '%search terms%'
ORDER BY (vector_score * 0.7 + text_score * 0.3) DESC
LIMIT 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_text
FROM document_chunks
WHERE document_id = 42
ORDER BY chunk_embedding <=> '[question_embedding]'
LIMIT 5;

使用场景 🎯#

  1. 语义搜索:不用分词器和同义词表,直接按语义匹配
  2. RAG 存储:文档嵌入持久化,支持实时检索
  3. 推荐系统:找相似商品/内容/用户
  4. 异常检测:嵌入空间里的孤立点
  5. 多模态搜索:图片/视频嵌入存储和查询

快速上手 🚀#

连接数据库#

Terminal window
# 默认端口 5433
psql -h localhost -p 5433 -U damien -d postgres
# 或设置环境变量
export PGHOST=localhost
export PGPORT=5433
export PGUSER=damien
export PGDATABASE=postgres

Python 批量插入#

import psycopg2
import 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/
Author
讨厌猫猫雨
Published at
2026-05-03
License
CC BY-NC-SA 4.0