EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Desbloqueando a pesquisa semântica: crie um mecanismo de pesquisa de filmes baseado em Java com o Atlas Vector Search e o Spring Boot

Tim Kelly10 min read • Published Sep 18, 2024 • Updated Sep 18, 2024
Pesquisa vetorialJavaAtlas
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
No mundo da tecnologia em rápida evolução, a busca por resultados de pesquisa mais relevantes, personalizados e intuitivos levou ao aumento da popularidade da pesquisa semântica.
O Vector Search do MongoDB permite que você pesquise seus dados relacionados semanticamente, tornando possível pesquisar seus dados por significado, não apenas por correspondência de palavras-chave.
Neste tutorial, analisaremos como podemos criar um aplicativo Spring Boot que possa executar uma pesquisa semântica em uma collection de filmes por suas descrições de trama.

O que precisaremos

Antes de começar, você precisará de algumas coisas.
  • Java 11 ou superior
  • Maven ou Gradle, mas este tutorial fará referência ao Maven
  • Uma contaOpenAI, para gerar nossas incorporações

Configure seu cluster do MongoDB

Visite o dashboard doMongoDB Atlas e configure seu cluster. Para aproveitar o operador$vectorSearch em um pipeline de agregação, você precisa executar o MongoDB Atlas 6.0.11 ou superior.
A seleção de sua versão do MongoDB Atlas está disponível na parte inferior da tela ao configurar seu cluster em "Configurações adicionais".
Tela de criação de cluster, configurações adicionais indicando que o número da versão é MongoDB 7.0.
Ao configurar sua implantação, você será solicitado a configurar um usuário de banco de dados e regras para sua conexão de rede.
Se precisar de mais ajuda para começar a usar o MongoDB Atlas, confira nosso tutorial.
Para este projeto, usaremos os dados de amostra fornecidos pelo MongoDB. Quando você fizer login pela primeira vez no painel, verá uma opção para carregar dados de exemplo em seu banco de dados.
Painel do MongoDB Atlas para um cluster vazio, solicitando o carregamento de dados.
Se você procurar no banco de dadossample_mflix, verá uma collection chamada embedded_movies. Esses documentos contêm um campo chamado plot_embeddings que contém uma matriz de números de ponto flutuante (nossos vetores). Esses números são sem sentido para nós quando vistos diretamente com o olho humano, mas nos permitirão realizar nossa busca semântica por filmes com base em seu enredo. Se você quiser incorporar seus próprios dados, poderá usar os métodos deste tutorial para fazer isso ou pode conferir o tutorial que mostra como configurar um trigger em seu banco de dados para incorporar automaticamente seus dados.

Crie um índice de pesquisa vetorial

Para usar o operador$vectorSearch em nossos dados, precisamos configurar um índice de Atlas Search apropriado. Selecione a aba "Atlas Search" no seu cluster e clique em "Criar Índice do Atlas Search".
Aba de pesquisa Cluster com botão para Criar Índice de Pesquisa.
Queremos escolher a "Opção JSON Editor" e clicar em "Avançar".
Criar tela de configuração de índice do Atlas Search, exibindo as opções Editor Visual ou Editor JSON .
Nesta página, vamos selecionar nosso banco de dados de destino, sample_mflix, e embedded_moviescollection, para este tutorial.
O nome não é muito importante, mas nomeie o índice - PlotVectorSearch, por exemplo - e copie o seguinte JSON.
insira a descrição da imagem aqui
Os campos especificam o nome do campo de incorporação em nossos documentos,plot_embedding, as dimensões do modelo usado para incorporar, 1536, e a função de similaridade a ser usada para encontrar os K-vizinhos mais próximos, dotProduct. É muito importante que as dimensões no índice correspondam às do modelo usado para incorporação. Esses dados foram incorporados usando o mesmo modelo que usaremos, mas outros modelos estão disponíveis e podem usar dimensões diferentes.
Confira nossa documentação do Vector Atlas Search para obter mais informações sobre essas definições de configuração.

Configurar um projeto do Spring Boot

Para configurar nosso projeto, vamos usar o Spring Initializr. Isso gerará o arquivopom.xml, que conterá as dependências do nosso projeto.
Para este projeto, você deseja selecionar as opções na captura de tela abaixo e criar um JAR:
Tela de configuração do Spring Initializr.
  • Projeto: Maven
  • Linguagem: Java
  • Dependências: Web reativa do Spring e MongoDB reativo dos dados do Spring
  • Gerar: JAR
