In diesem Abschnitt wird beschrieben, wie Sie Vorhersagen aufrufen und Einbettungen mit der pgvector-Erweiterung abfragen und indexieren. Diese KI-Funktionen, die auf maschinellem Lernen basieren, sind über AlloyDB AI verfügbar. AlloyDB AI ist eine Reihe von AlloyDB for PostgreSQL-Funktionen, mit denen Sie die semantischen und prädiktiven Möglichkeiten von ML-Modellen (maschinelles Lernen) auf Ihre Daten anwenden können.
Weitere Informationen zu AlloyDB AI finden Sie unter https://cloud.google.com//alloydb/docs/ai.
Vorhersagen aufrufen
So binden Sie Vertex AI in AlloyDB Omni ein und führen Vorhersagen für in Vertex AI gespeicherte Modelle aus:
Hinweise
- Vertex AI-Onlinevorhersagen in GDC aktivieren
Erstellen Sie mit dem folgenden Befehl ein Kubernetes-Secret basierend auf dem Dienstkontoschlüssel, der in den vorherigen Schritten heruntergeladen wurde. Achten Sie darauf, dass Sie das Kubernetes-Secret im selben Namespace wie Ihre
DBCluster
-Ressource erstellen.kubectl create secret generic SECRET_NAME \ --from-file=PATH_TO_SERVICE_ACCOUNT_KEY/private-key.json \ -n NAMESPACE
Ersetzen Sie Folgendes:
SECRET_NAME
: Der Name des Secrets, das beim Erstellen einesDBCluster
-Manifests verwendet wird, damit AlloyDB Omni auf Distributed Cloud AI-Funktionen zugreifen kann. Beispiel:vertex-ai-key-alloydb
PATH_TO_SERVICE_ACCOUNT_KEY
: Der Pfad zum Speicherort, an dem Sie denprivate-key.json
-Dienstkontoschlüssel heruntergeladen haben.NAMESPACE
: der Namespace des Datenbankclusters.
Installieren Sie den AlloyDB Omni-Operator anhand der Schritte unter Datenbankmodul auswählen und Datenbankcluster erstellen.
Erstellen Sie einen Datenbankcluster mit AlloyDB AI und legen Sie
vertexAIKeyRef
auf das Kubernetes-Secret fest, das in den vorherigen Schritten im FeldgoogleMLExtension
imDBCluster
-Manifest erstellt wurde.apiVersion: v1 kind: Secret metadata: name: db-pw-DBCLUSTER_NAME namespace: USER_PROJECT type: Opaque data: DBCLUSTER_NAME: "BASE64_PASSWORD" --- apiVersion: DBENGINE_NAME.dbadmin.gdc.goog/v1 kind: DBCluster metadata: name: DBCLUSTER_NAME namespace: USER_PROJECT spec: primarySpec: adminUser: passwordRef: name: db-pw-DBCLUSTER_NAME features: googleMLExtension: config: vertexAIKeyRef: SECRET_NAME version: "DB_VERSION" resources: memory: DB_MEMORY cpu: DB_CPU disks: - name: DataDisk size: DB_DATA_DISK
Ersetzen Sie die folgenden Variablen:
DBCLUSTER_NAME
: der Name des Datenbankclusters.USER_PROJECT
: Der Name des Nutzerprojekts, in dem der Datenbankcluster erstellt wird.BASE64_PASSWORD
: Die Base64-Codierung des Administratorpassworts der Datenbank.DBENGINE_NAME
: der Name der Datenbank-Engine. Setze dies aufalloydbomni
.DB_VERSION
: die Version des Datenbankmoduls.DB_MEMORY
: die Größe des Arbeitsspeichers, der dem Datenbankcluster zugewiesen ist, z. B.5Gi
.DB_CPU
: Die Anzahl der CPUs, die dem Datenbankcluster zugewiesen sind, z. B.2
.DB_DATA_DISK
: die Menge an Speicherplatz, die dem Datenbankcluster zugewiesen ist, z. B.10 Gi
.
Wenden Sie das Manifest an.
kubectl apply -f DB_CLUSTER_YAML
Ersetzen Sie Folgendes:
DB_CLUSTER_YAML
: Der Name dieser Manifestdatei für den Datenbankcluster, z. B.alloydb-omni-db-cluster.yaml
.
Installieren Sie die
google_ml_integration
-Erweiterung.CREATE EXTENSION google_ml_integration CASCADE;
Vorhersage aufrufen
Rufen Sie eine Onlinevorhersage mit einem Vertex AI-Modellendpunkt auf, indem Sie die folgende SQL-Funktion ml_predict_row()
ausführen:
SELECT ml_predict_row('PREDICTION_ENDPOINT/PROJECT_NAMESPACE/ORGANIZATION/ZONE/DNS/DNS_SUFFIX', '{ "instances": [ INSTANCES ], "parameters":
PARAMETERS');
Ersetzen Sie Folgendes:
PREDICTION_ENDPOINT
: Der qualifizierte Name des Vertex AI-Endpunkts.PROJECT_NAMESPACE
: Der Namespace, in dem der Vertex AI-Endpunkt bereitgestellt wird.ORGANIZATION
: Der Name der Organisation, in der der Vertex AI-Endpunkt bereitgestellt wird.ZONE
: die Zone, in der Ihr Vertex AI-Endpunkt bereitgestellt wirdDNS
: die DNS-Einträge für Ihre OrganisationDNS_SUFFIX
: das Suffix des DNS-ObjektsINSTANCES
: Die Eingaben für den Vorhersageaufruf im JSON-FormatPARAMETERS
: Die Parameter für den Vorhersageaufruf im JSON-Format
Einbettungen mit pgvector abfragen und indexieren
Mit der PostgreSQL-Erweiterung pgvector
können Sie vektorspezifische Operatoren und Funktionen verwenden, wenn Sie Texteinbettungen in Ihrer Datenbank speichern, indexieren und abfragen.
AlloyDB bietet Optimierungen für die Arbeit mit pgvector
, mit denen Sie Indexe erstellen können, die bestimmte Abfragen mit Einbettungen beschleunigen.
Weitere Informationen zur Verwendung von AlloyDB als LLM sowie zum Generieren und Speichern von Vektoreinbettungen auf Grundlage eines LLM finden Sie unter https://cloud.google.com/alloydb/docs/ai/work-with-embeddings#index.
Indexe erstellen und Vektoren mit ScaNN abfragen
In diesem Abschnitt erfahren Sie, wie Sie gespeicherte Einbettungen verwenden, um Index- und Anfrageeinbettungen zu generieren. Sie können ScaNN
-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 Erweiterungpostgres_ann
.CREATE EXTENSION IF NOT EXISTS postgres_ann;
ScaNN
-Index erstellen
Sie können einen ScaNN
-Index für Tabellen in Ihrer Datenbank erstellen.
AlloyDB postgres_ann
, eine von Google entwickelte PostgreSQL-Erweiterung, die einen hocheffizienten Nearest-Neighbor-Index implementiert, der auf dem ScaNN-Algorithmus basiert.
Der ScaNN
-Index ist ein baumbasierter Quantisierungsindex für die Suche nach dem ungefähren nächsten Nachbarn. Die Indexerstellung dauert nur kurz und der Speicherbedarf ist gering. Außerdem bietet es schnelle QPS basierend auf der Arbeitslast.
ScaNN
-Index mit zweistufigem Baum
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 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:
l2
Skalarprodukt:
dot_product
Kosinus-Distanz:
cosine
NUM_LEAVES_VALUE
: Die Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Kann auf einen beliebigen Wert zwischen 1 und 1.048.576 festgelegt werden.
Dreistufiger Baumindex ScaNN
Führen Sie die folgende DDL-Abfrage aus, um einen dreistufigen Baumindex mit dem ScaNN-Algorithmus für eine Spalte 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 im K-Means-Clustering-Baum. Legen Sie1
(Standard) für die zweistufige baumbasierte Quantisierung und2
fü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 nach nächsten Nachbarn mit einem bestimmten Text erstellen.
Die Indexparameter müssen so festgelegt werden, dass ein gutes Gleichgewicht zwischen QPS und Recall erreicht wird.
Wenn Sie diesen Index für eine Einbettungsspalte erstellen möchten, die den Datentyp real[]
anstelle von vector
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.
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 index: tree training
wird nach der Indexerstellung nicht mehr angezeigt.
Abfrage ausführen
Nachdem Sie Embeddings in Ihrer Datenbank gespeichert und indexiert haben, können Sie mit der pgvector
-Abfragefunktion beginnen. Mit der postgres_ann
-Erweiterung können keine Bulk-Suchanfragen ausgeführt werden.
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 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 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 das beste Ergebnis erhalten möchten.
Sie können auch die embedding()
-Funktion verwenden, um den Text in einen Vektor zu übersetzen. Sie wenden den Vektor auf einen der pgvector
-Operatoren für den nächsten Nachbarn an, <->
für die L2-Distanz, um die Datenbankzeilen mit den semantisch ähnlichsten Einbettungen zu finden. Hinweis: Sie müssen das Texteinbettungsmodell „Gecko“ zuerst registrieren, um diese Funktion verwenden zu können.
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.
CREATE EXTENSION 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
textembedding-gecko@003
als Modell-ID an. Dies sind die cloudbasierten Modelle, die von Distributed Cloud für Texteinbettungen verwendet werden können.Optional:
VERSION_TAG
: das Versionstag des abzufragenden Modells. Stellen Sie dem Tag@
voran.Wenn Sie eines der
textembedding-gecko
-Modelle in englischer Sprache mit Vertex AI verwenden, geben Sie eines der Versions-Tags an, z. B.textembedding-gecko@003
.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.
Messwerte für Vektorindex
In diesem Abschnitt werden die Messwerte für die Vektorindexe aufgeführt, die Sie in AlloyDB generieren. Sie können diese Messwerte in der pg_stat_ann_indexes
-Ansicht aufrufen, die bei der Installation der postgres_ann
-Erweiterung verfügbar ist.
Messwerte zur Nutzerfreundlichkeit
Die Messwerte zur Nutzerfreundlichkeit umfassen Messwerte, mit denen Sie den Status der Indexnutzung nachvollziehen können, z. B. die Indexkonfiguration und die Anzahl der Indexscans.
Messwertname | Datentyp | Beschreibung |
---|---|---|
relid |
OID |
Eindeutige Kennung der Tabelle, die den Vektorindex enthält. |
indexrelid |
OID |
Eindeutige Kennung des Vektorindex. |
schemaname |
NAME |
Name des Schemas, zu dem der Index gehört. |
relname |
NAME |
Der Name der Tabelle, die den Index enthält. |
indexrelname |
NAME |
Name des Index. |
indextype |
NAME |
Typ des Index. Dieser Wert ist immer auf postgres_ann festgelegt. |
indexconfig |
TEXT[] |
Konfiguration, z. B. Anzahl der Blätter und Quantisierer, die für den Index bei seiner Erstellung definiert wurden. |
indexsize |
TEXT |
Größe des Index. |
indexscan |
BIGINT |
Anzahl der für den Index initiierten Indexscans. |
Messwerte für die Abstimmung
Mit den Tuning-Messwerten erhalten Sie Informationen zur aktuellen Indexoptimierung. So können Sie Empfehlungen für eine schnellere Abfrageleistung anwenden.
Messwertname | Datentyp | Beschreibung |
---|---|---|
insertcount |
BIGINT |
Anzahl der Einfügevorgänge im Index. Dieser Messwert umfasst auch eine beliebige Anzahl von Zeilen, die vor der Erstellung des Index vorhanden waren. |
updatecount |
BIGINT |
Anzahl der Aktualisierungsvorgänge für den Index. Bei diesem Messwert werden keine HOT-Updates berücksichtigt. |
deletecount |
BIGINT |
Anzahl der Löschvorgänge für den Index. |
distribution |
JSONB |
Vektorverteilungen für alle Partitionen für den Index. In den folgenden Feldern wird die Verteilung angezeigt:
Hinweis:Aufgrund der inhärenten Eigenschaften des K-Means-Clustering-Algorithmus gibt es immer eine gewisse Varianz in der Verteilung von Vektoren auf Partitionen, auch wenn der Index ursprünglich erstellt wird. |
Empfehlung zur Optimierung basierend auf den Messwerten
- Mutation
- Die Messwerte
insertcount
,updatecount
unddeletecount
geben zusammen die Änderungen oder Mutationen im Vektor für den Index an. - Der Index wird mit einer bestimmten Anzahl von Vektoren und Partitionen erstellt. Wenn Vorgänge wie „insert“, „update“ oder „delete“ für den Vektorindex ausgeführt werden, wirkt sich das nur auf die ursprüngliche Gruppe von Partitionen aus, in denen sich die Vektoren befinden. Daher schwankt die Anzahl der Vektoren in jeder Partition im Laufe der Zeit, was sich möglicherweise auf den Recall, die QPS oder beides auswirkt.
- Wenn Sie im Laufe der Zeit bei Ihren ANN-Suchanfragen auf Probleme mit der Geschwindigkeit oder Genauigkeit stoßen, z. B. eine niedrige QPS oder einen schlechten Recall, sollten Sie diese Messwerte überprüfen. Eine hohe Anzahl von Mutationen im Verhältnis zur Gesamtzahl der Vektoren kann darauf hindeuten, dass eine Neuindexierung erforderlich ist.
- Verteilung
- Der Messwert
distribution
zeigt die Vektorverteilungen für alle Partitionen. - Wenn Sie einen Index erstellen, wird er mit einer bestimmten Anzahl von Vektoren und festen Partitionen erstellt. Die Partitionierung und die anschließende Verteilung erfolgen auf Grundlage dieser Überlegung. Wenn zusätzliche Vektoren hinzugefügt werden, werden sie auf die vorhandenen Partitionen aufgeteilt. Das führt zu einer anderen Verteilung als bei der Erstellung des Index. Da bei der endgültigen Verteilung nicht alle Vektoren gleichzeitig berücksichtigt werden, kann sich dies auf den Recall, die Anzahl der Anfragen pro Sekunde oder beides auswirken.
- Wenn Sie einen allmählichen Rückgang der Leistung Ihrer ANN-Suchanfragen feststellen, z. B. langsamere Reaktionszeiten oder eine geringere Genauigkeit der Ergebnisse (gemessen an QPS oder Recall), sollten Sie diesen Messwert prüfen und neu indexieren.