Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
MongoDBchevron-right

Construindo um aplicativo Quartokus para realizar a Vector Search do MongoDB

Aasawari Sahasrabuddhe9 min read • Published Oct 07, 2024 • Updated Oct 07, 2024
QuarkusJavaMongoDB
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Os métodos tradicionais de pesquisa baseados em palavras-chave muitas vezes falham na entrega de resultados relevantes em um mundo afundado em dados. A pesquisa vetorial é uma abordagem histórica e política que permite que os aplicativos entendam o contexto e o significado, permitindo pesquisas mais inteligentes e intuitivas. Neste artigo, exploraremos como aproveitar o poder combinado do Quandokus, uma framework Java leve e de alto desempenho, e do MongoDB , um banco de banco de dados de documento flexível, para implementar a pesquisa vetorial sem problemas.
Entraremos nos fundamentos da pesquisa vetorial, abordando como ela difere dos métodos de pesquisa tradicionais e por que é essencial para aplicativos modernos. Aprenderemos sobre como gerar incorporações vetoriais a partir de seus dados, configurar um mecanismo de pesquisa robusto e otimizar o desempenho - tudo isso enquanto aproveitamos a velocidade e a eficiência do Quandokus.
Esteja você criando um sistema de recomendações, melhorando a descoberta de conteúdo ou simplesmente aprimorando a experiência do usuário, este guia fornecerá a você o conhecimento e as ferramentas para liberar o verdadeiro potencial de seus recursos de pesquisa. Junte-se a nós nesta viagem para redefinir a forma como os utilizadores encontram e se envolvem com a informação!
No passado, os métodos de pesquisa tradicionais concentravam-se principalmente na correspondência exata de palavras-chave ou, na melhor das opções, incorporavam técnicasde pesquisa difusa . No entanto, o cenário digital moderno exige muito mais do que apenas recursos de pesquisa difusa. Os desenvolvedores de hoje estão procurando soluções de pesquisa avançada que ofereçam compreensão semântica, mecanismos de referência completos e chatbots orientados por IA por meio do processamento de linguagem natural (NLP).
A solução para essas necessidades em constante mudança está no recursode Vector Search do MongoDB . Essa tecnologia de ponta vai além da simples correspondência de palavras-chave, fornecendo uma compreensão mais profunda da intenção e do contexto do usuário. À medida que a demanda por experiências de pesquisa mais inteligentes e intuitivas cresce, a adesão à pesquisa vetorial se torna essencial para desenvolvedores e empresas que visam melhorar a experiência e o engajamento do usuário. Com a pesquisa vetorial do MongoDB, você pode criar sistemas de pesquisa altamente responsivos e inteligentes que acompanham os requisitos dos aplicação modernos.

Como funciona a pesquisa vetorial?

A pesquisa vetorial doMongoDB funciona no conceito de representações vetoriais. A representação vetorial em AI é um método de transformar dados em vetores para que os algoritmos de aprendizado de máquina possam processá-los e entegiá-los. Esses vetores capturam relações semânticas; por exemplo, palavras com significados semelhantes serão posicionadas mais próximas umas das outras no espaço vetorial.
A pesquisa vetorial executa as medidas de similaridade usando técnicas como cálculos deeuclideia, similaridade de cossenoe produto pontual para avaliar a proximidade de dois vetores.

O que é AIGêmeos

A AIda Gêmeos é um conjunto de modelos de inteligência artificial da próxima geração desenvolvido pelo GoogleDeepMind, destinado a competir com sistemas avançados de AI , como o GPT-4 da OpenAI. Ele se concentra em vários recursos de AI , incluindo compreensão de linguagem natural, argumentos e geração de resultados Criativos.
Os modelos de AI da Gemini são projetados para serem usados em diferentes serviços do Google e integrados em produtos como o Google Search, o Google Workspace e Google Cloud Platform. Elas são conhecidas por melhorar os recursos interativos de AI , tornando tarefas como conversa, geração de conteúdo e resolução de problemas mais intuitivas e semelhantes às humanos.
Neste tutorial, utilizaremos a chave de AI Gemini para gerar as incorporações para os campos e também para a query que está sendo enviada para executar a pesquisa vetorial.

