Gerar texto usando um modelo do Gemini e a função ML.GENERATE_TEXT
Neste tutorial, mostramos como criar um
modelo remoto
baseado no
modelo gemini-1.0-pro-002
,
e como usá-lo com a
função ML.GENERATE_TEXT
para extrair palavras-chave e realizar análises de sentimento em resenhas de filmes
a tabela pública bigquery-public-data.imdb.reviews
.
Permissões necessárias
- Para criar o conjunto de dados, você precisa da permissão
bigquery.datasets.create
do Identity and Access Management (IAM). Para criar o recurso de conexão, você precisa das seguintes permissões do IAM:
bigquery.connections.create
bigquery.connections.get
Para conceder permissões à conta de serviço da conexão, você precisa da seguinte permissão:
resourcemanager.projects.setIamPolicy
Para criar o modelo, você precisa das seguintes permissões:
bigquery.jobs.create
bigquery.models.create
bigquery.models.getData
bigquery.models.updateData
bigquery.connections.delegate
Para executar a inferência, você precisa das seguintes permissões:
bigquery.models.getData
bigquery.jobs.create
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
- BigQuery ML: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Para mais informações, consulte Preços do BigQuery na documentação do BigQuery.
Para mais informações sobre preços da Vertex AI, consulte esta página.
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.
Criar um conjunto de dados
Crie um conjunto de dados do BigQuery para armazenar o modelo de ML:
No console do Google Cloud, acesse a página do BigQuery.
No painel Explorer, clique no nome do seu projeto.
Clique em
Conferir ações > Criar conjunto de dados.Na página Criar conjunto de dados, faça o seguinte:
Para o código do conjunto de dados, insira
bqml_tutorial
.Em Tipo de local, selecione Multirregião e EUA (várias regiões nos Estados Unidos).
Os conjuntos de dados públicos são armazenados na multirregião
US
. Para simplificar, armazene seus conjuntos de dados no mesmo local.Mantenha as configurações padrão restantes e clique em Criar conjunto de dados.
Criar uma conexão
Crie uma Conexão de recursos do Cloud e tenha acesso à conta de serviço da conexão. Crie a conexão no mesmo local do conjunto de dados criado na etapa anterior.
Selecione uma das seguintes opções:
Console
Acessar a página do BigQuery.
Para criar uma conexão, clique em
Adicionar e em Conexões com fontes de dados externas.Na lista Tipo de conexão, selecione Modelos remotos da Vertex AI, funções remotas e BigLake (Cloud Resource).
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
Anexe a seguinte seção ao seu arquivo main.tf
.
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }
CONNECTION_ID
: um ID para sua conexãoPROJECT_ID
: o ID do projeto do Google CloudREGION
: sua região de conexão
Conceder permissões para a conta de serviço do portal
Conceda à conta de serviço da conexão a função de usuário da Vertex AI. É necessário conceder essa função no mesmo projeto que você criou ou selecionou na seção Antes de começar. 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:
Acessar a página AM e administrador
Clique em
Conceder acesso.No campo Novos principais, digite o ID da conta de serviço que você copiou anteriormente.
No campo Selecionar um papel, escolha Vertex AI e, em seguida, selecione o papel Usuário da Vertex AI.
Clique em Salvar.
Criar o modelo remoto
Crie um modelo remoto que represente um modelo da Vertex AI:
No Console do Google Cloud, acesse a página BigQuery.
No editor de consultas, execute a seguinte instrução:
CREATE OR REPLACE MODEL `bqml_tutorial.gemini_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'gemini-1.0-pro-002');
Substitua:
LOCATION
: o local da conexãoCONNECTION_ID
: o ID da sua 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
A consulta leva alguns segundos para ser concluída. Depois disso, o modelo gemini_model
aparece no conjunto de dados bqml_tutorial
no painel Explorer.
Como a consulta usa uma instrução CREATE MODEL
para criar um modelo, não há resultados de consulta.
Realizar extração de palavra-chave
Realize a extração de palavra-chave em avaliações de filmes do IMDB usando o modelo remoto e a função ML.GENERATE_TEXT
:
No Console do Google Cloud, acesse a página BigQuery.
No editor de consultas, insira a seguinte instrução para realizar a extração de palavra-chave em cinco avaliações de filmes:
SELECT ml_generate_text_result['candidates'][0]['content'] AS generated_text, ml_generate_text_result['candidates'][0]['safety_ratings'] AS safety_ratings, * EXCEPT (ml_generate_text_result) FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini_model`, ( SELECT CONCAT('Extract the key words from the text below: ', review) AS prompt, * FROM `bigquery-public-data.imdb.reviews` LIMIT 5 ), STRUCT( 0.2 AS temperature, 100 AS max_output_tokens));
A saída é semelhante à seguinte, com as colunas não geradas omitidas para fins de esclarecimento:
+----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+ | generated_text | safety_ratings | ml_generate_text_status | prompt | ... | +----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+ | {"parts":[{"text":"## Key words:\n\n* | [{"category":1,"probability":1, | | Extract the key words from | | | **Negative sentiment:** \"terribly | "probability_score":0.28856909, | | the text below: I had to | | | bad acting\", \"dumb story\", \"not | "severity":1,"severity_score":0.1510278}, | | see this on the British | | | even a kid would enjoy this\", | {"category":2,"probability":1, | | Airways plane. It was | | | \"something to switch off\"\n* | "probability_score":0.062445287, | | terribly bad acting and | | | **Context:** \"British Airways plane\" | "severity":1,"severity_score":0.10393038}, | | a dumb story. Not even | | | \n* **Genre:** \"movie\" (implied)... | {"category":3,"probability":2,... | | a kid would enjoy this... | | +----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+ | {"parts":[{"text":"## Key words:\n\n* | [{"category":1,"probability":1, | | Extract the key words from | | | **Movie:** The Real Howard Spitz\n* | "probability_score":0.2995148,"severity":2, | | the text below: This is | | | **Genre:** Family movie\n* | "severity_score":0.22354652}, | | a family movie that was | | | **Broadcast:** ITV station, 1.00 am\n* | {"category":2,"probability":1," | | broadcast on my local | | | **Director:** Vadim Jean\n* | probability_score":0.13072868, | | ITV station at 1.00 am a | | | **Main character:** Howard Spitz, | "severity":1,"severity_score":0.07030385}, | | couple of nights ago. | | | a children's author who hates... | {"category":3,"probability":2," ... | | This might be a strange... | | +----------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
Os resultados incluem as seguintes colunas:
generated_text
: o texto gerado.safety_ratings
: os atributos de segurança, com informações sobre eventual bloqueio do conteúdo devido a uma das categorias de bloqueio. Para mais informações sobre os atributos de segurança, consulte a API Vertex PaLM.ml_generate_text_status
: o status da resposta da API sobre a linha correspondente. Se a operação tiver sido bem-sucedida, esse valor estará vazio.prompt
: o comando usado para a análise de sentimento.- Todas as colunas da tabela
bigquery-public-data.imdb.reviews
.
Opcional: em vez de analisar manualmente o JSON retornado pela função, como você fez na etapa anterior, use o argumento
flatten_json_output
para retornar o texto gerado e os atributos de segurança em colunas separadas.No editor de consultas, execute a seguinte instrução:
SELECT * FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini_model`, ( SELECT CONCAT('Extract the key words from the text below: ', review) AS prompt, * FROM `bigquery-public-data.imdb.reviews` LIMIT 5 ), STRUCT( 0.2 AS temperature, 100 AS max_output_tokens, TRUE AS flatten_json_output));
A saída é semelhante à seguinte, com as colunas não geradas omitidas para fins de esclarecimento:
+----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+ | ml_generate_text_llm_result | ml_generate_text_rai_result | ml_generate_text_status | prompt | ... | +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+ | ## Keywords: | [{"category":1,"probability":1, | | Extract the key words from | | | | "probability_score":0.29391089,"severity":1, | | the text below: I had to | | | * **Negative sentiment:** | "severity_score":0.15584777},{"category":2, | | see this on the British | | | "terribly bad acting", "dumb | "probability":1,"probability_score": | | Airways plane. It was | | | story", "not even a kid would | 0.061311536,"severity":1,"severity_score": | | terribly bad acting and | | | enjoy this", "switch off" | 0.10320505},{"category":3,"probability":2, | | a dumb story. Not even | | | * **Context:** "British | "probability_score":0.60340... | | a kid would enjoy this... | | +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+ | ## Key words: | [{"category":1,"probability":1, | | Extract the key words from | | | | "probability_score":0.16968086,"severity":1, | | the text below: This is | | | * **Movie:** The Real Howard Spitz | "severity_score":0.13386749},{"category":2, | | a family movie that was | | | * **Genre:** Family movie | "probability":1,"probability_score": | | broadcast on my local | | | * **Broadcast:** ITV, 1.00 | 0.14841709,"severity":1,"severity_score": | | ITV station at 1.00 am a | | | am | 0.062674366},{"category":3,"probability":1, | | couple of nights ago. | | | - ... | "probability_score":0.38116196,... | | This might be a strange... | | +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
Os resultados incluem as seguintes colunas:
ml_generate_text_llm_result
: o texto gerado.ml_generate_text_rai_result
: os atributos de segurança, com informações sobre eventual bloqueio do conteúdo devido a uma das categorias de bloqueio. Para mais informações sobre os atributos de segurança, consulte a API Vertex PaLM.ml_generate_text_status
: o status da resposta da API sobre a linha correspondente. Se a operação tiver sido bem-sucedida, esse valor estará vazio.prompt
: o prompt usado para a extração da palavra-chave.- Todas as colunas da tabela
bigquery-public-data.imdb.reviews
.
Realizar análise de sentimento
Realize a análise de sentimento nas avaliações de filmes do IMDB usando o modelo remoto e a função ML.GENERATE_TEXT
:
No Console do Google Cloud, acesse a página BigQuery.
No editor de consultas, execute a seguinte instrução para realizar a análise de sentimento em cinco avaliações de filmes:
SELECT ml_generate_text_result['candidates'][0]['content'] AS generated_text, ml_generate_text_result['candidates'][0]['safety_ratings'] AS safety_ratings, * EXCEPT (ml_generate_text_result) FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.gemini_model`, ( SELECT CONCAT( 'perform sentiment analysis on the following text, return one the following categories: positive, negative: ', review) AS prompt, * FROM `bigquery-public-data.imdb.reviews` LIMIT 5 ), STRUCT( 0.2 AS temperature, 100 AS max_output_tokens));
A saída é semelhante à seguinte, com as colunas não geradas omitidas para fins de esclarecimento:
+--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+ | generated_text | safety_ratings | ml_generate_text_status | prompt | ... | +--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+ | {"parts":[{"text":"## Sentiment Analysis: | [{"category":1,"probability":1, | | perform sentiment analysis | | | Negative \n\nThis text expresses a | "probability_score":0.33895186, | | on the following text, | | | strongly negative sentiment towards the | "severity":1,"severity_score":0.10521054}, | | return one the following | | | movie. Here's why:\n\n* **Negative | {"category":2,"probability":1, | | negative: I had to see | | | like \"terribly,\" \"dumb,\" and | "probability_score":0.069163561,"severity" | | this on the British | | | \"not even\" to describe the acting... | :1,"severity_score":0.093512312},... | | Airways plane. It was... | | +--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+ | {"parts":[{"text":"## Sentiment Analysis: | [{"category":1,"probability":1, | | perform sentiment analysis | | | Negative \n\nThis review expresses a | "probability_score":0.35644665, | | on the following text, | | | predominantly negative sentiment towards | "severity":1,"severity_score":0.15253653}, | | return one the following | | | the movie \"The Real Howard Spitz.\" | {"category":2,"probability":1, | | categories: positive, | | | Here's why:\n\n* **Criticism of the film's | "probability_score":0.063948415,"severity" | | negative: This is a family | | | premise:** The reviewer finds it strange | :1,"severity_score":0.047249716}, | | movie that was broadcast | | | that a film about a children's author... | {"category":3,"probability":2,... | | on my local ITV station... | | +--------------------------------------------+---------------------------------------------+-------------------------+----------------------------+-----+
Os resultados incluem as mesmas colunas documentadas para Realizar a extração de palavra-chave.
Limpar
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.