Crie um app de recomendação de posições de ioga contextual com o Firestore, a pesquisa de vetores e o Gemini 2.0.

Crie um app de recomendação de posições de ioga contextual com o Firestore, a pesquisa de vetores e o Gemini 2.0.

Sobre este codelab

subjectÚltimo fev. 10, 2025 atualizado
account_circleEscrito por Author: Abirami Sukumaran

1. Visão geral

No mundo dos apps de bem-estar e fitness, é fundamental oferecer uma experiência rica e envolvente aos usuários. No caso de um app de ioga, isso significa ir além das descrições de texto simples das poses e oferecer informações abrangentes, conteúdo multimídia e recursos de pesquisa inteligente. Neste blog, vamos mostrar como criar um banco de dados robusto de poses de ioga usando o Firestore do Google Cloud, aproveitar a extensão Vector Search para correspondência contextual e integrar o poder do Gemini 2.0 Flash (experimental) para trabalhar com conteúdo multimodal.

O Firestore, o banco de dados de documentos NoSQL sem servidor do Google Cloud, é uma excelente escolha para criar aplicativos escalonáveis e dinâmicos. Confira por que ele é perfeito para nosso app de ioga:

  • Escalonamento e desempenho:o Firestore é escalonado automaticamente para processar milhões de usuários e conjuntos de dados massivos, garantindo que seu app continue responsivo mesmo quando crescer.
  • Atualizações em tempo real: a sincronização em tempo real integrada mantém os dados consistentes em todos os clientes conectados, o que é perfeito para recursos como aulas ao vivo ou prática colaborativa.
  • Modelo de dados flexível:a estrutura baseada em documentos do Firestore permite armazenar diversos tipos de dados, incluindo texto, imagens e até mesmo incorporações, o que o torna ideal para representar informações complexas de posições de ioga.
  • Consultas avançadas:o Firestore oferece suporte a consultas complexas, incluindo igualdade, desigualdade e, agora, com a nova extensão, pesquisas de similaridade de vetores.
  • Suporte off-line:o Firestore armazena dados em cache localmente, permitindo que seu app funcione mesmo quando os usuários estão off-line.

Como melhorar a pesquisa com a extensão de pesquisa de vetor do Firestore

A pesquisa tradicional baseada em palavras-chave pode ser limitada ao lidar com conceitos complexos, como poses de ioga. Um usuário pode pesquisar uma pose que "abre os quadris" ou "melhore o equilíbrio" sem saber o nome específico da pose. É aí que a Pesquisa Vetorial entra.

A pesquisa vetorial com o Firestore permite:

  • Gerar embeddings:transforme descrições de texto e, no futuro, possivelmente imagens e áudio em representações de vetores numéricos (embeddings) que capturam o significado semântico usando modelos como os disponíveis na Vertex AI ou modelos personalizados.
  • Armazenar embeddings:armazene esses embeddings diretamente nos documentos do Firestore.
  • Realizar pesquisas de similaridade:consulte seu banco de dados para encontrar documentos semanticamente semelhantes a um determinado vetor de consulta, permitindo a correspondência contextual.

Como integrar o Gemini 2.0 Flash (experimental)

O Gemini 2.0 Flash é o modelo de IA multimodal de ponta do Google. Ainda que seja um recurso experimental, ele oferece possibilidades interessantes para enriquecer nosso app de yoga:

  • Geração de texto: use o Gemini 2.0 Flash para gerar descrições detalhadas de posições de ioga, incluindo benefícios, modificações e contraindicações.
  • Geração de imagens (simulada): embora a geração de imagens direta com o Gemini ainda não esteja disponível publicamente, simulei isso usando o Imagen do Google, gerando imagens que representam visualmente as poses.
  • Geração de áudio (imitação): da mesma forma, podemos usar um serviço de conversão de texto em voz (TTS) para criar instruções em áudio para cada pose, orientando os usuários durante a prática.

