Ga naar hoofdinhoud

pgvector-tutorial: integreer vector search in PostgreSQL

Ontdek hoe je PostgreSQL uitbreidt met vector search-mogelijkheden met pgvector. Deze tutorial leidt je door installatie, basisbewerkingen en integratie met AI-tools.
Bijgewerkt 2 jun 2026  · 10 min lezen

Vector search is de laatste jaren enorm populair geworden, dankzij alle vooruitgang in het Generative AI- en Large Language Model-ecosysteem. 

Vector search is een methode voor informatieopvraging waarbij documenten en zoekopdrachten worden weergegeven als vectors in plaats van platte tekst. Deze numerieke representatie wordt verkregen met een groot, getraind neuraal netwerk dat ongestructureerde data, zoals tekst, afbeeldingen en video’s, kan omzetten in vectors.

Traditionele relationele databases zijn niet geoptimaliseerd om grote hoeveelheden vectordata te verwerken. Daarom zijn er de afgelopen jaren veel open-source en propriëtaire, exclusieve vectordatabases verschenen. Het is echter niet voor alle bedrijven ideaal om een aparte database uitsluitend voor vectors te hebben, los van de hoofd­database.

Daar komt pgvector om de hoek kijken: een krachtige extensie voor PostgreSQL die mogelijkheden voor gelijkeniszoekopdrachten met vectors toevoegt aan een van de populairste relationele databases. 

In deze tutorial verkennen we de features van pgvector en laten we zien hoe het je in je werk kan helpen.

Wat is pgvector?

pgvector is een open-source extensie voor PostgreSQL die ondersteuning toevoegt voor vector­bewerkingen en gelijkeniszoekopdrachten. Je kunt vectordata direct in je PostgreSQL-database opslaan, indexeren en opvragen. 

Deze integratie brengt de kracht van vectorbewerkingen naar je bestaande PostgreSQL-infrastructuur, waardoor het een uitstekende keuze is voor toepassingen met embeddings, aanbevelingssystemen en gelijkeniszoekopdrachten.

Features van pgvector zijn onder andere:

  • Efficiënte opslag van dichte vectordata
  • Snelle gelijkeniszoekopdrachten met diverse afstandsmaatstaven
  • Integratie met de bestaande queryplanner en indexeringsmechanismen van PostgreSQL
  • Ondersteuning voor zowel exacte als benaderende nearest neighbor-zoekopdrachten

Het belang van pgvector en vectordatabases

Vectordatabases zijn gespecialiseerde databases die zijn ontworpen om multidimensionale vectordata op te slaan en te bevragen. Deze capaciteit is relevant in moderne machinelearningtoepassingen, waaronder aanbevelingssystemen, beeldherkenning en natural language processing.

An image showing different type of non-relational databases with title "Vectors need a new kind of database"

Vectors hebben een nieuw type database nodig—afbeelding bron.

Traditionele relationele databases hebben moeite met hoog-dimensionale data en het efficiënt uitvoeren van gelijkeniszoekopdrachten. Vectordatabases daarentegen zijn specifiek geoptimaliseerd voor deze taken, waardoor snelle en nauwkeurige gegevensopvraging op basis van vectornabijheid of -gelijkenis mogelijk is. 

Deze aanpak maakt zoekopdrachten mogelijk op basis van semantische of contextuele relevantie, wat betekenisvollere resultaten oplevert dan de exacte-matchzoekopdrachten van conventionele databases.

Een vectordatabase kan bijvoorbeeld:

  • Zoeken naar nummers die qua melodie en ritme aansluiten op een bepaalde tune.
  • Artikelen vinden die qua thema en invalshoek overeenkomen met een specifiek ander artikel.
  • Gadgets identificeren die de kenmerken en reviews van een bepaald apparaat weerspiegelen.

Hoe wordt ongestructureerde data zoals tekst of afbeeldingen dan omgezet in getallen? Het antwoord is embeddings.

