ScaNN-Index erstellen

Mit ScaNN-Indizes (Scalable Nearest Neighbors) in AlloyDB for PostgreSQL können Sie die ungefähre Vektorsuche nach dem nächsten Nachbarn in gespeicherten Einbettungen beschleunigen.

Der ScaNN-Index ist ein von Google entwickelter, baumbasierter Quantisierungsindex für die Suche nach dem ungefähren nächsten Nachbarn. Im Vergleich zu HNSW ist die Indexerstellung schneller und der Speicherbedarf geringer. Außerdem bietet es im Vergleich zu HNSW je nach Arbeitslast eine höhere Abfragerate pro Sekunde.

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.

    Wenn Sie versuchen, einen ScaNN-Index für eine leere oder partitionierte Tabelle zu erstellen, können Probleme auftreten. Weitere Informationen zu den generierten Fehlern finden Sie unter Fehlerbehebung bei ScaNN-Indexfehlern. Informationen zum Erstellen eines Index für eine leere oder kleine Tabelle finden Sie unter Verzögerte Indexerstellung für leere oder fast leere Tabellen.

  • Die Erweiterungen vector und alloydb_scann sind installiert:

    CREATE EXTENSION IF NOT EXISTS alloydb_scann CASCADE;
    

    Wenn Sie die Erweiterung alloydb_scann installieren, wird automatisch geprüft, ob die Erweiterung vector installiert ist. Falls nicht, wird sie installiert. Sie müssen vector nicht manuell installieren.

  • Wenn Sie einen ScaNN-Index mit vier Ebenen erstellen möchten, müssen Sie zuerst die Vorschau-Funktion für Ihre AlloyDB-Instanz aktivieren. Wählen Sie eine der folgenden beiden Methoden aus, um die Vorabversion zu aktivieren:

Automatisch optimierten Index erstellen

Automatisch optimierte ScaNN-Indizes vereinfachen die Indexerstellung, da AlloyDB die Indexstruktur verwalten und optimieren kann. Wenn Sie eine detaillierte Kontrolle über die Indexoptimierung benötigen, erstellen Sie einen manuell optimierten ScaNN-Index.

Automatisch abgestimmte Indexe können auf zwei Arten optimiert werden:

  • (Standard) Recall und Latenz der Vektorsuche auf Kosten der Index-Build-Dauer
  • Build-Dauer des Index und Suchleistung ausgleichen

Führen Sie den folgenden Befehl aus, um einen automatisch optimierten ScaNN-Index zu erstellen.

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)

Ersetzen Sie Folgendes:

  • INDEX_NAME: Name des Index, den Sie erstellen möchten. Beispiel: my_scann_index. Indexnamen gelten für die gesamte Datenbank. Prüfen Sie, ob jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.

  • TABLE: Tabelle, der der Index hinzugefügt werden soll.

  • EMBEDDING_COLUMN: Spalte, in der vector-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

Mit diesem Befehl wird ein ScaNN-Index erstellt, der für die Suchleistung optimiert ist und eine automatische Indexwartung durchführt. Wenn Sie eine dieser Einstellungen ändern möchten, führen Sie den folgenden Befehl aus:

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (MODE='AUTO',
      OPTIMIZATION='OPTIMIZATION',
      auto_maintenance='AUTO_MAINTENANCE')

