Analisar dados multimodais em Python com o BigQuery DataFrames

Este tutorial mostra como analisar dados multimodais em um notebook do Python usando classes e métodos do BigQuery DataFrames.

Este tutorial usa o catálogo de produtos do conjunto de dados público da loja de animais de estimação Cymbal.

Para fazer upload de um notebook já preenchido com as tarefas abordadas neste tutorial, consulte BigFrames Multimodal DataFrame.

Objetivos

  • Crie DataFrames multimodais.
  • Combine dados estruturados e não estruturados em um DataFrame.
  • Transformar imagens.
  • Gerar texto e embeddings com base nos dados da imagem.
  • Divida os PDFs para análise mais detalhada.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Trusted Cloud by S3NS:

  • 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 gerar uma estimativa de custo baseada na projeção de uso, use a calculadora de preços. Novos usuários do Trusted Cloud podem estar qualificados para um teste gratuito.

Para mais informações, consulte as seguintes páginas de preços:

Antes de começar

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

    Go to project selector

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

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

    Enable the APIs

Funções exigidas

Para conseguir as permissões necessárias para concluir este tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.

Configurar

Nesta seção, você cria o bucket, a conexão e o notebook do Cloud Storage usados neste tutorial.

Criar um bucket

Crie um bucket do Cloud Storage para armazenar objetos transformados:

  1. No console Trusted Cloud , acesse a página Buckets.

    Acessar buckets

  2. Clique em Criar.

  3. Na página Criar um bucket, na seção Começar, insira um nome globalmente exclusivo que atenda aos requisitos de nome de bucket.

  4. Clique em Criar.

Crie uma conexão

Crie uma Conexão de recursos do Cloud e tenha acesso à conta de serviço da conexão. O BigQuery usa a conexão para acessar objetos no Cloud Storage.

  1. Acessar a página do BigQuery.

    Ir para o BigQuery

  2. No painel Explorer, clique em Adicionar dados.

    A caixa de diálogo Adicionar dados é aberta.

  3. No painel Filtrar por, na seção Tipo de fonte de dados, selecione Aplicativos empresariais.

    Como alternativa, no campo Pesquisar fontes de dados, você pode inserir Vertex AI.

  4. Na seção Fontes de dados em destaque, clique em Vertex AI.

  5. Clique no card da solução Vertex AI Models: BigQuery Federation.

  6. Na lista Tipo de conexão, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (recurso do Cloud).

  7. No campo ID da conexão, digite bigframes-default-connection.

  8. Clique em Criar conexão.

  9. Clique em Ir para conexão.

  10. No painel Informações da conexão, copie o ID da conta de serviço para uso em uma etapa posterior.

Conceder permissões para a conta de serviço do portal

Conceda à conta de serviço da conexão as funções necessárias para acessar o Cloud Storage e a Vertex AI. É necessário conceder essas funções no mesmo projeto que você criou ou selecionou na seção Antes de começar.

Para conceder o papel, siga estas etapas:

  1. Acessar a página AM e administrador

    Acessar IAM e administrador

  2. Clique em CONCEDER ACESSO.

  3. No campo Novos principais, digite o ID da conta de serviço que você copiou anteriormente.

  4. No campo Selecionar papel, escolha Cloud Storage e, em seguida, Usuário de objetos do Storage.

  5. Clique em Adicionar outro papel.

  6. No campo Selecionar um papel, selecione Vertex AI e, em seguida, selecione Usuário da Vertex AI.

  7. Clique em Salvar.

Criar um notebook

Crie um notebook em que você possa executar código Python:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. Na barra de guias do painel do editor, clique na seta suspensa ao lado de Consulta SQL e clique em Notebook.

  3. No painel Começar com um modelo, clique em Fechar.

  4. Clique em Conectar > Conectar a um ambiente de execução.

  5. Se você já tiver um ambiente de execução, aceite as configurações padrão e clique em Conectar. Se você não tiver um ambiente de execução, selecione Criar novo ambiente de execução e clique em Conectar.

    A configuração do ambiente de execução pode levar alguns minutos.

Criar um DataFrame multimodal

Crie um DataFrame multimodal que integre dados estruturados e não estruturados usando o método from_glob_path da classe Session:

  1. No notebook, crie uma célula de código e copie o seguinte código nela:
    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. Clique em Executar.

    A chamada final para df_image retorna as imagens que foram adicionadas ao DataFrame. Como alternativa, chame o método .display.

Combine dados estruturados e não estruturados no DataFrame

Combine dados de texto e imagem no DataFrame multimodais:

  1. No notebook, crie uma célula de código e copie o seguinte código nela:
    # 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. Clique em Executar .

    O código retorna os dados do DataFrame.

  3. No notebook, crie uma célula de código e copie o seguinte código:

    # 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. Clique em Executar .

    O código retorna imagens do DataFrame em que o valor da coluna author é alice.

Realizar transformações de imagem

Transforme dados de imagem usando os seguintes métodos da classe Series.BlobAccessor:

As imagens transformadas são gravadas no Cloud Storage.

Transformar imagens:

  1. No notebook, crie uma célula de código e copie o seguinte código nela:
    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. Atualize todas as referências a {dst_bucket} para se referir ao bucket que você criou, no formato gs://mybucket.
  3. Clique em Executar .

    O código retorna as imagens originais e todas as transformações delas.

Gerar texto

Gere texto a partir de dados multimodais usando o método predict da classe GeminiTextGenerator:

  1. No notebook, crie uma célula de código e copie o seguinte código nela:
    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. Clique em Executar .

    O código retorna as duas primeiras imagens em df_image, junto com o texto gerado em resposta à pergunta what item is it? para as duas imagens.

  3. No notebook, crie uma célula de código e copie o seguinte código:

    # 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. Clique em Executar .

    O código retorna as duas primeiras imagens em df_image, com o texto gerado em resposta à pergunta what item is it? para a primeira imagem e o texto gerado em resposta à pergunta what color is the picture? para a segunda imagem.

Gerar embeddings

Gere embeddings para dados multimodais usando o método predict da classe MultimodalEmbeddingGenerator:

  1. No notebook, crie uma célula de código e copie o seguinte código nela:
    # Generate embeddings on images
    embed_model = llm.MultimodalEmbeddingGenerator()
    embeddings = embed_model.predict(df_image["image"])
    embeddings
  2. Clique em Executar .

    O código retorna os embeddings gerados por uma chamada para um modelo de embedding.

PDFs em pedaços

Divida objetos PDF usando o método pdf_chunk da classe Series.BlobAccessor:

  1. No notebook, crie uma célula de código e copie o seguinte código nela:
    # 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. Clique em Executar .

    O código retorna os dados do PDF fragmentado.

Limpar

  1. In the Trusted 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.