Embedding is een proces waarbij ongestructureerde data wordt omgezet in numerieke vectors met vaste grootte, die de onderliggende semantiek en relaties in de data vastleggen. Dit gebeurt met grote neurale netwerken die leren om de data weer te geven in een continue vectorruimte, waarin vergelijkbare items dichter bij elkaar liggen.

An image showing How does vector databases work

Hoe werkt een vectordatabase? Afbeelding bron.

pgvector gebruiken: stap voor stap

In dit gedeelte lopen we door het opzetten van pgvector, het gebruik van de basisfeatures en bouwen we een eenvoudige applicatie door het te integreren met OpenAI.

We behandelen installatie, basis­operaties, indexering en integratie met Python en LangChain.

1. Vereisten

Om deze tutorial te volgen, heb je basiskennis van SQL en PostgreSQL nodig en ben je vertrouwd met programmeren in Python.

Zorg voordat we beginnen dat je het volgende hebt:

  • PostgreSQL 11 of hoger geïnstalleerd op je systeem
  • Python 3.7 of hoger (voor het integratiegedeelte)
  • Een OpenAI API-sleutel (voor de semantische zoekapplicatie)

2. Hoe installeer je pgvector

1. Zorg eerst dat je de PostgreSQL-ontwikkelbestanden hebt geïnstalleerd. Op Ubuntu of Debian kun je ze installeren met:

sudo apt-get install postgresql-server-dev-all

Als je Windows gebruikt, kun je de PostgreSQL-installer downloaden van de officiële website.

2. Clone de pgvector GitHub-repository:

git clone https://github.com/pgvector/pgvector.git

3. Bouw en installeer de pgvector-extensie:

cd pgvector
make
sudo make install

Als je Windows gebruikt, zorg dan dat C++-ondersteuning in Visual Studio Code is geïnstalleerd. De officiële installatiedocumentatie biedt een stappenplan.

4. Verbind met je PostgreSQL-database:

Je hebt meerdere opties om verbinding te maken en met de PostgreSQL-database te werken: pgAdmin is een van de meest gebruikte interfaces. Je kunt ook pSQL (de PostgreSQL-commandline-interface) gebruiken of zelfs een VS Code-extensie voor PostgreSQL.

5. Maak na het verbinden met je PostgreSQL-database de extensie aan:

CREATE EXTENSION vector;

the pgvector pgAdmin interface

pgAdmin-interface

3. Basisgebruik van pgvector

Nu we pgvector hebben geïnstalleerd, gaan we het basisgebruik verkennen.

1. Om onze eerste vectordatabase in PostgreSQL met de pgvector-extensie op te zetten, maken we een tabel om onze vectordata op te slaan:

CREATE TABLE items (
  id SERIAL PRIMARY KEY,
  embedding vector(3)
);

Dit maakt een tabel items met een id-kolom en een embedding-kolom van het type vector(3), die 3-dimensionale vectors opslaat.

2. Laten we nu wat data in onze tabel invoegen:

INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[1,1,1]');

3. Nu kunnen we vectorbewerkingen uitvoeren. Bijvoorbeeld, om de dichtstbijzijnde buur te vinden van de vector [2,3,4]:

SELECT * FROM items ORDER BY embedding <-> '[2,3,4]' LIMIT 1;

Deze query gebruikt de <->-operator, die de Euclidische afstand tussen vectors berekent.

4. We kunnen ook andere afstandsmaatstaven gebruiken, zoals cosine-afstand:

SELECT * FROM items ORDER BY embedding <=> '[2,3,4]' LIMIT 1;

De <=>-operator berekent de cosine-afstand tussen vectors.

4. Vectordata indexeren met pgvector

Indexeren in vectordatabases, waaronder pgvector, is nodig om de zoekprestaties te verbeteren, vooral naarmate je dataset groeit.

