Autonome Generierung von Einbettungen

In diesem Dokument wird beschrieben, wie Sie die autonome Einbettungsgenerierung für Ihre Daten verwenden, damit BigQuery eine Spalte mit Einbettungen in einer Tabelle auf Grundlage einer Quellspalte verwalten kann. Wenn Sie Daten in der Quellspalte hinzufügen oder ändern, generiert oder aktualisiert BigQuery die Einbettungsspalte für diese Daten automatisch mit einem Vertex AI-Einbettungsmodell. Das ist hilfreich, wenn Sie möchten, dass BigQuery Ihre Einbettungen verwaltet, wenn Ihre Quelldaten regelmäßig aktualisiert werden.

Einbettungen sind nützlich für moderne Anwendungen mit generativer KI wie Retrieval Augmented Generation (RAG), können aber komplex zu erstellen, zu verwalten und abzufragen sein. Mit der autonomen Generierung von Einbettungen können Sie den Prozess des Erstellens, Verwaltens und Abfragens von Einbettungen für die Verwendung in Ähnlichkeitssuchen und anderen generativen KI-Anwendungen vereinfachen.

Sie können beispielsweise Abfragen ähnlich den folgenden verwenden, um eine Tabelle mit aktivierter autonomer Einbettungsgenerierung zu erstellen, Daten einzufügen und dann eine semantische Suche durchzuführen:

CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(description, connection_id => 'us.example_connection',
        endpoint => 'text-embedding-005'))
    STORED OPTIONS( asynchronous = TRUE ));

# Values in the description_embedding column are automatically generated.
INSERT INTO mydataset.products (name, description) VALUES
  ("Super slingers"), ("An exciting board game for the whole family"), ...;

SELECT * FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");

Hinweise

Damit autonome Einbettungen für eine Tabelle generiert werden können, benötigen Sie die erforderlichen Berechtigungen und eine entsprechende Verbindung.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Aktivieren der autonomen Einbettungserstellung benötigen:

  • So verwenden Sie eine Verbindungsressource: BigQuery Connections User (roles/bigquery.connectionUser) für die Verbindung
  • So erstellen Sie eine Tabelle: BigQuery Data Editor (roles/bigquery.dataEditor) für die Tabelle
  • Weisen Sie dem Dienstkonto der Verbindung die folgende Rolle zu, damit es auf Modelle zugreifen kann, die in Vertex AI-Endpunkten gehostet werden: Vertex AI User (roles/aiplatform.user) für das Projekt mit der Verbindung

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Verbindung erstellen und Berechtigung für ein Dienstkonto erteilen

Wenn Sie die autonome Einbettungsgenerierung für eine Tabelle aktivieren möchten, müssen Sie eine Cloud-Ressourcenverbindung erstellen. Gewähren Sie dann dem Dienstkonto, das beim Erstellen der Verbindung erstellt wurde, die Rolle „Vertex AI-Nutzer“ (roles/aiplatform.user).

Tabelle mit autonomer Einbettungserstellung erstellen

Mit der autonomen Generierung von Einbettungen können Sie Einbettungen mit der AI.EMBED-Funktion in einer CREATE TABLE-Anweisung generieren.

CREATE TABLE DATASET_ID.TABLE (
  [COLUMN, ...]
  STRING_COL STRING,
  EMBEDDING_COL_NAME STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(
        STRING_COL,
        connection_id => CONNECTION_ID,
        endpoint => ENDPOINT)
    )
    STORED OPTIONS (asynchronous = TRUE)
);

