Wat is een vectordatabase?
Een vectordatabase slaat hoog-dimensionele vectors op en kan efficient de dichtstbijzijnde buren vinden (Approximate Nearest Neighbor, ANN). Dit is de kern van RAG: gegeven een query-vector, vind de k meest gelijkende document-vectors.
Naast vectorzoekopdrachten ondersteunen de meeste vectordatabases ook metadata-filtering. Je zoekt dan de k dichtstbijzijnde vectors alleen binnen documenten van een bepaalde categorie of datum. Goede filtering is in de praktijk net zo belangrijk als ruwe zoeksnelheid, omdat productie-RAG bijna altijd op een subset van je data zoekt.
Vergelijkingsoverzicht
De tabel hieronder geeft een grove richting. Prijzen en limieten veranderen regelmatig, controleer dus altijd de actuele prijspagina van de leverancier voor je een keuze vastlegt. De stand hieronder is juni 2026.
| Database | Schaal | Hosting | Latentie | Metadata-filtering | Prijsmodel |
|---|---|---|---|---|---|
| Chroma | Klein tot middel | Self-hosted | Laag | Basis | Gratis (open source) |
| pgvector | Klein tot groot | Self-hosted | Middel | Volledig (SQL) | Gratis (PostgreSQL-extensie) |
| Qdrant | Groot | Self-hosted of managed | Laag | Geavanceerd | Open source gratis, managed vanaf gratis tier |
| Weaviate | Groot | Self-hosted of managed | Middel | Geavanceerd | Open source gratis, managed vanaf gratis tier |
| Pinecone | Groot | Managed (serverless) | Laag | Basis tot middel | Gebruik (read/write units + opslag) |
| Milvus | Zeer groot | Self-hosted of managed | Laag | Geavanceerd | Open source gratis |
Pinecone is serverless, geen pods meer
Oudere documentatie noemt voor Pinecone een prijs per pod-uur. Sinds Pinecone naar een serverless model is overgestapt betaal je per gebruik: read units, write units en opslag, met een maandelijks minimum op de betaalde plannen. Reken je kosten dus op je verwachte query- en opslagvolume, niet op een vast uurtarief.
Chroma: voor ontwikkeling
import { ChromaClient, Collection } from "chromadb";
const client = new ChromaClient({ path: "http://localhost:8000" });
const collection = await client.getOrCreateCollection({
name: "documents",
metadata: { "hnsw:space": "cosine" },
});
await collection.add({
ids: ["doc-1", "doc-2"],
embeddings: [[0.1, 0.2], [0.3, 0.4]],
documents: ["Eerste document", "Tweede document"],
metadatas: [
{ category: "technisch", date: "2025-01" },
{ category: "beleid", date: "2025-02" },
],
});
const results = await collection.query({
queryEmbeddings: [[0.15, 0.25]],
nResults: 5,
where: { category: "technisch" },
});
Chroma is ideaal voor lokale ontwikkeling en kleine tot middelgrote productiesystemen. Het draait in-process of als losse server, vraagt nauwelijks configuratie en is daardoor perfect om snel een RAG-prototype op te zetten.
pgvector: SQL-integratie
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
content TEXT NOT NULL,
embedding vector(1536),
category VARCHAR(50),
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
import { Pool } from "pg";
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
async function vectorSearch(embedding: number[], category?: string, limit = 5) {
const embeddingStr = `[${embedding.join(",")}]`;
const query = category
? `SELECT id, content, 1 - (embedding <=> $1) AS similarity
FROM documents WHERE category = $2
ORDER BY embedding <=> $1 LIMIT $3`
: `SELECT id, content, 1 - (embedding <=> $1) AS similarity
FROM documents ORDER BY embedding <=> $1 LIMIT $2`;
const params = category ? [embeddingStr, category, limit] : [embeddingStr, limit];
const result = await pool.query(query, params);
return result.rows;
}
pgvector is ideaal als je al PostgreSQL gebruikt. Je hoeft geen aparte database te beheren en je kunt vectorzoekopdrachten combineren met gewone SQL-filters, joins en transacties.
Kies standaard HNSW als index
Voor de meeste RAG-toepassingen is HNSW de beste standaardkeuze in pgvector: betere zoeksnelheid bij hoge recall en je kunt de index al op een lege tabel aanmaken. Sinds pgvector 0.8 lossen iteratieve indexscans bovendien het over-filteren op bij gecombineerde vector- en metadata-zoekopdrachten. Kies alleen ivfflat als bouwsnelheid en geheugengebruik zwaarder wegen dan querysnelheid, bijvoorbeeld bij grote, zelden wijzigende batches.
Qdrant: productie self-hosted of managed
import { QdrantClient } from "@qdrant/js-client-rest";
const client = new QdrantClient({ url: "http://localhost:6333" });
await client.createCollection("documents", {
vectors: { size: 1536, distance: "Cosine" },
});
await client.upsert("documents", {
points: [
{
id: 1,
vector: [0.1, 0.2],
payload: { content: "Document tekst", category: "technisch", date: "2025-01" },
},
],
});
const results = await client.search("documents", {
vector: [0.15, 0.25],
limit: 5,
filter: {
must: [{ key: "category", match: { value: "technisch" } }],
},
with_payload: true,
});
Qdrant biedt uitstekende performance, geavanceerde filtering en ondersteunt sparse vectors voor hybrid search. Je draait het zelf met Docker of je gebruikt Qdrant Cloud, dat een permanente gratis tier heeft voor experimenten en daarna afrekent op gereserveerde resources (vCPU, RAM en schijf) in plaats van per query.
Keuzewijzer
Loop deze vragen van boven naar beneden af en stop bij de eerste die op jou van toepassing is.
- Gebruik je al PostgreSQL en blijf je onder enkele miljoenen vectors? Gebruik pgvector.
- Ben je aan het prototypen of bouw je een klein systeem? Gebruik Chroma.
- Heb je veel vectors, hoge query-volumes en wil je zelf hosten? Gebruik Qdrant of Weaviate.
- Wil je geen enkele infrastructuur beheren? Gebruik Pinecone (serverless) of de managed variant van Qdrant of Weaviate.
Bewaar altijd de ruwe tekst
Sla naast de vectors ook de originele chunk-tekst en bron-metadata op, los van je vectordatabase. Embeddings kun je altijd opnieuw genereren als je van model of database wisselt, maar verloren brontekst is lastig te reconstrueren. Dit maakt migratie en het wisselen van embedding-model veel eenvoudiger.
Migratie tussen databases
Wissel je later van database, dan komt het neer op uitlezen in batches en herinvoeren aan de andere kant:
async function migrateVectors(source: VectorDB, target: VectorDB, batchSize = 1000): Promise<void> {
let offset = 0;
while (true) {
const batch = await source.listAll(offset, batchSize);
if (batch.length === 0) break;
await target.upsertBatch(batch);
offset += batchSize;
console.error(`Gemigreerd: ${offset} vectors`);
}
}
Omdat je de embeddings zelf hebt opgeslagen (of opnieuw kunt genereren uit de brontekst) hoef je bij een migratie meestal niet alles opnieuw te embedden. Houd wel rekening met verschillen in id-formaat en filter-syntaxis tussen databases.
Welke vectordatabase is het beste voor RAG?
Er is geen universele winnaar. Voor lokale ontwikkeling en kleine systemen passen Chroma en pgvector goed. Voor productie op schaal kijk je naar Qdrant, Weaviate, Milvus of Pinecone. Gebruik je al PostgreSQL, dan is pgvector vaak de eenvoudigste keuze omdat je geen extra systeem hoeft te beheren.
Kan ik meerdere vectordatabases tegelijk gebruiken?
Ja, maar het is ongebruikelijk. Een denkbaar scenario is Chroma lokaal voor snelle ontwikkeling zonder netwerk, en een managed database zoals Pinecone of Qdrant Cloud in productie. Houd er rekening mee dat je dan twee implementaties moet onderhouden en testen.
Hoe kies ik het juiste indexalgoritme?
HNSW (Hierarchical Navigable Small World) is de standaard voor de meeste use cases: een goed evenwicht tussen snelheid en nauwkeurigheid. IVF-varianten kunnen beter passen bij zeer grote datasets met beperkt geheugen, omdat ze minder RAM gebruiken ten koste van wat querysnelheid.
Wat is de maximale vectordimensie?
Chroma, pgvector en Qdrant kennen geen praktische harde limiet. Pinecone hanteert een maximum van 20.000 dimensies voor dense vectors. In de praktijk kom je zelden boven 3072 dimensies uit, het formaat van text-embedding-3-large.
Hoe maak ik een back-up van een vectordatabase?
Bij pgvector maak je gewoon een PostgreSQL-dump, bij Chroma kun je het onderliggende bestand of de SQLite-database kopieren, en Qdrant heeft een snapshot-API. Bewaar daarnaast altijd de ruwe tekst van je chunks, zodat je in het ergste geval volledig kunt herindexeren.
Hoeveel kost een vectordatabase in productie?
Self-hosted opties (pgvector, Chroma, Qdrant, Weaviate, Milvus) zijn qua licentie gratis; je betaalt alleen de servers. Managed opties rekenen verschillend af: Pinecone op gebruik (read- en write-units plus opslag), Qdrant en Weaviate Cloud op gereserveerde resources. Schat je kosten op je verwachte aantal vectors en queries en controleer de actuele prijspagina van de leverancier.