PRODSouveräne europäische BaaS-PlattformÖffnen Sie das Dashboard →

Native KI · 9 Min. Lesezeit

HNSW-Index in Postgres: Indexbrunnen für die Vektorsuche

Affane Daylami · Fondateur · 6. April 2026

Zurück zum Blog

HNSW ist der Indexierungsalgorithmus, den pgvector für die Suche nach Ähnlichkeitsvektoren in Postgres empfiehlt. In dieser Anleitung wird gezeigt, wie Sie einen ordnungsgemäß abgestimmten HNSW-Index erstellen. Drei Auswahlmöglichkeiten sind wichtig: der Spaltentyp entsprechend der Größe Ihrer Einbettungen, die m- und ef_construction-Parameter bei der Erstellung und ef_search bei jeder Anfrage, um Rückruf und Latenz zu bestimmen.

Dieser englische Text wurde automatisch aus dem französischen Original generiert und wurde noch nicht überprüft.
Diese Seite wurde automatisch übersetzt. Maßgeblich ist die englische Version.

Die native Vektorsuche von Aurabase (RAG, pgvector, Einbettungen) basiert auf demselben Indexierungsmechanismus, der ausführlich auf der Seite Native AI auf Postgresbeschrieben wird. In dieser Anleitung wird von einer Postgres-Tabelle mit bereits installiertem pgvector, einer Spalte vom Typ vectorund mindestens einigen tausend Zeilen ausgegangen. Im Folgenden ist ein einfacher sequenzieller Scan häufig schneller als ein ungefährer Index.

Das Wesentliche

  • HNSW erfordert im Gegensatz zu IVFFlat keine Trainingsphase: Der Index wird über Einfügungen erstellt und ist seit Version 0.5.0 in pgvector verfügbar.
  • Zwei Parameter legen die Qualität des Index bei der Erstellung fest: m (Verbindungen pro Knoten, Standard 16) und ef_construction (Suchbreite bei der Erstellung, Standard 64).
  • Ein dritter Parameter, hnsw.ef_search (pgvector-Standard: 40), wird für jede Anfrage angepasst, ohne den Index neu zu erstellen, um Rückruf und Latenz zu vermitteln.
  • pgvector begrenzt die HNSW-Indizierung vom Typ vector auf 2000 Dimensionen. Darüber hinaus (z. B. eine Einbettung mit 3072-Dimensionen) ist zur Indizierung eine Umwandlung in halfvec erforderlich.
  • pgvector 0.8.6 ist die im Aurabase Postgres-Mandanten-Image eingebettete Version, die am 24. August 2026 direkt im Dockerfile verifiziert wurde.
#
Verstehe

Was ist ein HNSW-Index in pgvector?

HNSW steht für Hierarchical Navigable Small World. Es handelt sich um einen Diagrammindex: Jeder Vektor wird zu einem Knoten, der mit seinen nächsten Nachbarn verbunden ist und in mehreren übereinander liegenden Schichten organisiert ist. Eine Suche beginnt oben im Diagramm auf der dünnsten Ebene und geht dann Schicht für Schicht nach unten zu den relevantesten Nachbarn. Die Suchzeit wird somit nahezu logarithmisch und nicht linear über die Anzahl der Zeilen.

IVFFlat, der andere Index von pgvector, funktioniert anders: Er unterteilt den Vektorraum in Listen, die durch einen Trainingsdurchlauf an einer vorhandenen Stichprobe bestimmt werden, bevor er irgendetwas indizieren kann. Bei HNSW gibt es diese Einschränkung nicht. Jede Einfügung bereichert das Diagramm direkt, was die Arbeit an einer kontinuierlich wachsenden Tabelle vereinfacht. Andererseits verbraucht ein HNSW-Index mehr Speicher und benötigt mehr Zeit für die Erstellung als ein gleichwertiger IVFFlat auf demselben Volume.

pgvector führt HNSW-Unterstützung in Version 0.5.0 ein. Spätere Versionen fügen diesem Handbuch nützliche Funktionen hinzu: den Typ halfvec (0.7.0) zur Indizierung über 2000 Dimensionen hinaus und den Parameter hnsw.iterative_scan (0.8.0) zur Verbesserung des Abrufs bei gefilterten Abfragen. Wenn Sie pgvector mit einer dedizierten Vektorbasis vergleichen, bevor Sie sich entscheiden, finden Sie in unserem -Vergleich pgvector vs. Pinecone, Weaviate und Qdrant Einzelheiten zu den Kompromissen.

#
Schritt 1

Überprüfen Sie Ihre Version von pgvector, bevor Sie den Index erstellen

Bestätigen Sie zuerst die installierte Version von pgvector. Eine zu alte Erweiterung führt dazu, dass einige Funktionen in diesem Handbuch stillschweigend fehlschlagen, insbesondere halfvec und hnsw.iterative_scan.

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

HNSW existiert seit pgvector 0.5.0. Der Typ halfvec, der zum Indizieren von Einbettungen über 2000 Dimensionen hinaus erforderlich ist, erfordert mindestens Version 0.7.0. Der Parameter hnsw.iterative_scan fordert Version 0.8.0 an.

