Mittelstufe 11 Min.Stack

pgvector: die vektorbasierte Suche in PostgreSQL

Direkte Antwort

pgvector ist eine Open-Source-Erweiterung für PostgreSQL (unter der permissiven PostgreSQL-Lizenz), die einer Datenbank, die Sie bereits verwalten, die Speicherung und Suche von Vektoren hinzufügt, mit indexierbaren Spalten bis zu 2.000 Dimensionen (4.000 bei halber Präzision). Für einen lokalen Korpus aus einigen Hunderttausend Textabschnitten bedeutet das einen Dienst weniger, den Sie betreiben müssen, und funktionierende SQL-Filter, ohne eine Synchronisierung mit Ihren relationalen Daten pflegen zu müssen.

pgvector ist eine PostgreSQL-Erweiterung, die eine Datenbank, die Sie bereits verwalten, um die Speicherung und Suche von Vektoren ergänzt. Für die meisten Projekte zur lokalen Dokumentensuche bedeutet das einen Dienst weniger, den Sie betreiben müssen, eine Datensicherung weniger, die Sie organisieren müssen, und SQL-Filter, die tatsächlich funktionieren — auch bei Zugriffsrechten. Das unter der PostgreSQL-Lizenz gepflegte und auf GitHub gehostete Projekt hatte Ende September 2026 mehr als 23.000 Sterne und lag in Version 0.8.6 vor, die mit PostgreSQL 13 und neueren Versionen kompatibel ist.

Von Mohamed Meguedmi·Aktualisierung 2026-09-28·Unter Windows, macOS und Linux getestet

#Das Argument: keinen zusätzlichen Dienst hinzufügen

Eine lokale Installation für die Arbeit mit Dokumenten betreibt bereits einen Modellserver, einen Kodierungsschritt und einen Dokumentenspeicher. Eine dedizierte Vektordatenbank hinzuzufügen bedeutet einen zusätzlichen Container, einen zusätzlichen Port, eine zusätzliche Sicherung und eine weitere Komponente, die beim Löschen eines Dokuments nicht mehr mit Ihren relationalen Daten synchron sein kann.

Wenn PostgreSQL bereits vorhanden ist — und in einer Geschäftsanwendung ist das fast immer der Fall — beseitigt pgvector diese ganze Kategorie von Problemen. Ihre Textabschnitte liegen in einer Tabelle neben den Dokumenten, aus denen sie stammen, mit Fremdschlüsseln, die ihre Konsistenz gewährleisten. Löschungen werden so weitergegeben, wie Sie es erwarten, ohne dass Sie eine separate Bereinigungsaufgabe schreiben oder überwachen müssen. Das Projekt ergänzt außerdem exakte und approximative Suche, Vektoren mit einfacher und halber Genauigkeit sowie binäre und dünn besetzte Vektoren, fünf Distanzmaße (L2, Skalarprodukt, Kosinus, L1, Hamming, Jaccard) und übernimmt ohne Zusatzaufwand die ACID-Konformität, die Wiederherstellung zu einem bestimmten Zeitpunkt und die Joins von PostgreSQL.

#Wie es in der Praxis funktioniert

Das RAG-Local-Kit

Ihre Dokumente, Ihre KI: ein zuverlässiges lokales RAG für Ihre PDFs, Notizen und E-Mails – ohne Daten in die Cloud zu senden.

  • Lebenslanger Online-Zugang
  • PDF + Dateien
  • Erstattung binnen 30 Tagen

Sie speichern eine Spalte mit Vektoren neben Ihren üblichen Spalten. Eine Abfrage sortiert die Zeilen nach dem Abstand zum Vektor der Frage und gibt die nächstgelegenen zurück. Drei Abstandsoperatoren decken die gängigen Fälle ab, und der gewählte Operator muss zur Konvention des Embedding-Modells passen: Eine falsche Wahl ist die häufigste Ursache für mittelmäßige Ergebnisse, die nicht sofort auffallen. Bei auf Länge 1 normierten Vektoren (wie bei OpenAI und den meisten neueren Embedding-Modellen) lässt sich das Skalarprodukt am schnellsten berechnen und liefert dieselbe Rangfolge wie die Kosinusähnlichkeit.

Die Teile des Puzzles
ElementWas es istWorauf Sie achten sollten
VektorspalteEin Array von Fließkommazahlen mit fester DimensionDie Dimension ergibt sich aus dem Embedding-Modell und ändert sich nicht, solange kein vollständiges Re-Embedding durchgeführt wird
DistanzoperatorKosinus, Skalarprodukt oder euklidische Distanz (L2)Muss dem Modell entsprechen
HNSW-IndexGraphbasierter Index, schnelle AbfragenLangsamer Aufbau mit hohem Speicherbedarf; seit Version 0.5 eine sinnvolle Standardwahl
IVFFlat-IndexPartitionsbasierter Index, kostengünstig aufzubauenErstellen, sobald repräsentative Daten vorliegen
Kein IndexExaktes Durchsuchen aller ZeilenBis zu einigen Zehntausend Zeilen problemlos einsetzbar

