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 ScaNN
-, IVF
-, IVFFlat
- und HNSW
-Indizes mit AlloyDB erstellen.
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;
Wenn Sie
ScaNN
-Indizes 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
, ein
Von Google entwickelte PostgreSQL-Erweiterung, die eine hoch
effizienter Index für die Suche nach dem nächsten Nachbarn, der auf [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 ungefähre
Suche nach dem nächsten Nachbarn. Dadurch wird die Indexerstellung beschleunigt und die
Speicherbedarf im Vergleich zu HNSW
. Außerdem bietet sie schnellere QPS in
Vergleich mit HNSW
basierend auf der Arbeitslast.
eine Tabelle in Ihrer AlloyDB-Datenbank. Wenn Sie versuchen, einen ScaNN
-Index zu generieren,
auf eine leere oder partitionierte Tabelle anwenden, 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
Führen Sie die folgende DDL-Abfrage aus, um eine Tabelle mit gespeicherten Vektoreinbettungen zu erstellen:
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 werden weitergegebenin 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 dervector
gespeichert wird.transaktionale und relationale Daten.
DISTANCE_FUNCTION
: die zu verwendende Distanzfunktionmit diesem Index. Wählen Sie eine der folgenden Optionen aus:
L2-Distanz:
l2
Skalarprodukt:
dot_product
Kosinus-Distanz:
cosine
NUM_LEAVES_VALUE
: Die Anzahl der anzuwendenden Partitionendiesem Index. Kann auf einen beliebigen Wert zwischen 1 und 1.048.576 festgelegt werden. Weitere Informationen
Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter
ScaNN
-Index optimieren.
Dreistufiger Baumindex ScaNN
So erstellen Sie einen dreistufigen Baumindex mit dem ScaNN-Algorithmus für eine Spalte:
Führen Sie die folgende DDL-Abfrage aus, um eine Tabelle mit gespeicherten Vektoreinbettungen zu erstellen:
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 desK-Means-Clustering-Baum. Auf
1
(Standard) für zweistufige baumbasierteQuantisierung und
2
für die baumbasierte Quantisierung mit drei Ebenen.
Nachdem Sie den Index erstellt haben, können Sie Abfragen für die Suche nach nächsten Nachbarn ausführen, die
Verwenden Sie den Index, indem Sie der Anleitung unter [Make a nearest-neighbor
mit dem angegebenen Text abfragen](#query).
Die Indexparameter müssen so festgelegt werden, dass ein ausgewogenes Verhältnis zwischen QPS und
Recall Weitere Informationen zum Optimieren des ScaNN
-Index finden Sie unter [ScaNN
-Index optimieren].
index](/alloydb/omni/kubernetes/15.7.0/docs/ai/tune-indexes).
So erstellen Sie diesen Index für eine Einbettungsspalte, die den Datentyp real[]
verwendet:
Wandeln Sie die Spalte anstelle von vector
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 des
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).
So rufen Sie den Indexierungsfortschritt auf:pg_stat_progress_create_index
SELECT * FROM pg_stat_progress_create_index;
In der Spalte phase
sehen Sie den aktuellen Status der Indexerstellung.
Die building index: tree training
-Phase wird ausgeblendet, nachdem der Index erstellt wurde.
Informationen zum Optimieren des Index für ein bestimmtes Gleichgewicht zwischen Recall und QPS finden Sie unter ScaNN
-Index optimieren.
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 die 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
Suchen Sie mit der alloydb_scann
-Erweiterung nach mehreren Begriffen gleichzeitig.
Wenn Sie die semantisch nächsten Nachbarn für einen Einbettungsvektor ermitteln möchten, können Sie die
Im folgenden Beispiel wird dieselbe Distanzfunktion festgelegt, 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 mit dem Embedding, mit dem verglichen werden sollSMS senden.
INDEX_NAME
: Der Name des Index, den Sie verwenden möchten.Beispiel:
my-scann-index
EMBEDDING_COLUMN
: die Spalte mit den gespeichertenEinbettungen.
DISTANCE_FUNCTION_QUERY
: Die Distanzfunktion, die dafür verwendet werden soll.query verwendet werden kann. Wählen Sie je nach verwendeter Distanzfunktion eine der folgenden Optionen aus:
Beim Erstellen des Index:
L2-Distanz:
<->
Skalarprodukt:
<#>
Kosinus-Distanz:
<=>
EMBEDDING
: Der Einbettungsvektor, für den Sie den nächsten gespeichertensemantische Nachbarn von.
ROW_COUNT
: Die Anzahl der zurückzugebenden Zeilen.Geben Sie
1
an, 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
Text in einen Vektor. Sie wenden den Vektor auf eine der folgenden
pgvector
-Nearest-Neighbor-Operator, <->
für die L2-Distanz, um die Datenbankzeilen mit den
die semantisch ähnlichsten Einbettungen.
Da embedding()
ein real
-Array zurückgibt, müssen Sie das
embedding()
-Aufruf an vector
, 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-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 Versionstag des abzufragenden Modells. Stellen Sie dem Tag@
voran.Wenn Sie eines der
text-embedding
-Modelle in englischer Sprache mit Vertex AI verwenden, geben Sie eines der Versionstags an, z. B.text-embedding-005
, das in Modellversionen aufgeführt ist.Google empfiehlt dringend, immer das Versionstag anzugeben. Wenn Sie das Versionstag 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 optimieren
- Messwerte für Vektorindexe