Ersetzen Sie Folgendes:

  • INDEX_NAME: Name des Index, den Sie erstellen möchten. Beispiel: my_scann_index. Indexnamen gelten für die gesamte Datenbank. Prüfen Sie, ob jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.

  • TABLE: Tabelle, der der Index hinzugefügt werden soll.

  • EMBEDDING_COLUMN: Spalte, in der vector-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

  • (Optional) OPTIMIZATION: Legen Sie dafür Folgendes fest:

    • (Standard) SEARCH_OPTIMIZED: Optimiert sowohl die Trefferquote als auch die Latenz der Vektorsuche, was zu längeren Indexerstellungszeiten führt.

    • BALANCED: Ausgewogenes Verhältnis zwischen Indexerstellungszeit und Suchleistung.

    Wenn OPTIMIZATION festgelegt ist, muss auch MODE='AUTO' enthalten sein.

  • (Optional) AUTO_MAINTENANCE: Steuert, ob die automatische Wartung des Index aktiviert oder deaktiviert ist. Weitere Informationen zur automatischen Wartung finden Sie unter Vektorindexe verwalten.

    • (Standard) ON: AlloyDB führt eine automatische Wartung des Index durch.

    • OFF: AlloyDB führt keine automatische Wartung des Index durch.

Manuell optimierten Index erstellen

Wenn Ihre Anwendung bestimmte Anforderungen an die Rückruf- und Indexerstellungszeiten hat, können Sie den ScaNN-Index manuell erstellen und optimieren.

Informationen zum manuellen Erstellen eines ScaNN-Index für eine Spalte mit gespeicherten Vektoreinbettungen finden Sie in den folgenden Befehlen.

Zweistufiger Baumindex

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (mode='MANUAL',
      num_leaves=NUM_LEAVES_VALUE,
      quantizer=QUANTIZER,
      auto_maintenance=AUTO_MAINTENANCE);
  • INDEX_NAME: Name des Index, den Sie erstellen möchten. Beispiel: my_scann_index. Die Indexnamen werden in Ihrer Datenbank freigegeben. Achten Sie darauf, dass jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.
  • TABLE: Tabelle, der der Index hinzugefügt werden soll.
  • EMBEDDING_COLUMN: Spalte, in der „vector“-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: Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Kann auf einen beliebigen Wert zwischen 1 und 30 Millionen festgelegt werden. Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter ScaNN-Index abstimmen.
  • QUANTIZER: Der zu verwendende Quantisierungstyp. Der ScaNN-Index kann in die spaltenbasierte Engine geladen werden, um die Vektorsuche weiter zu beschleunigen. Wählen Sie eine der folgenden Optionen aus:
    • (Standard) SQ8: bietet ein ausgewogenes Verhältnis zwischen Abfrageleistung und minimalem Recall-Verlust. Dieser Wert liegt normalerweise unter 1–2%.
    • Vorabversion AH: Asymmetrisches Hashing (AH) ist im Vergleich zu SQ8 bis zu viermal komprimierter. Wenn die spaltenorientierte Engine aktiviert ist und die Index- und Tabellendaten in die spaltenorientierte Engine eingefügt werden, kann dies die Abfrageleistung potenziell verbessern. Weitere Informationen finden Sie unter Best Practices für die Optimierung von ScaNN.
    • FLAT: bietet den höchsten Recall (99% oder höher), allerdings auf Kosten der Suchleistung.
  • (Optional) AUTO_MAINTENANCE: Steuert, ob die automatische Wartung des Index aktiviert oder deaktiviert ist. Weitere Informationen zur automatischen Wartung finden Sie unter Vektorindexe verwalten.
    • (Standard) ON: AlloyDB führt eine automatische Wartung des Index durch.
    • OFF: In AlloyDB wird keine automatische Wartung des Index durchgeführt.

