Context Caching no BigQuery: IA generativa rápida, econômica e fundamentada para Big Data

1. Introdução

As funções de IA generativa do BigQuery permitem usar o SQL para raciocinar sobre os dados usando modelos de linguagem grandes (LLMs). É possível analisar sentimentos, gerar resumos e legendas de imagens em milhões de linhas sem mover os dados.

Mas e se o prompt precisar de uma grande quantidade de contexto (como políticas, manuais ou um vídeo) para gerar resultados precisos e confiáveis?

O armazenamento em cache de contexto do Gemini resolve esse problema armazenando esse contexto grande em um cache. Os prompts subsequentes referenciam o cache em vez de processar o conteúdo completo todas as vezes, oferecendo menor latência e até 90% de desconto nos tokens de entrada.

Neste codelab, você vai criar um verificador de política de devolução de "letras miúdas" que usa o armazenamento em cache de contexto explícito para analisar solicitações de devolução de clientes em relação a um documento de política de devolução estático e enorme no BigQuery.

Fluxo de trabalho do cache de contexto do BigQuery (a imagem será atualizada)

Atividades deste laboratório

  • Criar um conjunto de dados do BigQuery e preenchê-lo com exemplos de solicitações de devolução de clientes.
  • Criar um cache de contexto na plataforma de agentes do Gemini Enterprise (antiga Vertex AI), apontando para um documento de política de devolução armazenado no Cloud Storage.
  • Executar uma consulta usando AI.GENERATE que referencia o cache para avaliar as solicitações linha por linha de maneira eficiente.

O que é necessário

  • Um navegador da web, como o Chrome
  • Tenha um projeto na nuvem do Google Cloud com o faturamento ativado.
  • Acesso ao Google Cloud Shell

Este codelab é destinado a desenvolvedores de todos os níveis, incluindo iniciantes.

Os recursos criados neste codelab custam menos de US $2.

Duração estimada:este codelab leva aproximadamente 30 minutos para ser concluído.

2. Antes de começar

Criar um projeto do Google Cloud

  1. No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
  2. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.

Iniciar o Cloud Shell

O Cloud Shell é um ambiente de linha de comando em execução no Google Cloud que vem pré-carregado com as ferramentas necessárias.

  1. Clique em Ativar o Cloud Shell na parte de cima do console do Google Cloud. Ativar imagem do Cloud Shell
  2. Depois de se conectar ao Cloud Shell, verifique sua autenticação:
    gcloud auth list
    
  3. Confirme se o projeto está configurado:
    gcloud config get project
    
  4. Se o projeto não estiver definido como esperado, defina-o:
    gcloud config set project <YOUR_PROJECT_ID>
    

Definir o ID e o local do projeto

Execute o comando a seguir para recuperar o ID do projeto ativo do Google Cloud e definir o local padrão como variáveis de ambiente a serem usadas neste codelab:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export LOCATION="us-central1"

Ativar APIs

Execute este comando para ativar as APIs necessárias:

gcloud services enable \
 bigquery.googleapis.com \
 aiplatform.googleapis.com

3. Preparar dados do BigQuery

Antes de testar o armazenamento em cache de contexto, precisamos de um conjunto de dados e uma tabela preenchida com exemplos de solicitações de devolução de clientes para executar nossas consultas.

1. Criar um conjunto de dados

Execute o comando a seguir no Cloud Shell para criar um conjunto de dados do BigQuery chamado caching_demo:

bq mk --dataset $PROJECT_ID:caching_demo

2. Criar e preencher a tabela

Execute o comando a seguir para criar uma tabela chamada return_requests e inserir exemplos de solicitações de devolução de clientes:

bq query \
  --use_legacy_sql=false \
  "CREATE OR REPLACE TABLE \`caching_demo.return_requests\` AS
SELECT
  10001 AS return_id,
  'P-1001' AS purchase_id,
  'I bought this jacket on Black Friday but it was too small.' AS return_comment,
  DATE('2025-11-28') AS purchase_date,
  DATE('2025-12-05') AS return_date,
  'ApexWear' AS product_brand,
  'Gold' AS customer_tier
UNION ALL
  SELECT
  10002 AS return_id,
  'P-1002' AS purchase_id,
  'The item arrived broken, I want a refund. I don\'t have photos because I threw it away.' AS return_comment,
  DATE('2026-04-01') AS purchase_date,
  DATE('2026-04-02') AS return_date,
  'GenericBrand' AS product_brand,
  'Standard' AS customer_tier
UNION ALL
  SELECT
  10003 AS return_id,
  'P-1003' AS purchase_id,
  'I bought this ApexWear jacket, took the tags off to wear it once, but it doesn\'t fit well.' AS return_comment,
  DATE('2026-02-15') AS purchase_date,
  DATE('2026-02-20') AS return_date,
  'ApexWear' AS product_brand,
  'Standard' AS customer_tier