Bei Aurabase-Projekten stellt sich die Frage nicht: Das Postgres-Image bettet pgvector 0.8.6 ein, sowohl im gemeinsam genutzten Postgres-Cluster (docker/Postgres.Dockerfile, direkt auf pgvector/pgvector:0.8.6-pg16-bookwormaufgebaut) als auch auf den 16 CNPG-Instanzen von Postgres, die pro Projekt dediziert sind (docker/Postgres.CNPG.Dockerfile, das pgvector 0.8.6 vom offiziellen CloudNativePG-Image erbt). Verifiziert in beiden Docker-Dateien am 24. August 2026.

#
Schritt 2

Wählen Sie den richtigen Spaltentyp entsprechend der Größe Ihrer Einbettungen

Der Spaltentyp hängt von der Größe Ihrer Einbettungen ab, nicht nur vom Modell, das sie generiert. pgvector speichert einen klassischen Vektor im Typ vectormit einer Speicherkapazität von maximal 16.000 Dimensionen. Die HNSW-Indizierung für diesen Typ ist jedoch auf 2000 Dimensionen beschränkt: Darüber hinaus schlägt CREATE INDEX fehl.

Gängige Einbettungsmodelle überschreiten diesen Schwellenwert häufig: text-embedding-3-large von OpenAI oder gemini-embedding-2 von Google erzeugen nativ bis zu 3072 Dimensionen. Um diese Vektoren mit HNSW zu indizieren, wandeln Sie die Spalte in halfvec um (Speichergenauigkeit halbiert), wodurch die Indizierungsgrenze weit über 2000 Dimensionen hinausgeht.

AbmessungenSpalteHNSW auf VektorErfordert Casting
768Einbettung_768JaNein
1536Einbettung_1536JaNein
3072Einbettung_3072Nein (> 2000 Dimmungen)Ja, cast::halfvec(3072)

Die Aurabase RAG-Engine veranschaulicht diesen Kompromiss in der Produktion: Drei Dimensionsklassen werden unterstützt (768, 1536, 3072), gespeichert in drei unterschiedlichen Spalten derselben embeddings-Tabelle. Die Spalten 768 und 1536 werden direkt in HNSW auf den Typ vectorindiziert. Spalte 3072 wird über eine ::halfvec(3072)-Umwandlung indiziert, genau um die 2000-Dimensionsbeschränkung zu umgehen.

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;

Einzelheiten zur Aufnahme (Chunking, Aufruf des Einbettungsanbieters, Einfügen) finden Sie im RAG-Pipeline-Tutorial zu pgvector.

#
Schritt 3

Erstellen Sie den Index mit den Parametern m und ef_construction

Für einen ersten Index reicht die minimale Syntax mit den Standardwerten von pgvector aus.

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

pgvector wendet dann m = 16 und ef_construction = 64an. Um diese Werte explizit anzupassen, verwenden Sie die WITH-Klausel:

psqlsql
CREATE INDEX ON items
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 24, ef_construction = 100);
Beschleunigen Sie eine große Konstruktion

Bevor Sie einen HNSW-Index für eine große Tabelle erstellen, erhöhen Sie vorübergehend maintenance_work_mem für die Sitzung: Dies ist laut der pgvector-Dokumentation selbst der direkteste Hebel, um die Erstellungszeit zu verkürzen.

Was ändert sich durch den Parameter m?

m legt die maximale Anzahl von Verbindungen fest, die jeder Knoten im Diagramm pro Schicht verwaltet. Ein höherer Wert verdichtet das Diagramm: Der Rückruf nimmt zu, aber auch der Speicherverbrauch und die Erstellungszeit nehmen annähernd linear zu. Der Standardwert (16) ist für die meisten Fälle geeignet. Eine Erhöhung auf 24 oder 32 ist insbesondere bei großen Einbettungen gerechtfertigt, wo die Unterscheidung zwischen nahen und entfernten Nachbarn feiner wird.

Was ändert sich durch ef_construction?

ef_construction legt die Größe der Kandidatenliste fest, die während der Indexerstellung für jeden eingefügten Knoten untersucht wird. Ein höherer Wert verbessert die Qualität des endgültigen Diagramms und damit den potenziellen Rückruf, allerdings auf Kosten einer längeren Erstellungszeit. Im Gegensatz zu mfallen für diesen Parameter zum Zeitpunkt der Abfrage keine Kosten an: Es handelt sich um eine einmalige Investition, die nur einmal bei der Indexerstellung bezahlt wird.

Teilindizes für mehrere Dimensionsklassen in derselben Tabelle

Wenn eine Tabelle mehrere Vektorspalten speichert (eine pro Dimensionsklasse, wie dies bei Aurabase der Fall ist), indizieren Sie jede Spalte separat mit einer WHERE colonne IS NOT NULL-Klausel. Dieser Teilindex vermeidet die Indizierung leerer Zeilen für Klassen, die nicht von einer bestimmten Zeile verwendet werden, wodurch die Größe des Index reduziert und seine Erstellung beschleunigt wird, ohne dass beim Abruf Kosten entstehen.

