Zpět na domů

pgvector vs pgvectorscale vs VectorChord: srovnání

Srovnávací analýza rozšíření PostgreSQL pro vektorový vyhledávání: pgvector, pgvectorscale a VectorChord. Popis algoritmů HNSW, StreamingDiskANN, RaBitQ. Infrastruktura Docker, bulk nahrání 1M záznamů, příprava benchmarků.

Bitva vektorových indexů PostgreSQL: kdo je rychlejší?
Advertisement 728x90

Porovnání rozšíření pgvector, pgvectorscale a VectorChord pro vektorové vyhledávání v PostgreSQL

Vektorové vyhledávání převádí text na číselné vektory a najde podobné dokumenty podle smyslu pomocí metrik blízkosti. Vektory slov s podobným významem se seskupují v N-rozměrném prostoru. Klasický příklad: King - Man + Woman ≈ Queen ukazuje vektorové analogie.

Hlavní metriky:

  • Kosinová podobnost: úhel mezi vektory, normalizované vektory jsou ekvivalentní k eukleidovské vzdálenosti.
  • Eukleidovská vzdálenost: přímá vzdálenost mezi body.

Rozšíření PostgreSQL implementují ANN-hledání (přibližné nejbližší sousedy) s indexy IVFFlat, HNSW a specializovanými algoritmy.

Google AdInline article slot

Rozšíření pro vektorové vyhledávání

pgvector

Otevřené rozšíření v jazyce C s typem vector. Podporuje kosinovou podobnost, L2, skalární součin. Indexy:

  • IVFFlat: klastrování vektorů.
  • HNSW: hierarchický graf, hrubé hledání shora dolů.

Vyžaduje plnou načtení indexu do RAM.

pgvectorscale

Nadstavba nad pgvector v Rustu (PGRX). Index StreamingDiskANN (adaptace DiskANN) ukládá data na SSD a uvolňuje RAM. Komprese SBQ (Statistical Binary Quantization).

Google AdInline article slot

Prohlášený nárůst: 16× propustnost při 50M vektorech dim=768.

pgvecto.rs

Plně v Rustu, podpora binary/FP16/INT8, dim až 65535. Algoritmus VBASE optimalizován pro hybridní dotazy (vektor + filtry + JOIN).

VectorChord

Aktivní náhrada pgvecto.rs od TensorChord. Komprese RaBitQ (Randomized Binary Quantization) + reorganizace. Uloží 26× více dat při stejné ceně.

Google AdInline article slot

Všechna používají standardní typ vector, migrace jsou kompatibilní.

Nastavení testovací infrastruktury

Nasazení přes Docker Compose pro tři databáze:

  • 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

Inicializace:

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 pro správu:

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

Jedinečná jména služeb a porty jsou povinná.

Rozšíření repozitáře pro operace bulk

Metoda bulk_create ve BaseRepository:

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

Schéma BulkCreateRequest:

class BulkCreateRequest(BaseModel):
    documents: Annotated[
        list[DocumentCreate],
        Field(..., description='Seznam dokumentů k vytvoření', min_length=1, max_length=500)
    ]

Koncový bod:

@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

Příprava na benchmarky

Datová sada: ag_news z Hugging Face (nadpisy → vektory, category → metadata). Cíl: 1M záznamů.

Závislosti:

uv add --dev datasets ollama aiohttp tqdm

Komponenty testu:

  • Načítání batchů z datasets
  • Generování vektorů přes ollama
  • Bulk-nahrání do DB
  • Měření latence vyhledávání

Struktura testového třídy je navržena pro paralelní porovnání všech rozšíření.

Co je důležité

  • Kompatibilita: všechna rozšíření používají typ vector, kód je přenositelný.
  • Škálovatelnost: pgvectorscale/VectorChord pracují s diskem, pgvector vyžaduje RAM.
  • Komprese: RaBitQ (26× hustota), SBQ pro velké datové sady.
  • Hybridní vyhledávání: VBASE v pgvecto.rs pro filtry + JOIN.
  • Výkon: StreamingDiskANN poskytuje 16× nárůst při 50M+ vektorech.

— Editorial Team

Advertisement 728x90

Číst dál