Pré-requisitos

Veja o que você precisará acompanhar:
  1. Um cluster gratuito do Atlas — se você ainda não tiver um, registre-se para um cluster gratuito agora
  2. Seus dados de amostra pré-carregados na coleção
  3. Java 17 ou superior
  4. Chave de AI geminada — crie sua chave geminada grátis

Construindo um projeto no Quarkus

Reconhecido por sua estrutura leve e extensões robustas, o Quartokus é uma ótima opção para criar aplicativos de alto desempenho. Quando emparelhado com o MongoDB, um banco de banco de dados escalável orientado a documentos, ele permite a criação de soluções de pesquisa avançada que superam os métodos tradicionais baseados em palavras-chave, oferecendo uma experiência de pesquisa mais sensível ao contexto e intuitiva.
Especificamente, abordaremos duas funcionalidades principais:
  1. Geração de incorporações vetoriais para o campo "descrição" em cada documento dentro da coleção.
  2. Criar um índice vetorial para realizar pesquisas vetoriais eficientes em todo o conjunto de dados.
O código completo do projeto está disponível no repositório doGithub . Você pode começar clonando o projeto e adicionando seus detalhes ao arquivo.properties do aplicação para executar o aplicação.*

Gerando as incorporações vetoriais usando a chave API Gêmeos

A primeira etapa é gerar as incorporações vetoriais para um campo específico, que contém textos grandes e também está em idiomas diferentes. Para criar essas incorporações, temos o arquivoListingResource.java, que contém a chamada REST para gerar incorporações.
Estamos usando um modelo de incorporação simples como incorporação de texto004. O modelo "text-embedding-004" é um dos modelos de incorporação fornecidos pela Gemini AI, projetada para lidar com várias tarefas de AI , como incorporação de texto para pesquisa semântica, sistemas de recomendações e processamento de linguagem natural.
O número de incorporações geradas pelo modelotext-embedding-004 na Gemini AI depende do comprimento do texto de entrada e de como o modelo está configurado para lidar com ele. Normalmente, as incorporações são produzidas para cada token (palavras ou subpalavras) no texto. O modelo de incorporação gerará um vetor numérico de comprimento fixo para cada token ou sequência de tokens. Neste exemplo, o número total de incorporações geradas é 768.
Conforme mencionado na classeListingResource.java:
1@POST
2@Path("/generate-embeddings")
3public Response generateEmbeddings() {
4 listingService.generateAndStoreEmbeddings();
5 return Response.ok("Embeddings generated and stored").build();
6}
A classeListingService.java é onde as incorporações estão sendo realizadas em lotes. Isso é para evitar chamadas repetitivas à API Gêmeos para gerar incorporações para cada documento.
O processo em lote é seguido pelo BulkWrite, que primeiro gera todos os campos de descrição e, em seguida, faz a chamada de API para a AI da Gemini.
1public void generateAndStoreEmbeddings() {
2 MongoCollection<Document> listingsCollection = mongoClient.getDatabase("sample_airbnb").getCollection("listingsAndReviews");
3
4 int processedDocuments = 0;
5 long totalDocuments = listingsCollection.countDocuments();
6
7 while (processedDocuments < totalDocuments) {
8 List<Document> documents = listingsCollection.find()
9 .skip(processedDocuments)
10 .limit(BATCH_SIZE)
11 .into(new ArrayList<>());
12 List<UpdateOneModel<Document>> bulkUpdates = new ArrayList<>();
13
14 for (Document document : documents) {
15 String description = document.getString("description");
16 List<Double> embeddings = geminiClient.getEmbedding(description);
17
18 if (embeddings != null) {
19 UpdateOneModel<Document> updateModel = new UpdateOneModel<>(
20 Filters.eq("_id", document.getString("_id")),
21 Updates.set("embeddings", embeddings)
22 );
23 bulkUpdates.add(updateModel);
24 }
25 }
26 if (!bulkUpdates.isEmpty()) {
27 listingsCollection.bulkWrite(bulkUpdates, new BulkWriteOptions().ordered(false));
28 }
29
30 processedDocuments += documents.size();
31 System.out.println("Processed " + processedDocuments + " out of " + totalDocuments + " documents.");
32 }
33
34 System.out.println("Embedding generation complete for all documents.");
35}
A próxima etapa para gerar a incorporação é criar a solicitação Gêmeos e retornar a lista de incorporações. Isso é realizado por meio da classeGeminiAIGatewaysImpl.java.
1package com.example.vectorsearch.gateway;
2
3import com.example.vectorsearch.config.GeminiConfig;
4import com.example.vectorsearch.request.GeminiRequest;
5import com.fasterxml.jackson.core.JsonProcessingException;
6import com.fasterxml.jackson.databind.ObjectMapper;
7import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder;
8import jakarta.enterprise.context.ApplicationScoped;
9import jakarta.inject.Inject;
10import jakarta.ws.rs.WebApplicationException;
11import org.slf4j.Logger;
12import org.slf4j.LoggerFactory;
13
14import java.net.URI;
15import java.util.List;
16
17@ApplicationScoped
18public class GeminiAIGatewayImpl implements GeminiAIGateway {
19
20 @Inject
21 GeminiConfig geminiAIConfig;
22
23 private static final Logger LOGGER = LoggerFactory.getLogger(GeminiAIGatewayImpl.class);
24
25 @Override
26 public List<Double> getEmbedding(String input) {
27 ObjectMapper objectMapper = new ObjectMapper();
28
29 var geminiAIGateway = QuarkusRestClientBuilder.newBuilder()
30 .baseUri(URI.create*(geminiAIConfig.getGeminiAIUrl() + "?key=" + geminiAIConfig.getApiKey()))
31 .build(GeminiClient.class);
32
33 GeminiRequest request = new GeminiRequest(
34 geminiAIConfig.getModel(),
35 new GeminiRequest.Content(List.of(new GeminiRequest.Part(input)))
36 );
37 try {
38 String jsonRequest = objectMapper.writeValueAsString(request);
39 var embedding = geminiAIGateway.embedding(jsonRequest);
40
41 return embedding.getEmbedding().getValues();
42 } catch (WebApplicationException e) {
43 LOGGER.error("Error from Gemini AI: {}", e.getResponse().readEntity(String.class));
44 throw e;
45 } catch (JsonProcessingException e) {
46 throw new RuntimeException(e);
47 }
48 }
49}
Para executar este método API, execute o comando abaixo e aguarde até que todas as incorporações sejam geradas na coleção para o campo.
1 curl -X POST http://localhost:8080/api/listings/generate-embeddings
Observação: A incorporação gerada levará tempo para ser gerada e armazenada dentro da coleção. No método acima, o processamento ocorre em lotes.