Die Auswahl der Operatorklasse (vector_cosine_ops, vector_l2_ops oder vector_ip_ops) muss der Metrik entsprechen, auf der das Einbettungsmodell trainiert wurde. Die meisten neueren Texteinbettungsmodelle sind auf Kosinusähnlichkeit trainiert: vector_cosine_ops (oder halfvec_cosine_ops in einer umgewandelten Spalte) ist daher die sicherste Standardwahl.

#
Schritt 4

Legen Sie ef_search zum Zeitpunkt der Abfrage fest

ef_search wird bei jeder Abfrage festgelegt, nicht beim Erstellen des Index. Es legt die Größe der Kandidatenliste fest, die während der Suche untersucht wird: Je höher sie ist, desto besser ist der Rückruf, allerdings auf Kosten einer längeren Latenz. pgvector setzt seinen Standardwert auf 40.

psqlsql
SET LOCAL hnsw.ef_search = 100;

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

40 reicht selten aus, sobald eine Abfrage die Vektorsuche mit einem WHERE-Filter kombiniert, der nach dem Scannen des Index angewendet wird (auf einen Namespace, einen Mandanten oder ein anderes Metadatenkriterium). Der HNSW-Scan bringt ef_search Rohkandidaten zurück, dann verwirft der Filter einen Teil davon. Wenn zu wenige Kandidaten überleben, ist das endgültige LIMIT am Ende unterfüllt.

Die Aurabase RAG-Engine erweitert daher ef_search dynamisch entsprechend dem angeforderten top_k, anstatt den festen Wert von 40 beizubehalten: ef = max(top_k × 4, 64). Eine Suche nach den 5 nächstgelegenen Ergebnissen verwendet ef_search = 64; Eine Suche nach den Top 50 verwendet ef_search = 200. Diese Formel bleibt pro Umgebungsvariable für Bereitstellungen anpassbar, die einen anderen Kompromiss zwischen Rückruf und Latenz erfordern.

pgvector 0.8 fügt einen zweiten Hebel für dasselbe Problem hinzu: hnsw.iterative_scan. Im strict_order- oder relaxed_order-Modus erweitert die Suche ihre Suche schrittweise, bis nach dem Filtern genügend Ergebnisse gesammelt werden, anstatt bei einer festen Kandidatenliste anzuhalten. Aurabase aktiviert es standardmäßig in strict_order, schützt den Aufruf jedoch in einem Sicherungspunkt. Bei einer Version von pgvector vor 0.8, bei der dieser Parameter nicht vorhanden ist, wird die Abfrage im herabgesetzten Modus fortgesetzt und schlägt nicht fehl.

#
Gehen Sie weiter

Erstellen Sie die komplette RAG-Pipeline

Dieser HNSW-Index ist nur ein Teil der gesamten RAG-Pipeline: Chunking, Einbettungsgenerierung, Aufnahme und dann Suche. Unser Schritt-für-Schritt-Tutorial baut diese Pipeline durchgängig auf pgvector auf, von der ersten Einfügung bis zur Ähnlichkeitsabfrage. Die technische Dokumentation beschreibt außerdem alle nativen KI-Funktionen von Aurabase, die auf Postgres basieren.

#
Häufig gestellte Fragen

FAQs

HNSW oder IVFFlat: Welches soll ich mit pgvector wählen?+
HNSW eignet sich für die überwiegende Mehrheit der Vektorsuchfälle in der Produktion: besserer Rückruf bei gleicher Latenz, keine vorherige Trainingsphase und gute Toleranz gegenüber kontinuierlich wachsenden Tabellen. IVFFlat bleibt relevant, wenn der verfügbare Speicher sehr begrenzt ist, auf Kosten einer allgemein geringeren Rückrufrate und einer erforderlichen Umschulung, wenn sich die Datenverteilung erheblich ändert.
Wie viel Speicher muss für einen HNSW-Index eingeplant werden?+
Die Größenordnung hängt direkt von m und der Anzahl der indizierten Vektoren ab: Jeder Knoten speichert zusätzlich zum Vektor selbst bis zu m Verbindungen pro Schicht. Für eine zuverlässige Schätzung Ihres tatsächlichen Volumens erstellen Sie den Index auf einer repräsentativen Teilmenge Ihrer Daten. Dann messen Sie seine Größe mit pg_relation_size(), anstatt sich auf eine nicht gemessene Faustregel zu verlassen.
Können wir mit HNSW Einbettungen mit mehr als 2000 Dimensionen indizieren?+
Nicht direkt auf den Vektortyp: pgvector weigert sich, einen HNSW-Index über 2000 Dimensionen hinaus für diesen Typ zu erstellen. Die Lösung besteht darin, die Spalte zum Zeitpunkt der Indexerstellung in halfvec umzuwandeln, wodurch die Indizierungsgrenze durch die Halbierung der Speichergenauigkeit verschoben wird. Dies ist genau der Ansatz, der in der Produktion der 3072-dimensionalen Einbettungsklasse von Aurabase verwendet wird.

BEREIT ZUM EINSATZ?

Ihr Backend in fünf Minuten.

Keine Kreditkarte erforderlich · 500 MB kostenlos · 50.000 MAU