UNION ALL
  SELECT
  10004 AS return_id,
  'P-1004' AS purchase_id,
  'This was a holiday gift but doesn\'t fit.' AS return_comment,
  DATE('2025-12-20') AS purchase_date,
  DATE('2026-01-28') AS return_date,
  'StyleCorp' AS product_brand,
  'Standard' AS customer_tier
UNION ALL
  SELECT
  10005 AS return_id,
  'P-1005' AS purchase_id,
  'I realized this doesn\'t fit' AS return_comment,
  DATE('2026-02-01') AS purchase_date,
  DATE('2026-03-15') AS return_date,
  'ApexWear' AS product_brand,
  'Gold' AS customer_tier;"

Você vai receber uma mensagem de confirmação:

Created your-project-id.caching_demo.return_requests

Agora estamos prontos para criar nosso cache.

4. Criar o cache de contexto

Você vai criar o cache usando uma chamada REST para o endpoint do modelo da plataforma de agentes do Gemini Enterprise (antiga Vertex AI) usando curl.

Execute o comando a seguir no Cloud Shell para criar um novo bucket de armazenamento. Ele será usado para armazenar arquivos que queremos armazenar em cache:

gcloud storage buckets create gs://${PROJECT_ID}-caching-demo --location=${LOCATION}

Em seguida, copie o documento de política de amostra para o bucket recém-criado:

gcloud storage cp gs://sample-data-and-media/context_caching_demo/return_policy.md gs://${PROJECT_ID}-caching-demo/

Agora, execute o comando a seguir para criar o cache que referencia o documento de política recém-preparado (isso pode levar um minuto ou mais para ser concluído):

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents" \
  -d '{
    "model": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/publishers/google/models/gemini-2.5-flash",
    "contents": [
      {
        "role": "user",
        "parts": [
          {
            "fileData": {
              "mimeType": "text/markdown",
              "fileUri": "gs://'"${PROJECT_ID}"'-caching-demo/return_policy.md"
            }
          }
        ]
      }
    ],
    "ttl": "3600s"
  }'

Anote o name retornado na resposta JSON, que será semelhante a esta: projects/PROJECT_NUMBER/locations/LOCATION/cachedContents/CACHE_ID. Você vai precisar desse CACHE_ID para a próxima etapa.

{
  "name": "projects/123456789012/locations/us-central1/cachedContents/123456789012345"
}

Salve o CACHE_ID como uma variável de ambiente no Cloud Shell:

export CACHE_ID="<YOUR_CACHE_ID>"

5. Executar AI.GENERATE com conteúdo armazenado em cache

Primeiro, vamos verificar se os dados de amostra foram gerados corretamente. Navegue até o console do BigQuery, localize o conjunto de dados caching_demo e clique na tabela return_requests.

Na guia Visualização, você vai encontrar as solicitações de devolução de clientes que geramos anteriormente:

Prévia da tabela &quot;return_requests&quot; no BigQuery

Agora que o cache foi criado e preenchido, você pode consultar usando AI.GENERATE para avaliar a solicitação de reembolso simplesmente referenciando o ID do cache.

Para evitar encontrar e substituir variáveis manualmente, execute o comando a seguir no Cloud Shell. Isso vai criar dinamicamente a consulta SQL usando as variáveis de ambiente atuais e imprimi-la na tela para que você possa copiá-la facilmente.