Ersetzen Sie Folgendes:

  • DATASET_ID: Der Name des Datasets, in dem Sie die Tabelle erstellen möchten.
  • TABLE: Der Name der Tabelle, für die die autonome Einbettungsgenerierung erstellt werden soll.
  • COLUMN, ...: Alle Spalten, die Ihre Tabelle zusätzlich zu der Spalte enthalten soll, die automatisch eingebettet werden soll.
  • STRING_COL: Der Name der Spalte STRING, die automatisch eingebettet werden soll.
  • EMBEDDING_COL_NAME: Der Name der automatisch generierten Spalte für Einbettungen.
  • CONNECTION_ID: Ein STRING-Wert, der den Namen einer zu verwendenden Verbindung enthält, z. B. my_project.us.example_connection. Sie müssen dem Dienstkonto der Verbindung in dem Projekt, in dem Sie die Tabelle erstellen, die Rolle Vertex AI-Nutzer zuweisen.
  • ENDPOINT: ein STRING-Wert, der einen unterstützten Vertex AI-Endpunkt für das Texteinbettungsmodell angibt, der für das Texteinbettungsmodell verwendet werden soll. Der von Ihnen angegebene Endpunktwert muss die Modellversion enthalten, z. B. text-embedding-005. Wenn Sie den Modellnamen anstelle einer URL angeben, identifiziert BigQuery ML das Modell automatisch und verwendet den vollständigen Endpunkt des Modells.

Der Job zur Generierung von Hintergrund-Embeddings wird kurz nach dem Erstellen der Tabelle oder nach dem Aktualisieren von Daten in der Quellspalte gestartet.

Wenn Sie den Fortschritt der Einbettungsgenerierung verfolgen möchten, können Sie eine Abfrage wie die folgende verwenden:

SELECT
  COUNT(*) AS total_num_rows,
  COUNTIF(description_embedding IS NOT NULL
          AND description_embedding.status = '') AS total_num_generated_embeddings
FROM
  PROJECT_ID.DATASET_ID.TABLE;

Nachdem Sie die Tabelle mit den Einbettungen erstellt haben, können Sie einen Vektorindex für die Spalte STRUCT erstellen, die die automatisch generierte Einbettung enthält.

Beispiel

Angenommen, Sie sind ein großer Einzelhändler, der viele verschiedene Produkte verkauft. Sie haben eine Tabelle mit Produktnamen und ‑beschreibungen und möchten Ihren Kunden helfen, die gesuchten Produkte zu finden. Die folgenden Abfragen zeigen, wie Sie die automatische Einbettungserstellung einrichten, um die semantische Suche in Ihren Produktbeschreibungen zu unterstützen.

Erstellen Sie zuerst ein Dataset:

CREATE SCHEMA mydataset;

Erstellen Sie als Nächstes eine Tabelle mit aktivierter autonomer Einbettungserstellung, in der Ihre Produktinformationen gespeichert werden. Die automatisch generierte Spalte heißt description_embedding und basiert auf der Spalte description.

# Create a table of products and descriptions with a generated embedding column.
CREATE TABLE mydataset.products (
  name STRING,
  description STRING,
  description_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (AI.EMBED(
      description,
      connection_id => 'us.example_connection',
      endpoint => 'text-embedding-005'
    ))
    STORED OPTIONS( asynchronous = TRUE )
);

Mit der folgenden Abfrage werden einige Produktnamen und ‑beschreibungen in die Tabelle eingefügt. Sie geben keinen Wert für description_embedding an, da er automatisch generiert wird.

# Insert product descriptions into the table.
# The description_embedding column is automatically updated.
INSERT INTO mydataset.products (name, description) VALUES
  ("Lounger chair", "A comfortable chair for relaxing in."),
  ("Super slingers", "An exciting board game for the whole family."),
  ("Encyclopedia set", "A collection of informational books.");

Optional können Sie einen Vektorindex für die Tabelle erstellen, um die Suche zu beschleunigen. Für einen Vektorindex sind mehr als drei Zeilen erforderlich. Bei der folgenden Abfrage wird davon ausgegangen, dass Sie zusätzliche Daten eingefügt haben. Jedes Mal, wenn Sie Daten einfügen, wird die Spalte description_embedding automatisch aktualisiert.