Criando o índice de pesquisa vetorial

Depois que as incorporações forem geradas e armazenadas dentro da collection, a próxima etapa é criar o índice vetorial. Para criar esse índice, você pode Go até o cluster criado do Atlas , clicar em Atlas Search e executar as etapas abaixo:
Etapa 1: Clique na aba Índices de pesquisa da tela de interface do usuário do Atlas , conforme mostrado abaixo:
Captura de tela representando como criar o índice de pesquisa vetorial para a coleção selecionada Captura de tela representando como criar o índice de pesquisa vetorial para a coleção selecionada.
Etapa 2: Clique em Criar índice de Vector Search na tela.
Captura de tela representando como criar o índice de pesquisa vetorial Captura de tela representando como criar o índice de pesquisa vetorial para a coleção selecionada.
Passo 3: Clique em Editor JSON na seção Atlas Vector Search e clique em Avançar.
Captura de tela representando como criar o índice de pesquisa vetorial para a coleção selecionada Captura de tela representando como criar o índice de pesquisa vetorial para a coleção selecionada.
Etapa 4: Selecione o nome do banco de dados de dados e da coleção e crie o índice vetorial com o seguinte JSON.
1{
2 "fields": [
3 {
4 "numDimensions": 768,
5 "path": "embeddings",
6 "similarity": "euclidean",
7 "type": "vector"
8 }
9 ]
10}
Captura de tela representando como criar o índice de pesquisa vetorial para a coleção selecionada Captura de tela representando como criar o índice de pesquisa vetorial para a coleção selecionada.
Após gerar a incorporação para o campo desejado e criar o índice de pesquisa vetorial, a última etapa é realizar a pesquisa semântica. Por exemplo, você pode querer procurar:
  1. Locais recomendados para uma estada nómada.
  2. Locais com vista para a orla.
  3. Locais que se gostaria de ter com crianças.