Baumindex mit drei Ebenen

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (mode='MANUAL',
      num_leaves=NUM_LEAVES_VALUE,
      quantizer=QUANTIZER,
      auto_maintenance=AUTO_MAINTENANCE,
      max_num_levels = 2);
  • INDEX_NAME: Name des Index, den Sie erstellen möchten. Beispiel: my_scann_index. Die Indexnamen werden in Ihrer Datenbank freigegeben. Achten Sie darauf, dass jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.
  • TABLE: Tabelle, der der Index hinzugefügt werden soll.
  • EMBEDDING_COLUMN: Spalte, in der „vector“-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: Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Kann auf einen beliebigen Wert zwischen 1 und 30 Millionen festgelegt werden. Weitere Informationen dazu, wie Sie diesen Wert festlegen, finden Sie unter ScaNN-Index abstimmen.
  • QUANTIZER: Der zu verwendende Quantisierungstyp. Der ScaNN-Index kann in die spaltenbasierte Engine geladen werden, um die Vektorsuche weiter zu beschleunigen. Wählen Sie eine der folgenden Optionen aus:
    • (Standard) SQ8: bietet ein ausgewogenes Verhältnis zwischen Abfrageleistung und minimalem Recall-Verlust. Das sind in der Regel weniger als 1–2%.
    • Vorschau AH: Asymmetrisches Hashing (AH) ist im Vergleich zu SQ8 bis zu viermal stärker komprimiert. Wenn die spaltenorientierte Engine aktiviert ist und die Index- und Tabellendaten in die spaltenorientierte Engine eingefügt werden, sollten Sie dies für eine potenziell bessere Abfrageleistung in Betracht ziehen. Weitere Informationen finden Sie unter Best Practices für die Optimierung von ScaNN.
    • FLAT: bietet den höchsten Recall (99% oder höher), allerdings auf Kosten der Suchleistung.
  • (Optional) AUTO_MAINTENANCE: Steuert, ob die automatische Wartung des Index aktiviert oder deaktiviert ist. Weitere Informationen zur automatischen Wartung finden Sie unter Vektorindexe verwalten.
    • (Standard) ON: AlloyDB führt automatische Wartungsarbeiten am Index durch.
    • OFF: AlloyDB führt keine automatische Wartung des Index durch.
  • max_num_levels = 2: die maximale Anzahl von Zentroid-Ebenen des K-Means-Clustering-Baums. Legen Sie diesen Parameter auf 2 fest, um einen dreistufigen Index zu erstellen.

Baumindex mit vier Ebenen

CREATE INDEX INDEX_NAME ON TABLE
       USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (mode='MANUAL',
      num_leaves=NUM_LEAVES_VALUE,
      quantizer=QUANTIZER,
      auto_maintenance=AUTO_MAINTENANCE,
      max_num_levels = 3);
  • INDEX_NAME: Name des Index, den Sie erstellen möchten. Beispiel: my_scann_index. Die Indexnamen gelten für die gesamte Datenbank. Achten Sie darauf, dass jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.
  • TABLE: Tabelle, der der Index hinzugefügt werden soll.
  • EMBEDDING_COLUMN: Spalte, in der „vector“-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: Anzahl der Partitionen, die auf diesen Index angewendet werden sollen. Kann auf einen beliebigen Wert zwischen 1 und 30 Millionen festgelegt werden. Weitere Informationen dazu, wie Sie diesen Wert auswählen, finden Sie unter ScaNN-Index abstimmen.
  • QUANTIZER: Der zu verwendende Quantisierungstyp. Der ScaNN-Index kann in die spaltenbasierte Engine geladen werden, um die Vektorsuche weiter zu beschleunigen. Wählen Sie eine der folgenden Optionen aus:
    • (Standard) SQ8: bietet ein ausgewogenes Verhältnis zwischen Abfrageleistung und minimalem Recall-Verlust. Das sind in der Regel weniger als 1–2%.
    • Vorabversion AH: Asymmetrisches Hashing (AH) ist im Vergleich zu SQ8 bis zu viermal komprimierter. Wenn die spaltenbasierte Engine aktiviert ist und die Index- und Tabellendaten in die spaltenbasierte Engine eingefügt werden, sollten Sie dies für eine potenziell bessere Abfrageleistung in Betracht ziehen. Weitere Informationen finden Sie unter Best Practices für die Optimierung von ScaNN.
    • FLAT: bietet den höchsten Recall (99% oder höher), allerdings auf Kosten der Suchleistung.
  • (Optional) AUTO_MAINTENANCE: Steuert, ob die automatische Wartung des Index aktiviert oder deaktiviert ist. Weitere Informationen zur automatischen Wartung finden Sie unter Vektorindexe verwalten.
    • (Standard) ON: AlloyDB führt automatische Wartungsarbeiten am Index durch.
    • OFF: In AlloyDB wird keine automatische Wartung des Index durchgeführt.
  • max_num_levels = 3: die maximale Anzahl von Schwerpunkt-Ebenen im K-Means-Clustering-Baum. Legen Sie diesen Parameter auf 3 fest, um einen Index mit vier Ebenen zu erstellen.

