Genera datos estructurados con la función AI.GENERATE_TABLE

En este documento, se muestra cómo generar datos estructurados con un modelo Gemini Pro 1.5, Gemini Flash 1.5 o Gemini Flash 2.0 y, luego, dar formato a la respuesta del modelo con un esquema SQL.

Para ello, completa las siguientes tareas:

Permisos necesarios

  • Para crear una conexión, necesitas membresía en el siguiente rol de Identity and Access Management (IAM):

    • roles/bigquery.connectionAdmin
  • Para otorgar permisos a la cuenta de servicio de la conexión, necesitas el siguiente permiso:

    • resourcemanager.projects.setIamPolicy
  • Para crear el modelo con BigQuery ML, necesitas los siguientes permisos de IAM:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • Para ejecutar inferencias, necesitas los siguientes permisos:

    • bigquery.tables.getData en la tabla
    • bigquery.models.getData en el modelo
    • bigquery.jobs.create

Antes de comenzar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

Crear una conexión

Crea una conexión de recurso de Cloud y obtén la cuenta de servicio de la conexión.

Selecciona una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, haz clic en Agregar datos.

    Se abrirá el diálogo Agregar datos.

  3. En el panel Filtrar por, en la sección Tipo de fuente de datos, selecciona Aplicaciones empresariales.

    Como alternativa, en el campo Buscar fuentes de datos, puedes ingresar Vertex AI.

  4. En la sección Fuentes de datos destacadas, haz clic en Vertex AI.

  5. Haz clic en la tarjeta de solución Modelos de Vertex AI: BigQuery Federation.

  6. En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (Cloud Resource).

  7. En el campo ID de conexión, ingresa un nombre para tu conexión.

  8. Haz clic en Crear conexión (Create connection).

  9. Haz clic en Ir a la conexión.

  10. En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso posterior.

bq

  1. En un entorno de línea de comandos, crea una conexión:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    El parámetro --project_id anula el proyecto predeterminado.

    Reemplaza lo siguiente:

    • REGION: tu región de conexión
    • PROJECT_ID: El ID del proyecto de Google Cloud.
    • CONNECTION_ID: Es un ID para tu conexión.

    Cuando creas un recurso de conexión, BigQuery crea una cuenta de servicio del sistema única y la asocia con la conexión.

    Solución de problemas: Si recibes el siguiente error de conexión, actualiza el SDK de Google Cloud:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Recupera y copia el ID de cuenta de servicio para usarlo en un paso posterior:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID

    El resultado es similar a este:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

Usa el recurso google_bigquery_connection.

.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

En el siguiente ejemplo, se crea una conexión de recursos de Cloud llamada my_cloud_resource_connection en la región US:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

Para aplicar tu configuración de Terraform en un proyecto de Google Cloud, completa los pasos de las siguientes secciones.

Prepara Cloud Shell

  1. Inicia Cloud Shell
  2. Establece el proyecto de Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

    Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

Prepara el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

  1. En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

    Copia el código de muestra en el main.tf recién creado.

    De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

  3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
    terraform plan

    Corrige la configuración según sea necesario.

  2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

  3. Abre tu proyecto de Google Cloud para ver los resultados. En la consola de Google Cloud, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

Otorga acceso a la cuenta de servicio

Otorga a la cuenta de servicio de la conexión el rol de usuario de Vertex AI.

Si planeas especificar el extremo como una URL cuando crees el modelo remoto, por ejemplo, endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/gemini-1.5-flash', otorga este rol en el mismo proyecto que especifiques en la URL.

Si planeas especificar el extremo con el nombre del modelo cuando crees el modelo remoto, por ejemplo, endpoint = 'gemini-1.5-flash', otorga este rol en el mismo proyecto en el que planeas crear el modelo remoto.

Si otorgas el rol en un proyecto diferente, se produce el error bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource.

Para otorgar el rol, sigue estos pasos:

Console

  1. Ir a la página IAM y administración

    Ir a IAM y administración

  2. Haga clic en Agregar.

    Se abre el cuadro de diálogo Agregar principales.

  3. En el campo Principales nuevas (New principals), ingresa el ID de la cuenta de servicio que copiaste antes.

  4. En el campo Selecciona un rol, selecciona Vertex AI y, luego, Usuario de Vertex AI.

  5. Haz clic en Guardar.