Possivelmente, proponho a integração para melhorar o app e usar os seguintes recursos do modelo:

  • API Multimodal Live: essa nova API ajuda a criar aplicativos de streaming de áudio e visão em tempo real com o uso de ferramentas.
  • Velocidade e desempenho: o Gemini 2.0 Flash tem um tempo até o primeiro token (TTFT, na sigla em inglês) significativamente melhor do que o Gemini 1.5 Flash.
  • Experiências de agentes aprimoradas: o Gemini 2.0 oferece melhorias na compreensão multimodal, na programação, na execução de instruções complexas e na chamada de funções. Essas melhorias funcionam juntas para oferecer experiências melhores aos agentes.

Para mais detalhes, consulte a página%20over%20Gemini%201.5%20Flash desta documentação.

Para aumentar a credibilidade e fornecer mais recursos, podemos integrar a Pesquisa Google para fundamentar as informações fornecidas pelo nosso app. Isso significa:

  • Pesquisa contextual:quando um usuário administrador insere os detalhes de uma pose, podemos usar o nome da pose para realizar uma pesquisa no Google.
  • Extração de URL:podemos extrair URLs relevantes, como artigos, vídeos ou sites de ioga confiáveis, dos resultados da pesquisa e exibi-los no app.

O que você vai criar

Como parte deste laboratório, você vai:

  1. Criar uma coleção do Firestore e carregar documentos de yoga
  2. Aprenda a criar aplicativos CRUD com o Firestore
  3. Gerar descrição de uma pose de ioga com o Gemini 2.0 Flash
  4. Ativar a pesquisa vetorial do Firebase com a integração do Firestore
  5. Gerar embeddings com base na descrição do Yoga
  6. Realizar pesquisa de similaridade para o texto de pesquisa do usuário

Requisitos

  • Use um navegador, como o Chrome ou o Firefox.
  • Ter um projeto do Google Cloud com o faturamento ativado.

2. Antes de começar

Criar um projeto

  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 do Cloud. Saiba como verificar se o faturamento está ativado em um projeto .
  3. 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.

Imagem do botão "Ativar o Cloud Shell"

  1. Depois de se conectar ao Cloud Shell, verifique se você já está autenticado e se o projeto está definido como seu ID usando o seguinte comando:
gcloud auth list
  1. Execute o comando a seguir no Cloud Shell para confirmar se o comando gcloud sabe sobre seu projeto.
gcloud config list project
  1. Se o projeto não estiver definido, use este comando:
gcloud config set project <YOUR_PROJECT_ID>
  1. Ative as APIs necessárias.
gcloud services enable firestore.googleapis.com \
                       compute
.googleapis.com \
                       cloudresourcemanager
.googleapis.com \
                       servicenetworking
.googleapis.com \
                       run
.googleapis.com \
                       cloudbuild
.googleapis.com \
                       cloudfunctions
.googleapis.com \
                       aiplatform
.googleapis.com \
                       storage
.googleapis.com \
                       secretmanager
.googleapis.com \
                       texttospeech
.googleapis.com

A alternativa ao comando gcloud é pelo console, pesquisando cada produto ou usando este link.

Se alguma API for perdida, você poderá ativá-la durante a implementação.

Consulte a documentação para ver o uso e os comandos gcloud.

3. Configuração do banco de dados

A documentação tem etapas mais completas sobre como configurar uma instância do Firestore. Em um alto nível, para começar, vou seguir estas etapas:

1 Acesse o Visualizador do Firestore e, na tela "Selecionar um serviço de banco de dados", escolha "Firestore no modo nativo".

  1. Selecionar um local para o Firestore
  2. Clique em "Criar banco de dados". Se for a primeira vez, deixe como "(default)".

Ao criar um projeto do Firestore, a API no Cloud API Manager também é ativada.

  1. IMPORTANTE: escolha a versão de TESTE (não de PRODUÇÃO) das regras de segurança para que os dados sejam acessíveis.
  2. Depois de configurar, você vai ver a visualização do banco de dados, da coleção e do documento do Firestore no modo nativo, como na imagem abaixo:

f7136d53253c59a.png

  1. Não faça isso ainda, mas, apenas para constar, você pode clicar em "Iniciar coleção" e criar uma nova. Defina o ID da coleção como "poses". Clique no botão Salvar.

a26eb470aa9bfda9.png

Dicas profissionais para uso em produção:

  1. Depois de finalizar o modelo de dados e identificar quem pode acessar diferentes tipos de documentos, você pode criar, editar e monitorar as Regras de segurança na interface do Firebase. Acesse as Regras de segurança neste link: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
  2. Edite, monitore e teste suas regras de segurança antes de implantar / lançar o projeto na fase de desenvolvimento, porque elas são muitas vezes a causa silenciosa de problemas no funcionamento do app.

Para esta demonstração, vamos usar o modo TESTE.

4. API REST do Firestore

  1. A API REST pode ser útil nos seguintes casos de uso:a. Ao acessar o Firestore em um ambiente com recursos restritos, em que não é possível executar uma biblioteca de cliente completa. Como automatizar a administração do banco de dados ou extrair metadados detalhados do banco de dados
  2. A maneira mais fácil de usar o Firestore é usar uma das bibliotecas de cliente nativas, mas há algumas situações em que é melhor chamar a API REST diretamente.
  3. Neste blog, você vai conferir o uso e a demonstração das APIs REST do Firestore, e não das bibliotecas de cliente nativas.
  4. Para fazer a autenticação, a API REST do Firestore aceita um token de ID do Firebase Authentication ou um token do Google Identity OAuth 2.0. Para mais informações sobre o tópico "Autenticação e autorização", consulte a documentação.
  5. Todos os endpoints da API REST estão no URL de base https://firestore.googleapis.com/v1/.

Spring Boot e API Firestore

Esta solução no Spring Boot Framework demonstra um aplicativo cliente que usa as APIs do Firestore para coletar e modificar detalhes de postura e respiração de ioga com uma experiência interativa do usuário.

Para uma explicação detalhada da parte da solução CRUD do Firestore do app de poses de ioga, acesse o link do blog.

Para se concentrar na solução atual e aprender a parte CRUD em qualquer lugar, clone toda a solução focada neste blog do repositório abaixo no Cloud Shell Terminal e receba uma cópia da base de código.

git clone https://github.com/AbiramiSukumaran/firestore-poserecommender

Observação:

  1. Depois de clonar o repositório, basta fazer algumas mudanças no ID do projeto, nas APIs etc. Nenhuma outra mudança é necessária para colocar o aplicativo em funcionamento. Cada componente do aplicativo será explicado nas próximas seções. Confira uma lista de mudanças:
  2. No arquivo src/main/java/com/example/demo/GenerateImageSample.java, substitua "<<YOUR_PROJECT_ID>>" pelo ID do projeto.
  3. No arquivo src/main/java/com/example/demo/GenerateEmbeddings.java, substitua "<<YOUR_PROJECT_ID>>" pelo ID do projeto.
  4. Em src/main/java/com/example/demo/PoseController.java, substitua todas as instâncias de <<YOUR_PROJECT_ID>>" e o nome do banco de dados ,, neste caso "(default)",, pelos valores adequados da sua configuração:
  5. Em src/main/java/com/example/demo/PoseController.java, substitua "[YOUR_API_KEY]" pela sua CHAVE DE API para o Gemini 2.0 Flash. Você pode fazer isso no AI Studio.
  6. Se você quiser testar localmente, execute os seguintes comandos na pasta do projeto no terminal do Cloud Shell:
mvn package

mvn spring-boot:run