Manuell optimierten Index in einen automatisch optimierten Index umwandeln

So konvertieren Sie einen manuell optimierten Index in einen automatisch optimierten Index:

  1. Setzen Sie alle Suchparameter zurück, die für Ihren manuell optimierten Index definiert sind.

    ALTER INDEX INDEX_NAME RESET (PARAMETER_NAME);
    

    Ersetzen Sie die folgenden Variablen:

    • INDEX_NAME: Name des Index, den Sie konvertieren möchten. Beispiel: my_scann_index. Indexnamen werden in Ihrer Datenbank freigegeben. Prüfen Sie, ob jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.

    • PARAMETER_NAME: durch Kommas getrennte Liste mit den Namen der Suchparameter, die Sie zurücksetzen möchten. Beispiel: num_leaves, quantization.

      Beachten Sie, dass Sie alle anderen Suchparameter zurücksetzen müssen, bevor Sie num_leaves zurücksetzen.

  2. Indexieren Sie Ihren manuell optimierten Index neu, um ihn in einen automatisch optimierten Index umzuwandeln.

    REINDEX INDEX CONCURRENTLY INDEX_NAME;
    

ScaNN-Index für real[]-Datentypen erstellen

Wenn Sie einen 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)

Ersetzen Sie Folgendes:

  • INDEX_NAME: Name des Index, den Sie erstellen möchten. Beispiel: my_scann_index. Indexnamen gelten für die gesamte Datenbank. Prüfen Sie, ob jeder Indexname für jede Tabelle in Ihrer Datenbank eindeutig ist.

  • TABLE: Tabelle, der der Index hinzugefügt werden soll.

  • DIMENSIONS: Die Anzahl der Dimensionen, die vom Modell unterstützt werden.

  • EMBEDDING_COLUMN: Spalte, in der vector-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

Indexierungsfortschritt ansehen

Verwenden Sie zum Anzeigen des Indexierungsfortschritts die pg_stat_progress_create_index-Ansicht:

SELECT * FROM pg_stat_progress_create_index;

In der Spalte phase sehen Sie den aktuellen Status der Indexerstellung. Nach Abschluss der Indexerstellung ist die Zeile für den Index nicht mehr sichtbar.

Verzögerten Index für leere Tabellen oder Tabellen mit unzureichenden Zeilen erstellen

Standardmäßig können Sie keinen ScaNN-Index für eine Tabelle erstellen, die leer ist oder weniger Zeilen als der Wert der Indexoption num_leaves hat.

Um diese Einschränkung zu umgehen, aktivieren Sie die verzögerte Indexerstellung. Dadurch kann AlloyDB die Indexerstellung verzögern, bis die Anzahl der Zeilen in der Tabelle den von num_leaves definierten Grenzwert erreicht. Nach Erreichen des Schwellenwerts startet AlloyDB die Indexerstellung im Hintergrund.

Dieser verzögerte Vorgang ist ein nicht blockierender Prozess, sodass andere Datenbankvorgänge wie Lese- und Schreibvorgänge ohne Unterbrechung fortgesetzt werden können. Da der Index im Hintergrund neu erstellt wird, eignet sich die zurückgestellte Indexerstellung, wenn Tabellen Datenzeilen in kleinen Batches aufnehmen. Die Indexneuerstellung wird automatisch ausgelöst, nachdem die Anzahl der Zeilen den Schwellenwert erreicht hat.

