Gerar dados estruturados usando a função AI.GENERATE_TABLE
Este documento mostra como gerar dados estruturados usando um modelo Gemini Pro 1.5, Gemini Flash 1.5 ou Gemini Flash 2.0 e, em seguida, formatar a resposta do modelo usando um esquema SQL.
Para isso, você precisa concluir as seguintes tarefas:
- Criar um modelo remoto do BigQuery ML que represente um modelo hospedado da Vertex AI Gemini 1.5 ou 2.0.
- Usar o modelo com a função
AI.GENERATE_TABLE
para gerar dados estruturados com base em dados de tabelas padrão.
Permissões necessárias
Para criar uma conexão, você precisa da associação no seguinte papel do Identity and Access Management (IAM):
roles/bigquery.connectionAdmin
Para conceder permissões à conta de serviço da conexão, você precisa da seguinte permissão:
resourcemanager.projects.setIamPolicy
Para criar o modelo usando o BigQuery ML, você precisa das seguintes permissões do IAM:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.models.updateMetadata
Para executar a inferência, você precisa das seguintes permissões:
bigquery.tables.getData
na tabelabigquery.models.getData
no modelobigquery.jobs.create
Antes de começar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
Crie uma conexão
Crie uma Conexão de recursos do Cloud e tenha acesso à conta de serviço da conexão.
Selecione uma das seguintes opções:
Console
Acessar a página do BigQuery.
No painel Explorer, clique em
Adicionar dados.A caixa de diálogo Adicionar dados é aberta.
No painel Filtrar por, na seção Tipo de fonte de dados, selecione Aplicativos empresariais.
Como alternativa, no campo Pesquisar fontes de dados, insira
Vertex AI
.Na seção Fontes de dados em destaque, clique em Vertex AI.
Clique no card da solução Vertex AI Models: BigQuery Federation.
Na lista Tipo de conexão, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (recurso do Cloud).
No campo ID da conexão, insira um nome para a conexão.
Clique em Criar conexão.
Clique em Ir para conexão.
No painel Informações da conexão, copie o ID da conta de serviço para uso em uma etapa posterior.
bq
Em um ambiente de linha de comando, crie uma conexão:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
O parâmetro
--project_id
substitui o projeto padrão.Substitua:
REGION
: sua região de conexãoPROJECT_ID
: o ID do projeto do Google CloudCONNECTION_ID
: um ID para sua conexão
Quando você cria um recurso de conexão, o BigQuery cria uma conta de serviço do sistema exclusiva e a associa à conexão.
Solução de problemas: se você receber o seguinte erro de conexão, atualize o SDK Google Cloud:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Recupere e copie o ID da conta de serviço para uso em uma etapa posterior:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
O resultado será assim:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Use o
recurso
google_bigquery_connection
.
Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de cliente.
O exemplo a seguir cria uma conexão de recurso do Cloud chamada my_cloud_resource_connection
na região US
:
Para aplicar a configuração do Terraform em um projeto do Google Cloud, conclua as etapas nas seções a seguir.
Preparar o Cloud Shell
- Inicie o Cloud Shell.
-
Defina o projeto padrão do Google Cloud em que você quer aplicar as configurações do Terraform.
Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.
Preparar o diretório
Cada arquivo de configuração do Terraform precisa ter o próprio diretório, também chamado de módulo raiz.
-
No Cloud Shell, crie um diretório e um novo
arquivo dentro dele. O nome do arquivo precisa ter a extensão
.tf
, por exemplo,main.tf
. Neste tutorial, o arquivo é chamado demain.tf
.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Se você estiver seguindo um tutorial, poderá copiar o exemplo de código em cada seção ou etapa.
Copie o exemplo de código no
main.tf
recém-criado.Se preferir, copie o código do GitHub. Isso é recomendado quando o snippet do Terraform faz parte de uma solução de ponta a ponta.
- Revise e modifique os parâmetros de amostra para aplicar ao seu ambiente.
- Salve as alterações.
-
Inicialize o Terraform. Você só precisa fazer isso uma vez por diretório.
terraform init
Opcionalmente, para usar a versão mais recente do provedor do Google, inclua a opção
-upgrade
:terraform init -upgrade
Aplique as alterações
-
Revise a configuração e verifique se os recursos que o Terraform vai criar ou
atualizar correspondem às suas expectativas:
terraform plan
Faça as correções necessárias na configuração.
-
Para aplicar a configuração do Terraform, execute o comando a seguir e digite
yes
no prompt:terraform apply
Aguarde até que o Terraform exiba a mensagem "Apply complete!".
- Abra seu projeto do Google Cloud para ver os resultados. No console do Google Cloud, navegue até seus recursos na IU para verificar se foram criados ou atualizados pelo Terraform.
Conceder acesso à conta de serviço
Conceda à conta de serviço da conexão a função de usuário da Vertex AI.
Se você planeja especificar o endpoint como um URL ao criar o modelo remoto, por exemplo, endpoint = 'https://us-central1-aiplatform.googleapis.com/v1/projects/myproject/locations/us-central1/publishers/google/models/gemini-1.5-flash'
, conceda essa função no mesmo projeto especificado no URL.
Se você planeja especificar o endpoint usando o nome do modelo ao criar o modelo remoto, por exemplo, endpoint = 'gemini-1.5-flash'
, conceda esse papel no mesmo projeto em que planeja criar o modelo remoto.
Conceder o papel em um projeto diferente resulta no erro bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource
.
Para conceder o papel, siga estas etapas:
Console
Acesse a página IAM e administrador.
Clique em
Adicionar.A caixa de diálogo Adicionar principais é aberta.
No campo Novos principais, digite o ID da conta de serviço que você copiou anteriormente.
No campo Selecionar um papel, selecione Vertex AI e, em seguida, selecione Usuário da Vertex AI.
Clique em Salvar.
gcloud
Use o
comando gcloud projects add-iam-policy-binding
.
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None
Substitua:
PROJECT_NUMBER
: o ID do seu projetoMEMBER
: o ID da conta de serviço que você copiou anteriormente
Criar um modelo remoto do BigQuery ML
No Console do Google Cloud, acesse a página BigQuery.
Usando o editor de SQL, crie um modelo remoto:
CREATE OR REPLACE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID` OPTIONS (ENDPOINT = 'ENDPOINT');
Substitua:
PROJECT_ID
: ID do projeto;DATASET_ID
: o ID do conjunto de dados para conter o modelo. Esse conjunto de dados precisa estar no mesmo local que a conexão que você está usando.MODEL_NAME
: o nome do modeloREGION
: a região usada pela conexãoCONNECTION_ID
: o ID da conexão do BigQueryQuando você visualiza os detalhes da conexão no console do Google Cloud, esse é o valor na última seção do ID da conexão totalmente qualificado, mostrado em ID da conexão, por exemplo,
projects/myproject/locations/connection_location/connections/myconnection
ENDPOINT
: o nome do modelo do Gemini a ser usado. Os seguintes modelos são compatíveis: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
ENDPOINT
.
Gerar dados estruturados
Gere dados estruturados usando a
função AI.GENERATE_TABLE
com um modelo remoto e usando dados de comando de uma
coluna de tabela:
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) );
Substitua:
PROJECT_ID
: o ID do projeto.DATASET_ID
: o ID do conjunto de dados que contém o modelo.MODEL_NAME
: o nome do modeloTABLE_NAME
: o nome da tabela que contém o comando. Essa tabela precisa ter uma coluna chamadaprompt
ou é possível utilizar um alias para usar uma coluna com um nome diferente.PROMPT_QUERY
: a consulta GoogleSQL que gera os dados do comando. O valor do comando pode ser extraído de uma coluna ou especificado como um valor de struct com um número arbitrário de subcampos de nome de string e coluna. Por exemplo,SELECT ('Analyze the sentiment in ', feedback_column, 'using the following categories: positive, negative, neutral') AS prompt
.TOKENS
: um valorINT64
que define o número máximo de tokens que podem ser gerados na resposta. Esse valor precisa estar no intervalo[1,8192]
. Especifique um valor mais baixo para respostas mais curtas e um valor mais alto para respostas mais longas. O padrão é128
.TEMPERATURE
: um valorFLOAT64
no intervalo[0.0,2.0]
que controla o grau de aleatoriedade na seleção de token. O padrão é1.0
.Valores mais baixos para
temperature
são bons para comandos que exigem uma resposta mais determinista e menos aberta ou criativa, enquanto valores mais altos paratemperature
podem gerar resultados mais diversos ou criativos. Um valor de0
paratemperature
é determinista, o que significa que a resposta de maior probabilidade é sempre selecionada.TOP_P
: um valorFLOAT64
no intervalo[0.0,1.0]
ajuda a determinar a probabilidade dos tokens selecionados. Especifique um valor mais baixo para respostas menos aleatórias e um valor mais alto para respostas mais aleatórias. O padrão é0.95
.STOP_SEQUENCES
: um valorARRAY<STRING>
que remove as strings especificadas se elas estiverem incluídas nas respostas do modelo. As strings têm correspondência exata, incluindo as letras maiúsculas. O padrão é uma matriz vazia.SAFETY_SETTINGS
: um valor deARRAY<STRUCT<STRING AS category, STRING AS threshold>>
que configura limites de segurança de conteúdo para filtrar respostas. O primeiro elemento no struct especifica uma categoria de dano, e o segundo especifica um limite de bloqueio correspondente. O modelo filtra o conteúdo que viola essas configurações. Só é possível especificar cada categoria uma vez. Por exemplo, não é possível especificarSTRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_MEDIUM_AND_ABOVE' AS threshold)
eSTRUCT('HARM_CATEGORY_DANGEROUS_CONTENT' AS category, 'BLOCK_ONLY_HIGH' AS threshold)
ao mesmo tempo. Se não houver uma configuração de segurança para uma determinada categoria, a configuração de segurançaBLOCK_MEDIUM_AND_ABOVE
será usada.As categorias compatíveis são as seguintes:
HARM_CATEGORY_HATE_SPEECH
HARM_CATEGORY_DANGEROUS_CONTENT
HARM_CATEGORY_HARASSMENT
HARM_CATEGORY_SEXUALLY_EXPLICIT
Os limites aceitos são os seguintes:
BLOCK_NONE
(Restrito)BLOCK_LOW_AND_ABOVE
BLOCK_MEDIUM_AND_ABOVE
(padrão)BLOCK_ONLY_HIGH
HARM_BLOCK_THRESHOLD_UNSPECIFIED
Para mais informações, consulte Categorias de danos e Como configurar filtros de conteúdo.
OUTPUT_SCHEMA
: um valorSTRING
que especifica o formato da resposta do modelo. O valoroutput_schema
precisa ser uma definição de esquema SQL, semelhante à usada na instruçãoCREATE TABLE
. Os seguintes tipos de dados são aceitos:INT64
FLOAT64
BOOL
STRING
ARRAY
STRUCT
Para modelos do Gemini 1.5, especifique um tipo de dados
FLOAT64
apenas se você tiver certeza de que o valor de retorno não será um número arredondado. Às vezes, esses modelos podem retornar valoresINT64
em vez de valoresFLOAT64
para números arredondados, por exemplo,2
em vez de2.0
. Isso pode causar um erro de análise na consulta.Ao usar o argumento
output_schema
para gerar dados estruturados com base em instruções de uma tabela, é importante entender os dados da instrução para especificar um esquema adequado.Por exemplo, digamos que você esteja analisando o conteúdo da crítica de um filme em uma tabela que tem os seguintes campos:
- movie_id
- review
- prompt
Em seguida, você pode criar um texto de comando executando uma consulta semelhante a esta:
UPDATE
mydataset.movie_review
SET prompt = CONCAT('Extract the key words and key sentiment from the text below: ', review) WHERE review IS NOT NULL;E você pode especificar um valor
output_schema
semelhante a"keywords ARRAY<STRING>, sentiment STRING" AS output_schema
.
Exemplos
O exemplo a seguir mostra uma solicitação que recebe dados de uma tabela e fornece um esquema SQL para formatar a resposta do modelo:
SELECT * FROM AI.GENERATE_TABLE( MODEL `mydataset.gemini_model`, TABLE `mydataset.mytable`, STRUCT("keywords ARRAY<STRING>, sentiment STRING" AS output_schema));
O exemplo a seguir mostra uma solicitação que recebe dados de uma consulta e fornece um esquema SQL para formatar a resposta do 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, 8192 AS max_output_tokens));