Generación de inserciones autónoma

En este documento se describe cómo usar la generación de inserciones autónoma para sus datos, lo que permite a BigQuery mantener una columna de inserciones en una tabla basada en una columna de origen. Cuando añades o modificas datos en la columna de origen, BigQuery genera o actualiza automáticamente la columna de inserción de esos datos mediante un modelo de inserción de Vertex AI. Esto es útil si quieres que BigQuery mantenga tus inserciones cuando tus datos de origen se actualicen periódicamente.

Las incrustaciones son útiles para las aplicaciones de IA generativa modernas, como la generación aumentada de recuperación (RAG), pero pueden ser complejas de crear, gestionar y consultar. Puedes usar la generación de inserciones autónoma para simplificar el proceso de creación, mantenimiento y consulta de inserciones para usarlas en búsquedas de similitud y otras aplicaciones de IA generativa.

Por ejemplo, puede usar consultas similares a las siguientes para crear una tabla con la generación de embeddings autónoma habilitada, insertar datos y, a continuación, realizar una búsqueda semántica:

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

Antes de empezar

Para habilitar la generación autónoma de incrustaciones en una tabla, debes tener los permisos y la conexión necesarios.

Roles obligatorios

Para obtener los permisos que necesitas para habilitar la generación autónoma de inserciones, pide a tu administrador que te conceda los siguientes roles de IAM:

  • Para usar un recurso de conexión, haz lo siguiente: Usuario de conexiones de BigQuery (roles/bigquery.connectionUser) en la conexión
  • Para crear una tabla, sigue estos pasos: Editor de datos de BigQuery (roles/bigquery.dataEditor) en la tabla
  • Asigna a la cuenta de servicio de la conexión el siguiente rol para que pueda acceder a los modelos alojados en los endpoints de Vertex AI: Usuario de Vertex AI (roles/aiplatform.user) en el proyecto que tiene la conexión

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.

También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Crear una conexión y conceder permiso a una cuenta de servicio

Para habilitar la generación de inserciones autónoma en una tabla, debes crear una conexión de recurso de Cloud. A continuación, concede el rol Usuario de Vertex AI (roles/aiplatform.user) a la cuenta de servicio que se creó cuando creaste la conexión.

Crear una tabla con generación de inserciones autónoma

Puedes usar la generación de embeddings autónoma para generar embeddings mediante la función AI.EMBED en una instrucción CREATE TABLE.

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

Haz los cambios siguientes:

  • DATASET_ID: Nombre del conjunto de datos en el que quieres crear la tabla.
  • TABLE: Nombre de la tabla en la que se va a crear la generación de inserciones autónoma.
  • COLUMN, ...: las columnas que debe contener la tabla, además de la columna que quieras insertar automáticamente.
  • STRING_COL: el nombre de la columna STRING que quieras insertar automáticamente.
  • EMBEDDING_COL_NAME: el nombre de la columna de inserción generada automáticamente.
  • CONNECTION_ID: valor STRING que contiene el nombre de una conexión que se va a usar, como my_project.us.example_connection. Debes asignar el rol Usuario de Vertex AI a la cuenta de servicio de la conexión en el proyecto en el que crees la tabla.
  • ENDPOINT: un valor STRING que especifica un endpoint de modelo de inserción de texto de Vertex AI compatible que se va a usar para el modelo de inserción de texto. El valor del endpoint que especifique debe incluir la versión del modelo, por ejemplo, text-embedding-005. Si especificas el nombre del modelo en lugar de una URL, BigQuery ML identificará automáticamente el modelo y usará el endpoint completo del modelo.

La tarea de generación de la inserción en segundo plano se inicia poco después de crear la tabla o de actualizar los datos de la columna de origen.

Para monitorizar el progreso de la generación de la inserción, puedes usar una consulta similar a la siguiente:

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;

Después de crear la tabla con las inserciones, puedes crear un índice vectorial en la columna STRUCT que contiene la inserción generada automáticamente.

Ejemplo

Supongamos que es un gran comercio que vende muchos productos diferentes. Tiene una tabla con nombres y descripciones de productos, y quiere ayudar a sus clientes a encontrar los productos que buscan. Las siguientes consultas muestran cómo configurar la generación autónoma de inserciones para ayudar con la búsqueda semántica de las descripciones de tus productos.

Primero, crea un conjunto de datos:

CREATE SCHEMA mydataset;

A continuación, crea una tabla con la generación de inserciones autónoma habilitada para almacenar la información de tus productos. La columna que se genera automáticamente se llama description_embedding y se basa en la columna 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 )
);

La siguiente consulta inserta algunos nombres y descripciones de productos en la tabla. No especifica ningún valor para description_embedding porque se genera automáticamente.

# 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.");

También puedes crear un índice vectorial en la tabla para acelerar las búsquedas. Un índice vectorial requiere más de tres filas, por lo que la siguiente consulta presupone que has insertado datos adicionales. Cada vez que insertas datos, la columna description_embedding se actualiza automáticamente.

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

