
🧠 记忆锚点:向量与业务同库换一致性和简单运维;过滤要看选择性与执行计划。
💡 答案要点
pgvector = PostgreSQL 向量扩展,让 Postgres 原生支持 ANN 检索,无需额外向量库
核心价值:一套系统搞定业务数据 + 向量数据
sql
-- 安装扩展
CREATE EXTENSION vector;
-- 创建带向量的表
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
title TEXT,
category TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
embedding VECTOR(1536)
);
-- 创建 HNSW 索引(pgvector 0.6+)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- ✅ 一条 SQL 搞定混合检索:向量相似 + 业务条件过滤
SELECT title, 1 - (embedding <=> $1) AS similarity
FROM documents
WHERE category = '技术文档'
AND created_at > '2024-01-01'
ORDER BY embedding <=> $1
LIMIT 10;三种距离运算符:
| 运算符 | 类型 | 推荐场景 |
|---|---|---|
<=> | 余弦距离 | OpenAI 归一化 Embedding(首选) |
<-> | 欧氏距离 L2 | 未归一化向量 |
<#> | 负内积 | 归一化向量(等价余弦) |
选型边界:
| 数据量 | 建议 |
|---|---|
| < 100 万 | pgvector(省一套系统) ✅ |
| 100-500 万 | pgvector + HNSW 调优 |
| > 500 万 | 考虑 Milvus / Qdrant |
LangChain 集成:
python
from langchain_postgres import PGVector
from langchain_openai import OpenAIEmbeddings
vector_store = PGVector(
connection="postgresql+psycopg://user:pass@localhost:5432/ragdb",
embeddings=OpenAIEmbeddings(model="text-embedding-3-small"),
collection_name="documents",
)
# 向量检索 + 元数据过滤
results = vector_store.similarity_search(
query="如何优化 RAG 检索",
k=5,
filter={"category": "技术文档"}
)面试话术:
"pgvector 的优势是向量与关系数据共享 PostgreSQL 的事务、过滤、备份和权限体系,适合已有 Postgres 能力的团队。是否迁移到专用向量系统不能按固定条数判断,还取决于维度、索引、更新率、过滤、并发、分片和 SLO;应在真实查询与硬件上压测。"