Auf dieser Seite wird beschrieben, wie Sie gespeicherte Einbettungen verwenden, um IVF
-Indizes zu generieren und Einbettungen mit einem IVF
-Index mit AlloyDB for PostgreSQL abzufragen.
Weitere Informationen zum Speichern von Einbettungen finden Sie unter Vektoreinbettungen speichern.
Hinweise
Bevor Sie mit dem Erstellen von Indexen beginnen können, müssen Sie die folgenden Voraussetzungen erfüllen.
Einbettungsvektoren werden einer Tabelle in Ihrer AlloyDB-Datenbank hinzugefügt.
Die
vector
-Erweiterungsversion0.5.0
oder höher, die aufpgvector
basiert und von Google für AlloyDB erweitert wurde, ist installiert.CREATE EXTENSION IF NOT EXISTS vector;
IVF
-Index erstellen
Stock pgvector
unterstützt die Suche nach ungefähren nächsten Nachbarn durch die Indexierung. AlloyDB bietet zusätzliche Unterstützung mit einer Funktion zur skalaren Quantisierung, die Sie beim Erstellen eines Index angeben können.
Wenn die skalare Quantisierung aktiviert ist, können Abfragen mit Vektoren mit größeren Dimensionen deutlich beschleunigt werden. Außerdem können Sie Vektoren mit bis zu 8.000 Dimensionen speichern.
Wenn Sie die skalare Quantisierung für einen pgvector
-basierten Index aktivieren möchten, geben Sie IVF
als Indexmethode und SQ8
als Quantisierer an:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');
Ersetzen Sie Folgendes:
INDEX_NAME
: Der Name des Index, den Sie erstellen möchten, z. B.my-ivf-index
. Die Indexnamen sind in Ihrer Datenbank freigegeben. Achten Sie darauf, dass jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.TABLE
: Die Tabelle, der der Index hinzugefügt werden soll.EMBEDDING_COLUMN
: eine Spalte, in dervector
-Daten gespeichert werden.DISTANCE_FUNCTION
: Die Distanzfunktion, die für diesen Index verwendet werden soll. Wählen Sie eine der folgenden Optionen aus:L2-Distanz:
vector_l2_ops
Skalarprodukt:
vector_ip_ops
Kosinus-Distanz:
vector_cosine_ops
LIST_COUNT
: Die Anzahl der Listen, die mit diesem Index verwendet werden sollen. Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter IVF-Index optimieren.QUANTIZER
: Der Typ des Quantizers, den Sie verwenden möchten.Legen Sie dafür einen der folgenden Werte fest:
SQ8
: empfohlen. Schnellere Abfrageantwort, aber mit einem gewissen Verlust an Erinnerungswerten, was sich nicht auf Produktionsszenarien auswirkt.FLAT
: Langsamere Antwort auf Anfragen und höhere Speichernutzung, aber vernachlässigbarer Recall-Verlust.
Wenn Sie diesen Index für eine Einbettungsspalte erstellen möchten, die den Datentyp
real[]
anstelle vonvector
verwendet, wandeln Sie die Spalte in den Datentypvector
um:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'SQ8');
Ersetzen Sie DIMENSIONS
durch die dimensionale Breite der Einbettungsspalte. Weitere Informationen zum Ermitteln der Dimensionen finden Sie unter der Funktion vector_dims
in Vektorfunktionen.
So rufen Sie den Indexierungsfortschritt auf:pg_stat_progress_create_index
SELECT * FROM pg_stat_progress_create_index;
In der Spalte phase
wird der aktuelle Status der Indexerstellung angezeigt. Die Phase building postings
gibt an, dass die Indexerstellung bald abgeschlossen ist.
Informationen zum Optimieren des Index für ein bestimmtes Gleichgewicht zwischen Recall und QPS finden Sie unter IVF
-Index optimieren.
Abfrage ausführen
Nachdem Sie die Einbettungen in Ihrer Datenbank gespeichert und indexiert haben, können Sie mit der pgvector
-Abfragefunktion Abfragen starten.
Wenn Sie die semantisch nächsten Nachbarn für einen Einbettungsvektor finden möchten, können Sie die folgende Beispielabfrage ausführen. Dabei legen Sie dieselbe Distanzfunktion fest, die Sie beim Erstellen des Index verwendet haben.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
Ersetzen Sie Folgendes:
TABLE
: Die Tabelle, die die Einbettung enthält, mit der der Text verglichen werden soll.INDEX_NAME
: der Name des Index, den Sie verwenden möchten, z. B.my-scann-index
.EMBEDDING_COLUMN
: die Spalte mit den gespeicherten Einbettungen.DISTANCE_FUNCTION_QUERY
: Die Distanzfunktion, die für diese Abfrage verwendet werden soll. Wählen Sie je nach der beim Erstellen des Index verwendeten Distanzfunktion eine der folgenden Optionen aus:L2-Distanz:
<->
Skalarprodukt:
<#>
Kosinus-Distanz:
<=>
EMBEDDING
: Der Einbettungsvektor, für den Sie die nächsten gespeicherten semantischen Nachbarn finden möchten.ROW_COUNT
: Die Anzahl der zurückzugebenden Zeilen.Geben Sie
1
an, wenn Sie nur die beste Übereinstimmung erhalten möchten.
Weitere Beispiele für Abfragen finden Sie unter Abfragen.
Sie können auch die Funktion embedding()
verwenden, um den Text in einen Vektor zu übersetzen. Sie wenden den Vektor auf einen der pgvector
-Operatoren für die Suche nach dem nächsten Nachbarn<->
für die L2-Distanz an, um die Datenbankzeilen mit den semantisch ähnlichsten Einbettungen zu finden.
Da embedding()
ein real
-Array zurückgibt, müssen Sie den embedding()
-Aufruf explizit in vector
umwandeln, um diese Werte mit pgvector
-Operatoren zu verwenden.
Nächste Schritte
- ScaNN-Index erstellen
- Suchen nach Vektorähnlichkeiten durchführen
- Leistung von Vektorabfragen optimieren
- Messwerte für Vektorindexe
- Smart Shopping Assistant mit AlloyDB, pgvector und der Verwaltung von Modellendpunkten erstellen