Para realizar as pesquisas com esse exemplo, é necessário realizar a pesquisa vetorial.
A primeira etapa para fazer isso é criar uma incorporação para o texto que está sendo enviado como parte da solicitação.
Para fazer isso, usaremos a mesma técnica de incorporação mencionada na classeListingService.java.
1public void performVectorSearch(String query) {
2 MongoCollection<Document> collection = mongoClient.getDatabase("sample_airbnb").getCollection("listingsAndReviews");
3
4 List<Double> queryEmbeddings = geminiClient.getEmbedding(query);
5 String indexName = "vector_index";
6 int numCandidates = 150;
7 int limit = 10;
8
9 List<Document> pipeline = Arrays.asList(
10 new Document("$vectorSearch",
11 new Document("index", indexName)
12 .append("path", "embeddings")
13 .append("queryVector", queryEmbeddings)
14 .append("numCandidates", numCandidates)
15 .append("limit", limit)
16 ),
17 new Document("$project",
18 new Document("_id", 0)
19 .append("name", 1)
20 .append("listing_url", 1)
21 .append("description", 1)
22 .append("price", 1)
23 ),
24 new Document("$limit", 5));
25
26 collection.aggregate(pipeline)
27 .forEach(doc -> System.out.println(doc.toJson()));
28}
A próxima etapa é utilizar o estágio de agregação$vectorsearch. Este estágio realiza a pesquisa semântica nos dados. Ele pesquisa um índice vetorial (um índice especializado que armazena incorporações vetoriais) para os vetores correspondentes mais próximos com base em um determinado vetor de consulta.
Neste exemplo, estamos projetando apenas alguns detalhes do hotel e limitando a resposta a cinco.
Para executar a API, use o comando abaixo:
1curl -X GET "http://localhost:8080/api/listings/perform-vector-search?query=Hotels%20that%20are%20recommended%20for%20romantic%20stay" | jq
Observação: " | jq " foi usado no comando cURL para exibir os resultados no formato JSON. É recomendável baixar o jq antes de usar o comando cURL acima.
Isso lhe dará a seguinte resposta:
1[
2 {
3 "listing_url": "https://www.airbnb.com/rooms/15266254",
4 "name": "The Manhattan Club in the heart of midtown!!!!",
5 "description": "My place is good for couples, solo adventurers, and business travelers.",
6 "price": 305.00
7 },
8 {
9 "listing_url": "https://www.airbnb.com/rooms/14261122",
10 "name": "Cute Condo in Mile-End, sleeps 2",
11 "description": "You’ll love my place because of the location. My place is good for couples, solo adventurers, and business travellers.",
12 "price": 70.00
13 },
14 {
15 "listing_url": "https://www.airbnb.com/rooms/13609188",
16 "name": "Habitacion al lado de Sagrada Familia",
17 "description": "Lugares de interés: La Paradeta Sagarada Familia, FCB Official Point, Basílica de la Sagrada Família, Starbucks, . Mi alojamiento es bueno para parejas y aventureros.",
18 "price": 45.00
19 },
20 {
21 "listing_url": "https://www.airbnb.com/rooms/13748059",
22 "name": "Studio for the 2016 Olympics",
23 "description": "My space is good for couples, business travelers and individual adventures.",
24 "price": 298.00
25 },
26 {
27 "listing_url": "https://www.airbnb.com/rooms/11130156",
28 "name": "Double Room",
29 "description": "Literally just across the street is the world famous Cagaloglu Hammam featured in 1,000 Places to See Before You Die by Patricia Schultz. The hotel is tucked away on a quiet street and is just a few minutes walk to some of the world’s famous sites,",
30 "price": 359.00
31 }
32]
Outro exemplo que podemos tentar é “Stays that the kids would enjoy. "
1 curl -X GET "http://localhost:8080/api/listings/perform-vector-search?query=Stays%20that%20the%20kids%20would%20enjoy" | jq
Isso daria a resposta:
1[
2 {
3 "listing_url": "https://www.airbnb.com/rooms/13997910",
4 "name": "Apartamento de luxo em Copacabana - 4 quartos",
5 "description": "Meu espaço é bom para casais, viajantes de negócios e famílias (com crianças).",
6 "price": 11190.00
7 },
8 {
9 "listing_url": "https://www.airbnb.com/rooms/14571224",
10 "name": "Alugo Quarto Para Temporada de Olimpiadas",
11 "description": "Meu espaço é bom para casais, viajantes de negócios e famílias (com crianças).",
12 "price": 798.00
13 },
14 {
15 "listing_url": "https://www.airbnb.com/rooms/13927230",
16 "name": "Casa completa p olimpíadas com serviços incluído",
17 "description": "Você vai amar meu espaço por causa de a área externa, da piscina, o bairro com vários bares e diversões, o condomínio seguro com porteiro, a iluminação, a cama confortável e a cozinha grande. Meu espaço é bom para famílias (com crianças) e grandes grupos. Podendo se contratar junto também serviços de cozinheira, garçons e bartender. Podendo se contratar também com alimentação. Tudo para se sentir em casa e não se preocupar com nada. Consultar valores extras.",
18 "price": 601.00
19 },
20 {
21 "listing_url": "https://www.airbnb.com/rooms/13617872",
22 "name": "Amor do Rio",
23 "description": "Você vai amar meu espaço por causa de o aconchego e a localização. Meu espaço é bom para casais, aventuras individuais, viajantes de negócios, famílias (com crianças) e grandes grupos.",
24 "price": 116.00
25 },
26 {
27 "listing_url": "https://www.airbnb.com/rooms/13993059",
28 "name": "Ventanas Nature Resort ambiente familiar",
29 "description": "Meu espaço é perto de transporte público, restaurantes e refeições, atividades para famílias, , praia. Você vai amar meu espaço por causa de a localização, as pessoas, o ambiente e o bairro. Meu espaço é bom para casais, famílias (com crianças), grandes grupos e amigos peludos (animais de estimação).",
30 "price": 899.00
31 }
32]
Há vários exemplos adicionais que você pode explorar ajustando a query para executar uma pesquisa vetorial personalizada às suas necessidades.