No momento, você pode conferir o aplicativo em execução clicando na opção "Pré-visualização da Web" no terminal do Cloud Shell. Ainda não estamos prontos para realizar testes e testar o aplicativo.

  1. Opcional:se você quiser implantar o app no Cloud Run, será necessário inicializar um novo aplicativo Java Cloud Run do zero no Cloud Shell Editor e adicionar os arquivos src e template do repo ao novo projeto nas respectivas pastas, já que o projeto atual do repositório do GitHub não está configurado por padrão para a configuração de implantação do Cloud Run. Confira a seguir as etapas a serem seguidas, em vez de clonar o repositório atual:
  2. Acesse o editor do Cloud Shell (verifique se o editor está aberto e não o terminal) e clique no ícone do nome do projeto do Google Cloud no lado esquerdo da barra de status (a parte bloqueada na captura de tela abaixo).

d3f0de417094237d.png

  1. Selecione "Novo aplicativo" -> "Aplicativo do Cloud Run" -> "Java: Cloud Run" na lista de opções e nomeie como "firestore-poserecommender".

d5ef8b4ca8bf3f85.png

  1. Agora você vai encontrar um modelo de pilha completa para o aplicativo Java Cloud Run, pré-configurado e pronto para uso.
  2. Remova a classe Controller existente e copie os seguintes arquivos para as respectivas pastas na estrutura do projeto:

firestore-poserecommender/src/main/java/com/example/demo/

  1. FirestoreSampleApplication.java
  2. GenerateEmbeddings.java
  3. GenerateImageSample.java
  4. Pose.java
  5. PoseController.java
  6. ServletInitializer.java
             firestore-poserecommender/src/main/resources/static/
  7. Index.html

firestore-poserecommender/src/main/resources/templates/

  1. contextsearch.html
  2. createpose.html
  3. errmessage.html
  4. pose.html
  5. ryoq.html
  6. searchpose.html
  7. showmessage.html

firestore-poserecommender/

  1. Dockerfile
  2. É necessário fazer as mudanças nos arquivos correspondentes para substituir o ID DO PROJETO e a CHAVE DA API pelos valores respectivos. (etapas 1 a,b, c e d acima).

5. Ingestão de dados

Os dados do aplicativo estão disponíveis neste arquivo data.json: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json

Se você quiser começar com alguns dados predefinidos, copie o JSON e substitua todas as ocorrências de "<<YOUR_PROJECT_ID>>" pelo seu valor.

  • Acesse o Firestore Studio.
  • Verifique se você criou uma coleção chamada "poses"
  • Adicione documentos do arquivo de repositório mencionado acima manualmente, um por vez

Como alternativa, você pode importar dados de uma só vez do conjunto predefinido que criamos para você seguindo as etapas a seguir:

  1. Acesse o Cloud Shell Terminal e verifique se o projeto ativo do Google Cloud está definido e se você tem autorização. Crie um bucket no seu projeto com o comando gsutil abaixo. Substitua a variável <PROJECT_ID> no comando abaixo pelo ID do projeto do Google Cloud:

gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket

  1. Agora que o bucket foi criado, precisamos copiar a exportação de banco de dados que preparamos para ele antes de importar para o banco de dados do Firebase. Use o comando abaixo:

gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket

Agora que temos os dados para importar, podemos passar para a etapa final de importação dos dados para o banco de dados do Firebase (padrão) que criamos.

  1. Acesse o console do Firestore e clique em Importar/Exportar no menu de navegação à esquerda.

Selecione "Importar" e escolha o caminho do Cloud Storage que você acabou de criar. Navegue até selecionar o arquivo "yoga_poses.overall_export_metadata":

f5c1d16df7d5a64a.png

  1. Clique em Importar.

A importação vai levar alguns segundos. Quando estiver pronta, você poderá validar seu banco de dados do Firestore e a coleção acessando https://console.cloud.google.com/firestore/databases, selecionando o banco de dados padrão e a coleção poses, conforme mostrado abaixo:

  1. Outro método é criar os registros manualmente pelo aplicativo depois de implantar usando a ação "Criar uma nova pose".

6. Vector Search

Ativar a extensão de pesquisa de vetor do Firestore

Use esta extensão para incorporar e consultar automaticamente seus documentos do Firestore com o novo recurso de pesquisa de vetores. Isso vai levar você ao Hub de extensões do Firebase.