Abra o projeto Maven no IDE de sua escolha e vamos escrever código!

Modelo do MongoDB

Antes de fazer qualquer coisa, abra seu arquivo pom.xml. Na seção de propriedades, você precisará adicionar o seguinte:
Isso forçará sua API do Spring Boot a usar o 4.11. Versão 0 dos drivers do MongoDB Java. Sinta-se livre para usar uma versão mais atualizada para usar alguns dos recursos mais atualizados, como o métodovectorSearch(). Você também notará que, em todo este aplicativo, usamos os Reactive Streams do MongoDB Java. Isso ocorre porque estamos criando uma API assíncrona. Operações de AI, como gerar incorporações, podem ser intensivas em computação e consumir muito tempo. Uma API assíncrona permite que essas tarefas sejam processadas em segundo plano, liberando o sistema para lidar com outras solicitações ou operações simultaneamente. Agora, vamos codificar!
Para representar nosso documento em Java, usaremos objetos Java antigos simples(POJOs). Os dados que vamos manipular são os documentos dos dados de exemplo que você acabou de carregar em seu cluster. Para cada documento e subdocumento, precisamos de um POJO. Os documentos do MongoDB já têm muitas semelhanças com POJOs e são simples de configurar usando o driver MongoDB.
No documento principal, temos três subdocumentos: Imdb, Tomatoese Viewer. Assim, precisaremos de quatro POJOs para nosso documentoMovie.
Primeiro precisamos criar um pacote chamado com.example.mdbvectorsearch.model e adicionar nossa classe Movie.java.
Usamos o @BsonProperty("_id") para atribuir nosso campo_id no JSON para ser mapeado para o nosso campoId no Java, de modo a não violar as convenções de nomenclatura do Java.
Adicione outra classe chamada Imdb.
Ainda outro chamado Tomatoes.
E, finalmente, Viewer.
Dica: Para criar os getters e setters, muitos IDEs têm atalhos.

Conecte-se ao seu banco de dados

Em seu arquivo principal, configure um pacote com.example.mdbvectorsearch.config e adicione uma classe, MongodbConfig.java. É aqui que nos conectaremos ao nosso banco de dados e criaremos e configuraremos nosso cliente. Se você está usado para usar o Spring Data MongoDB, muito disso geralmente é ofuscado. Estamos fazendo isso dessa forma para aproveitar alguns dos recursos mais recentes do driver Java do MongoDB para suportar vetores.
A partir da interface do MongoDB Atlas, obteremos nossa connection string e a adicionaremos ao nosso arquivoapplication.properties. Também especificaremos o nome do nosso banco de dados aqui.
Agora, em sua classeMongodbConfig, importe esses valores e denote isso como uma classe de configuração com a anotação @Configuration.
Em seguida, precisamos criar um cliente e configurá-lo para lidar com a tradução de e para BSON para nossos POJOs. Aqui, configuramos um CodecRegistry para lidar com essas conversões e usamos um codec padrão, pois eles são capazes de lidar com os principais tipos de dados Java. Em seguida, envolvemos estes em um MongoClientSettings e criamos nosso MongoClient.
Nossa última etapa será então obter nosso banco de dados, e terminamos esta classe.

Incorpore seus dados com a API OpenAI

Vamos enviar a solicitação fornecida do usuário para a API OpenAI para ser incorporada. Uma incorporação é uma série (vetor) de números de ponto flutuante. A distância entre dois vetores mede seu relacionamento. Pequenas distâncias sugerem alto parentesco e grandes distâncias sugerem baixo parentesco.
Isso transformará nosso prompt de linguagem natural, como "Toys that come to life when no one is looking", em uma grande array de números de ponto flutuante que se parecerão com esta [-0.012670076, -0.008900887, ..., 0.0060262447, -0.031987168].
Para fazer isso, precisamos criar alguns arquivos. Todo o nosso código para interagir com o OpenAI estará contido em nossa classeOpenAIService.java e Go para com.example.mdbvectorsearch.service. O @Service no topo de nossa classe determina ao Spring Boot que ela pertence a essa camada de serviço e contém lógica de negócios.
Usamos o Spring WebClient para fazer as chamadas para a API OpenAI. Em seguida, criamos as incorporações. Para fazer isso, passamos em nosso texto e especificamos nosso modelo de incorporação (por exemplo, text-embedding-ada-002). Você pode ler mais sobre as opções de parâmetro da API OpenAI em seus Docs.
Para passar e receber os dados da API Open AI, precisamos especificar nossos modelos para os dados que estão sendo recebidos. Vamos adicionar dois modelos ao nosso pacotecom.example.mdbvectorsearch.model , EmbeddingData.java e EmbeddingResponse.java.