#Minimaler SQL-Code zum Start

  1. 01
    Erweiterung aktivieren
    CREATE EXTENSION IF NOT EXISTS vector; — ein einziger Befehl, der einmal pro Datenbank auszuführen ist.
  2. 02
    Spalte hinzufügen
    ALTER TABLE chunks ADD COLUMN embedding vector(1024); — die Dimension muss exakt derjenigen des verwendeten Embedding-Modells entsprechen.
  3. 03
    Daten vor dem Indexieren laden
    Ein Massenimport über COPY ist ohne bestehenden Index schneller; erstellen Sie den Index, sobald eine repräsentative Anzahl von Zeilen vorhanden ist.
  4. 04
    Index erstellen
    CREATE INDEX CONCURRENTLY ON chunks USING hnsw (embedding vector_cosine_ops); — die Option CONCURRENTLY verhindert, dass Schreibvorgänge während der Indexerstellung blockiert werden, die bei einer großen Tabelle lange dauert.
  5. 05
    Abfragen
    SELECT contenu FROM chunks WHERE document_id IN (SELECT id FROM documents WHERE utilisateur_autorise($1)) ORDER BY embedding <=> $2 LIMIT 5; — Berechtigungsfilter und Sortierung nach Ähnlichkeit in derselben Abfrage.

#Die Grenzen der Dimensionszahl in der Praxis

pgvector definiert vier Spaltentypen, jeder mit seiner eigenen Grenze für die indexierbare Dimension. Der Standardtyp vector (Einfachgenauigkeit, 4 Bytes pro Element) ist bis zu 2 000 Dimensionen indexierbar, was die meisten gängigen Open-Source-Embedding-Modelle abdeckt (384 bis 1 024 Dimensionen). Ein breiteres Modell wie text-embedding-3-large von OpenAI mit standardmäßig 3 072 Dimensionen überschreitet diese Grenze: Die dokumentierte Lösung besteht entweder darin, die Dimension bei der Erzeugung des Embeddings zu reduzieren (die API ermöglicht dies), oder auf den Typ halfvec umzusteigen, der in Halbgauigkeit speichert (2 Bytes pro Element, halb so viel Speicherplatz) und bis zu 4 000 Dimensionen indexierbar ist. Der Typ bit (binäre Vektoren, Hamming- oder Jaccard-Abstände) ist bis zu 64 000 Dimensionen indexierbar, und sparsevec (dünne Vektoren) bis zu 1 000 nicht-null-Elementen indexiert – darüber hinaus speichert PostgreSQL die Spalte weiterhin (bis zu 16 000 Dimensionen für vector, halfvec und sparsevec), kann sie aber nicht indexieren, was zu einem exakten Durchlauf führt.

→
Quantisierung ist nicht nur ein Speicherdetail
Der Wechsel von vector zu halfvec halbiert den Speicherbedarf jeder Zeile. Dadurch passen mehr Indexdaten in den Arbeitsspeicher, und Abfragen werden bei großen Datenmengen schneller, ohne dass Sie Ihr Embedding-Modell ändern müssen. Die binäre Quantisierung (Typ bit) geht noch weiter: Sie komprimiert den Index für die Suche; anschließend stellt eine Neusortierung anhand der vollständigen Vektoren die verlorene Genauigkeit wieder her — die vom Projekt selbst dokumentierte Methode, um einen großen Index vollständig im Arbeitsspeicher zu halten, statt ihn auf den Datenträger auszulagern.

#Das Filtern und die Zugriffsrechte

Eine reale Frage bezieht sich selten auf den gesamten Korpus: Gesucht sind die Passagen dieses Dienstes, die nach diesem Datum entstanden sind, in den Dokumenten, die dieser Benutzer lesen darf. In einer dedizierten Vektordatenbank ist das ein Metadatenfilter mit eigener Syntax und eigenen Sonderfällen. In PostgreSQL ist es eine WHERE-Klausel zusammen mit einer Sortierung nach Ähnlichkeit, bei Bedarf mit einer Verknüpfung zu Ihrer Benutzertabelle.