Het belang van indexeren kan niet worden overschat, want het biedt verschillende voordelen:

  • Ten eerste verbetert het de snelheid aanzienlijk. Zonder index vereist elke gelijkeniszoekopdracht een volledige tabelscan, waarbij de queryvector met elke vector in de database wordt vergeleken. Dit kost steeds meer tijd naarmate je data groeit. Indexen creëren een structuur die veel snellere zoekopdrachten mogelijk maakt. 
  • Ten tweede verhoogt indexeren de schaalbaarheid, waardoor je database grotere datasets efficiënt kan verwerken. Terwijl je meer vectors toevoegt, behouden goed geïndexeerde zoekopdrachten hun prestaties. 
  • Ten derde draagt indexeren bij aan een efficiënter gebruik van resources door CPU- en I/O-belasting tijdens zoekopdrachten te verlagen. Dit is vooral belangrijk voor drukbezette systemen of systemen met beperkte resources, zodat alles soepel blijft draaien, zelfs onder zware belasting.

Er zijn twee types indexen beschikbaar voor pgvector: ivfflat en hnsw. Ze dienen elk een ander doel:

  • IVFFlat (Inverted File Flat) index:
    • Geschikt voor exacte nearest neighbor-zoekopdrachten
    • Deelt de vectorruimte op in clusters, wat zoekopdrachten versnelt door eerst relevante clusters te bepalen
    • Goede balans tussen zoeksnelheid en nauwkeurigheid
  • HNSW (Hierarchical Navigable Small World) index:
    • Ontworpen voor benaderende nearest neighbor-zoekopdrachten
    • Maakt een graafstructuur voor snelle navigatie tussen vectors
    • Uiterst snel, maar kan soms de absoluut dichtstbijzijnde buur missen

Wanneer gebruik je welke index:

  • Gebruik IVFFlat wanneer je exacte resultaten nodig hebt en iets langzamere zoekopdrachten kunt tolereren
  • Gebruik HNSW wanneer je snelle zoekopdrachten nodig hebt en kleine onnauwkeurigheden accepteerbaar zijn

1. Laten we een ivfflat-index maken:

CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

Dit maakt een index met het IVFFlat-algoritme, geschikt voor exacte nearest neighbor-zoekopdrachten.

2. Voor benaderende nearest neighbor-zoekopdrachten kunnen we de hnsw-index gebruiken:

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);

Na het aanmaken van een index zullen onze queries deze automatisch gebruiken wanneer dat passend is.

5. pgvector-integratie met andere tools

Pgvector ondersteunt integratie met een aantal frameworks, wat de interactie met onze vectordatabase makkelijker maakt. Laten we er twee handige bespreken: Python en LangChain.

pgvector gebruiken met Python

pgvector kan eenvoudig met Python worden geïntegreerd met de psycopg2-bibliotheek. Laten we een Python-omgeving opzetten en enkele basisbewerkingen uitvoeren.

1. Installeer eerst de vereiste bibliotheken:

!pip install psycopg2-binary numpy

2. Maak nu een Python-script om met onze vectordatabase te communiceren:

import psycopg2
import numpy as np

# Connect to the database
conn = psycopg2.connect("dbname=your_database user=your_username")
cur = conn.cursor()

# Insert a vector
embedding = np.array([1.5, 2.5, 3.5])
cur.execute("INSERT INTO items (embedding) VALUES (%s)", (embedding.tolist(),))

# Perform a similarity search
query_vector = np.array([2, 3, 4])
cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector.tolist(),))
result = cur.fetchone()
print(f"Nearest neighbor: {result}")

conn.commit()
cur.close()
conn.close()

Dit script laat zien hoe je een vector invoegt en een gelijkeniszoekopdracht uitvoert met Python.

pgvector gebruiken met LangChain

pgvector kan ook worden geïntegreerd met LangChain, een populair framework voor het ontwikkelen van applicaties met large language models. 

Hier is een eenvoudig voorbeeld van het gebruik van pgvector als vector store in LangChain:

from langchain_postgres.vectorstores import PGVector
from langchain.embeddings.openai import OpenAIEmbeddings