Ao instalar a extensão da Pesquisa vetorial, você especifica uma coleção e um nome de campo de documento. A adição ou atualização de um documento com esse campo aciona a extensão para calcular uma embedding de vetor para o documento. Esse embedding vetorial é gravado no mesmo documento, que é indexado no repositório vetorial, pronto para ser consultado.

Confira as etapas:

Instalar a extensão:

Instale a extensão "Vector Search with Firestore" no Marketplace de Extensões do Firebase clicando em "Install in Firebase Console".

IMPORTANTE:

Na primeira vez que você acessar essa página de extensões, selecione o mesmo projeto em que está trabalhando no console do Google Cloud listado no console do Firebase.

715426b97c732649.png

Se o projeto não estiver na lista, adicione-o ao Firebase (escolha seu projeto do Google Cloud na lista).

Configurar a extensão:

Especifique a coleção ("poses"), o campo que contém o texto a ser incorporado ("posture") e outros parâmetros, como as dimensões de incorporação.

Se houver APIs que precisam ser ativadas nesta etapa, a página de configuração vai permitir que você faça isso. Siga as etapas.

Se a página não responder após ativar as APIs por um tempo, atualize a página e as APIs vão aparecer como ativadas.

5ba59b45710c567b.png

Em uma das etapas a seguir, você pode usar o LLM que preferir para gerar as representações. Escolha "Vertex AI".

bb528a04ebb5f976.png

As próximas configurações estão relacionadas à sua coleção e ao campo que você quer incorporar:

LLM: Vertex AI

Caminho da coleção: poses

Limite de consulta padrão: 3

Medida de distância: cosseno

Nome do campo de entrada: postura

Nome do campo de saída: embedding

Nome do campo de status: status

Incorporar documentos atuais: sim

Atualizar embeddings atuais: sim

Local do Cloud Functions: us-central1

Ativar eventos: não marcada

fb8cdf1163fac7cb.png

Depois de configurar tudo, clique no botão "Instalar extensão". Isso vai levar de 3 a 5 minutos.

Gerar embeddings:

À medida que você adiciona ou atualiza documentos na coleção "poses", a extensão gera automaticamente incorporações usando um modelo pré-treinado ou um modelo de sua escolha por um endpoint da API. Neste caso, escolhemos a Vertex AI na configuração da extensão.

Criação de índice

Ele vai exigir a criação de um índice no campo de incorporação no momento do uso da incorporação no aplicativo.

O Firestore cria índices automaticamente para consultas básicas. No entanto, você pode permitir que ele gere a sintaxe de índice executando consultas que não têm um índice. O Firestore vai fornecer um link para o índice gerado na mensagem de erro no aplicativo. Confira a lista de etapas para criar um índice vetorial:

  1. Acessar o terminal do Cloud Shell
  2. Execute este comando:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"

Saiba mais neste link.

Depois que um índice de vetores é criado, é possível realizar uma pesquisa de vizinho mais próximo com os embeddings vetoriais.

Observação importante:

A partir desse ponto, não é necessário fazer nenhuma mudança na fonte. Basta seguir as instruções para entender o que o aplicativo está fazendo.

Vamos conferir como o aplicativo recém-criado se aproxima da Pesquisa Vetorial. Depois que os embeddings forem armazenados, use a classe VectorQuery do SDK do Java do Firestore para realizar a pesquisa de vetores e receber os resultados do vizinho mais próximo:

CollectionReference coll = firestore.collection("poses");
   
VectorQuery vectorQuery = coll.findNearest(
       
"embedding",
        userSearchTextEmbedding
,
       
/* limit */ 3,
       
VectorQuery.DistanceMeasure.EUCLIDEAN,
       
VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance")
         
.setDistanceThreshold(2.0)
         
.build());
ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();
List<Pose> posesList = new ArrayList<Pose>();
// Get the ID of the closest document (assuming results are sorted by distance)
String closestDocumentId = vectorQuerySnapshot.getDocuments().get(0).getId();

