Sobre este codelab
1. Visão geral
Imagine um app de moda que não apenas ajuda você a encontrar a roupa perfeita, mas também oferece conselhos de estilo em tempo real, tudo isso graças ao poder da integração de IA generativa de última geração. Nesta palestra, vamos explorar como criamos esse app usando os recursos de pesquisa de vetores do AlloyDB, juntamente com o índice ScaNN do Google, permitindo pesquisas ultrarrápidas para encontrar roupas combinando e oferecendo recomendações de moda instantâneas.
Também vamos analisar como o índice ScaNN do AlloyDB otimiza consultas complexas para gerar sugestões de estilo personalizadas. Também vamos usar o Gemini e o Imagen, modelos de IA generativa poderosos, para oferecer inspiração criativa e até mesmo visualizar seus looks personalizados. Todo o aplicativo é criado em uma arquitetura sem servidor, garantindo uma experiência simples e escalonável para os usuários.
O desafio:ao oferecer sugestões de roupas personalizadas, o app pretende ajudar pessoas que têm dificuldade para decidir o que vestir. Isso também ajuda a evitar o cansaço de tomar decisões com o planejamento de roupas.
A solução:o app de recomendação de roupas resolve o problema de oferecer aos usuários uma experiência de moda inteligente, personalizada e envolvente, além de mostrar os recursos do AlloyDB, da IA generativa e das tecnologias sem servidor.
O que você vai criar
Como parte deste laboratório, você vai:
- Criar uma instância do AlloyDB e carregar o conjunto de dados de e-commerce
- Ativar as extensões de modelo de IA generativa e pgvector no AlloyDB
- Gerar embeddings com base na descrição do produto
- Implantar a solução em funções do Cloud Run sem servidor
- Faça upload de uma imagem no Gemini e gere uma solicitação de descrição de imagem.
- Gere resultados de pesquisa com base em comandos e embeddings de conjuntos de dados de e-commerce.
- Adicione mais comandos para personalizar o comando e gerar recomendações de estilo.
- Implantar a solução em funções do Cloud Run sem servidor
Requisitos
2. Arquitetura
A arquitetura de alto nível do app é a seguinte:
As seções a seguir destacam o fluxo contextual do tutorial:
Ingestão:
A primeira etapa é ingerir os dados de varejo (inventário, descrições de produtos, interações com o cliente) no AlloyDB.
Mecanismo do Google Analytics:
Usaremos o AlloyDB como mecanismo de análise para realizar o seguinte:
- Extração de contexto:o mecanismo analisa os dados armazenados no AlloyDB para entender as relações entre produtos, categorias, comportamento do cliente etc., conforme aplicável.
- Criação de embedding:os embeddings (representações matemáticas de texto) são gerados para a consulta do usuário e as informações armazenadas no AlloyDB.
- Pesquisa vetorial:o mecanismo realiza uma pesquisa de similaridade, comparando o embedding da consulta com os embeddings das descrições de produtos, avaliações e outros dados relevantes. Isso identifica os 25 "vizinhos mais próximos" mais relevantes.
Recomendação do Gemini:
A matriz de bytes da imagem é transmitida ao modelo Gemini pela API Vertex AI, junto com o comando que pede uma descrição textual da parte de cima e as sugestões de recomendação da parte de baixo.
RAG e pesquisa vetorial do AlloyDB:
A descrição da roupa de cima é usada para consultar o banco de dados. A consulta converte o texto da pesquisa (recomendação do modelo Gemini para combinar a parte de baixo) em embeddings e realiza uma pesquisa de vetores nos embeddings armazenados no banco de dados para encontrar os vizinhos mais próximos (resultados correspondentes). As embeddings de vetores no banco de dados do AlloyDB são indexadas usando o índice ScaNN para melhor recuperação.
Geração de imagens de resposta:
As respostas validadas são estruturadas em uma matriz JSON, e todo o mecanismo é empacotado em uma função do Cloud Run sem servidor que é invocada pelo Criador de agentes.
Geração de imagens do Imagen:
O comando de estilo do usuário, uma recomendação selecionada pelo usuário e todas as solicitações de personalização são combinadas para exibir a Imagem 3 com uma imagem existente. A imagem de estilo é gerada com base nesse comando, usando a API Vertex AI.
3. Antes de começar
Criar um projeto
- No console do Google Cloud, na página de seletor de projetos, selecione ou crie um projeto do Google Cloud.
- Verifique se o faturamento está ativado para seu projeto do Cloud. Saiba como verificar se o faturamento está ativado em um projeto .
- Você vai usar o Cloud Shell, um ambiente de linha de comando executado no Google Cloud que vem pré-carregado com bq. Clique em Ativar o Cloud Shell (
) na parte de cima do console do Google Cloud.
- Depois de se conectar ao Cloud Shell, verifique se você já está autenticado e se o projeto está definido como seu ID do projeto usando o seguinte comando:
gcloud auth list
- Execute o comando a seguir para confirmar que os comandos gcloud futuros vão identificar seu projeto corretamente.
gcloud config list project
- Se o projeto não estiver definido, use o seguinte comando para definir explicitamente:
gcloud config set project <YOUR_PROJECT_ID>
- Ative as APIs necessárias.
Siga o link para ativar as APIs.
Se você esquecer de ativar alguma API, poderá fazer isso durante a implementação.
Para mais informações sobre o uso e os comandos do gcloud, consulte a documentação.
4. Configuração do banco de dados
Neste laboratório, vamos usar o AlloyDB como o banco de dados para armazenar o conjunto de dados de e-commerce de varejo. Ele usa clusters para armazenar todos os recursos, como bancos de dados e registros. Cada cluster tem uma instância principal que fornece um ponto de acesso aos dados. As tabelas são o recurso real que armazena dados.
Vamos criar um cluster, uma instância e uma tabela do AlloyDB em que o conjunto de dados de e-commerce será carregado.
Criar um cluster e uma instância
- No Console do Google Cloud, pesquise AlloyDB. Uma maneira fácil de encontrar a maioria das páginas no console do Cloud é pesquisar usando a barra de pesquisa do console.
- Clique em CRIAR CLUSTER
- Crie um cluster e uma instância com os seguintes valores:
- ID do cluster:
shopping-cluster
- senha: "
alloydb
" - Compatível com PostgreSQL 15
- Região: "
us-central1
" - Rede: "
default
"
- Na rede, quando você seleciona a rede padrão, a opção a seguir aparece. Clique em CONFIGURAR CONEXÃO para configurar uma rede padrão.
- Selecione Usar um intervalo de IP alocado automaticamente e clique em Continuar. Depois de analisar as informações, clique em CRIAR CONEXÃO.
Aguarde a conclusão da criação da rede padrão.
- Em "Configurar a instância principal", defina o ID da instância como "
shopping-instance"
".
- Clique em CRIAR CLUSTER para concluir a configuração do cluster da seguinte maneira:
5. Ingestão de dados
Agora é hora de adicionar uma tabela com os dados da loja. Aguarde a conclusão da criação da instância. Depois de criado, você pode fazer login no AlloyDB usando as credenciais definidas ao criar o cluster.
Autenticação no banco de dados do AlloyDB
- No console do Google Cloud, acesse AlloyDB. Selecione o cluster principal e clique em AlloyDB Studio no menu de navegação à esquerda:
- Insira os seguintes detalhes para autenticar no banco de dados do AlloyDB:
- Nome de usuário : "
postgres
" - Banco de dados : "
postgres
" - Senha : "
alloydb
"
Depois que você fizer a autenticação no AlloyDB Studio, os comandos SQL serão inseridos nas guias Editor. É possível adicionar várias janelas do editor usando o sinal de adição à direita da primeira guia do editor.
Você vai inserir comandos para o AlloyDB nas janelas do Editor usando as opções Executar, Formatar e Limpar conforme necessário.
Ativar extensões
Para criar este app, vamos usar as extensões "pgvector"
" e "google_ml_integration"
".
- A extensão pgvector permite armazenar e pesquisar embeddings de vetor.
- A extensão google_ml_integration fornece funções que você usa para acessar endpoints de previsão da Vertex AI e receber previsões no SQL.
- Ative essas extensões executando os seguintes DDLs:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- Verifique se as extensões estão instaladas executando este comando SQL:
select extname, extversion from pg_extension;
Criar uma tabela
- Crie uma tabela usando a seguinte instrução DDL:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
Se o comando acima for executado com sucesso, você vai poder acessar a tabela em
banco de dados. A imagem a seguir mostra um exemplo:
Ingerir dados
Para este laboratório, temos dados de teste de cerca de 200 registros neste arquivo SQL. Ele contém id, category, sub_category, uri, image
e content
. Os outros campos serão preenchidos mais tarde no laboratório.
- Copie as 20 linhas/instruções de inserção do arquivo SQL em uma nova guia do editor no AlloyDB Studio e clique em RUN.
- Expanda a seção "Explorer" até encontrar a tabela
apparels
. - Clique no ícone de menu [⋮] e em Consulta. Uma instrução SELECT será aberta em uma nova guia do editor.
- Clique em Run para verificar se as linhas foram inseridas.
Conceder permissão ao usuário
Vamos conceder permissão ao usuário postgres
para gerar incorporações no AlloyDB.
. No AlloyDB Studio, execute a seguinte instrução para conceder direitos de execução na função embedding
ao usuário postgres
:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Conceder o papel de usuário da Vertex AI à conta de serviço do AlloyDB
Vamos usar os modelos de embedding de texto da Vertex AI para gerar embeddings para o ROL da conta de usuário da Vertex AI na conta de serviço do AlloyDB.
No console do Google Cloud, clique no ícone Terminal do Cloud Shell [ ] e execute o comando a seguir:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. Contexto de versões
Para criar uma incorporação, precisamos de um context
, ou seja, todas as informações que queremos incluir em um único campo. Para isso, vamos criar uma descrição do produto que será armazenada na coluna pdt_desc
da tabela apparels
.
No nosso caso, vamos usar todas as informações sobre cada produto, mas, quando você fizer isso com seus dados, sinta-se à vontade para projetar os dados da maneira que achar mais significativa para sua empresa.
Na guia "Editor" do AlloyDB Studio, execute o comando abaixo que atualiza o campo pdt_desc
com dados de contexto:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
Essa DML cria um resumo de contexto simples usando as informações de todos os campos disponíveis na tabela e outras dependências (se houver no seu caso de uso). Para uma variedade mais precisa de informações e criação de contexto, projete os dados da maneira que for significativa para sua empresa.
7. Criar embeddings para o contexto
É muito mais fácil para os computadores processar números do que processar texto. Um sistema de incorporação converte texto em uma série de números de ponto flutuante que representam o texto, independentemente da forma como ele é escrito, do idioma usado etc.
Considere descrever um local à beira-mar. Ela pode ser chamada de "on the water
, beachfront
, walk from your room to the ocean
, sur la mer
, на берегу океана
etc. Todos esses termos parecem diferentes, mas o significado semântico ou a terminologia de aprendizado de máquina deles precisa ser muito semelhante.
Agora que os dados e o contexto estão prontos, vamos executar o SQL para adicionar as incorporações da coluna de descrição do produto ((pdt_desc
) à tabela no campo embedding
. Há vários modelos de embedding que podem ser usados. Estamos usando text-embedding-005
da Vertex AI.
- No AlloyDB Studio, execute o comando abaixo para gerar embeddings e atualizar a coluna
pdt_desc
com embeddings para os dados armazenados:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- Execute o seguinte comando para verificar se as inclusões foram geradas:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
Confira a seguir um exemplo de vetor de embeddings, que se parece com uma matriz de números flutuantes, para o texto de exemplo na consulta:
8. Realizar pesquisa de vetor
Agora que a tabela, os dados e os embeddings estão prontos, vamos realizar a pesquisa de vetor em tempo real para o texto de pesquisa do usuário.
Suponha que o texto de pesquisa do usuário seja "pink color, casual, pure cotton tops for women
".
Para encontrar correspondências para essa consulta, execute a seguinte consulta SQL:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
Vamos analisar essa consulta em detalhes:
Nesta consulta,
- O texto de pesquisa do usuário é: "
I want womens tops, pink casual only pure cotton.
" - Estamos convertendo esse texto de pesquisa em embeddings usando o método
embedding()
com o modelo:text-embedding-005
. Esta etapa é semelhante à anterior, em que aplicamos a função de incorporação a todos os itens da tabela. - "
<=>
" representa o uso do método de distância COSINE SIMILARITY. Todas as medidas de similaridade disponíveis estão disponíveis na documentação do pgvector. - Estamos convertendo o resultado do método de embedding no tipo de dados vetor para que ele seja compatível com os vetores armazenados no banco de dados.
- LIMIT 5 representa que queremos extrair 5 vizinhos mais próximos para o texto de pesquisa.
Confira a seguir um exemplo de resposta desta consulta SQL:
Como você pode observar nos resultados, as correspondências são muito próximas do texto da pesquisa. Tente mudar a cor para conferir como os resultados mudam.
Índice ScaNN do AlloyDB para a performance da consulta
Digamos que queremos aumentar a performance (tempo de consulta), a eficiência e a recuperação desse resultado de pesquisa vetorial usando o índice ScaNN.
Se você quiser usar o índice ScaNN, siga estas etapas:
- Como já temos o cluster, a instância, o contexto e as embeddings criadas, basta instalar a extensão ScaNN usando a seguinte instrução:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- Crie o índice ScaNN:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
Na DDL acima:
apparel_index
é o nome do índice.apparels
é o nome da tabela.scann
é o método de índice.embedding
é a coluna na tabela que você quer indexar.cosine
é o método de distância que você quer usar com o índice.54
é o número de partições a serem aplicadas a esse índice. Defina qualquer valor entre 1 e 1.048.576. Para mais informações sobre como decidir esse valor, consulte Ajustar um índice ScaNN.
De acordo com a recomendação no repo do ScaNN, usamos a RAIZ QUADRADA do número de pontos de dados. Ao fazer a partição, num_leaves
precisa ser aproximadamente a raiz quadrada do número de pontos de dados.
- Verifique se o índice foi criado usando a consulta:
SELECT * FROM pg_stat_ann_indexes;
- Realize a pesquisa vetorial usando a mesma consulta que usamos sem o índice:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
A consulta acima é a mesma que usamos no laboratório na etapa 8. No entanto, agora temos o campo indexado usando o índice ScaNN.
- Faça um teste com uma consulta de pesquisa simples com e sem o índice. Para testar sem índice, você precisa excluir o índice:
white tops for girls without any print
O texto de pesquisa acima na consulta de pesquisa vetorial nos dados de embeddings INDEXADOS resulta em resultados de pesquisa de qualidade e eficiência. A eficiência é muito melhor (em termos de tempo de execução: 10,37 ms sem ScaNN e 0,87 ms com ScaNN) com o índice. Para mais informações sobre esse assunto, consulte este blog.
9. Validação de correspondência com o LLM
Antes de continuar e criar um serviço para retornar as melhores correspondências a um aplicativo, vamos usar um modelo de IA generativa para validar se essas possíveis respostas são realmente relevantes e seguras para compartilhar com o usuário.
Verificar se a instância está configurada para o Gemini
- Verifique se o
google_ml_integration
já está ativado para o cluster e a instância. No AlloyDB Studio, execute o seguinte comando:
show google_ml_integration.enable_model_support;
Se o valor for mostrado como "ativado", pule as duas próximas etapas e vá direto para a configuração.
a integração do AlloyDB e do modelo da Vertex AI.
- Acesse a instância principal do cluster do AlloyDB e clique em EDIT PRIMARY INSTANCE.
- Em Opções de configuração avançadas, abra a seção Nova flag de banco de dados e verifique se
google_ml_integration.enable_model_support flag
está definido como "on
" da seguinte maneira:
3. Se não estiver definido como "
on
", defina como "on
" e clique em ATUALIZAR INSTÂNCIA.
Essa etapa vai levar alguns minutos.
Integração do AlloyDB e do modelo da Vertex AI
Agora você pode se conectar ao AlloyDB Studio e executar a seguinte instrução DML para configurar o acesso ao modelo Gemini no AlloyDB, usando o ID do projeto indicado. Talvez você receba um aviso de erro de sintaxe antes de executar o comando, mas ele deve funcionar bem.
- No console do Google Cloud, acesse AlloyDB. Selecione o cluster principal e clique em AlloyDB Studio no menu de navegação à esquerda.
- Vamos usar o
gemini-1.5-pro:generateContent
disponível por padrão com a extensãogoogle_ml_integration
. - É possível verificar os modelos configurados para acesso usando o seguinte comando no AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;
- Conceda permissão aos usuários do banco de dados para executar a função ml_predict_row e fazer previsões usando os modelos da Google Vertex AI. Para isso, execute o seguinte comando:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Como avaliar as respostas
Embora vamos usar uma consulta grande na próxima seção, em que vamos levar o aplicativo para o Cloud Run, para garantir que as respostas da consulta sejam razoáveis, ela pode ser difícil de entender.
Vamos analisar as seções individuais que vão criar a consulta maior que vamos usar.
- Primeiro, vamos enviar uma solicitação ao banco de dados para receber as cinco correspondências mais próximas de uma consulta do usuário. Estamos codificando a consulta para simplificar, mas não se preocupe, vamos interpolá-la na consulta mais tarde.
Vamos incluir a descrição do produto da tabela apparels
e adicionar dois novos campos: um que combina a descrição com o índice e outro com a solicitação original. Esses dados estão sendo salvos em uma tabela chamada xyz
, que é um nome temporário.
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
A saída dessa consulta será 5 linhas mais semelhantes relacionadas à consulta dos usuários. O
A nova tabela xyz
vai conter cinco linhas, e cada uma delas terá as seguintes colunas:
literature
content
user_text
- Para determinar a validade das respostas, usaremos uma consulta complicada em que explicamos como avaliar as respostas. Ele usa
user_text
econtent
na tabelaxyz
como parte da consulta.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- Usando essa consulta, vamos analisar a "qualidade" das respostas na tabela
xyz
. Quando falamos em precisão, queremos dizer o quanto as respostas geradas são precisas em relação ao que esperamos.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
- O
predict_row
retorna o resultado no formato JSON. O código "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
é usado para extrair o texto real desse JSON. Para conferir o JSON real que é retornado, remova esse código. - Por fim, para extrair o campo LLM da tabela x:
SELECT
LLM_RESPONSE
FROM
x;
- Isso pode ser combinado em uma única consulta da seguinte maneira:
Aviso: se você executou as consultas acima para verificar os resultados intermediários,
exclua/remova as tabelas xyz
e x
do banco de dados do AlloyDB antes de executar esta consulta.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
A consulta maior é uma combinação de todas as consultas executadas nas etapas anteriores. Os resultados informam se há ou não uma correspondência, qual é a porcentagem dela e uma explicação da classificação.
O modelo Gemini tem o streaming ativado por padrão, então a resposta real é distribuída em várias linhas:
10. Leve o aplicativo para a Web
Agora vamos hospedar esse aplicativo para que ele possa ser acessado pela Internet.
Criar a função do Cloud Run
- No console do Google Cloud, acesse o Cloud Run Functions usando este link:
https://console.cloud.google.com/run/create?deploymentType=function
- Em "Configurar", defina o nome da função como retail-engine e selecione a região como us-central1.
- Em "URL do endpoint", selecione Java 17 como ambiente de execução.
- Em "Autenticação", selecione Permitir invocações não autenticadas.
- Abra Contêineres, volumes, rede, segurança e clique na guia Rede.
- Selecione Conectar a uma VPC para tráfego de saída e clique em Usar conectores de acesso VPC sem servidor.
- Em "Rede", clique em Adicionar novo conector de VPC. Ative a API Serverless VPC Access, se ainda não tiver feito isso.
- No conector "Criar", defina o nome como
alloydb-test-conn
. - Defina a região como
us-central
. - Deixe o valor da rede como padrão e defina Sub-rede como Intervalo de IP personalizado com o intervalo de IP de 10.8.0.0 ou algo semelhante que esteja disponível.
- Abra as configurações Mostrar escalonamento e defina Instâncias mínimas como 2 e Instâncias máximas como 3.
- Selecione o tipo de instância como f1-micro. Confira a seguir as opções de criação de conector:
- Clique em "Criar" para criar o conector.
- Em Encaminhamento de tráfego, selecione Encaminhar todo o tráfego para a VPC.
- Clique em Criar para criar a função.
Implantar o aplicativo
Depois que a função for criada, atualize a origem e reimplante o aplicativo.
- No Cloud Run, clique na guia Serviços e na função retail-engine.
- Clique na guia "Origem". Deixe o ponto de entrada da função padrão definido como "
gcfv2.HelloHttpFunction
". - Substitua o conteúdo do arquivo HelloHttpFunction.java pelo conteúdo deste arquivo Java.
- Atualize os detalhes do AlloyDbJdbcConnector no arquivo de acordo com os detalhes da sua instância e do cluster do AlloyDB. Substitua
$PROJECT_ID
pelo ID do projeto do cluster e da instância do AlloyDB.
- Substitua o conteúdo do arquivo pom.xml pelo conteúdo deste arquivo XML.
- Clique em Salvar e implantar novamente para implantar a função.
11. Testar o aplicativo de motor de varejo
Depois que a função do Cloud atualizada for implantada, o endpoint vai aparecer neste formato:
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
Para testar no terminal do Cloud Shell, execute o seguinte comando:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
Você também pode testar a função do Cloud Run da seguinte maneira:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
Resultado:
Agora que executamos a pesquisa de vetor de semelhança usando o modelo de embeddings nos dados do AlloyDB, podemos criar o aplicativo que usa esses embeddings com sua imagem e solicitações para gerar sugestões de estilo.
12. Entender o fluxo de recomendação de looks
O app de recomendação de roupas é um aplicativo de inicialização de sprint configurado para funcionar com as incorporações que criamos no aplicativo de varejo AlloyDB com o Gemini e o Imagen para gerar opções visuais de estilo de roupas. Também é possível adicionar comandos personalizados e improvisar a recomendação.
Pense assim: você faz upload de uma imagem de um top rosa-choque do seu guarda-roupa para o app. Quando você clica em "Mostrar", com base no comando definido no código do aplicativo e nas incorporações no banco de dados do AlloyDB, o aplicativo gera várias opções que correspondem à imagem original. Agora você quer saber como as opções sugeridas ficariam com uma gargantilha azul. Então, você adiciona uma instrução nessas linhas e clica em Estilo. A imagem final é gerada, combinando a imagem original e as recomendações para criar uma roupa que combine.
Para começar a criar o app de recomendação de roupas, siga estas etapas:
- No Cloud Run, abra o app retail-engine e anote o URL do seu aplicativo. Esse é o repositório de embeddings que vamos usar para gerar sugestões semelhantes.
- No ambiente de desenvolvimento integrado, clone o repositório https://github.com/AbiramiSukumaran/outfit-recommender/. Para este exercício, as etapas mostradas são realizadas no ambiente de desenvolvimento integrado do Visual Studio Code.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
Confira a seguir alguns dos arquivos importantes no diretório do app:
src/main
: diretório de origem em que os arquivos do aplicativo e o HTML estão armazenados:HelloWorldApplication.java
: ponto de entrada principal do aplicativo de inicialização do Spring.HelloWorldController.java
: controlador REST do Spring Boot que processa solicitações HTTP relacionadas a um aplicativo de recomendação de roupas. Esse arquivo processa solicitações GET e POST, processa solicitações do usuário, analisa imagens, interage com incorporações do AlloyDB e retorna a resposta final para a interface. Esse controlador chama a classe GenerateImageSample.GenerateImageSample.java
: contém a classe de geração de imagens que se conecta à Vertex AI, formata o comando do usuário, faz chamadas de API para o modelo Imagen e retorna a imagem prevista para a classe do controlador.Resources
: contém imagens e arquivos HTML necessários para gerar a interface do aplicativo.Pom.xml
: define as dependências e configurações do projeto.
- No código do Visual Studio, abra o
HelloWorldController.java
e atualize as instâncias do ID e do local do projeto de acordo com o local em que a instância do AlloyDB foi criada.
- Atualize o
endpoint
para o URL do app de motor de varejo que você hospedou anteriormente.
- Abra o
GenerateImageSample.java
e atualize o ID do projeto e o local de acordo com a instância do AlloyDB criada.
- Salve todos os arquivos.
Agora vamos implantar este aplicativo no ambiente de execução sem servidor do Cloud Run.
13. Levar o aplicativo para a Web
Agora que adicionamos o projeto, o local e os detalhes do app de motor de varejo ao aplicativo de inicialização do spring para recomendar roupas, podemos implantar o aplicativo no Cloud Run.
Vamos usar o comando gcloud run deploy
no terminal do Visual Studio Code para implantar o aplicativo. No Visual Studio Code, é possível instalar a extensão do Google Cloud Code para começar a usar a gcloud CLI.
Para implantar o aplicativo, siga estas etapas:
- No ambiente de desenvolvimento integrado, abra o diretório clonado e inicie o terminal. No Visual Code Studio, clique em Terminal > Novo terminal.
- Siga as instruções neste documento para instalar a CLI gcloud.
- Se você estiver usando o Visual Code Studio, clique em Extensões, pesquise Google Cloud Code e instale a extensão.
- No terminal do ambiente de desenvolvimento integrado, faça a autenticação da sua Conta do Google executando o seguinte comando:
gcloud auth application-default login
- Defina o ID do projeto como o mesmo em que a instância do AlloyDB está localizada.
gcloud config set project PROJECT_ID
- Inicie o processo de implantação.
gcloud run deploy
- Em
Source code location
, pressione Enter para selecionar o diretório clonado do GitHub. - Em
Service name
, insira um nome para o serviço, como "outfit-recommender", e pressione Enter. - Em
Please specify a region
, insira o local em que a instância do AlloyDB e o aplicativo de motor de varejo estão hospedados, como 32 para us-central1, e pressione Enter.
- Em
Allow unauthenticated invocations to [..]
, digite Y e pressione Enter.
A imagem a seguir mostra o progresso da implantação do aplicativo:
14. Testar o aplicativo de recomendação de roupas
Depois que o aplicativo for implantado no Cloud Run, você poderá conferir o serviço no console do Google Cloud da seguinte maneira:
- No console do Google Cloud, acesse o Cloud Run.
- Em "Serviços", clique no serviço selecionador de roupas que você implantou. Você vai encontrar o serviço retail-engine e o serviço outfit-recommender da seguinte maneira:
- Clique no URL do aplicativo para abrir a interface do app de recomendação.
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
O aplicativo implantado pode ser visto da seguinte maneira:
Como usar o aplicativo
Para começar a usar o aplicativo, siga estas etapas:
- Clique em Enviar e faça upload de uma foto de uma peça de roupa.
- Depois de fazer o upload da imagem, clique em Estilo. O aplicativo usa a imagem como um comando e gera opções de fundo com base no comando do app de motor de varejo, que inclui embeddings para o conjunto de dados de varejo.
O app gera sugestões de imagem e um comando com base na imagem com recomendações de estilo. Por exemplo, A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
.
- É possível transmitir outras solicitações para essa recomendação de estilo gerada automaticamente. Por exemplo,
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
. - Clique em Mostrar para conferir o estilo final.
15. Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta postagem, siga estas etapas:
- No console do Google Cloud, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
16. Parabéns
Parabéns! Você realizou uma pesquisa de similaridade usando o AlloyDB, o pgvector e a pesquisa de vetores, além de usar o resultado da pesquisa com o poderoso modelo Imagen para gerar recomendações de estilo.