Skip to content

pgvector 向量数据库

什么是 pgvector

pgvector 是 PostgreSQL 的开源扩展,支持向量存储和相似度检索,让 PostgreSQL 兼具关系型数据库和向量数据库的能力。

为什么选 pgvector

对比项pgvectorMilvusPineconeChroma
部署方式PG 扩展,无额外运维独立服务,运维复杂云服务嵌入式
ACID 事务支持不支持不支持不支持
数据规模百万级亿级亿级十万级
查询能力SQL + 向量混合仅向量仅向量仅向量
适用场景中小规模、快速集成大规模生产免运维原型开发

优势:复用 PostgreSQL 生态、ACID 事务、SQL + 向量混合查询、运维简单

劣势:超大规模数据(亿级以上)性能不如 Milvus

安装与配置

sql
-- 安装扩展
CREATE EXTENSION IF NOT EXISTS vector;

-- 创建带向量列的表
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    embedding VECTOR(1536),  -- OpenAI text-embedding-3 输出维度
    metadata JSONB
);

向量操作

sql
-- 插入向量
INSERT INTO documents (content, embedding)
VALUES ('Hello world', '[0.1, 0.2, 0.3, ...]');

-- 余弦相似度查询(越小越相似)
SELECT content, embedding <=> '[0.1, 0.2, 0.3, ...]' AS distance
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, 0.3, ...]'
LIMIT 5;

-- 距离运算符
-- <=>  余弦距离
-- <->  L2 距离(欧几里得)
-- <#>  内积(负值,越大越相似)

索引类型

索引原理适用场景构建速度
IVFFlat聚类分区 + 暴力搜索数据量适中、精度要求高
HNSW图结构近似搜索大数据量、低延迟需求
sql
-- HNSW 索引(推荐)
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);

-- IVFFlat 索引
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

与 RAG 集成

python
from langchain_community.vectorstores import PGVector
from langchain_openai import OpenAIEmbeddings

# 连接 pgvector
vectorstore = PGVector.from_documents(
    documents=docs,
    embedding=OpenAIEmbeddings(),
    connection_string="postgresql://user:pass@localhost:5432/mydb",
    collection_name="knowledge_base"
)

# 相似度检索
results = vectorstore.similarity_search("用户查询内容", k=5)

实际应用场景

  • 语义搜索:用户输入自然语言,返回语义最相关的文档
  • 相似度推荐:基于内容 Embedding 找相似商品/文章
  • AI 记忆存储:对话历史向量化存储,多轮对话时检索相关记忆
  • 混合查询:SQL 条件过滤 + 向量相似度排序,同时满足结构化和语义化需求

基于 VitePress 构建