Analiza datos multimodales en Python con BigQuery DataFrames

En este instructivo, se muestra cómo analizar datos multimodales en un notebook de Python con las clases y los métodos de BigQuery DataFrames.

En este instructivo, se usa el catálogo de productos del conjunto de datos públicos de la tienda de mascotas Cymbal.

Para subir un notebook ya completado con las tareas que se abordan en este instructivo, consulta DataFrame multimodal de BigFrames.

Objetivos

  • Crea DataFrames multimodales.
  • Combina datos estructurados y no estructurados en un DataFrame.
  • Transformar imágenes
  • Generar texto y embeddings basados en datos de imágenes
  • Divide los archivos PDF en fragmentos para su posterior análisis.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • BigQuery: you incur costs for the data that you process in BigQuery.
  • BigQuery Python UDFs: you incur costs for using BigQuery DataFrames image transformation and chunk PDF methods.
  • Cloud Storage: you incur costs for the objects stored in Cloud Storage.
  • Vertex AI: you incur costs for calls to Vertex AI models.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios Google Cloud nuevos sean aptos para obtener una prueba gratuita.

Para obtener más información, consulta las siguientes páginas de precios:

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, Cloud Storage, and Vertex AI APIs.

    Enable the APIs

Roles obligatorios

Si quieres obtener los permisos que necesitas para completar este instructivo, pídele a tu administrador que te otorgue los siguientes roles de IAM:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Configurar

En esta sección, crearás el bucket de Cloud Storage, la conexión y el notebook que se usan en este instructivo.

Crea un bucket

Crea un bucket de Cloud Storage para almacenar objetos transformados:

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

    Ir a Buckets

  2. Haz clic en Crear.

  3. En la página Crear un bucket, en la sección Comenzar, ingresa un nombre único a nivel global que cumpla con los requisitos de nombres de buckets.

  4. Haz clic en Crear.

Crear una conexión

Crea una conexión de recurso de Cloud y obtén la cuenta de servicio de la conexión. BigQuery usa la conexión para acceder a los objetos en Cloud Storage.

  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.

    También puedes ingresar Vertex AI en el campo Buscar fuentes de datos.

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

  5. Haz clic en la tarjeta de solución Vertex AI Models: 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, escribe bigframes-default-connection.

  8. Haz clic en Crear conexión.

  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.

Otorga permisos a la cuenta de servicio de las conexiones

Otorga a la cuenta de servicio de la conexión los roles que necesita para acceder a Cloud Storage y Vertex AI. Debes otorgar estos roles en el mismo proyecto que creaste o seleccionaste en la sección Antes de comenzar.

Para otorgar el rol, sigue estos pasos:

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

    Ir a IAM y administración

  2. Haz clic en Grant access.

  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, elige Cloud Storage y, luego, selecciona Usuario de objetos de Storage.

  5. Haz clic en Agregar otra función.

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

  7. Haz clic en Guardar.

Crea un notebook

Crea un notebook en el que puedas ejecutar código de Python:

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En la barra de pestañas del panel del editor, haz clic en la flecha desplegable junto a Consulta en SQL y, luego, haz clic en Notebook.

  3. En el panel Empezar con una plantilla, haz clic en Cerrar.

  4. Haz clic en Connect > Connect to a runtime.

  5. Si tienes un tiempo de ejecución existente, acepta la configuración predeterminada y haz clic en Conectar. Si no tienes un entorno de ejecución existente, selecciona Create new Runtime y, luego, haz clic en Connect.

    La configuración del tiempo de ejecución puede tardar varios minutos.

Crea un DataFrame multimodal

Crea un DataFrame multimodal que integre datos estructurados y no estructurados con el método from_glob_path de la clase Session:

  1. En el notebook, crea una celda de código y copia el siguiente código en ella:
    import bigframes
    
    # Flags to control preview image/video preview size
    bigframes.options.display.blob_display_width = 300
    
    import bigframes.pandas as bpd
    
    # Create blob columns from wildcard path.
    df_image = bpd.from_glob_path(
        "gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/images/*", name="image"
    )
    # Other ways are: from string uri column
    # df = bpd.DataFrame({"uri": ["gs://<my_bucket>/<my_file_0>", "gs://<my_bucket>/<my_file_1>"]})
    # df["blob_col"] = df["uri"].str.to_blob()
    
    # From an existing object table
    # df = bpd.read_gbq_object_table("<my_object_table>", name="blob_col")
    
    # Take only the 5 images to deal with. Preview the content of the Mutimodal DataFrame
    df_image = df_image.head(5)
    df_image
  2. Haz clic en Ejecutar.

    La llamada final a df_image devuelve las imágenes que se agregaron al DataFrame. También puedes llamar al método .display.

Cómo combinar datos estructurados y no estructurados en el DataFrame