cat << EOF > query.sql
WITH generated_returns AS (
  SELECT
    *,
    -- Call AI.GENERATE with the prompt, schema, and cache ID
    AI.GENERATE(
      -- Construct the prompt referencing the cached policy
      prompt => CONCAT(
        'Analyze this return request using the cached Return Policy. ',
        'Return Comment: "', return_comment, '". ',
        'Purchase Date: ', purchase_date, '. ',
        'Brand: ', product_brand, '. ',
        'Customer Tier: ', customer_tier, '. '
      ),
      -- Define the structured output schema
      output_schema => """
        eligible_for_refund STRING OPTIONS(description = 'True/False whether the request is eligible for a refund based on the policy'),
        refund_type STRING OPTIONS(description = 'Classify as Full, Store Credit, or None'),
        reason_citation STRING OPTIONS(description = 'Quote the specific rule from the policy applied to this decision')
      """,    
      -- Construct the endpoint string dynamically using variables
      endpoint => 'gemini-2.5-flash',
      
      -- Pass the cached content ID using bash interpolation for the literal
      model_params => JSON '{"cachedContent": "projects/$PROJECT_NUMBER/locations/$LOCATION/cachedContents/$CACHE_ID"}'
    ) AS results
  FROM \`caching_demo.return_requests\`
)
SELECT 
  *,
  -- Extract token usage metrics from the raw JSON response
  CAST(JSON_EXTRACT_SCALAR(results.full_response, '$.usage_metadata.prompt_token_count') AS INT64) AS prompt_token_count,
  CAST(JSON_EXTRACT_SCALAR(results.full_response, '$.usage_metadata.cached_content_token_count') AS INT64) AS cached_content_token_count,
  CAST(JSON_EXTRACT_SCALAR(results.full_response, '$.usage_metadata.candidates_token_count') AS INT64) AS output_token_count,
  CAST(JSON_EXTRACT_SCALAR(results.full_response, '$.usage_metadata.total_token_count') AS INT64) AS total_token_count,
  CAST(JSON_EXTRACT_SCALAR(results.full_response, '$.usage_metadata.thoughts_token_count') AS INT64) AS thoughts_token_count,
  CAST(JSON_EXTRACT_SCALAR(results.full_response, '$.usage_metadata.billable_prompt_usage.text_count') AS INT64) AS billable_prompt_text_count,
  CAST(JSON_EXTRACT_SCALAR(results.full_response, '$.usage_metadata.billable_cached_content_usage.text_count') AS INT64) AS billable_cached_text_count
  
FROM generated_returns;
EOF

cat query.sql

Agora, copie o SQL no terminal, navegue até o console do BigQuery no navegador e execute a consulta na guia do editor de consultas.

Prévia da tabela &quot;return_requests&quot; no BigQuery

Confira a seguir um detalhamento dos principais argumentos nessa chamada de função:

  • prompt: contém as informações específicas de cada linha do cliente. Esse texto é anexado ao documento de política de devolução grande que já está no cache.
  • output_schema: define a estrutura JSON esperada da resposta do modelo.
  • endpoint: especifica o endpoint do modelo de IA da plataforma de agentes (Gemini 2.5 Flash no nosso caso) usado para geração.
  • model_params: parâmetro essencial que transmite o ID do cache gerado usando o campo cachedContent.

Você deve ver os resultados gerados analisando cada pedido de devolução de acordo com a política armazenada. Role para a direita para ver as métricas de token extraídas.

Resultados da consulta mostrando a análise do modelo e as contagens de tokens.

Confira a seguir um detalhamento das métricas de token que você encontra:

  • prompt_token_count: o número total de tokens processados no prompt de entrada (incluindo o conteúdo armazenado em cache).
  • cached_content_token_count: o número de tokens veiculados do cache (que representa o documento de política de devolução estático).
  • output_token_count: o número de tokens gerados pelo modelo na resposta.
  • total_token_count: a soma dos tokens de prompt e de saída.
  • billable_prompt_text_count: o número de caracteres faturáveis na parte não armazenada em cache do prompt.
  • billable_cached_text_count: o número de caracteres faturáveis no conteúdo armazenado em cache.

Observe a coluna billable_prompt_text_count : ela mostra apenas algumas centenas de caracteres por linha, que é apenas a solicitação específica do cliente. Compare isso com o billable_cached_text_count de mais de 30.000 caracteres para a política de devolução completa. Sem o armazenamento em cache de contexto, você pagaria para processar o documento de política completo para cada linha. Ao armazená-lo em cache, você paga pelo documento grande uma vez, e as linhas subsequentes só cobram pelo texto do prompt pequeno e em mudança.

Isso resulta em economias enormes para jobs em lote.

6. Limpar

Para evitar cobranças contínuas na sua conta do Google Cloud, exclua os recursos criados durante este codelab.

Execute o comando a seguir no Cloud Shell para excluir o conjunto de dados do BigQuery e as tabelas dele:

bq rm -r -f -d caching_demo

Exclua o bucket de preparação criado para o documento de política:

gcloud storage rm --recursive gs://${PROJECT_ID}-caching-demo

Por fim, exclua o cache de contexto para evitar cobranças de armazenamento contínuas usando as variáveis armazenadas anteriormente:

curl -X DELETE \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents/${CACHE_ID}"

7. Parabéns

Parabéns! Você criou um cache de contexto na plataforma de agentes e o referenciou em uma função de IA do BigQuery para acelerar a análise e reduzir os custos de processamento de tokens de entrada.

O que você aprendeu

  • Como configurar tabelas de ambiente para análise de dados de pedidos de devolução.
  • Como chamar a API da plataforma de agentes (Vertex AI) usandocurl para criar explicitamente um cache de contexto de documento estático.
  • Como usar o ID do cache gerado em uma consulta SQL AI.GENERATE para eliminar tokens de entrada redundantes em prompts ativos.

Documentos de referência