Optimiza los costos de las funciones de IA con la destilación de modelos

En este documento, se describe cómo usar el modo optimizado para las funciones de IA administradas en BigQuery. Puedes usar el modo optimizado para procesar conjuntos de datos a gran escala que contengan miles o incluso miles de millones de filas con un consumo de tokens de modelos de lenguaje grandes (LLM) y una latencia de consultas significativamente reducidos en comparación con la inferencia de LLM estándar por fila. Esta optimización solo se aplica a las funciones AI.IF y AI.CLASSIFY.

Si deseas establecer un límite en el consumo total de tokens para evitar que se exceda el presupuesto, en lugar de optimizar la eficiencia de los tokens de tus consultas, consulta Controla los costos con cuotas de tokens.

Para comprender mejor tu consumo de tokens, puedes ver la cantidad de tokens que usa una consulta en la consola deGoogle Cloud . Para estimar este uso antes de ejecutar una consulta, usa la función AI.COUNT_TOKENS.

En el siguiente ejemplo, se muestra cómo usar la función AI.IF con el modo optimizado para identificar artículos de noticias sobre desastres naturales, con text-embedding-005 como el modelo de incorporación:

SELECT
  title,
  body,
  AI.IF(
    ('The following news story is about a natural disaster: ', body),
    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 is_natural_disaster
FROM
  `bigquery-public-data.bbc_news.fulltext`;

El argumento optimization_mode => 'MINIMIZE_COST' habilita el modo optimizado. Este es el parámetro de configuración predeterminado cuando se proporcionan embeddings, por lo que puedes omitir este argumento.

En este ejemplo, los embeddings se generan sobre la marcha. En la práctica, te recomendamos que materialices los embeddings para que se puedan reutilizar.

Cómo funciona el modo optimizado

Las funciones IA administradas, AI.IF y AI.CLASSIFY, suelen llamar a un LLM remoto para cada fila de tu conjunto de datos. Cuando usas el modo optimizado, BigQuery entrena automáticamente un modelo ligero y sintetizado durante la ejecución de la consulta.

El proceso funciona de la siguiente manera:

Flujo de trabajo de la función IA cuando el modo optimizado está habilitado

  • Muestreo y etiquetado: BigQuery selecciona una pequeña muestra representativa de tus datos y llama a Gemini para que proporcione etiquetas.
  • Entrenamiento del modelo de destilación: Se entrena un modelo de destilación local justo a tiempo con las etiquetas del LLM y las incorporaciones de datos como atributos.
  • Verificación de calidad: BigQuery evalúa la exactitud del modelo destilado en comparación con los resultados del LLM. De forma predeterminada, si el modelo sintetizado no cumple con el umbral de calidad requerido, la consulta falla con un error que explica por qué se descartó el modelo. Si el modelo tiene una calidad aceptable, es posible que BigQuery recurra al LLM remoto para filas específicas con el objetivo de mantener una calidad coherente o para las filas que no tienen incorporaciones válidas.
  • Inferencia: El modelo sintetizado procesa la mayoría de las filas, lo que reduce de forma significativa la cantidad de llamadas a Gemini.

Limitaciones

El modo optimizado tiene las siguientes limitaciones:

  • Recuento mínimo de filas: La entrada a la función IA debe contener aproximadamente 3,000 filas para garantizar que haya suficientes datos para el entrenamiento de modelos.
  • Compatibilidad con funciones: Solo las funciones AI.IF y AI.CLASSIFY admiten el modo optimizado. Sin embargo, cuando se usa el modo optimizado con AI.CLASSIFY, las consultas pueden fallar si la calidad del modelo destilado es insuficiente.
  • Proporción de errores: El argumento max_error_ratio no se admite en el modo optimizado.

Antes de comenzar

Para obtener los permisos que necesitas para ejecutar funciones de IA administradas en BigQuery, consulta Establece permisos para las funciones de IA generativa que llaman a los LLM de Gemini Enterprise Agent Platform.

Elige un modelo de embedding

Para usar el modo optimizado, debes calcular los embeddings de tus datos y proporcionarlos a la función IA. Para que las columnas de entrada tengan incorporaciones asociadas, todas las filas deben tener dimensiones de incorporación coherentes y generarse con el mismo modelo de incorporación.

Para obtener la mejor relación costo-calidad y escalabilidad, te recomendamos calcular los embeddings de tus datos con un modelo de embeddings, como text-embedding-005 o los embeddings de Gemini para tareas en inglés o multilingües. Para los datos multimodales (texto e imágenes), te recomendamos usar un modelo de incorporación multimodal, como Gemini Embedding 2 (gemini-embedding-2).

Genera embeddings

Puedes calcular embeddings para tus datos con la generación autónoma administrada por BigQuery o creando de forma manual las columnas de embeddings. En las siguientes secciones, se describe cómo usar ambos enfoques con las funciones AI.CLASSIFY y AI.IF.

Generación de embeddings autónoma

Si usas la generación de embeddings autónoma, BigQuery usa automáticamente los embeddings cuando se llama a AI.IF o AI.CLASSIFY. Este es el enfoque recomendado, pero se limita a una columna de embedding por tabla.

En el siguiente ejemplo, se crea una tabla con una columna de incorporación generada de forma autónoma, con text-embedding-005 como el modelo de incorporación y, luego, se usa la función AI.CLASSIFY para categorizar los datos:

-- 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;

Especificación manual de columnas

Si tienes una columna de incorporaciones existente, especifícala en el argumento embeddings de AI.IF o AI.CLASSIFY. Puedes generarlo con la función AI.EMBED.

En el siguiente ejemplo, se muestra cómo crear una tabla con una columna de embedding, con text-embedding-005 como modelo de embedding y, luego, usar esa columna en una consulta de AI.CLASSIFY:

-- 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;

Si tu instrucción hace referencia a varias columnas, proporciona una lista de nombres de columnas y sus incorporaciones correspondientes en el argumento embeddings. Por ejemplo: embeddings => [('body', body_embedding), ('title', title_embedding)]

Supervisa la optimización de consultas

Para verificar cuántas filas se optimizaron durante la ejecución de la consulta, puedes ver las estadísticas de ejecución en la consola de Google Cloud o a través de la API:

Console

Para ver cuántas filas se optimizaron y ver los mensajes del sistema sobre el estado de optimización, haz lo siguiente:

  1. En la consola de Google Cloud , ve a la página BigQuery.

    Ir a BigQuery

  2. En el menú de navegación, haz clic en Explorador de trabajos.

  3. Haz clic en el ID de tarea para ver el panel Detalles de la tarea.

  4. Haz clic en la pestaña Información del trabajo y consulta las métricas y el estado en el campo Optimizaciones de funciones de IA generativa.

    Campo de optimizaciones de funciones de IA generativa en la pestaña de información del trabajo

API

Verifica el FunctionGenAiCostOptimizationStats en el objeto GenAIFunctionStats de los metadatos del trabajo. Este objeto incluye la cantidad de filas inferidas a través del flujo de trabajo optimizado y los mensajes generados por el sistema que proporcionan información sobre el estado de optimización.

Solucionar problemas

En las siguientes secciones, se explica cómo diagnosticar y resolver problemas habituales con el uso del modo optimizado.

El tamaño de los datos es demasiado pequeño

Problema: No hay datos suficientes para entrenamiento de modelos. Es posible que veas un mensaje de error como el siguiente: Fail to apply cost optimizations because the number of rows to process is too small.

Solución: Aumenta el tamaño de tu entrada al menos a la cantidad de filas que se muestran en el mensaje de error y verifica que se hayan generado correctamente incorporaciones válidas para todas las filas.

Pocas o ninguna muestra en algunas clases

Problema: Cantidad insuficiente de muestras para ciertas categorías o casos durante la fase de muestreo, lo que impide el entrenamiento de modelos.

  • En el caso de la función AI.CLASSIFY, es posible que veas un mensaje de error: Failed to apply cost optimizations because the random training sample did not contain enough examples of all categories.
  • En el caso de la función AI.IF, es posible que veas un mensaje de error: Failed to apply cost optimizations because the random training sample did not include enough examples of both true/false cases.

Solución:

  • Para AI.CLASSIFY:
    • Quita las categorías poco frecuentes o vacías de la llamada a función AI.CLASSIFY.
    • Agrupa las categorías poco frecuentes en una más amplia para aumentar el tamaño de la muestra. Puedes usar una categoría OTHER para agrupar elementos que no se incluyen en categorías más específicas. Sin embargo, no agregues OTHER si tu lista de categorías ya está completa, ya que este término es ambiguo y puede causar confusión.
  • Para AI.IF, actualiza la condición de filtro de la instrucción para que los casos true y false estén bien representados en las filas de entrada. Una condición que coincida con casi todas las filas, o casi ninguna, puede causar este error.

Los embeddings tienen dimensiones incoherentes

Problema: Incoherencias entre las dimensiones de incorporación en las filas. Es posible que veas un mensaje de error: Failed to apply cost optimizations because the embeddings have inconsistent dimensions.

Solución: Verifica que todos los embeddings se generen con el mismo modelo y tengan la misma longitud de vector de embedding. Puedes usar una consulta en SQL similar a la siguiente para verificar que los embeddings de una columna tengan la misma longitud:

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

La complejidad de la instrucción es demasiado alta

Problema: El modelo destilado no puede alcanzar un umbral de precisión alta. Tal vez veas alguno de los siguientes mensajes de error:

  • Fail to apply cost optimizations because the distilled model does not approximate LLM behavior well enough for some categories.
  • Fail to apply cost optimization because the prompt complexity is too high.

Solución:

  • Si en el mensaje de error se enumeran categorías con puntuaciones F1 bajas, enfócate primero en esas categorías. Define mejor sus nombres y descripciones para que se distingan claramente de las otras categorías.

  • Usa un conjunto de categorías que formen una partición. Asegúrate de que las categorías tengan una superposición mínima y abarquen todas las entradas posibles.

    • Evita las categorías superpuestas en las que una entrada podría pertenecer a varias categorías de forma simultánea. Por ejemplo, evita categorías como ['terrible', 'bad', 'okay', 'good', 'excellent'].
    • Evita dejar espacios en blanco donde no se apliquen categorías. Por ejemplo, la lista de categorías ['bad', 'average'] no abarca una opinión que exprese elogios.
    • Proporciona descripciones de categorías para guiar al LLM a resolver la ambigüedad entre categorías. Por ejemplo:

      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)
      
  • Prueba modelos de incorporación más avanzados, como text-embedding-005 o gemini-embedding-2.

  • Comunícate con bqml-feedback@google.com para obtener asistencia adicional para la depuración.

Cantidad inesperada de filas procesadas por el LLM

Problema: Las estadísticas de ejecución de consultas muestran que el LLM remoto procesó una cantidad inesperadamente alta de filas en lugar del modelo destilado. Esto podría deberse a los siguientes motivos:

  • El modelo destilado se entrenó correctamente, pero algunas filas tenían incorporaciones faltantes. El LLM remoto procesa estas filas.
  • No se pudo aplicar el modelo destilado para cada fila y se tuvo que recurrir al LLM remoto para mantener una calidad coherente.

Solución: Verifica que los embeddings se generen correctamente y sean válidos para todas las filas de tus datos. Si el problema persiste, comunícate con bqml-feedback@google.com para depurarlo.

No se detectó la columna de embedding autónomo

Problema: BigQuery no puede detectar una columna de embedding autónoma. Esto puede ocurrir si tu secuencia de comandos usa una tabla temporal y se pierde la referencia a la tabla original.

Solución: Usa el parámetro embeddings para pasar de forma explícita una columna de embedding autónoma, por ejemplo, embeddings => content_embedding.result, que activa la optimización de costos.

¿Qué sigue?