Esse snippet compara o embedding do texto de pesquisa do usuário com os embeddings dos documentos no Firestore e extrai o mais próximo do contexto.

7. Gemini 2.0 Flash

Como integrar o Gemini 2.0 Flash (para geração de descrição)

Vamos conferir como o app recém-criado processa a integração do Gemini 2.0 Flash para a geração de descrições.

Agora, digamos que um usuário administrador / professor de ioga queira inserir os detalhes das poses com a ajuda do Gemini 2.0 Flash e realizar uma pesquisa para ver as correspondências mais próximas. Isso resulta na extração dos detalhes das poses correspondentes e dos objetos multimodais que oferecem suporte aos resultados.

String apiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=[YOUR_API_KEY]";
Map<String, Object> requestBody = new HashMap<>();
List<Map<String, Object>> contents = new ArrayList<>();
List<Map<String, Object>> tools = new ArrayList<>();
Map<String, Object> content = new HashMap<>();
List<Map<String, Object>> parts = new ArrayList<>();
Map<String, Object> part = new HashMap<>();
part.put("text", prompt);
parts.add(part);
content.put("parts", parts);
contents.add(content);
requestBody.put("contents", contents);
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, String.class);
System.out.println("Generated response: " + response);
String responseBody = response.getBody();
JSONObject jsonObject = new JSONObject(responseBody);
JSONArray candidates = jsonObject.getJSONArray("candidates");
JSONObject candidate = candidates.getJSONObject(0);
JSONObject contentResponse = candidate.getJSONObject("content");
JSONArray partsResponse = contentResponse.getJSONArray("parts");
JSONObject partResponse = partsResponse.getJSONObject(0);
String generatedText = partResponse.getString("text");
System.out.println("Generated Text: " + generatedText);

a. Geração de imagens e áudio fictícios

O Gemini 2.0 Flash Experimental é capaz de gerar resultados multimodais, mas ainda não me inscrevi para o acesso antecipado. Por isso, simulei a saída de imagem e áudio com as APIs Imagen e TTS, respectivamente. Imagine como é ótimo gerar tudo isso com uma chamada de API para o Gemini 2.0 Flash.

try (PredictionServiceClient predictionServiceClient =
          PredictionServiceClient.create(predictionServiceSettings)) {
 
        final EndpointName endpointName =
            EndpointName.ofProjectLocationPublisherModelName(
                projectId, location, "google", "imagen-3.0-generate-001");
 
        Map<String, Object> instancesMap = new HashMap<>();
        instancesMap.put("prompt", prompt);
        Value instances = mapToValue(instancesMap);
 
        Map<String, Object> paramsMap = new HashMap<>();
        paramsMap.put("sampleCount", 1);
        paramsMap.put("aspectRatio", "1:1");
        paramsMap.put("safetyFilterLevel", "block_few");
        paramsMap.put("personGeneration", "allow_adult");
        Value parameters = mapToValue(paramsMap);
 
        PredictResponse predictResponse =
            predictionServiceClient.predict(
                endpointName, Collections.singletonList(instances), parameters);
 
        for (Value prediction : predictResponse.getPredictionsList()) {
          Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
          if (fieldsMap.containsKey("bytesBase64Encoded")) {
            bytesBase64Encoded = fieldsMap.get("bytesBase64Encoded").getStringValue();
       }
      }
      return bytesBase64Encoded;
    }
 try {
            // Create a Text-to-Speech client
            try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
                // Set the text input to be synthesized
                SynthesisInput input = SynthesisInput.newBuilder().setText(postureString).build();

                // Build the voice request, select the language code ("en-US") and the ssml
                // voice gender
                // ("neutral")
                VoiceSelectionParams voice =
                        VoiceSelectionParams.newBuilder()
                                .setLanguageCode("en-US")
                                .setSsmlGender(SsmlVoiceGender.NEUTRAL)
                                .build();

                // Select the type of audio file you want returned
                AudioConfig audioConfig =
                        AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();

                // Perform the text-to-speech request on the text input with the selected voice
                // parameters and audio file type
                SynthesizeSpeechResponse response =
                        textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);

                // Get the audio contents from the response
                ByteString audioContents = response.getAudioContent();

                // Convert to Base64 string
                String base64Audio = Base64.getEncoder().encodeToString(audioContents.toByteArray());

                // Add the Base64 encoded audio to the Pose object
               return base64Audio;
            }

        } catch (Exception e) {
            e.printStackTrace(); // Handle exceptions appropriately. For a real app, log and provide user feedback.
            return "Error in Audio Generation";
        }
}

