Kosten für KI-Funktionen optimieren

In diesem Dokument wird beschrieben, wie Sie den optimierten Modus für verwaltete KI-Funktionen in BigQuery verwenden. In diesem Modus können Sie umfangreiche Datasets mit Tausenden oder sogar Milliarden von Zeilen verarbeiten. Dabei wird im Vergleich zur standardmäßigen Large Language Model (LLM)-Inferenz pro Zeile die Anzahl der LLM-Tokens deutlich reduziert und die Abfragelatenz verringert.

Im folgenden Beispiel wird veranschaulicht, wie Sie die Funktion AI.CLASSIFY im optimierten Modus verwenden, um Nachrichtenartikel mit text-embedding-005 als Einbettungsmodell zu kategorisieren:

SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other'],
    embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
    -- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
    optimization_mode => 'MINIMIZE_COST'
   ) AS category
FROM
  `bigquery-public-data.bbc_news.fulltext`;

Mit dem Argument optimization_mode => 'MINIMIZE_COST' wird der optimierte Modus aktiviert. Dies ist die Standardeinstellung, wenn Einbettungen bereitgestellt werden. Sie können dieses Argument also weglassen.

In diesem Beispiel werden Einbettungen spontan generiert. In der Praxis empfehlen wir, Einbettungen zu materialisieren, damit sie wiederverwendet werden können.

Funktionsweise des optimierten Modus

Die verwalteten KI-Funktionen AI.IF und AI.CLASSIFY rufen in der Regel für jede Zeile in Ihrem Dataset ein externes LLM auf. Wenn Sie den optimierten Modus verwenden, trainiert BigQuery während der Abfrageausführung automatisch ein leichtgewichtiges, komprimiertes Modell.

Der Prozess funktioniert so:

Workflow für KI-Funktionen, wenn der optimierte Modus aktiviert ist

  • Stichprobenerhebung und Labeling: BigQuery wählt eine kleine repräsentative Stichprobe Ihrer Daten aus und ruft Gemini auf, um Labels bereitzustellen.
  • Training des destillierten Modells: Ein lokales destilliertes Modell wird Just-in-Time mit den LLM-Labels und Dateneinbettungen als Features trainiert.
  • Qualitätsprüfung: BigQuery vergleicht die Genauigkeit des destillierten Modells mit den Ergebnissen des LLM. Wenn das destillierte Modell den erforderlichen Qualitätsschwellenwert nicht erreicht, schlägt die Anfrage standardmäßig mit einer Fehlermeldung fehl, in der erklärt wird, warum das Modell verworfen wurde. Wenn das Modell eine akzeptable Qualität hat, greift BigQuery möglicherweise trotzdem für bestimmte Zeilen auf das Remote-LLM zurück, um eine gleichbleibende Qualität zu gewährleisten, oder für Zeilen, in denen keine gültigen Einbettungen vorhanden sind.
  • Inference: Das destillierte Modell verarbeitet die meisten Zeilen, wodurch die Anzahl der Gemini-Aufrufe erheblich reduziert wird.

Beschränkungen

Für den optimierten Modus gelten die folgenden Einschränkungen:

  • Mindestanzahl von Zeilen: Die Eingabe für die KI-Funktion muss etwa 3.000 Zeilen enthalten,damit genügend Daten für das Modelltraining vorhanden sind.
  • Datentypen: Bei Prompts, die auf mehrere Spalten verweisen, werden für die Optimierung nur Stringspalten unterstützt.
  • Klassifizierung mit mehreren Labels: AI.CLASSIFY mit output_mode => 'multi' wird im optimierten Modus nicht unterstützt.
  • Funktionsunterstützung: Nur die Funktionen AI.IF und AI.CLASSIFY unterstützen den optimierten Modus.
  • Fehlerverhältnis: Das Argument max_error_ratio wird im optimierten Modus nicht unterstützt.

Hinweis

Informationen zum Erteilen der Berechtigungen, die zum Ausführen von verwalteten KI-Funktionen in BigQuery erforderlich sind, finden Sie unter Berechtigungen für generative KI-Funktionen festlegen, die Vertex AI-LLMs aufrufen.

Einbettungsmodell auswählen

Wenn Sie den optimierten Modus verwenden möchten, müssen Sie Einbettungen für Ihre Daten berechnen und der KI-Funktion zur Verfügung stellen. Damit Eingabespalten zugeordnete Einbettungen haben, müssen alle Zeilen einheitliche Einbettungsdimensionen aufweisen und vom selben Einbettungsmodell generiert werden.

Für ein optimales Kosten-Qualitäts-Verhältnis und eine optimale Skalierbarkeit empfehlen wir, Einbettungen für Ihre Daten mit einem Einbettungsmodell wie text-embedding-005 oder den Gemini-Einbettungen für englische oder mehrsprachige Aufgaben zu berechnen. Verwenden Sie für multimodale Daten (Text und Bilder) ein multimodales Einbettungsmodell wie multimodalembedding@001.

Einbettungen generieren

