PRODSoeverein Europees BaaS-platformOpen Dashboard →

Native AI · 9 min gelezen

HNSW-index in Postgres: indexbron voor zoeken naar vectoren

Affane Daylami · Fondateur · 6 april 2026

Terug naar blog

HNSW is het indexeringsalgoritme dat pgvector aanbeveelt voor het zoeken naar gelijkenisvectoren op Postgres. Deze handleiding laat zien hoe u een goed afgestemde HNSW-index kunt maken. Drie keuzes zijn van belang: het type kolom op basis van de grootte van uw inbedding, de m- en ef_construction-parameters bij de constructie, en ef_search bij elk verzoek om terugroepen en latentie te arbitreren.

Deze Engelse tekst is automatisch gegenereerd op basis van het Franse origineel en is nog niet beoordeeld.
Deze pagina is automatisch vertaald. De Engelse versie is gezaghebbend.

De native vectorzoekopdracht van Aurabase (RAG, pgvector, embeddings) is gebaseerd op hetzelfde indexeringsmechanisme, dat in detail wordt beschreven op de pagina Native AI op Postgres. Deze handleiding gaat uit van een Postgres-tabel waarin pgvector al is geïnstalleerd, een kolom van het type vectoren minstens een paar duizend rijen. Hieronder is een eenvoudige sequentiële scan vaak sneller dan een geschatte index.

De essentie

  • HNSW vereist geen trainingsfase, in tegenstelling tot IVFFlat: de index is opgebouwd over invoegingen, beschikbaar in pgvector sinds versie 0.5.0.
  • Twee parameters bepalen de kwaliteit van de index bij constructie: m (verbindingen per knooppunt, standaard 16) en ef_construction (zoekbreedte bij constructie, standaard 64).
  • Een derde parameter, hnsw.ef_search (pgvector standaard: 40), wordt voor elk verzoek aangepast, zonder de index opnieuw op te bouwen, om het terugroepen en de latentie te arbitreren.
  • pgvector caps HNSW-indexering van type vector tot 2000 afmetingen. Buiten dat (bijvoorbeeld een inbedding met 3072 dimensies) is een cast naar halfvec nodig om te indexeren.
  • pgvector 0.8.6 is de versie die is ingebed in de Aurabase Postgres-tenantimage, rechtstreeks geverifieerd in het Dockerfile op 24 augustus 2026.
#
Begrijp het

Wat is een HNSW-index in pgvector?

HNSW staat voor Hiërarchisch Navigeerbare Kleine Wereld. Het is een grafiekindex: elke vector wordt een knooppunt dat is verbonden met zijn dichtstbijzijnde buren, georganiseerd in verschillende over elkaar heen liggende lagen. Een zoekopdracht begint bovenaan de grafiek, op de dunste laag, en gaat vervolgens laag voor laag naar de meest relevante buren. De zoektijd wordt dus bijna logaritmisch en niet lineair over het aantal regels.

IVFFlat, de andere index van pgvector, werkt anders: het verdeelt de vectorruimte in lijsten die worden bepaald door een trainingspas op een bestaand monster, voordat het iets kan indexeren. HNSW heeft deze beperking niet; elke invoeging verrijkt de grafiek direct, waardoor het eenvoudiger wordt om te werken op een tafel die voortdurend groeit. Aan de andere kant verbruikt een HNSW-index meer geheugen en kost het meer tijd om te bouwen dan een gelijkwaardige IVFFlat op hetzelfde volume.

pgvector introduceert HNSW-ondersteuning in versie 0.5.0. Latere versies voegen nuttige mogelijkheden toe aan deze handleiding: het type halfvec (0.7.0) om verder dan 2000 dimensies te indexeren, en de parameter hnsw.iterative_scan (0.8.0) om het terugroepen van gefilterde query's te verbeteren. Als u pgvector vergelijkt met een speciale vectorbasis voordat u een beslissing neemt, beschrijft onze vergelijking pgvector versus Pinecone, Weaviate en Qdrant de afwegingen.

#
Stap 1

Controleer uw versie van pgvector voordat u de index maakt

Bevestig eerst welke versie van pgvector is geïnstalleerd. Een extensie die te oud is, zorgt ervoor dat sommige functies in deze handleiding stilzwijgend mislukken, met name halfvec en hnsw.iterative_scan.

psqlsql
SELECT extversion FROM pg_extension WHERE extname = 'vector';

HNSW bestaat sinds pgvector 0.5.0. Voor het type halfvec, nodig om inbeddingsvormen groter dan 2000 dimensies te indexeren, is minimaal versie 0.7.0 vereist. De parameter hnsw.iterative_scan vraagt ​​om versie 0.8.0.