Eine vom Projekt selbst dokumentierte Stolperfalle sollten Sie kennen, bevor Sie im Produktivbetrieb darauf stoßen: Bei einem approximativen Index (HNSW oder IVFFlat) wird der Filter nach dem Indexdurchlauf angewendet, nicht davor. Wenn eine Bedingung nur 10 % der Zeilen durchlässt und der Parameter hnsw.ef_search den Standardwert 40 hat, werden im Durchschnitt nur 4 Zeilen zurückgegeben – nicht die zehn angeforderten. Die offizielle Abhilfe, die seit Version 0.8.0 verfügbar ist, heißt iterativer Indexdurchlauf (SET hnsw.iterative_scan = strict_order). Dabei wird der Durchlauf automatisch erneut gestartet, bis genügend Ergebnisse gefunden wurden, statt stillschweigend eine unvollständige Ergebnismenge zurückzugeben.

!
Die Rechte werden nicht im Prompt festgelegt
Wenn mehrere Personen denselben Index abfragen, verhindert der Berechtigungsfilter, dass ein Modell jemandem ein Dokument als Quelle nennt, das diese Person nicht sehen darf. Keine Prompt-Anweisung ersetzt diesen Filter. Ihn in SQL auf Grundlage Ihres bestehenden Berechtigungsmodells auszudrücken, ist wesentlich sicherer, als ihn neu zu implementieren.

#Wo die Grenzen liegen

Speicherbedarf bei großen Datenmengen
Millionen Vektoren mit voller Präzision benötigen viel Speicher; halfvec und binäre Quantisierung reduzieren den Speicherbedarf, doch spezialisierte Engines bieten von Haus aus eine noch stärkere Komprimierung. Das ist der deutlichste Unterschied.
Dauer der Indexierung
Der Aufbau eines HNSW-Indexes auf einer sehr großen Tabelle dauert lange und benötigt viele Ressourcen; in der Produktion verhindert der Aufbau mit CREATE INDEX CONCURRENTLY, dass Schreibvorgänge währenddessen blockiert werden.
Konkurrierende Lasten
Wenn Sie aufwendige Vektorsuchen neben Ihrer Transaktionslast ausführen, laufen beide auf demselben Server. Lesereplikate helfen, eine Trennung der Rollen hilft noch mehr.
Die Dimension der Vektoren
Für indexierte Vektoren gilt je nach Typ eine Obergrenze (2.000 für vector, 4.000 für halfvec). Gängige Modelle passen innerhalb dieser Grenzen; ein Modell mit sehr hoher Dimension muss reduziert oder quantisiert werden.
Hybride Suche
PostgreSQL unterstützt Volltextsuche (tsvector), und Sie können sie mit der Vektordistanz kombinieren. Die komfortable Nutzung müssen Sie jedoch selbst umsetzen: Sie müssen die beiden Abfragen getrennt ausführen und anschließend die Ranglisten zusammenführen, beispielsweise mit Reciprocal Rank Fusion, statt mit einer einzigen Abfrage einen nativen hybriden Score zu erhalten.
Die horizontale Skalierung
Für den Betrieb auf mehr als einem Server führt der dokumentierte Weg über PostgreSQL-Lesereplikate oder ein Verteilungstool wie Citus oder PgDog – ein zusätzlicher Baustein, der dem ursprünglichen Argument entgegensteht.
i
VACUUM bei einem HNSW-Index kann langsam sein
Die offizielle Dokumentation weist ausdrücklich darauf hin: Die Bereinigung (VACUUM) einer Tabelle mit einem HNSW-Vektorindex kann bei großen Datenmengen einige Zeit dauern. Sie lässt sich beschleunigen, indem vor dem VACUUM ein REINDEX INDEX CONCURRENTLY ausgeführt wird, statt den Wartungsvorgang allein laufen zu lassen — ein Betriebsdetail, das nur wenige Tutorials erwähnen, bevor die nächtliche Wartung ihr Zeitfenster überschreitet.

#pgvector oder eine dedizierte Datenbank

Die Frage ist nicht, welche Lösung objektiv besser ist, sondern welche heute zu Ihrer Situation passt. pgvector hat die Nase vorn, sobald PostgreSQL bereits die maßgebliche Datenquelle der Anwendung ist: Abrechnung, Konten, Quelldokumente. Eine dedizierte Engine hat die Nase vorn, wenn die Menge der Vektoren oder der Abfragedurchsatz über das hinausgeht, was ein einzelner Transaktionsserver bewältigen kann, ohne den Rest der Anwendung zu beeinträchtigen, oder wenn das Team die KI-Komponente aus betrieblichen Gründen und nicht wegen der reinen Leistung vom übrigen Informationssystem trennen möchte.