b. Embasamento com a Pesquisa Google:

Se você verificar o código de invocação do Gemini na etapa 6, vai notar o snippet de código a seguir para ativar a base da Pesquisa Google para a resposta do LLM:

 /**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);

Isso garante que:

  • Basear nosso modelo nos resultados reais da pesquisa
  • Extrair URLs relevantes mencionados na pesquisa

8. Executar o aplicativo

Vamos conferir todos os recursos do seu aplicativo Java Spring Boot recém-criado com uma interface da Web Thymeleaf simples:

  1. Operações CRUD do Firestore (criar, ler, atualizar, excluir)
  2. Pesquisa de palavras-chave
  3. Criação de contexto com base em IA generativa
  4. Pesquisa contextual (pesquisa vetorial)
  5. Saída multimodal para se relacionar à pesquisa
  6. Executar sua própria consulta (consultas no formato structuredQuery)

Exemplo: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}

Todos esses recursos discutidos até agora fazem parte do aplicativo que você acabou de criar no repositório: https://github.com/AbiramiSukumaran/firestore-poserecommender

Para criar, executar e implantar, execute os seguintes comandos no terminal do Cloud Shell:

mvn package

mvn spring-boot:run

Você vai ver o resultado e poderá brincar com os recursos do seu aplicativo. Confira o vídeo abaixo para ver a demonstração da saída:

Recomendador de poses com o Firestore, a Pesquisa vetorial e o Gemini 2.0 Flash

Etapa opcional:

Para implantar no Cloud Run (assumindo que você tenha inicializado um aplicativo novo com o Dockerfile e copiado os arquivos conforme necessário), execute o seguinte comando no terminal do Cloud Shell no diretório do projeto:

gcloud run deploy --source .

Informe o nome do aplicativo, o código da região (escolha o código para us-central1) e escolha a invocação não autenticada "Y" conforme solicitado. Você vai receber o endpoint do aplicativo no terminal quando a implantação for concluída.

9. Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta postagem, siga estas etapas:

  1. No console do Google Cloud, acesse a página Gerenciar recursos.
  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir.
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

10. Parabéns

Parabéns! Você usou o Firestore para criar um aplicativo robusto e inteligente de gerenciamento de posturas de ioga. Ao combinar o poder do Firestore, a extensão de pesquisa vetorial e os recursos do Gemini 2.0 Flash (com geração simulada de imagens e áudio), criamos um app de yoga realmente envolvente e informativo para implementar as operações CRUD, realizar pesquisas baseadas em palavras-chave, pesquisas vetoriais contextuais e gerar conteúdo multimídia.

Essa abordagem não se limita a apps de ioga. À medida que modelos de IA como o Gemini continuam a evoluir, as possibilidades de criar experiências de usuário ainda mais imersivas e personalizadas só vão aumentar. Fique por dentro dos desenvolvimentos e da documentação mais recentes do Google Cloud e do Firebase para aproveitar todo o potencial dessas tecnologias.

Se eu fosse estender esse app, tentaria fazer duas coisas com o Gemini 2.0 Flash:

  1. Use a API Multimodal Live para criar streaming de visão e áudio em tempo real para o caso de uso.
  2. Ative o Modo de pensamento para gerar os pensamentos por trás das respostas para a interação com dados em tempo real e tornar a experiência mais realista.

Fique à vontade para testar e enviar uma solicitação de pull :>D!!!