返回首页

pgvector 与 pgvectorscale 与 VectorChord:比较

PostgreSQL 向量搜索扩展的比较分析:pgvector、pgvectorscale 和 VectorChord。HNSW、StreamingDiskANN、RaBitQ 算法描述。Docker 基础设施、批量加载 1M 记录、基准测试准备。

PostgreSQL 向量索引之战:谁更快?
Advertisement 728x90

pgvector vs pgvectorscale vs VectorChord:PostgreSQL向量搜索性能对比

向量搜索将文本转化为数值嵌入,通过距离度量找出语义相似的文档。在N维空间中,含义相近的词汇会自然聚类。经典例子:国王 - 男人 + 女人 ≈ 女王,生动展示了向量之间的类比关系。

核心衡量指标

  • 余弦相似度:衡量向量间夹角;归一化后结果等价于欧氏距离。
  • 欧氏距离:两点间的直线距离。

PostgreSQL扩展通过IVFFlat、HNSW及专用算法实现近似最近邻(ANN)搜索。

顶级向量搜索扩展对比

pgvector

开源C语言扩展,支持vector数据类型。兼容余弦相似度、L2距离和点积计算。索引类型包括:

Google AdInline article slot
  • IVFFlat:基于向量聚类。
  • HNSW:分层图结构,采用自顶向下的粗略搜索策略。

需将完整索引加载至内存,对RAM要求较高。

pgvectorscale

基于pgvector构建的Rust层(使用PGRX),引入StreamingDiskANN索引(源自DiskANN),数据存储于SSD,显著降低内存占用。采用SBQ(统计二值量化)压缩技术。

宣称性能提升:5000万条768维向量场景下,吞吐量提升16倍。

Google AdInline article slot

pgvecto.rs

全由Rust编写,支持二进制、FP16与INT8格式,最大维度达65,535。其VBASE算法专为混合查询优化(向量+过滤条件+JOIN操作)。

VectorChord

由TensorChord推出的pgvecto.rs继任者。结合RaBitQ(随机二值量化)与重排序技术,相同成本下可存储26倍更多数据。

所有扩展均兼容标准vector类型,确保迁移无缝衔接。

Google AdInline article slot

测试环境搭建

通过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

Advertisement 728x90

继续阅读