Seu pipeline de agregação vetorial do Atlas Search no Spring Boot

Nós temos nosso banco de dados. Podemos incorporar nossos dados. Estamos prontos para enviar e receber nossos documentos de cinema. Como realmente realizamos nossa semântica Atlas Search?
A camada de acesso a dados da implementação de nossa API ocorre no repositório. Crie um pacote com.example.mdbvectorsearch.repository e adicione a interface MovieRepository.java.
Agora, implementamos a lógica do nosso métodofindMoviesByVector na implementação desta interface. Adicione uma classe MovieRepositoryImpl.java ao pacote. Esse método implementa a lógica de dados de nosso aplicativo e faz a incorporação do texto inserido pelo usuário, incorporado usando a API OpenAI, em seguida, usa o estágio de agregação $vectorSearchem relação à nossa coleçãoembedded_movies, usando o índice que configuramos anteriormente.
Para a lógica de negócios do nosso aplicativo, precisamos criar uma classe de serviço. Crie uma classe chamada MovieService.java em nosso pacoteservice .
O métodogetMoviesSemanticSearch pegará a descrição do gráfico em linguagem natural do usuário, incorporará-a usando a API OpenAI, realizará uma pesquisa vetorial em nossa collectionembedded_movies e retornará os cinco resultados mais semelhantes.
Esse serviço pegará o texto inserido pelo usuário, incorporará-o usando a API OpenAI e, em seguida, usará o estágio de agregação $vectorSearchem relação à nossa coleçãoembedded_movies, usando o índice que definimos anteriormente.
Isso retorna um Mono envolvendo nossa lista de Movie objetos. Tudo o que resta agora é passar alguns dados e chamar nossa função.
Temos a lógica em nosso aplicativo. Agora, vamos transformá-lo em uma API! Primeiro, precisamos configurar nosso controlador. Isso nos permitirá receber a entrada do usuário para o nosso aplicativo. Vamos configurar um endpoint para receber a descrição do enredo do usuário e retornar os resultados da pesquisa semântica. Crie um pacote com.example.mdbvectorsearch.servicee adicione a classeMovieController.java.
Definimos um endpoint /movies/semantic-search que lida com solicitações de obtenção, captura plotDescription como um parâmetro de query e delega a operação Atlas Search para MovieService.
Você pode usar sua ferramenta favorita para testar os pontos de conexão da API, mas só vamos enviar um comando cURL.
Observação: usamos %20 para indicar espaços em nossa URL.
Aqui chamamos nossa API com a consulta "A cop from China and a cop from America save a kidnapped girl". Não há título, mas acho que é uma boa descrição de um determinado filme de ação/comédia estrelado por Jackie Chan e Chris Tucker. Aqui está uma versão ligeiramente abreviada do meu resultado. Vamos verificar nossos resultados!
Consideramos ahora do pico nossa melhor correspondência. Exatamente o que eu tinha em mente! Se a premissa ressoa com você, há alguns outros filmes de que você pode assistir.
Você mesmo pode testar isso alterando o plotDescription que temos no comando cURL.

Conclusão

Este tutorial percorreu as etapas abrangentes de criação de um aplicativo de pesquisa semântica usando MongoDB Atlas, OpenAI e Spring Boot.
A pesquisa semântica oferece uma pluralidade de aplicativos, que vão desde consultas sofisticadas de produtos em sites de e-commerce até recomendações de filmes personalizados. Este guia foi elaborado para equipá-lo com o essencial, abrindo caminho para seu próximo projeto.
Está pensando em integrar a pesquisa vetorial em seu próximo projeto? Confira este artigo — Como modelar seus documentos para pesquisa vetorial — para aprender como projetar seus documentos para pesquisa vetorial.
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 Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Início rápido

Construindo aplicativos de AI e RAG com MongoDB, Anyscale e PyMongo


Jul 17, 2024 | 7 min read
exemplo de código

Comece a usar o MongoDB Atlas e o AWS CloudFormation


Jan 23, 2024 | 3 min read
Tutorial

Crie uma Cocktail API com o Beanie e o MongoDB


Sep 11, 2024 | 6 min read
Tutorial

Uma API GraphQL gratuita para o Conjunto de DadosCOVID-19 da UniversidadeJohnsHopkins


Aug 15, 2024 | 7 min read
Sumário