# Set up the connection string and embedding function
connection_string = "postgresql://user:pass@localhost:5432/db_name"
embedding_function = OpenAIEmbeddings()

# Create a PGVector instance
vector_store = PGVector.from_documents(
    documents,
    embedding_function,
    connection_string=connection_string
)

# Perform a similarity search
query = "Your query here"
results = vector_store.similarity_search(query)

Dit voorbeeld gaat ervan uit dat je OpenAI-embeddings hebt ingesteld en een lijst met documenten hebt om te embedden.

6. Een voorbeeldapplicatie bouwen met pgvector en OpenAI

Laten we nu een eenvoudige semantische zoekmachine bouwen met pgvector en OpenAI-embeddings!

Met deze applicatie kunnen gebruikers door een collectie tekstdocumenten zoeken met natuurlijke taalqueries.

import openai
import psycopg2
import numpy as np

# Set up OpenAI API (replace with your actual API key)
openai.api_key = "your_openai_api_key"

# Connect to the database
conn = psycopg2.connect("dbname=your_database user=your_username")
cur = conn.cursor()

# Create a table for our documents
cur.execute("""
    CREATE TABLE IF NOT EXISTS documents (
        id SERIAL PRIMARY KEY,
        content TEXT,
        embedding vector(1536)
    )
""")

# Function to get embeddings from OpenAI
def get_embedding(text):
    response = openai.embeddings.create(input=text, model="text-embedding-ada-002")
    return response['data'][0]['embedding']

# Function to add a document
def add_document(content):
    embedding = get_embedding(content)
    cur.execute("INSERT INTO documents (content, embedding) VALUES (%s, %s)", (content, embedding))
    conn.commit()

# Function to search for similar documents
def search_documents(query, limit=5):
    query_embedding = get_embedding(query)
    cur.execute("""
        SELECT content, embedding <-> %s AS distance
        FROM documents
        ORDER BY distance
        LIMIT %s
    """, (query_embedding, limit))
    return cur.fetchall()

# Add some sample documents
sample_docs = [
    "The quick brown fox jumps over the lazy dog.",
    "Python is a high-level programming language.",
    "Vector databases are essential for modern AI applications.",
    "PostgreSQL is a powerful open-source relational database.",
]
for doc in sample_docs:
    add_document(doc)

# Perform a search
search_query = "Tell me about programming languages"
results = search_documents(search_query)
print(f"Search results for: '{search_query}'")
for i, (content, distance) in enumerate(results, 1):
    print(f"{i}. {content} (Distance: {distance:.4f})")

# Clean up
cur.close()
conn.close()

Deze eenvoudige applicatie laat zien hoe je pgvector gebruikt om een semantische zoekmachine te maken.

Hij embedt documenten met het text embedding-model van OpenAI en slaat ze op in een PostgreSQL-database met pgvector. De zoekfunctie vindt de meest vergelijkbare documenten bij een gegeven query met behulp van cosine similarity.

pgvector optimaliseren voor veel verkeer

Je wilt pgvector optimaliseren naarmate je applicatie schaalt. Hier zijn enkele suggesties op hoofdlijnen:

Connection pooling

Implementeer connection pooling om overhead te verminderen. Gebruik PgBouncer of PgPool-II. Deze tools zijn handig omdat ze herbruikbare databaseverbindingen in stand houden. 

Query-performantietuning

Pas indexparameters tijdens runtime aan. Je kunt snelheid en nauwkeurigheid balanceren op basis van je behoeften.

  • Voor IVFFlat-indexen stel je de parameter probes in. Gebruik 1–5 voor snelheid. Gebruik 10–20 voor gebalanceerde performance.

  • Voor HNSW-indexen tune je ef_search. Gebruik 20–40 voor snelheid. Gebruik 100–200 voor nauwkeurigheid.

Je kunt ook EXPLAIN ANALYZE gebruiken om indexgebruik te verifiëren. Voeg altijd LIMIT-clausules toe aan queries.