Por último, puedes usar la función AI.SEARCH para hacer una búsqueda semántica de tus productos y encontrar un juguete divertido:

# 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   |
 +------------------+----------------------------------------------+----------------------*/

Obtener información sobre las columnas de inserción generadas automáticamente

Para verificar que una columna es una columna de inserciones generada automáticamente, consulta la vista INFORMATION_SCHEMA.COLUMNS.

La siguiente consulta muestra información sobre todas las columnas de inserciones generadas automáticamente:

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

El campo generation_expression muestra la llamada a la función AI.EMBED que se usa para generar las inserciones en la columna.

Usar tu propia reserva

De forma predeterminada, BigQuery usa slots bajo demanda para gestionar el procesamiento necesario para mantener la columna de inserciones generada. Para que el rendimiento sea predecible y constante, puedes crear una reserva y definir el job_type en BACKGROUND. Cuando hay una reserva en segundo plano, BigQuery la usa para mantener la columna de inserciones generada.

Solución de problemas

La columna de inserciones generada contiene dos campos: result y status. Si se produce un error cuando BigQuery intenta generar una inserción para una fila concreta de tu tabla, el campo result será NULL y el campo status describirá el error. Por ejemplo, si la columna de origen es NULL, la inserción result también es NULL y el estado es NULL value is not supported for embedding generation.

Si el error es más grave, se puede detener la generación de la inserción. En este caso, puedes consultar la vista INFORMATION_SCHEMA.JOBS del trabajo en segundo plano y buscar la información en el campo error_result. El ID de una tarea de inserción en segundo plano tiene el prefijo gc_. Por ejemplo, la siguiente consulta extrae todas las tareas en segundo plano cuyo resultado de error no es NULL:

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;

Monitorizar costes

La generación de incrustaciones autónoma envía solicitudes a Vertex AI, lo que puede generar costes. Para monitorizar los costes de Vertex AI generados por los trabajos de inserción en segundo plano, siga estos pasos:

  1. Consulta tus informes de facturación en Facturación de Cloud.
  2. Usa filtros para acotar los resultados.

    En Servicios, selecciona Vertex AI.

  3. Para ver los cargos de un trabajo específico, filtra por etiqueta.

    Asigna a la clave el valor bigquery_ml_job y al valor el ID de la tarea de la tarea de inserción. Todas las tareas de inserción en segundo plano tienen el prefijo gc_.

Algunos cargos pueden tardar hasta 24 horas en aparecer en la facturación de Cloud.

Limitaciones

  • Cada tabla admite como máximo una columna de inserción generada automáticamente.
  • No hay ninguna indicación de que una columna se genere automáticamente cuando se consulta el esquema de una tabla mediante la consola Google Cloud , el comando bq show o el campo ddl de la vista INFORMATION_SCHEMA.TABLES.
  • No puedes añadir columnas de inserciones generadas a una tabla que ya tengas con ALTER TABLE ADD COLUMN.
  • Si creas una copia, un clon o una instantánea de una tabla que tiene una columna de inserción generada, solo se copiarán los datos. La configuración de generación no se aplica a la nueva tabla y, si se actualiza la columna de origen de la nueva tabla, no se generarán nuevas inserciones.
  • Si restauras una tabla que tenía habilitada la generación de inserciones autónoma a partir de una instantánea, la configuración de generación de inserciones no se restaurará.
  • Solo puedes crear columnas de inserciones generadas mediante SQL. No puedes usar los comandos bq mk o bq update para crear columnas de inserciones generadas.
  • La columna de origen de la columna generada debe ser una columna STRING.
  • Una vez que haya creado la columna de inserciones generadas, se aplicarán las siguientes limitaciones:

    • No puedes eliminar ni cambiar el nombre de la columna de origen, pero sí puedes eliminar o cambiar el nombre de la columna de inserciones generada. Si quitas la columna de inserción, puedes quitar o cambiar el nombre de la columna de origen.
    • No puedes cambiar el tipo de datos de la columna de origen ni de la columna de inserciones generada.
  • No puedes especificar valores predeterminados para las columnas de inserción generadas automáticamente.

  • No puedes escribir directamente en las columnas de inserción generadas con estos métodos:

    • DML
    • Escrituras de streaming
    • bq insert
    • bq copy -a
  • Las tablas con columnas de inserciones generadas no admiten ninguna política de seguridad a nivel de columna, como las etiquetas de política.

  • Cuando llamas a una función de búsqueda, como VECTOR_SEARCH o AI.SEARCH, las filas que no tienen inserciones en la tabla base se omiten durante la búsqueda.

  • No puedes crear un índice vectorial particionado en una tabla que tenga habilitada la generación de embeddings autónoma.

  • Si creas un índice vectorial en la columna de inserciones generada automáticamente, el entrenamiento del índice se iniciará cuando al menos el 80% de las filas hayan generado inserciones. Puedes usar la siguiente consulta para comprobar qué porcentaje de las inserciones de tu tabla se ha generado:

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

Siguientes pasos