Conclusão

A integração da pesquisa vetorial ao MongoDB e ao Quartokus fornece uma solução poderosa, escalável e eficiente para as necessidades de pesquisa moderna. Ao aproveitar a estrutura leve do Quartokus e os recursos avançados de pesquisa do MongoDB, os desenvolvedores podem implementar facilmente a pesquisa vetorial para fornecer experiências de pesquisa mais sensíveis ao contexto e significativas. Com a capacidade de processar queries de linguagem natural e retornar resultados semanticamente relevantes, a pesquisa vetorial abre novas possibilidades para a criação de aplicativos inteligentes – seja para mecanismos de referência, descoberta de conteúdo ou interações personalizadas com o usuário. Essa abordagem não apenas melhora o desempenho, mas também melhora significativamente a satisfações do usuário, tornando os resultados da pesquisa mais intuitivos e alinhados com sua verdadeira intenção.
Se você tiver mais dúvidas, entre em contato com os Fóruns da MongoDB Community e visite o conteúdo no Centro do Desenvolvedor para saber mais sobre esses conceitos legais.
Feliz busca!
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Início rápido

Aggregation Framework com Node.js 3.3.2 Tutorial


Oct 01, 2024 | 9 min read
Artigo

Definir preocupações globais de leitura e gravação no MongoDB 4.4


Sep 23, 2022 | 7 min read
Artigo

Um resumo dos antipadrões de projeto de esquema e como identificá-los


Oct 01, 2024 | 3 min read
Artigo

3 Funcionalidades do MongoDB subutilizadas


Sep 11, 2024 | 6 min read
Sumário