Otimizar os custos da função de IA
Neste documento, descrevemos como usar o modo otimizado para funções de IA gerenciadas no BigQuery. Esse modo permite processar conjuntos de dados em grande escala com milhares ou até bilhões de linhas com consumo de tokens do modelo de linguagem grande (LLM) e latência de consulta significativamente reduzidos em comparação com a inferência padrão do LLM por linha.
O exemplo a seguir demonstra como usar a função AI.CLASSIFY
com o modo otimizado para categorizar artigos de notícias usando text-embedding-005
como o modelo de incorporação:
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other'],
embeddings => AI.EMBED(body, endpoint => 'text-embedding-005', task_type => 'CLASSIFICATION').result,
-- Optional, 'MINIMIZE_COST' is the default when embeddings are provided.
optimization_mode => 'MINIMIZE_COST'
) AS category
FROM
`bigquery-public-data.bbc_news.fulltext`;
O argumento optimization_mode => 'MINIMIZE_COST' ativa o modo otimizado. Essa é a configuração padrão quando os embeddings são fornecidos. Portanto, você pode omitir esse argumento.
Neste exemplo, os embeddings são gerados de forma dinâmica. Na prática, recomendamos materializar incorporações para que possam ser reutilizadas.
Como funciona o modo otimizado
As funções gerenciadas de IA, AI.IF e AI.CLASSIFY, normalmente chamam um LLM remoto para cada linha no conjunto de dados. Ao usar o modo otimizado, o BigQuery treina automaticamente um modelo leve e refinado durante a execução da consulta.
O processo funciona da seguinte maneira:

- Amostragem e rotulagem: o BigQuery seleciona uma pequena amostra representativa dos seus dados e chama o Gemini para fornecer rótulos.
- Treinamento de modelo destilado: um modelo destilado local é treinado no momento certo usando os rótulos e incorporações de dados do LLM como recursos.
- Verificação de qualidade: o BigQuery avalia a acurácia do modelo destilado em relação aos resultados do LLM. Por padrão, se o modelo destilado não atender ao limite de qualidade exigido, a consulta vai falhar com um erro explicando por que o modelo foi descartado. Se o modelo for de qualidade aceitável, o BigQuery ainda poderá usar o LLM remoto para linhas específicas a fim de manter a qualidade consistente ou para linhas sem embeddings válidos.
- Inferência: o modelo destilado processa a maioria das linhas, reduzindo significativamente o número de chamadas do Gemini.
Limitações
O modo otimizado tem as seguintes limitações:
- Contagem mínima de linhas: a entrada da função de IA precisa conter aproximadamente 3.000 linhas para garantir dados suficientes para o treinamento de modelo.
- Tipos de dados: para comandos que fazem referência a várias colunas, apenas colunas de string são compatíveis com a otimização.
- Classificação de vários rótulos:
AI.CLASSIFYcomoutput_mode => 'multi'não é compatível no modo otimizado. - Compatibilidade com funções: apenas as funções
AI.IFeAI.CLASSIFYsão compatíveis com o modo otimizado. - Proporção de erros: o argumento
max_error_rationão é compatível com o modo otimizado.
Antes de começar
Para ter as permissões necessárias para executar funções gerenciadas de IA no BigQuery, consulte Definir permissões para funções de IA generativa que chamam LLMs da Vertex AI.
Escolher um modelo de embedding
Para usar o modo otimizado, você precisa calcular incorporações para seus dados e fornecê-las à função de IA. Para que as colunas de entrada tenham incorporações associadas, todas as linhas precisam ter dimensões de incorporação consistentes e ser geradas pelo mesmo modelo de incorporação.
Para ter a melhor relação custo-qualidade e escalonabilidade, recomendamos calcular incorporações para seus dados usando um modelo de incorporação, como text-embedding-005 ou as incorporações do Gemini para tarefas em inglês ou multilíngues. Para dados multimodais (texto e imagens), use um modelo de embedding multimodal, como multimodalembedding@001.
Gerar embeddings
É possível calcular embeddings para seus dados usando a geração autônoma gerenciada pelo BigQuery ou criando manualmente as colunas de embedding.
As seções a seguir descrevem como usar as duas abordagens com as funções AI.CLASSIFY e AI.IF.
Geração autônoma de embeddings
Se você usa a geração autônoma de embeddings, o BigQuery usa automaticamente os embeddings quando AI.IF ou AI.CLASSIFY são chamados. Essa é a abordagem recomendada, mas é limitada a uma coluna de embedding por tabela.
O exemplo a seguir cria uma tabela com uma coluna de embedding gerada de forma autônoma, usando text-embedding-005 como o modelo de embedding. Em seguida, ele usa a função AI.CLASSIFY para categorizar os dados:
-- Create a table with an autonomously generated embedding column
CREATE TABLE my_dataset.bbc_news (
title STRING,
body STRING,
body_embedding STRUCT<result ARRAY<FLOAT64>, status STRING>
GENERATED ALWAYS AS (
AI.EMBED(
body,
connection_id => '<my_connection_id>',
task_type => 'CLASSIFICATION',
endpoint => 'text-embedding-005')
) STORED
OPTIONS(asynchronous = TRUE)
);
-- Insert data into the table
INSERT INTO my_dataset.bbc_news (title, body)
SELECT title, body FROM `bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query.
-- Wait for the background job to finish generating embeddings before running.
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other']
) AS category
FROM
my_dataset.bbc_news;
Especificação manual de colunas
Se você tiver uma coluna de incorporação, especifique-a no argumento embeddings de AI.IF ou AI.CLASSIFY. É possível gerar isso usando a função AI.EMBED.
O exemplo a seguir demonstra como criar uma tabela com uma coluna de embedding usando text-embedding-005 como modelo de embedding e, em seguida, usar essa coluna em uma consulta AI.CLASSIFY:
-- Create a table with an embedding column
CREATE TABLE my_dataset.bbc_news AS
SELECT
title,
body,
AI.EMBED(
body,
endpoint => 'text-embedding-005',
task_type => 'CLASSIFICATION'
).result AS body_embedding
FROM
`bigquery-public-data.bbc_news.fulltext`;
-- Run the optimized query
SELECT
title,
body,
AI.CLASSIFY(
body,
categories => ['tech', 'sport', 'business', 'other'],
embeddings => body_embedding,
) AS category
FROM
my_dataset.bbc_news;
Se o comando fizer referência a várias colunas, forneça uma lista de nomes de colunas e os embeddings correspondentes no argumento embeddings. Por exemplo, embeddings => [('body', body_embedding), ('title', title_embedding)].
Monitorar a otimização de consultas
Para verificar quantas linhas foram otimizadas durante a execução da consulta, confira as estatísticas de execução no console do Google Cloud ou pela API:
Console
Para saber quantas linhas foram otimizadas e ver mensagens do sistema sobre o status da otimização, faça o seguinte:
No console do Google Cloud , acesse a página BigQuery.
No menu de navegação, clique em Explorador de jobs.
Clique no ID do job para abrir o painel Detalhes do job.
Clique na guia Informações do job e confira as métricas e o status no campo Otimizações de função de IA generativa.

API
Verifique o FunctionGenAiCostOptimizationStats no objeto GenAIFunctionStats dos metadados do job. Esse objeto inclui o número de linhas inferidas pelo fluxo de trabalho otimizado e mensagens geradas pelo sistema com insights sobre o estado da otimização.
Resolver problemas
As seções a seguir explicam como diagnosticar e resolver problemas comuns ao usar o modo otimizado.
O tamanho dos dados é muito pequeno
Problema: dados insuficientes para o treinamento de modelo. Talvez você veja a seguinte mensagem de erro: Fail to apply cost optimization because the data size is too
small.
Solução: aumente o tamanho da entrada para aproximadamente 3.000 linhas e verifique se os encodings válidos foram gerados corretamente para todas as linhas.
Poucas ou nenhuma amostra em algumas classes
Problema: número insuficiente de amostras para determinadas categorias durante a fase de amostragem, o que impede o treinamento de modelo. Talvez você veja a seguinte mensagem de erro: Fail to apply cost optimization because some classes have
few or no samples.
Solução:
- Remova categorias raras da chamada de função
AI.CLASSIFY. - Combine várias categorias raras em uma mais ampla para aumentar o tamanho da amostra na categoria combinada. Por exemplo, combine várias categorias raras em uma categoria
OTHER.
Os embeddings têm dimensões inconsistentes
Problema: inconsistências entre as dimensões de embedding em todas as linhas. Talvez você veja a seguinte mensagem de erro: Fail to apply cost optimization
because the embeddings have inconsistent dimensions.
Solução: verifique se os embeddings foram gerados pelo mesmo modelo e têm o mesmo comprimento de vetor de embedding. Use uma consulta SQL semelhante à seguinte para verificar se os embeddings em uma coluna têm o mesmo comprimento:
SELECT ARRAY_LENGTH(body_embedding.result), COUNT(*)
FROM `PROJECT_ID.DATASET.TABLE_NAME`
GROUP BY 1;
A complexidade do comando é muito alta
Problema: o modelo destilado não consegue atingir um limite de alta acurácia. Talvez você veja a seguinte mensagem de erro: Fail to apply cost optimization
because the prompt complexity is too high.
Solução:
Use categorias mutuamente exclusivas.
- Evite categorias sobrepostas em que uma entrada possa pertencer a várias categorias simultaneamente. Por exemplo, evite categorias como
['terrible', 'bad', 'okay', 'good', 'excellent']. Forneça descrições de categoria para orientar o LLM a resolver ambiguidades entre categorias. Exemplo:
AI.CLASSIFY( review, categories => [ ('terrible', 'Review where customer was not happy and the message indicates they will never try this product again'), ('bad', 'Review where customer was not happy but suggested improvements to the product'), ('okay', 'Review where customer was neutral about the product. Short reviews qualify for this category'), ('good', 'Review where customers were happy using this product but had minor critiques'), ('excellent', 'Review where customers were very happy using this product and will recommend others to try it too')], embeddings => review_embeddings)
- Evite categorias sobrepostas em que uma entrada possa pertencer a várias categorias simultaneamente. Por exemplo, evite categorias como
Teste modelos de embedding mais avançados, como
text-embedding-005oumultimodalembedding.Entre em contato com bqml-feedback@google.com para receber mais ajuda com a depuração.
Número inesperado de linhas processadas pelo LLM
Problema: as estatísticas de execução de consultas mostram que um número inesperadamente alto de linhas foi processado pelo LLM remoto em vez do modelo destilado. Isso pode acontecer pelos seguintes motivos:
- O modelo destilado foi treinado com sucesso, mas algumas linhas tinham incorporações ausentes. Essas linhas são processadas pelo LLM remoto.
- O modelo destilado não pôde ser aplicado a cada linha e precisou voltar ao LLM remoto para manter a qualidade consistente.
Solução: verifique se os embeddings foram gerados corretamente e são válidos para todas as linhas dos seus dados. Se o problema persistir, entre em contato com bqml-feedback@google.com para depuração.
Coluna de incorporação autônoma não detectada
Problema: o BigQuery não consegue detectar uma coluna de incorporação autônoma. Isso pode acontecer se o script usar uma tabela temporária e a referência à tabela original for perdida.
Solução: use o parâmetro embeddings para transmitir explicitamente uma coluna de incorporação autônoma, por exemplo, embeddings => content_embedding.result, que aciona a otimização de custos.
A seguir
- Saiba mais sobre a IA generativa no BigQuery.
- Consulte a documentação da função
AI.IF. - Consulte a documentação da função
AI.CLASSIFY.