gcloud

Usa el comando gcloud projects add-iam-policy-binding

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None

Reemplaza lo siguiente:

  • PROJECT_NUMBER: Es el número de tu proyecto.
  • MEMBER: el ID de la cuenta de servicio que copiaste antes

Crea un modelo remoto de BigQuery ML

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

    Ir a BigQuery

  2. Crea un modelo remoto con el editor de SQL:

    CREATE OR REPLACE MODEL
    `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (ENDPOINT = 'ENDPOINT');

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • DATASET_ID: El ID del conjunto de datos que contendrá el modelo. Este conjunto de datos debe estar en la misma ubicación que la conexión que usas
    • MODEL_NAME: Es el nombre del modelo.
    • REGION: la región que usa la conexión.
    • CONNECTION_ID: el ID de tu conexión de BigQuery

      Cuando ves los detalles de conexión en la consola de Google Cloud, este es el valor en la última sección del ID de conexión completamente calificado que se muestra en Conexión ID, por ejemplo, projects/myproject/locations/connection_location/connections/myconnection.

    • ENDPOINT: Es el nombre del modelo de Gemini que se usará. Se admiten los siguientes modelos:
      • gemini-2.0-flash-001
      • gemini-1.5-flash-001
      • gemini-1.5-flash-002
      • gemini-1.5-pro-001
      • gemini-1.5-pro-002
      Para obtener más información, consulta ENDPOINT.

Genera datos estructurados

Para generar datos estructurados, usa la función AI.GENERATE_TABLE con un modelo remoto y usa los datos de la instrucción de una columna de tabla:

SELECT *
FROM AI.GENERATE_TABLE(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  [TABLE `PROJECT_ID.DATASET_ID.TABLE_NAME` / (PROMPT_QUERY)],
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_P AS top_p, STOP_SEQUENCES AS stop_sequences,
  SAFETY_SETTINGS AS safety_settings,
  OUTPUT_SCHEMA AS output_schema)
);

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto
  • DATASET_ID: El ID del conjunto de datos que contiene el modelo.
  • MODEL_NAME: el nombre del modelo
  • TABLE_NAME: Es el nombre de la tabla que contiene el mensaje. Esta tabla debe tener una columna llamada prompt, o puedes usar un alias para usar una columna con nombre diferente.
  • PROMPT_QUERY: Es la consulta de GoogleSQL que genera los datos del mensaje. El valor de la instrucción puede extraerse de una columna o puedes especificarlo como un valor de struct con una cantidad arbitraria de subcampos de cadena y nombre de columna. Por ejemplo:SELECT ('Analyze the sentiment in ', feedback_column, 'using the following categories: positive, negative, neutral') AS prompt
  • TOKENS: Un valor INT64 que establece la cantidad máxima de tokens que se pueden generar en la respuesta. Este valor debe estar en el rango [1,8192]. Especifica un valor más bajo para respuestas más cortas y un valor más alto para respuestas más largas. El valor predeterminado es 128.
  • TEMPERATURE: Un valor FLOAT64 en el rango [0.0,2.0] que controla el grado de aleatorización en la selección de tokens. El valor predeterminado es 1.0.

    Los valores más bajos para temperature son buenos para las instrucciones que requieren una respuesta más determinística y menos abierta o creativa, mientras que los valores más altos para temperature pueden generar resultados más diversos o creativos. Un valor de 0 para temperature es determinístico, lo que significa que siempre se selecciona la respuesta de mayor probabilidad.

  • TOP_P: Un valor FLOAT64 en el rango [0.0,1.0] ayuda a determinar la probabilidad de los tokens seleccionados. Especifica un valor más bajo para respuestas menos aleatorias y un valor más alto para respuestas más aleatorias. El valor predeterminado es 0.95.
  • STOP_SEQUENCES: Un valor ARRAY<STRING> que quita las cadenas especificadas si se incluyen en respuestas del modelo. Las cadenas coinciden de forma exacta, incluido el uso de mayúsculas. El valor predeterminado es un array vacío.
  • SAFETY_SETTINGS: Un valor ARRAY<STRUCT<STRING AS category, STRING AS threshold>> que configura umbrales de seguridad del contenido para filtrar las respuestas. El primer elemento de la estructura especifica una categoría de daño, y el segundo elemento especifica un umbral de bloqueo correspondiente. El modelo filtra el contenido que incumple esta configuración. Solo puedes especificar cada categoría una vez. Por ejemplo, no puedes especificar STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_MEDIUM_AND_ABOVE' AS threshold) y STRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_ONLY_HIGH' AS threshold) a la vez. Si no hay un parámetro de configuración de seguridad para una categoría determinada, se usa el parámetro de configuración de seguridad BLOCK_MEDIUM_AND_ABOVE.

    Las categorías admitidas son las siguientes:

    • HARM_CATEGORY_HATE_SPEECH
    • HARM_CATEGORY_DANGEROUS_CONTENT
    • HARM_CATEGORY_HARASSMENT
    • HARM_CATEGORY_SEXUALLY_EXPLICIT

    Los umbrales admitidos son los siguientes:

    • BLOCK_NONE (Restringido)
    • BLOCK_LOW_AND_ABOVE
    • BLOCK_MEDIUM_AND_ABOVE (predeterminado)
    • BLOCK_ONLY_HIGH
    • HARM_BLOCK_THRESHOLD_UNSPECIFIED

    Para obtener más información, consulta Categorías de daño y Cómo configurar filtros de contenido.

  • OUTPUT_SCHEMA: Es un valor STRING que especifica el formato de la respuesta del modelo. El valor de output_schema debe ser una definición de esquema SQL, similar a la que se usa en la sentencia CREATE TABLE. Se admiten los siguientes tipos de datos:
    • INT64
    • FLOAT64
    • BOOL
    • STRING
    • ARRAY
    • STRUCT

    Para los modelos de Gemini 1.5, solo especifica un tipo de datos FLOAT64 si tienes la certeza de que el valor que se muestra no será un número redondo. Estos modelos, a veces, pueden mostrar valores INT64 en lugar de valores FLOAT64 para números redondos, por ejemplo, 2 en lugar de 2.0, y esto puede provocar un error de análisis en la consulta.

    Cuando usas el argumento output_schema para generar datos estructurados en función de instrucciones de una tabla, es importante comprender los datos de la instrucción para especificar un esquema adecuado.

    Por ejemplo, supongamos que analizas el contenido de las opiniones de películas de una tabla que tiene los siguientes campos:

    • movie_id
    • review
    • mensaje

    Luego, puedes crear texto de instrucciones ejecutando una consulta similar a la siguiente:

    UPDATE mydataset.movie_review
    SET prompt = CONCAT('Extract the key words and key sentiment from the text below: ', review)
    WHERE review IS NOT NULL;

    También puedes especificar un valor output_schema similar a "keywords ARRAY<STRING>, sentiment STRING" AS output_schema.

Ejemplos

En el siguiente ejemplo, se muestra una solicitud que toma datos de instrucciones de una tabla y proporciona un esquema de SQL para dar formato a la respuesta del modelo:

SELECT
*
FROM
AI.GENERATE_TABLE( MODEL `mydataset.gemini_model`,
  TABLE `mydataset.mytable`,
  STRUCT("keywords ARRAY<STRING>, sentiment STRING" AS output_schema));

En el siguiente ejemplo, se muestra una solicitud que toma datos de instrucciones de una consulta y proporciona un esquema de SQL para dar formato a la respuesta del modelo:

SELECT *
FROM
  AI.GENERATE_TABLE(
    MODEL `mydataset.gemini_model`,
    (
      SELECT
        'John Smith is a 20-year old single man living at 1234 NW 45th St, Kirkland WA, 98033. He has two phone numbers 123-123-1234, and 234-234-2345. He is 200.5 pounds.'
          AS prompt
    ),
    STRUCT("address STRUCT<street_address STRING, city STRING, state STRING, zip_code STRING>, age INT64, is_married BOOL, name STRING, phone_number ARRAY<STRING>, weight_in_pounds FLOAT64"
        AS output_schema));