Auf dieser Seite wird beschrieben, wie Sie mithilfe gespeicherter Embeddings Indizes generieren und Embeddings mit ScaNN
-, IVF
-, IVFFlat
- und HNSW
-Indizes in AlloyDB for PostgreSQL abfragen.
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.
Vektoreinbettungen 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;
Wenn Sie
ScaNN
-Indexe generieren möchten, installieren Sie zusätzlich zur Erweiterungvector
die Erweiterungalloydb_scann
.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Index erstellen
Sie können einen der folgenden Indextypen für Tabellen in Ihrer Datenbank erstellen.
ScaNN
-Index erstellen
AlloyDB alloydb_scann
, eine von Google entwickelte PostgreSQL-Erweiterung, die einen äußerst effizienten Nearest-Neighbor-Index mit dem ScaNN-Algorithmus implementiert.
Der ScaNN
-Index ist ein baumbasierter Quantisierungsindex für die ungefähre Suche nach dem nächsten Nachbarn. Im Vergleich zu HNSW
ist die Indexerstellungszeit kürzer und der Arbeitsspeicherbedarf geringer. Außerdem bietet es je nach Arbeitslast eine höhere Abfragerate pro Sekunde als HNSW
.
Zweistufiger BaumScaNN
-Index
Wenn Sie einen zweistufigen Baumindex mit dem ScaNN-Algorithmus auf eine Spalte mit gespeicherten Vektoreinbettungen anwenden möchten, führen Sie die folgende DDL-Abfrage aus:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
Ersetzen Sie Folgendes:
INDEX_NAME
: Der Name des Index, den Sie erstellen möchten, z. B.my-scann-index
. Die Indexnamen werden in der gesamten Datenbank verwendet. 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
: Spalte, in dervector
-Daten gespeichert werden.DISTANCE_FUNCTION
: die Entfernungsfunktion, die mit diesem Index verwendet werden soll. Wählen Sie eine der folgenden Optionen aus:L2-Distanz:
l2
Skalarprodukt:
dot_product
Kosinus-Distanz:
cosine
NUM_LEAVES_VALUE
: die Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Legen Sie einen Wert zwischen 1 und 1048576 fest. Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unterScaNN
-Index optimieren.
Dreistufiger BaumScaNN
-Index
Wenn Sie einen dreistufigen Baumindex mit dem ScaNN-Algorithmus für eine Spalte mit gespeicherten Vektoreinbettungen erstellen möchten, führen Sie die folgende DDL-Abfrage aus:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Ersetzen Sie Folgendes:
MAX_NUM_LEVELS
: die maximale Anzahl von Ebenen des K-Means-Clusterbaums. Legen Sie1
(Standard) für die zweistufige treebasierte Quantisierung und2
für die dreistufige treebasierte Quantisierung fest.
Nachdem Sie den Index erstellt haben, können Sie Abfragen nach nächsten Nachbarn ausführen, die den Index nutzen. Folgen Sie dazu der Anleitung unter Abfrage nach nächsten Nachbarn mit angegebenem Text erstellen.
Die Indexparameter müssen so festgelegt werden, dass ein ausgewogenes Verhältnis zwischen Abfragen pro Sekunde und Trefferquote erreicht wird. Weitere Informationen zum Optimieren des ScaNN
-Index finden Sie unter ScaNN
-Index optimieren.
Wenn Sie diesen Index für eine Einbettungsspalte erstellen möchten, die den Datentyp real[]
anstelle von vector
verwendet, müssen Sie die Spalte in den Datentyp vector
umwandeln:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Ersetzen Sie DIMENSIONS
durch die Dimensionsbreite der Einbettungsspalte. Weitere Informationen zum Ermitteln der Dimensionen finden Sie unter Vektorfunktionen in der Beschreibung der Funktion vector_dims
.
In der Ansicht pg_stat_progress_create_index
können Sie den Fortschritt der Indexierung sehen:
SELECT * FROM pg_stat_progress_create_index;
In der Spalte phase
wird der aktuelle Status der Indexerstellung angezeigt. Die Phase building index: tree training
verschwindet, nachdem der Index erstellt wurde.
Informationen zum Optimieren Ihres Index für eine gewünschte Trefferanzahl und ein ausgewogenes QPS finden Sie unter ScaNN
-Index optimieren.
Abfrage ausführen
Nachdem Sie Embeddings in Ihrer Datenbank gespeichert und indexiert haben, können Sie mithilfe der pgvector
-Abfragefunktion Abfragen ausführen. Mit der alloydb_scann
-Erweiterung können keine Bulk-Suchanfragen ausgeführt werden.
Wenn Sie die nächsten semantischen Nachbarn für einen Einbettungsvektor ermitteln möchten, können Sie die folgende Beispielabfrage ausführen. Dabei verwenden Sie dieselbe Distanzfunktion, die Sie bei der Indexerstellung verwendet haben.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
Ersetzen Sie Folgendes:
TABLE
: die Tabelle mit der Einbettung, 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 Entfernungsfunktion, die für diese Abfrage verwendet werden soll. Wählen Sie je nach der beim Erstellen des Index verwendeten Entfernungsfunktion 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 nur die beste Übereinstimmung zurückgegeben werden soll.
Weitere Abfragebeispiele finden Sie unter Abfragen.
Sie können auch die Funktion embedding()
verwenden, um den Text in einen Vektor umzuwandeln. Sie wenden den Vektor auf einen der pgvector
-Operatoren für den 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 verwenden zu können.
CREATE EXTENSION IF NOT EXISTS google_ml_integration VERSION '1.2';
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
Ersetzen Sie Folgendes:
MODEL_ID
: Die ID des Modells, das abgefragt werden soll.Wenn Sie Vertex AI Model Garden verwenden, geben Sie
text-embedding-005
als Modell-ID an. Dies sind die cloudbasierten Modelle, die AlloyDB für Texteinbettungen verwenden kann. Weitere Informationen finden Sie unter Texteinbettungen.Optional:
VERSION_TAG
: das Versions-Tag des Modells, das abgefragt werden soll. Stellen Sie dem Tag@
voran.Wenn Sie eines der
text-embedding-005
-Englischmodelle mit Vertex AI verwenden, geben Sie eines der Versions-Tags an, z. B.text-embedding-005
, das unter Modellversionen aufgeführt ist.Google empfiehlt dringend, immer das Versions-Tag anzugeben. Wenn Sie das Versions-Tag nicht angeben, verwendet AlloyDB immer die neueste Modellversion. Dies kann zu unerwarteten Ergebnissen führen.
TEXT
: Der Text, der in eine Vektoreinbettung umgewandelt werden soll.
Nächste Schritte
- Beispiel für einen Einbettungsworkflow
- Leistung von Vektorabfragen optimieren
- Messwerte für Vektorindexe
- Informationen zum Erstellen eines intelligenten Shopping-Assistenten mit AlloyDB, pgvector und der Modellendpunktverwaltung