CREATE VECTOR INDEX my_index
ON mydataset.products(description_embedding)
OPTIONS(index_type = 'IVF');

Schließlich können Sie die Funktion AI.SEARCH verwenden, um eine semantische Suche nach einem lustigen Spielzeug für Ihre Produkte durchzuführen:

# Search for products that are fun to play with.
SELECT base.name, base.description, distance
FROM AI.SEARCH(TABLE mydataset.products, 'description', "A really fun toy");

/*------------------+----------------------------------------------+----------------------+
 | name             | description                                  | distance             |
 +------------------+----------------------------------------------+----------------------+
 | Super slingers   | An exciting board game for the whole family. | 0.80954913893618929  |
 | Lounger chair    | A comfortable chair for relaxing in.         | 0.938933930620146    |
 | Encyclopedia set | A collection of informational books.         | 1.1119297739353384   |
 +------------------+----------------------------------------------+----------------------*/

Informationen zu automatisch generierten Spalten für Einbettungen

Wenn Sie prüfen möchten, ob eine Spalte eine automatisch generierte Einbettungsspalte ist, fragen Sie die INFORMATION_SCHEMA.COLUMNS-Ansicht ab.

Die folgende Abfrage enthält Informationen zu allen automatisch generierten Spalten für Einbettungen:

SELECT *
FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.COLUMNS
WHERE is_generated = 'ALWAYS';

Im Feld generation_expression sehen Sie den Aufruf der Funktion AI.EMBED, mit der die Einbettungen für die Spalte generiert werden.

Eigene Reservierung verwenden

Standardmäßig verwendet BigQuery On-Demand-Slots für die Verarbeitung, die zum Verwalten der generierten Spalte mit Einbettungen erforderlich ist. Wenn Sie für eine vorhersehbare und konsistente Leistung sorgen möchten, können Sie optional eine Reservierung erstellen und job_type auf BACKGROUND festlegen. Wenn eine Hintergrundreservierung vorhanden ist, verwendet BigQuery diese, um die generierte Spalte für Einbettungen zu verwalten.

Fehlerbehebung

Die generierte Spalte für Einbettungen enthält zwei Felder: result und status. Wenn beim Versuch von BigQuery, ein Embedding für eine bestimmte Zeile in Ihrer Tabelle zu generieren, ein Fehler auftritt, ist das Feld result auf NULL gesetzt und das Feld status beschreibt den Fehler. Wenn die Quellspalte beispielsweise NULL ist, ist die result-Einbettung ebenfalls NULL und der Status NULL value is not supported for embedding generation.

Ein schwerwiegenderer Fehler kann die Generierung von Einbettungen zum Stillstand bringen. In diesem Fall können Sie die Ansicht INFORMATION_SCHEMA.JOBS für den Hintergrundjob abfragen und sich die Informationen im Feld error_result ansehen. Die Job-ID eines Hintergrund-Embedding-Jobs hat das Präfix gc_. Mit der folgenden Abfrage werden beispielsweise alle Hintergrundjobs extrahiert, deren Fehlerergebnis nicht NULL ist:

SELECT * FROM `region-REGION.INFORMATION_SCHEMA.JOBS` j
WHERE EXISTS (
  SELECT 1
  FROM unnest(j.referenced_tables) t
  WHERE
    j.project_id = 'PROJECT_ID'
    AND t.dataset_id = 'DATASET_ID'
    AND t.table_id = 'TABLE'
)
AND starts_with(job_id, 'gc')
AND error_result IS NOT NULL
ORDER BY j.creation_time DESC;

Kosten im Blick behalten

