In diesem Dokument erfahren Sie, wie Sie gespeicherte Einbettungen verwenden, um Indexe zu generieren und Einbettungen abzufragen. Weitere Informationen zum Speichern von Einbettungen finden Sie unter Vektoreinbettungen speichern.
Sie können Indexe vom Typ ScaNN, IVF, IVFFlat und HNSW mit AlloyDB erstellen.
Hinweis
Bevor Sie mit dem Erstellen von Indexen beginnen können, müssen Sie die folgenden Voraussetzungen erfüllen.
Einbettungsvektoren wurden einer Tabelle in Ihrer AlloyDB-Datenbank hinzugefügt.
Die
vector-Erweiterungsversion0.5.0oder höher, die aufpgvectorbasiert 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 Erweiterungvectordie 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 eine hoch
einen effizienten Index für die Suche nach dem nächsten Nachbarn, der auf dem [ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
Der ScaNN-Index ist ein baumbasierter Quantisierungsindex für die Suche nach dem ungefähren
Suche nach dem nächsten Nachbarn. Im Vergleich zu ist die Indexerstellung schneller und der Speicherbedarf geringer.
Speicherbedarf im Vergleich zu HNSW. Außerdem bietet es im Vergleich zu
im Vergleich zu HNSW je nach Arbeitslast.
eine Tabelle in Ihrer AlloyDB-Datenbank. Wenn Sie versuchen, einen ScaNN-Index zu generieren,
Wenn Sie versuchen, einen -Index für eine leere oder partitionierte Tabelle zu erstellen, können Probleme auftreten. Weitere Informationen
Informationen zu den generierten Fehlern finden Sie unter Fehlerbehebung bei ScaNN-Indexfehlern.
ScaNN-Index mit zweistufigem Baum
Einen zweistufigen Baumindex mit dem ScaNN-Algorithmus auf eine Spalte anwenden
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 SieErstellen – z. B.
my-scann-index. Die Indexnamen sind freigegebenin Ihrer Datenbank. Achten Sie darauf, dass jeder Indexname für jede
Tabelle in Ihrer Datenbank.
TABLE: Die Tabelle, der der Index hinzugefügt werden soll.EMBEDDING_COLUMN: eine Spalte, in dervectorgespeichert wird.verschiedene Verfahren vor.
DISTANCE_FUNCTION: Die zu verwendende Distanzfunktionmit diesem Index. Wählen Sie eine der folgenden Optionen aus:
L2-Distanz:
l2Skalarprodukt:
dot_productKosinus-Distanz:
cosine
NUM_LEAVES_VALUE: Die Anzahl der Partitionen, die angewendet werden sollen.diesem Index. Kann auf einen beliebigen Wert zwischen 1 und 1.048.576 festgelegt werden. Weitere Informationen
Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter
ScaNN-Index abstimmen.
Dreistufiger ScaNN-Baumindex
So erstellen Sie einen dreistufigen Baumindex mit dem ScaNN-Algorithmus für 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, max_num_levels = MAX_NUM_LEVELS);
Ersetzen Sie Folgendes:
MAX_NUM_LEVELS: die maximale Anzahl von Ebenen imK-Means-Clustering-Baum. Legen Sie
1(Standard) für die zweistufige baumbasierteQuantisierung und
2für die dreistufige baumbasierte Quantisierung fest.
Nachdem Sie den Index erstellt haben, können Sie Abfragen zur Suche nach nächsten Nachbarn ausführen, die
den Index verwenden. Folgen Sie dazu der Anleitung unter [Abfrage von nächsten Nachbarn
mit dem angegebenen Text abfragen](#query).
Die Indexparameter müssen mit Blick auf ein gutes Gleichgewicht zwischen QPS und
Recall Weitere Informationen zum Optimieren des ScaNN-Index finden Sie unter [ScaNN-Index optimieren].
index](/alloydb/omni/containers/15.7.0/docs/ai/tune-indexes).
Wenn Sie diesen Index für eine Einbettungsspalte erstellen möchten, die den Datentyp real[] verwendet,
Wenn Sie diesen Index für eine Einbettungsspalte erstellen möchten, die den Datentyp vector anstelle von verwendet, wandeln Sie die Spalte in den Datentyp vector um:
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 dimensionale Breite der
Einbettungsspalte. Weitere Informationen zum Ermitteln der Dimensionen
Weitere Informationen finden Sie unter der Funktion vector_dims in [Vector
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
Verwenden Sie zum Anzeigen des Indexierungsfortschritts die pg_stat_progress_create_index-Ansicht:
SELECT * FROM pg_stat_progress_create_index;
In der Spalte phase wird der aktuelle Status der Indexerstellung angezeigt.
Die Phase building index: tree training wird nach der Indexerstellung nicht mehr angezeigt.
Informationen zum Abstimmen Ihres Index auf ein bestimmtes Gleichgewicht zwischen Recall und QPS finden Sie unter ScaNN-Index abstimmen.
Indexierte Tabelle analysieren
Nachdem Sie den ScaNN-Index erstellt haben, führen Sie den Befehl ANALYZE aus, um Statistiken zu Ihren Daten zu aktualisieren.
ANALYZE TABLE;
Abfrage ausführen
Nachdem Sie Einbettungen in Ihrer Datenbank gespeichert und indexiert haben, können Sie
Abfragen mit der [pgvector-Abfrage
functionality](https://github.com/pgvector/pgvector#querying). Sie können nicht laufen
Bulk-Suchanfragen mit der alloydb_scann-Erweiterung
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
während der Indexerstellung.
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.SMS senden.
INDEX_NAME: Der Name des Index, den Sie verwenden möchten.Beispiel:
my-scann-indexEMBEDDING_COLUMN: die Spalte mit den gespeichertenEinbettungen.
DISTANCE_FUNCTION_QUERY: Die Distanzfunktion, die für diesequery verwendet werden kann. Wählen Sie je nach der verwendeten Distanzfunktion eine der folgenden Optionen aus:
Beim Erstellen des Index:
L2-Distanz:
<->Inneres Produkt:
<#>Kosinus-Distanz:
<=>
EMBEDDING: Der Einbettungsvektor, für den Sie die nächsten gespeichertensemantische Nachbarn von.
ROW_COUNT: Die Anzahl der zurückzugebenden Zeilen.Geben Sie
1an, wenn Sie nur das beste Ergebnis erhalten möchten.
Weitere Beispiele für Abfragen finden Sie unter
Sie können auch die Funktion embedding() verwenden, um den
Text in einen Vektor. Sie wenden den Vektor auf eine der folgenden
pgvector-Operator für den nächsten Nachbarn, <-> für die L2-Distanz, um die Datenbankzeilen mit den
die semantisch ähnlichsten Einbettungen.
Da embedding() ein real-Array zurückgibt, müssen Sie den
embedding()-Aufruf in vector umwandeln, um diese Werte mit pgvector zu verwenden
Operatoren.
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
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 den Vertex AI Model Garden verwenden, geben Sie
text-embedding-005als 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 abzufragenden Modells. Stellen Sie@dem Tag voran.Wenn Sie eines der englischen
text-embedding-Modelle mit Vertex AI verwenden, geben Sie eines der Versionstags 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, was zu unerwarteten Ergebnissen führen kann.
TEXT: Der Text, der in eine Vektoreinbettung übersetzt werden soll.
Nächste Schritte
- Beispiel für einen Einbettungsworkflow
- Leistung von Vektorabfragen abstimmen
- Messwerte für Vektorindexe