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.
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).
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ě.
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
Zatím žádné komentáře.