Combina datos de texto y de imágenes en el DataFrame multimodal:

  1. En el notebook, crea una celda de código y copia el siguiente código en ella:
    # Combine unstructured data with structured data
    df_image["author"] = ["alice", "bob", "bob", "alice", "bob"]  # type: ignore
    df_image["content_type"] = df_image["image"].blob.content_type()
    df_image["size"] = df_image["image"].blob.size()
    df_image["updated"] = df_image["image"].blob.updated()
    df_image
  2. Haga clic en Ejecutar .

    El código devuelve los datos del DataFrame.

  3. En el notebook, crea una celda de código y copia el siguiente código en ella:

    # Filter images and display, you can also display audio and video types. Use width/height parameters to constrain window sizes.
    df_image[df_image["author"] == "alice"]["image"].blob.display()
  4. Haga clic en Ejecutar .

    El código devuelve imágenes del DataFrame en las que el valor de la columna author es alice.

Realiza transformaciones de imágenes

Transforma los datos de la imagen con los siguientes métodos de la clase Series.BlobAccessor:

Las imágenes transformadas se escriben en Cloud Storage.

Transformar imágenes:

  1. En el notebook, crea una celda de código y copia el siguiente código en ella:
    df_image["blurred"] = df_image["image"].blob.image_blur(
        (20, 20), dst=f"{dst_bucket}/image_blur_transformed/", engine="opencv"
    )
    df_image["resized"] = df_image["image"].blob.image_resize(
        (300, 200), dst=f"{dst_bucket}/image_resize_transformed/", engine="opencv"
    )
    df_image["normalized"] = df_image["image"].blob.image_normalize(
        alpha=50.0,
        beta=150.0,
        norm_type="minmax",
        dst=f"{dst_bucket}/image_normalize_transformed/",
        engine="opencv",
    )
    
    # You can also chain functions together
    df_image["blur_resized"] = df_image["blurred"].blob.image_resize(
        (300, 200), dst=f"{dst_bucket}/image_blur_resize_transformed/", engine="opencv"
    )
    df_image
  2. Actualiza todas las referencias a {dst_bucket} para que hagan referencia al bucket que creaste, en el formato gs://mybucket.
  3. Haga clic en Ejecutar .

    El código devuelve las imágenes originales y todas sus transformaciones.

Generar texto

Genera texto a partir de datos multimodales con el método predict de la clase GeminiTextGenerator:

  1. En el notebook, crea una celda de código y copia el siguiente código en ella:
    from bigframes.ml import llm
    
    gemini = llm.GeminiTextGenerator(model_name="gemini-2.0-flash-001")
    
    # Deal with first 2 images as example
    df_image = df_image.head(2)
    
    # Ask the same question on the images
    df_image = df_image.head(2)
    answer = gemini.predict(df_image, prompt=["what item is it?", df_image["image"]])
    answer[["ml_generate_text_llm_result", "image"]]
  2. Haga clic en Ejecutar .

    El código devuelve las dos primeras imágenes de df_image, junto con el texto generado en respuesta a la pregunta what item is it? para ambas imágenes.

  3. En el notebook, crea una celda de código y copia el siguiente código en ella:

    # Ask different questions
    df_image["question"] = [  # type: ignore
        "what item is it?",
        "what color is the picture?",
    ]
    answer_alt = gemini.predict(
        df_image, prompt=[df_image["question"], df_image["image"]]
    )
    answer_alt[["ml_generate_text_llm_result", "image"]]
  4. Haga clic en Ejecutar .

    El código devuelve las dos primeras imágenes en df_image, con texto generado en respuesta a la pregunta what item is it? para la primera imagen y texto generado en respuesta a la pregunta what color is the picture? para la segunda imagen.

Genera embeddings

Genera embeddings para datos multimodales con el método predict de la clase MultimodalEmbeddingGenerator:

  1. En el notebook, crea una celda de código y copia el siguiente código en ella:
    # Generate embeddings on images
    embed_model = llm.MultimodalEmbeddingGenerator()
    embeddings = embed_model.predict(df_image["image"])
    embeddings
  2. Haga clic en Ejecutar .

    El código devuelve las incorporaciones generadas por una llamada a un modelo de incorporación.

Fragmenta PDFs

Fragmenta objetos PDF con el método pdf_chunk de la clase Series.BlobAccessor:

  1. En el notebook, crea una celda de código y copia el siguiente código en ella:
    # PDF chunking
    df_pdf = bpd.from_glob_path(
        "gs://cloud-samples-data/bigquery/tutorials/cymbal-pets/documents/*", name="pdf"
    )
    df_pdf["chunked"] = df_pdf["pdf"].blob.pdf_chunk(engine="pypdf")
    chunked = df_pdf["chunked"].explode()
    chunked
  2. Haga clic en Ejecutar .

    El código devuelve los datos del PDF en fragmentos.

Limpia

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.