Bij Aurabase-projecten doet de vraag zich niet voor: de Postgres-image sluit pgvector 0.8.6 in, zowel op het gedeelde Postgres-cluster (docker/Postgres.Dockerfile, rechtstreeks gebouwd op pgvector/pgvector:0.8.6-pg16-bookworm) als op de Postgres 16 CNPG-instanties die per project zijn toegewezen (docker/Postgres.CNPG.Dockerfile, die pgvector 0.8.6 overneemt van de officiële CloudNativePG-image). Geverifieerd in beide Dockerfiles op 24 augustus 2026.

#
Stap 2

Kies het juiste type kolom op basis van de grootte van uw insluitingen

Het kolomtype is afhankelijk van de grootte van uw insluitingen, en niet alleen van het model dat ze genereert. pgvector slaat een klassieke vector op in het type vector, met een maximum van 16.000 dimensies in opslag. Maar HNSW-indexering op dit type is beperkt tot 2000 dimensies: daarbuiten mislukt CREATE INDEX.

Veelgebruikte insluitingsmodellen overschrijden deze drempel vaak: text-embedding-3-large van OpenAI of gemini-embedding-2 van Google produceren native maximaal 3072 dimensies. Om deze vectoren met HNSW te indexeren, cast u de kolom naar halfvec (opslagprecisie gehalveerd), waardoor de indexeringslimiet ruim boven de 2000 dimensies ligt.

AfmetingenKolomHNSW op vectorVereist casten
768embedding_768JaNee
1536inbedding_1536JaNee
3072inbedding_3072Nee (> 2000 dimmen)Ja, cast::halfvec(3072)

De Aurabase RAG-engine illustreert dit compromis in de productie: er worden drie dimensieklassen ondersteund (768, 1536, 3072), opgeslagen in drie afzonderlijke kolommen van dezelfde embeddings-tabel. Kolommen 768 en 1536 worden rechtstreeks in HNSW geïndexeerd op het type vector. Kolom 3072 wordt geïndexeerd via een ::halfvec(3072)-cast, precies om de dimensielimiet van 2000 te omzeilen.

migration.sqlsql
CREATE INDEX idx_embeddings_vec_768 ON embeddings
  USING hnsw (embedding_768 vector_cosine_ops)
  WHERE embedding_768 IS NOT NULL;

CREATE INDEX idx_embeddings_vec_1536 ON embeddings
  USING hnsw (embedding_1536 vector_cosine_ops)
  WHERE embedding_1536 IS NOT NULL;

CREATE INDEX idx_embeddings_vec_3072 ON embeddings
  USING hnsw ((embedding_3072::halfvec(3072)) halfvec_cosine_ops)
  WHERE embedding_3072 IS NOT NULL;

Voor details over opname (chunking, aanroep van de insluitingsprovider, invoeging), zie de RAG-pijplijntutorial op pgvector.

#
Stap 3

Maak de index met de parameters m en ef_construction

De minimale syntaxis is voldoende voor een eerste index, met de standaardwaarden van pgvector.

psqlsql
CREATE INDEX ON items
  USING hnsw (embedding vector_cosine_ops);

pgvector past vervolgens m = 16 en ef_construction = 64toe. Om deze waarden expliciet aan te passen, gebruik je de WITH-clausule:

psqlsql
CREATE INDEX ON items
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 24, ef_construction = 100);
Versnel een grote constructie

Voordat u een HNSW-index op een grote tafel bouwt, verhoogt u tijdelijk maintenance_work_mem voor de sessie: dit is, volgens de pgvector-documentatie zelf, de meest directe hefboom om de bouwtijd te verkorten.

Wat verandert de parameter m?

m stelt het maximale aantal verbindingen in dat elk knooppunt in de grafiek per laag onderhoudt. Een hogere waarde verdicht de grafiek: de herinnering neemt toe, maar het verbruikte geheugen en de bouwtijd nemen ook toe, ongeveer lineair. De standaardinstelling (16) is geschikt voor de meeste gevallen. Een stijging naar 24 of 32 is vooral gerechtvaardigd bij grote inbedding, waar het onderscheid tussen nabije en verre buren kleiner wordt.

Wat verandert ef_construction?

ef_construction stelt de grootte in van de kandidatenlijst die wordt onderzocht tijdens de indexconstructie, voor elk ingevoegd knooppunt. Een hogere waarde verbetert de kwaliteit van de uiteindelijke grafiek, en dus de potentiële terugroepactie, ten koste van een langere bouwtijd. In tegenstelling tot mbrengt deze parameter geen kosten met zich mee op het moment van de query: het is een eenmalige investering, die slechts één keer wordt betaald wanneer de index wordt gemaakt.

Gedeeltelijke indexen voor verschillende dimensieklassen in dezelfde tabel

Wanneer een tabel meerdere vectorkolommen opslaat (één per dimensieklasse, zoals Aurabase doet), indexeer dan elke kolom afzonderlijk met een WHERE colonne IS NOT NULL-clausule. Deze gedeeltelijke index vermijdt het indexeren van lege regels voor klassen die niet door een bepaalde regel worden gebruikt, waardoor de omvang van de index wordt verkleind en de constructie ervan wordt versneld zonder dat dit iets kost bij het terugroepen.