Caching

Implementeer caching met Redis of Memcached. Cache vectors waar vaak naar wordt gevraagd. Gebruik de queryvector als cachekey. Stel geschikte vervaltijden in. 

Read-replica’s

Stel PostgreSQL read-replica’s in voor leesintensieve workloads. Leid writes naar de primaire database. Leid vectorzoekopdrachten naar replica’s. Gebruik load balancers voor automatische verdeling. 

PostgreSQL-configuratie

Stel belangrijke parameters af voor vectorworkloads:

  • shared_buffers: Stel in op 25% van het totale RAM

  • work_mem: Stel in op 64–128 MB voor vectorbewerkingen

  • random_page_cost: Lager instellen voor SSD-opslag

  • effective_cache_size: Stel in op 50–75% van het totale RAM

Indexonderhoud

Bouw indexen periodiek opnieuw op tijdens daluren. Voer VACUUM en ANALYZE uit. Schakel autovacuum in voor geautomatiseerd onderhoud. 

Monitoring

Volg querylatency en queries per seconde. Monitor de benutting van de connection pool. Controleer cache-hitratio’s. Houd resourcegebruik in de gaten. Stel alerts in voor performanceproblemen. Schakel pg_stat_statements in om trage queries te identificeren.

pgvector en alternatieven

Laten we pgvector nu vergelijken met andere populaire vectordatabases. Deze vergelijking helpt je de verschillen te begrijpen in features, implementatieopties, schaalbaarheid, integratie en kosten tussen pgvector en andere oplossingen op de markt.

pgvector vs. Pinecone

Pinecone is een volledig beheerde vectordatabase die is ontworpen voor hoge schaalbaarheid en gebruiksgemak.

Feature

pgvector

Pinecone

Databasetype

Extensie voor PostgreSQL

Volledig beheerde vectordatabase

Implementatie

Self-hosted

Cloudgebaseerd

Schaalbaarheid

Beperkt door PostgreSQL

Zeer schaalbaar

Integratie

Werkt met bestaande PostgreSQL-stack 

Vereist aparte integratie

Kosten

Gratis, open-source

Pay-as-you-go-prijzen

pgvector is een uitstekende keuze voor wie de bestaande PostgreSQL-infrastructuur wil benutten zonder extra kosten. Tegelijkertijd biedt Pinecone een zeer schaalbare, beheerde oplossing met pay-as-you-go-prijzen voor gebruiksgemak.

pgvector vs. Milvus

Milvus is een dedicated vectordatabase met geavanceerde features en hoge schaalbaarheid.

Feature

pgvector

Milvus

Databasetype

Extensie voor PostgreSQL

Dedicated vectordatabase

Implementatie

Self-hosted

Self-hosted of cloud

Schaalbaarheid

Beperkt door PostgreSQL

Zeer schaalbaar

Integratie

Werkt met bestaande PostgreSQL-stack

Vereist aparte integratie

Featureset

Basale vectorbewerkingen

Geavanceerde features zoals dynamisch schema

Waar pgvector basale vectorbewerkingen biedt binnen de vertrouwde PostgreSQL-omgeving, levert Milvus een uitgebreidere en schaalbaardere oplossing die specifiek is bedoeld voor grootschalige vectordata.

pgvector vs. Weaviate

Weaviate is een vectordatabase met geïntegreerde objectopslag, met flexibel datamodel en schaalbaarheid.

Feature

pgvector

Weaviate

Databasetype

Extensie voor PostgreSQL

Vectordatabase met objectopslag

Implementatie

Self-hosted

Self-hosted of cloud

Schaalbaarheid

Beperkt door PostgreSQL

Ontworpen voor schaalbaarheid

Integratie

Werkt met bestaande PostgreSQL-stack

Vereist aparte integratie

Datamodel

Alleen vectors

Objecten met vectors en eigenschappen