Beim automatischen Generieren von Einbettungen werden Anfragen an Vertex AI gesendet, was Kosten verursachen kann. So verfolgen Sie die Vertex AI-Kosten, die durch Hintergrund-Embedding-Jobs anfallen:

  1. Abrechnungsberichte in Cloud Billing ansehen
  2. Verwenden Sie Filter, um die Ergebnisse einzugrenzen.

    Wählen Sie für Dienste Vertex AI aus.

  3. Wenn Sie die Gebühren für einen bestimmten Job sehen möchten, filtern Sie nach Label.

    Legen Sie den Schlüssel auf bigquery_ml_job und den Wert auf die Job-ID des Einbettungsjobs fest. Hintergrundjobs zum Einbetten haben alle das Präfix gc_.

Es kann bis zu 24 Stunden dauern, bis einige Gebühren in Cloud Billing angezeigt werden.

Beschränkungen

  • Jede Tabelle unterstützt maximal eine automatisch generierte Spalte für Einbettungen.
  • Es gibt keinen Hinweis darauf, dass eine Spalte automatisch generiert wird, wenn Sie das Schema einer Tabelle über die Google Cloud Console, den bq show-Befehl oder das Feld ddl der Ansicht INFORMATION_SCHEMA.TABLES aufrufen.
  • Sie können einer vorhandenen Tabelle mit ALTER TABLE ADD COLUMN keine generierten Spalten für Einbettungen hinzufügen.
  • Wenn Sie eine Kopie, einen Klon oder einen Snapshot einer Tabelle mit einer generierten Spalte für Einbettungen erstellen, werden nur die Daten kopiert. Die Konfiguration für die Generierung wird nicht auf die neue Tabelle angewendet und Aktualisierungen der Quellspalte der neuen Tabelle führen nicht zu neuen Einbettungen.
  • Wenn Sie eine Tabelle, für die die autonome Einbettungserstellung aktiviert war, aus einem Snapshot wiederherstellen, wird die Konfiguration für die Einbettungserstellung nicht wiederhergestellt.
  • Sie können generierte Einbettungsspalten nur mit SQL erstellen. Sie können die Befehle bq mk oder bq update nicht verwenden, um Spalten mit generierten Einbettungen zu erstellen.
  • Die Quellspalte der generierten Spalte muss eine STRING-Spalte sein.
  • Nachdem Sie die generierte Spalte für Einbettungen erstellt haben, gelten die folgenden Einschränkungen:

    • Sie können die Quellspalte nicht löschen oder umbenennen, aber die generierte Einbettungsspalte schon. Wenn Sie die Spalte mit den Einbettungen löschen, können Sie die Quellspalte löschen oder umbenennen.
    • Sie können den Datentyp der Quellspalte oder der generierten Spalte mit Einbettungen nicht ändern.
  • Sie können keine Standardwerte für automatisch generierte Einbettungsspalten angeben.

  • Sie können mit diesen Methoden nicht direkt in generierte Spalten für Einbettungen schreiben:

    • DML
    • Streaming-Schreibvorgänge
    • bq insert
    • bq copy -a
  • Tabellen mit generierten Spalten für Einbettungen unterstützen keine Sicherheitsrichtlinien auf Spaltenebene, z. B. Richtlinien-Tags.

  • Wenn Sie eine Suchfunktion wie VECTOR_SEARCH oder AI.SEARCH aufrufen, werden Zeilen mit fehlenden Einbettungen in der Basistabelle bei der Suche übersprungen.

  • Sie können keinen partitionierten Vektorindex für eine Tabelle erstellen, für die die autonome Einbettungsgenerierung aktiviert ist.

  • Wenn Sie einen Vektorindex für die automatisch generierte Spalte für Einbettungen erstellen, beginnt das Index-Training, nachdem für mindestens 80% der Zeilen Einbettungen generiert wurden. Mit der folgenden Abfrage können Sie prüfen, wie viel Prozent der Einbettungen in Ihrer Tabelle generiert wurden:

    SELECT
      COUNTIF(description_embedding IS NOT NULL
      AND description_embedding.status = '') * 100.0 / COUNT(*) AS percent
    FROM PROJECT_ID.DATASET_ID.TABLE;
    

Nächste Schritte