De keuze van de operatorklasse (vector_cosine_ops, vector_l2_ops of vector_ip_ops) moet overeenkomen met de metriek waarop het insluitingsmodel is getraind. De meest recente modellen voor het insluiten van tekst zijn getraind op cosinusovereenkomst: vector_cosine_ops (of halfvec_cosine_ops op een cast-kolom) is daarom de veiligste standaardkeuze.

#
Stap 4

Stel ef_search in op het moment van de zoekopdracht

ef_search wordt ingesteld voor elke query, niet wanneer de index wordt gebouwd. Het bepaalt de omvang van de lijst met kandidaten die tijdens de zoekopdracht worden onderzocht: hoe hoger deze is, hoe beter de terugroepactie, ten koste van een langere latentie. pgvector stelt de standaardwaarde in op 40.

psqlsql
SET LOCAL hnsw.ef_search = 100;

SELECT id, content
FROM embeddings
ORDER BY embedding <=> '[...]'::vector
LIMIT 10;

40 is zelden genoeg zodra een zoekopdracht vectorzoekopdrachten combineert met een WHERE-filter dat wordt toegepast na het scannen van de index (op een naamruimte, een tenant of een ander metadatacriterium). De HNSW-scan brengt ef_search onbewerkte kandidaten terug, waarna het filter een deel ervan verwijdert. Als er te weinig kandidaten overleven, wordt de laatste LIMIT onderbezet.

De Aurabase RAG-engine breidt daarom ef_search dynamisch uit volgens de gevraagde top_k, in plaats van de vaste waarde van 40 te behouden: ef = max(top_k × 4, 64). Een zoekopdracht naar de 5 dichtstbijzijnde resultaten gebruikt ef_search = 64; een zoekopdracht naar de top 50 gebruikt ef_search = 200. Deze formule blijft per omgevingsvariabele aanpasbaar voor implementaties waarvoor een andere afweging tussen terugroeping en latentie nodig is.

pgvector 0.8 voegt een tweede hefboom toe voor hetzelfde probleem: hnsw.iterative_scan. In de modus strict_order of relaxed_orderbreidt de zoekopdracht de zoekopdracht geleidelijk uit totdat na het filteren voldoende resultaten worden verzameld, in plaats van te stoppen bij een vaste lijst met kandidaten. Aurabase activeert het standaard in strict_order, maar beschermt de oproep in een savepoint. Op een versie van pgvector vóór 0.8, waar deze parameter niet bestaat, wordt de query voortgezet in een gedegradeerde modus in plaats van te mislukken.

#
Ga verder

Bouw de volledige RAG-pijplijn

Deze HNSW-index is slechts een onderdeel van de volledige RAG-pijplijn: chunking, genereren van inbedden, opname en vervolgens zoeken. Onze stapsgewijze zelfstudie bouwt deze pijplijn end-to-end op pgvector, vanaf de eerste invoeging tot aan de gelijkenisquery. De technische documentatie beschrijft ook alle native AI-mogelijkheden van Aurabase, gebouwd op Postgres.

#
Veelgestelde vragen

Veelgestelde vragen

HNSW of IVFFlat: welke kies je met pgvector?+
HNSW is geschikt voor de overgrote meerderheid van vectorzoekgevallen in productie: betere herinnering met gelijke latentie, geen voorafgaande trainingsfase en goede tolerantie voor tabellen die voortdurend groeien. IVFFlat blijft relevant wanneer het beschikbare geheugen zeer beperkt is, ten koste van een doorgaans lagere terugroepactie en noodzakelijke herscholing als de gegevensdistributie aanzienlijk verandert.
Hoeveel geheugen moet u plannen voor een HNSW-index?+
De orde van grootte hangt rechtstreeks af van m en het aantal geïndexeerde vectoren: elk knooppunt slaat maximaal m verbindingen per laag op, naast de vector zelf. Voor een betrouwbare schatting van uw werkelijke volume bouwt u de index op op een representatieve subset van uw gegevens. Meet vervolgens de grootte ervan met pg_relation_size() in plaats van te vertrouwen op een niet-gemeten vuistregel.
Kunnen we inbedding van meer dan 2000 dimensies indexeren met HNSW?+
Niet rechtstreeks op het vectortype: pgvector weigert een HNSW-index op te bouwen die verder gaat dan 2000 dimensies op dit type. De oplossing is om de kolom naar halfvec te casten op het moment dat de index wordt gemaakt, waardoor de indexeringslimiet wordt verlegd door de opslagprecisie te halveren. Dit is precies de aanpak die wordt gebruikt bij de productie van de 3072-dimensionale inbeddingsklasse van Aurabase.

KLAAR VOOR IMPLEMENTATIE?

Uw backend in vijf minuten.

Geen creditcard vereist · 500 MB gratis · 50.000 MAU