De eenvoud van pgvector en de integratie met PostgreSQL maken het geschikt voor bestaande gebruikers die basisfunctionaliteit voor vectors nodig hebben. Weaviate’s geavanceerdere datamodel en schaalbaarheid zijn daarentegen geschikt voor complexe applicaties die naast vectors ook objectopslag vereisen.

Conclusie

pgvector brengt krachtige mogelijkheden voor gelijkeniszoekopdrachten met vectors naar PostgreSQL, waardoor het een uitstekende keuze is voor developers die AI-features willen toevoegen aan hun bestaande PostgreSQL-gebaseerde applicaties. 

In deze tutorial hebben we installatie, basisgebruik, indexeringsmogelijkheden en integratie met Python en LangChain verkend.

Hoewel pgvector niet dezelfde schaalbaarheid en gespecialiseerde features biedt als dedicated vectordatabases zoals Pinecone of Milvus, maakt de naadloze integratie met PostgreSQL het voor veel use cases een aantrekkelijke optie. 

Het is vooral geschikt voor projecten die al PostgreSQL gebruiken en vector search-functionaliteit willen toevoegen zonder een nieuw databasesysteem te introduceren.

We moedigen je aan om pgvector in je eigen projecten te proberen. Of je nu een aanbevelingssysteem bouwt, een semantische zoekmachine of een andere applicatie die gelijkeniszoekopdrachten vereist, pgvector kan een waardevolle tool zijn in je data science-toolkit.

Voor verdere verdieping, bekijk onze cursussen:

pgvector FAQ

Moet ik mijn hele database omzetten om pgvector te gebruiken?

Nee, het is een add-on voor je bestaande PostgreSQL-database.

Kan ik pgvector gebruiken met andere talen dan Python?

Ja, met elke taal die een PostgreSQL-adapter heeft.

Hoe kan ik de prestaties van pgvector-queries monitoren?

Je kunt de ingebouwde tools van PostgreSQL gebruiken, zoals EXPLAIN en ANALYZE om de queryprestaties te monitoren. Daarnaast kunnen logging- en monitoring­extensies zoals pg_stat_statements inzicht geven in queryprestaties en helpen bij het identificeren van knelpunten.

Is het mogelijk om vector search te combineren met traditionele SQL-queries?

Ja, pgvector laat je vector search combineren met traditionele SQL-queries. Je kunt vector­gelijkenis­bewerkingen opnemen in je SQL-queries naast andere voorwaarden, zodat je complexe zoekopdrachten kunt maken die zowel vector- als relationele data benutten.

Kan pgvector worden gebruikt met andere machinelearningframeworks dan OpenAI?

Ja, pgvector kan worden geïntegreerd met diverse machinelearningframeworks en -bibliotheken. Je kunt embeddings genereren met modellen uit frameworks zoals TensorFlow, PyTorch of Hugging Face, en deze embeddings opslaan en bevragen met pgvector in PostgreSQL.

Hoe ga ik om met versie-upgrades van pgvector?

Volg bij het upgraden van pgvector de officiële upgrade-instructies in de pgvector-documentatie. Maak een back-up van je data voordat je een upgrade uitvoert. Test na het upgraden je applicatie grondig om compatibiliteit en prestaties te waarborgen.

Kan pgvector efficiënt omgaan met hoog-dimensionale vectors?

Hoewel pgvector hoog-dimensionale vectors aankan, kan de performance beperkt worden door de capaciteiten van PostgreSQL. Voor zeer hoog-dimensionale data kun je je PostgreSQL-setup optimaliseren of dedicated vectordatabases zoals Milvus of Pinecone overwegen.


Moez Ali's photo
Author
Moez Ali
LinkedIn
Twitter

Data scientist, oprichter en maker van PyCaret

Onderwerpen

Leer meer over machine learning en AI met deze cursussen!

Cursus

Generatieve AI-concepten

2 Hr
104.1K
Bekijk detailsRight Arrow
Begin met de cursus
Meer zienRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer zienMeer zien