Sie können Einbettungen für Ihre Daten mithilfe der autonomen Generierung durch BigQuery berechnen lassen oder die Einbettungsspalten manuell erstellen. In den folgenden Abschnitten wird beschrieben, wie Sie beide Ansätze mit den Funktionen AI.CLASSIFY und AI.IF verwenden.

Autonome Generierung von Einbettungen

Wenn Sie die autonome Generierung von Einbettungen verwenden, verwendet BigQuery die Einbettungen automatisch, wenn AI.IF oder AI.CLASSIFY aufgerufen werden. Dies ist die empfohlene Methode, sie ist jedoch auf eine Einbettungsspalte pro Tabelle beschränkt.

Im folgenden Beispiel wird eine Tabelle mit einer autonom generierten Spalte für Einbettungen erstellt. Dabei wird text-embedding-005 als Einbettungsmodell verwendet. Anschließend werden die Daten mit der Funktion AI.CLASSIFY kategorisiert:

-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
  title STRING,
  body STRING,
  body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
    GENERATED ALWAYS AS (
      AI.EMBED(
        body,
        connection_id => '<my_connection_id>',
        task_type => 'CLASSIFICATION',
        endpoint => 'text-embedding-005')
    ) STORED
    OPTIONS(asynchronous = TRUE)
);

-- Insert data into the table
INSERT INTO my_dataset.bbc_news (title, body)
SELECT title, body FROM `bigquery-public-data.bbc_news.fulltext`;

-- Run the optimized query.
-- Wait for the background job to finish generating embeddings before running.
SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other']
  ) AS category
FROM
  my_dataset.bbc_news;

Manuelle Spaltenspezifikation

Wenn Sie eine vorhandene Spalte mit Einbettungen haben, geben Sie sie im Argument embeddings von AI.IF oder AI.CLASSIFY an. Sie können diese mit der Funktion AI.EMBED generieren.

Im folgenden Beispiel wird gezeigt, wie Sie eine Tabelle mit einer Einbettungsspalte erstellen, wobei text-embedding-005 als Einbettungsmodell verwendet wird. Anschließend wird diese Spalte in einer AI.CLASSIFY-Abfrage verwendet:

-- Create a table with an embedding column
CREATE TABLE my_dataset.bbc_news AS
SELECT
  title,
  body,
  AI.EMBED(
    body,
    endpoint => 'text-embedding-005',
    task_type => 'CLASSIFICATION'
  ).result AS body_embedding
FROM
  `bigquery-public-data.bbc_news.fulltext`;

-- Run the optimized query
SELECT
  title,
  body,
  AI.CLASSIFY(
    body,
    categories => ['tech', 'sport', 'business', 'other'],
    embeddings => body_embedding,
  ) AS category
FROM
  my_dataset.bbc_news;

Wenn in Ihrem Prompt auf mehrere Spalten verwiesen wird, geben Sie im Argument embeddings eine Liste der Spaltennamen und der entsprechenden Einbettungen an. Beispiel: embeddings => [('body', body_embedding), ('title', title_embedding)].

Abfrageoptimierung überwachen

Wenn Sie prüfen möchten, wie viele Zeilen während der Ausführung Ihrer Abfrage optimiert wurden, können Sie sich die Ausführungsstatistiken in der Google Cloud Console oder über die API ansehen:

Console

So sehen Sie, wie viele Zeilen optimiert wurden, und rufen Systemmeldungen zum Optimierungsstatus auf:

  1. Rufen Sie in der Google Cloud Console die Seite BigQuery auf.

    BigQuery aufrufen

  2. Klicken Sie im Navigationsmenü auf Jobs Explorer.

  3. Klicken Sie auf die Job-ID, um den Bereich Jobdetails aufzurufen.

  4. Klicken Sie auf den Tab Jobinformationen und sehen Sie sich die Messwerte und den Status im Feld Optimierungen für KI-Funktionen an.

    Feld „Optimierungen für Funktionen der generativen KI“ auf dem Tab „Jobinformationen“

API

Prüfen Sie FunctionGenAiCostOptimizationStats im GenAIFunctionStats-Objekt der Jobmetadaten. Dieses Objekt enthält die Anzahl der Zeilen, die durch den optimierten Workflow abgeleitet wurden, sowie vom System generierte Meldungen, die Aufschluss über den Optimierungsstatus geben.

Fehlerbehebung

In den folgenden Abschnitten wird erläutert, wie Sie häufige Probleme bei der Verwendung des optimierten Modus diagnostizieren und beheben können.

Die Datengröße ist zu klein.

Problem: Unzureichende Daten für das Modelltraining. Möglicherweise wird die folgende Fehlermeldung angezeigt: Fail to apply cost optimization because the data size is too small.

Lösung: Erhöhen Sie die Größe Ihrer Eingabe auf etwa 3.000 Zeilen und prüfen Sie,ob für alle Zeilen gültige Einbettungen generiert wurden.

Wenige oder keine Stichproben in einigen Klassen