Je nach Situation wählen
SituationAuswahl
PostgreSQL bereits vorhanden, weniger als einige Hunderttausend Textabschnittepgvector, bequem
Die Vektoren müssen mit relationalen Daten konsistent bleibenpgvector: Transaktionen werden kostenlos bereitgestellt
Feingranulare Filterung anhand bestehender Berechtigungenpgvector
Ein Embedding-Modell mit mehr als 4.000 Dimensionen ohne mögliche ReduktionDen Typ sparsevec oder eine speziell für diesen Fall konzipierte Datenbank prüfen
Millionen Vektoren, viele AbfragenEine spezialisierte Engine (Qdrant, Milvus)
Prototyp in einem NotizbuchBeliebige Wahl; diese Entscheidung lässt sich rückgängig machen

#FAQ

Ist pgvector schnell genug für RAG?+
Für ein typisches lokales Korpus — einige Zehntausend bis einige Hunderttausend Textabschnitte — ja, mit einem HNSW-Index und am unteren Ende dieser Spanne oft sogar ohne Index. Die Suche nach relevanten Textabschnitten ist selten der langsame Schritt einer lokalen Verarbeitungskette: Die Generierung durch das Modell bestimmt den größten Teil der wahrgenommenen Antwortzeit.
pgvector oder Qdrant?+
pgvector, wenn PostgreSQL bereits vorhanden ist und Ihre Daten relational sind: weniger Dienste, transaktionale Konsistenz, native SQL-Filter und nur eine einzige zu organisierende Sicherung. Qdrant, wenn die Größenordnung, eine aggressive Quantisierung zur Speicherersparnis oder ein dedizierter, vollständig auf Vektordaten ausgelegter Dienst wichtiger sind als der einfache Betrieb einer einzigen Datenbank. Beide decken denselben Bedarf bis zu mehreren Hunderttausend Vektoren gut ab.
Welchen Index sollten Sie wählen: HNSW oder IVFFlat?+
HNSW ist seit mehreren Versionen die Standardwahl: bessere Abfrageleistung, allerdings auf Kosten eines langsameren Indexaufbaus und eines höheren Speicherbedarfs. Der Aufbau eines IVFFlat-Index ist weniger aufwendig, darf aber erst erfolgen, nachdem repräsentative Daten geladen wurden; andernfalls entstehen schlecht verteilte Partitionen.
Kann ich nach Metadaten filtern?+
Ja, mit gewöhnlichem SQL, einschließlich Joins. Das ist einer der besten Gründe, es zu wählen, insbesondere für das Filtern nach Zugriffsrechten. Beachten Sie jedoch: Bei einem approximativen Index wird dieser Filter erst nach dem Indexdurchlauf angewendet. Ohne einen iterativen Durchlauf kann dies dazu führen, dass weniger Ergebnisse als erwartet zurückgegeben werden.
Was passiert, wenn ich das Embedding-Modell wechsle?+
Alles muss neu kodiert werden: Dimension und Geometrie der Vektoren sind vom Modell abhängig, nicht von der Datenbank. Das ist eine Stapelverarbeitung auf der GPU, keine Schemamigration, und die Spalte muss neu erstellt werden, wenn die neue Dimension die deklarierte überschreitet. Planen Sie ein Zeitfenster für die Umstellung ein, denn der alte Index bleibt gültig, solange die Neukodierung nicht abgeschlossen ist.
Mein Embedding-Modell hat mehr als 2.000 Dimensionen – was soll ich tun?+
Der Standardtyp vector unterstützt die Indexierung von bis zu 2.000 Dimensionen. Wechseln Sie darüber hinaus zum Typ halfvec (bis zu 4.000 Dimensionen, mit halber Präzision) oder reduzieren Sie die Dimensionszahl bei der Generierung, sofern Ihr Anbieter dies ermöglicht, wie OpenAI es für text-embedding-3-large anbietet. Ohne Index speichert PostgreSQL dennoch bis zu 16.000 Dimensionen, allerdings mit einer exakten Suche über alle Einträge.
Wie lässt sich eine langsame Vektorabfrage diagnostizieren?+
Die Dokumentation empfiehlt, EXPLAIN (ANALYZE, BUFFERS) vor die Abfrage zu setzen, um zu sehen, ob der Index tatsächlich verwendet wird und wie viele Blöcke gelesen werden. Eine exakte Abfrage ohne Index profitiert von einer Erhöhung von max_parallel_workers_per_gather; eine langsame approximative Abfrage deutet oft auf einen Index hin, der noch aufgebaut wird, oder auf zu wenig Speicher, um ihn im Cache zu halten.
Hat Ihnen dieser Guide geholfen?

Haben Sie Feedback, einen Fehler entdeckt oder möchten Sie etwas präzisieren? Geben Sie uns Bescheid – so wird der Guide für alle besser.