pgvector vs pgvectorscale vs VectorChord:PostgreSQL向量搜索性能对比
向量搜索将文本转化为数值嵌入,通过距离度量找出语义相似的文档。在N维空间中,含义相近的词汇会自然聚类。经典例子:国王 - 男人 + 女人 ≈ 女王,生动展示了向量之间的类比关系。
核心衡量指标
- 余弦相似度:衡量向量间夹角;归一化后结果等价于欧氏距离。
- 欧氏距离:两点间的直线距离。
PostgreSQL扩展通过IVFFlat、HNSW及专用算法实现近似最近邻(ANN)搜索。
顶级向量搜索扩展对比
pgvector
开源C语言扩展,支持vector数据类型。兼容余弦相似度、L2距离和点积计算。索引类型包括:
- IVFFlat:基于向量聚类。
- HNSW:分层图结构,采用自顶向下的粗略搜索策略。
需将完整索引加载至内存,对RAM要求较高。
pgvectorscale
基于pgvector构建的Rust层(使用PGRX),引入StreamingDiskANN索引(源自DiskANN),数据存储于SSD,显著降低内存占用。采用SBQ(统计二值量化)压缩技术。
宣称性能提升:5000万条768维向量场景下,吞吐量提升16倍。
pgvecto.rs
全由Rust编写,支持二进制、FP16与INT8格式,最大维度达65,535。其VBASE算法专为混合查询优化(向量+过滤条件+JOIN操作)。
VectorChord
由TensorChord推出的pgvecto.rs继任者。结合RaBitQ(随机二值量化)与重排序技术,相同成本下可存储26倍更多数据。
所有扩展均兼容标准vector类型,确保迁移无缝衔接。
测试环境搭建
通过Docker Compose部署三个数据库实例:
- pgvectorscale(timescale/timescaledb-ha:pg18)
services:
postgres:
image: timescale/timescaledb-ha:pg18
ports:
- "5432:5432"
volumes:
- pgdata:/home/postgres/pgdata
- ./db_init_pgv:/docker-entrypoint-initdb.d
初始化脚本:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS vectorscale;
- VectorChord(tensorchord/vchord-postgres:pg18-v1.1.1)
CREATE EXTENSION IF NOT EXISTS vchord CASCADE;
Makefile用于编排管理:
COMPOSE := docker compose
PGV_FILE := docker-compose-pgv.yml
PGVS_FILE := docker-compose-pgvs.yml
VC_FILE := docker-compose-vc.yml
up-pgv:
$(COMPOSE) -f $(PGV_FILE) up --build -d
up-pgvs:
$(COMPOSE) -f $(PGVS_FILE) up --build -d
up-vc:
$(COMPOSE) -f $(VC_FILE) up --build -d
up: up-pgv up-pgvs up-vc
服务名称与端口必须唯一,避免冲突。
扩展仓库以支持批量操作
BaseRepository中的bulk_create方法:
async def bulk_create(self, schemas: list[CreateSchemaType]) -> list[ModelType]:
instances = [
self.model(**self._normalize_embedding_format(schema.model_dump()))
for schema in schemas
]
self.session.add_all(instances)
await self.session.flush()
return instances
BulkCreateRequest请求模型:
class BulkCreateRequest(BaseModel):
documents: Annotated[
list[DocumentCreate],
Field(..., description='待创建文档列表', min_length=1, max_length=500)
]
API端点定义:
@router.post('/bulk', response_model=list[DocumentResponse], status_code=status.HTTP_201_CREATED)
async def bulk_create_documents(request: BulkCreateRequest):
async with transaction() as session:
repo = DocumentRepository(session)
created_docs = await repo.bulk_create(request.documents)
return created_docs
基准测试准备
数据集:来自Hugging Face的ag_news(标题转嵌入,类别转元数据)。目标:100万条记录。
依赖安装:
uv add --dev datasets ollama aiohttp tqdm
测试组件包含:
- 数据集批量加载
- 通过ollama生成嵌入向量
- 批量写入数据库
- 搜索查询延迟测量
测试类结构支持多扩展并行对比,确保结果可比性。
关键结论
- 兼容性:所有扩展均使用
vector类型,代码可移植性强。 - 可扩展性:pgvectorscale与VectorChord支持磁盘存储;pgvector依赖内存。
- 压缩能力:RaBitQ实现26倍数据密度,SBQ适用于大规模数据集。
- 混合查询:pgvecto.rs的VBASE支持向量+过滤+JOIN复合查询。
- 性能表现:StreamingDiskANN在5000万+向量场景下,吞吐量提升16倍。
— Editorial Team
暂无评论。