Wenn Sie jedoch eine große Anzahl von Zeilen in einer einzelnen Transaktion in die Tabelle einfügen möchten, empfehlen wir, die Transaktion in mehrere Transaktionen aufzuteilen oder einen ScaNN-Index zu generieren, ohne die zurückgestellte Indexerstellung zu aktivieren.

Zurückgestellte Indexerstellung aktivieren

So aktivieren Sie die zurückgestellte Indexerstellung:

  1. Achten Sie darauf, dass das Flag scann.enable_index_maintenance und eines der folgenden Flags aktiviert sind:

    Verwenden Sie die gcloud-Befehlszeile, um die Nutzung zu konfigurieren:

    • So aktivieren Sie die zurückgestellte Indexerstellung zusammen mit anderen Funktionen in der Vorabversion:

      gcloud alloydb instances update INSTANCE_ID \
         --database-flags scann.enable_index_maintenance=on \
         --database-flags scann.enable_preview_features=on \
         --region=REGION_ID \
         --cluster=CLUSTER_ID \
         --project=PROJECT_ID
      
    • So aktivieren Sie die verzögerte Indexerstellung explizit, ohne andere Vorabfunktionen zu aktivieren:

      gcloud alloydb instances update INSTANCE_ID \
         --database-flags scann.enable_index_maintenance=on \
         --database-flags scann.enable_index_with_insufficient_data=on \
         --region=REGION_ID \
         --cluster=CLUSTER_ID \
         --project=PROJECT_ID
      

    Ersetzen Sie Folgendes:

    • INSTANCE_ID: Die ID der Instanz.
    • REGION_ID: Die Region, in der die Instanz platziert wird, z. B. us-central1.
    • CLUSTER_ID: Die ID des Clusters, in dem sich die Instanz befindet.
    • PROJECT_ID: Die ID des Projekts, in dem sich der Cluster befindet.
  2. ScaNN-Index erstellen:

    • Wenn Sie einen automatisch optimierten Index erstellen möchten, geben Sie WITH (MODE='AUTO') explizit in der CREATE INDEX-Anweisung an:

      CREATE INDEX INDEX_NAME ON TABLE
             USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
      WITH (MODE='AUTO')
      

      Weitere Informationen zu den Parametern finden Sie unter Automatisch optimierten Index erstellen.

    • Wenn Sie einen manuell optimierten Index erstellen möchten, muss der Parameter auto_maintenance auf on festgelegt sein. Weitere Informationen finden Sie unter Manuell optimierten Index erstellen.

Beschränkungen

  • Der Hintergrundprozess für die automatische Indexerstellung verwendet Flag-Werte auf Datenbankebene. Auch wenn Sie mit dem Befehl SET LOCAL Flags auf Sitzungsebene festlegen, wird der auf Datenbankebene festgelegte Flag-Wert berücksichtigt.
  • Wenn Sie eine große Datenmenge in einer einzelnen Transaktion im Bulk-Verfahren in eine leere Tabelle einfügen möchten, empfehlen wir, die einzelne Einfügetransaktion auszuführen und dann einen ScaNN-Index zu erstellen.

Indexerstellung für leere oder kleine Tabellen erzwingen

AlloyDB verwendet Validierungen, um die Erstellung eines ScaNN-Index für eine leere Tabelle oder eine Tabelle mit sehr wenigen Zeilen zu verhindern. Das hat folgende Gründe:

  • Der ScaNN-Index wird mit unzureichenden Daten trainiert. Dies kann zu einem schlechten Recall bei Vektorsuchen nach Ähnlichkeit führen.

  • Die Schreibleistung für die Datenbank kann sich verschlechtern.

Wir empfehlen, die Indexerstellung zu verschieben, wenn die Leistung nicht optimal ist.