Problem: Während der Stichprobenphase ist die Anzahl der Stichproben für bestimmte Kategorien nicht ausreichend, was das Modelltraining verhindert. Möglicherweise wird die folgende Fehlermeldung angezeigt: Fail to apply cost optimization because some classes have few or no samples.

Lösung:

  • Entfernen Sie seltene oder leere Kategorien aus dem AI.CLASSIFY-Funktionsaufruf.
  • Fassen Sie seltene Kategorien in einer umfassenderen Kategorie zusammen, um die Stichprobengröße zu erhöhen. Mit der Kategorie OTHER können Sie Elemente gruppieren, die nicht von spezifischeren Kategorien abgedeckt werden. Fügen Sie OTHER jedoch nicht hinzu, wenn Ihre Liste der Kategorien bereits vollständig ist, da dieser Begriff mehrdeutig ist und zu Verwirrung führen kann.

Einbettungen haben inkonsistente Dimensionen

Problem: Inkonsistenzen zwischen Einbettungsdimensionen in verschiedenen Zeilen. Möglicherweise wird die folgende Fehlermeldung angezeigt: Fail to apply cost optimization because the embeddings have inconsistent dimensions.

Lösung: Prüfen Sie, ob die Einbettungen vom selben Modell generiert wurden und dieselbe Einbettungsvektorlänge haben. Mit einer SQL-Abfrage wie der folgenden können Sie prüfen, ob die Einbettungen in einer Spalte dieselbe Länge haben:

SELECT ARRAY_LENGTH(body_embedding.result), COUNT(*)
FROM `PROJECT_ID.DATASET.TABLE_NAME`
GROUP BY 1;

Die Komplexität des Prompts ist zu hoch

Problem: Das destillierte Modell kann keinen hohen Genauigkeitsschwellenwert erreichen. Möglicherweise wird die folgende Fehlermeldung angezeigt: Fail to apply cost optimization because the prompt complexity is too high.

Lösung:

  • Verwenden Sie eine Reihe von Kategorien, die eine Partition bilden. Achten Sie darauf, dass sich die Kategorien möglichst wenig überschneiden und alle möglichen Eingaben abdecken.

    • Vermeiden Sie sich überschneidende Kategorien, in die eine Eingabe gleichzeitig fallen könnte. Vermeiden Sie beispielsweise Kategorien wie ['terrible', 'bad', 'okay', 'good', 'excellent'].
    • Vermeiden Sie Lücken, in denen keine Kategorien zutreffen. Die Liste der Kategorien ['bad', 'average'] deckt beispielsweise keine Rezension ab, in der Lob geäußert wird.
    • Geben Sie Kategoriebeschreibungen an, um das LLM bei der Auflösung von Unklarheiten zwischen Kategorien zu unterstützen. Beispiel:

      AI.CLASSIFY(
        review,
        categories => [
          ('terrible', 'Review where customer was not happy and the message indicates they will never try this product again'),
          ('bad', 'Review where customer was not happy but suggested improvements to the product'),
          ('okay', 'Review where customer was neutral about the product. Short reviews qualify for this category'),
          ('good', 'Review where customers were happy using this product but had minor critiques'),
          ('excellent', 'Review where customers were very happy using this product and will recommend others to try it too')],
        embeddings => review_embeddings)
      
  • Verwenden Sie komplexere Einbettungsmodelle wie text-embedding-005 oder multimodalembedding.

  • Wenden Sie sich an bqml-feedback@google.com, um weitere Unterstützung beim Debuggen zu erhalten.

Unerwartete Anzahl von Zeilen, die vom LLM verarbeitet wurden

Problem: Die Statistiken zur Ausführung von Abfragen zeigen, dass eine unerwartet hohe Anzahl von Zeilen vom Remote-LLM anstelle des komprimierten Modells verarbeitet wurde. Das kann folgende Gründe haben:

  • Das destillierte Modell wurde erfolgreich trainiert, aber für einige Zeilen fehlen die Einbettungen. Diese Zeilen werden vom Remote-LLM verarbeitet.
  • Das komprimierte Modell konnte nicht für jede Zeile angewendet werden und musste auf das Remote-LLM zurückgreifen, um eine gleichbleibende Qualität zu gewährleisten.

Lösung: Prüfen Sie, ob Einbettungen ordnungsgemäß generiert wurden und für alle Zeilen in Ihren Daten gültig sind. Sollte das Problem weiterhin bestehen, wenden Sie sich zur Fehlerbehebung an bqml-feedback@google.com.

Autonome Spalte für Einbettung nicht erkannt

Problem: BigQuery kann keine autonome Spalte für Einbettungen erkennen. Das kann passieren, wenn in Ihrem Skript eine temporäre Tabelle verwendet wird und der Verweis auf die Originaltabelle verloren geht.

Lösung: Verwenden Sie den Parameter embeddings, um explizit eine autonome Spalte für Einbettungen zu übergeben, z. B. embeddings => content_embedding.result. Dadurch wird die Kostenoptimierung ausgelöst.

Nächste Schritte