In einigen Entwicklungs- oder Testszenarien müssen Sie jedoch möglicherweise einen Index für eine leere oder kleine Tabelle erstellen. In diesen Fällen können Sie die Indexerstellung erzwingen. Hinweis: Das Erzwingen der Indexerstellung erfordert SUPERUSER-Berechtigungen.

So erzwingen Sie die Indexerstellung:

  1. Legen Sie den Parameter scann.allow_blocked_operations auf Sitzungsebene in der Datenbank auf true fest:

    SET scann.allow_blocked_operations = true;
    
  2. Wenn der Nutzer, mit dem Sie diese Abfragen ausführen, nicht die Berechtigung SUPERUSER hat, weisen Sie sie ihm zu:

    CREATE USER USERNAME WITH SUPERUSER PASSWORD PASSWORD;
    

    Ersetzen Sie die folgenden Variablen:

    • USERNAME: Name des Nutzers, dem Sie SUPERUSER-Berechtigungen gewähren möchten.
    • PASSWORD: Das Passwort des Nutzers.

Indexe parallel erstellen

Je nach Dataset und Art des Index, den Sie erstellen möchten, kann AlloyDB automatisch mehrere parallele Worker starten, um den Index schneller zu erstellen. Dies wird häufig ausgelöst, wenn Sie einen ScaNN-Index mit drei oder vier Ebenen erstellen oder Ihr Dataset mehr als 100 Millionen Zeilen umfasst.

Obwohl AlloyDB die Anzahl der parallelen Worker automatisch optimiert, können Sie die parallelen Worker mit den folgenden PostgreSQL-Parametern für die Abfrageplanung anpassen:

Damit beim Erstellen des ScaNN-Index keine Probleme mit dem Arbeitsspeicher auftreten, müssen die Datenbank-Flags maintenance_work_mem und shared_buffers auf einen Wert festgelegt sein, der kleiner als der gesamte Arbeitsspeicher der Maschine ist.

Abfrage ausführen

Nachdem Sie die Einbettungen in Ihrer Datenbank gespeichert und indexiert haben, können Sie Ihre Daten abfragen. Mit der alloydb_scann-Erweiterung können keine Bulk-Suchanfragen ausgeführt werden.

Wenn Sie die semantisch nächsten Nachbarn für einen Textstring finden möchten, können Sie die Funktion google_ml.embedding() verwenden, um den Text in einen Vektor zu übersetzen.

Da google_ml.embedding() ein echtes Array zurückgibt, müssen Sie den Funktionsaufruf explizit in vector umwandeln, bevor Sie ihn auf einen der Nearest-Neighbor-Operatoren anwenden, z. B. <-> für die L2-Distanz. Diese Operatoren können dann den ScaNN-Index verwenden, um die Datenbankzeilen mit den semantisch ähnlichsten Einbettungen zu finden.

SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY
  google_ml.embedding(
      model_id => 'MODEL_ID',
      content => 'CONTENT')::vector
LIMIT ROW_COUNT

Ersetzen Sie die folgenden Variablen:

  • TABLE: Tabelle, die die Einbettung enthält, mit der der Text verglichen werden soll.

  • EMBEDDING_COLUMN: Spalte mit den gespeicherten Einbettungen.

  • DISTANCE_FUNCTION_QUERY: Die Distanzfunktion, die für diese Abfrage verwendet werden soll. Wählen Sie das Abfrageäquivalent für die Distanzfunktion aus, die Sie beim Erstellen des Index verwendet haben:

    • L2-Distanz: <->

    • Inneres Produkt: <#>

    • Kosinus-Distanz: <=>

  • MODEL_ID: ID des registrierten Einbettungsmodells, das Sie verwenden möchten.

  • CONTENT: Der Textstring, den Sie in eine Einbettung übersetzen und nach dem Sie suchen möchten.

  • ROW_COUNT: Anzahl der zurückzugebenden Zeilen. Geben Sie beispielsweise 1 an, wenn Sie nur das beste Ergebnis erhalten möchten.

Nächste Schritte