Construindo um serviço de pesquisa semântica do Atlas com Spring AI e MongoDB Atlas
Avalie esse Tutorial
Qual é a faixa que diz "Duh da, duh da, DUH da duh"? Todos nós já passamos por isso antes. Lembremo-nos de um trecho do coro, sabemos que tem algo a ver com um hotel em Chelsea, mas que letra é essa? Não me recordo do título — como faz o Atlas Search por energia?! Bem, com o poder da AI, podemos fazer o Atlas Search em nossos bancos de dados, não apenas combinando palavras, mas pesquisando o significado semântica do texto. E com o Spring AI, você pode incorporar o Atlas Search com AIem seu aplicativo Spring. Com apenas a vaga memória de uma modelo que prefere um modelo bonito, podemos localizar nosso clássico do diretor.
Spring AI é uma estrutura de aplicativo da Spring que permite combinar vários AI serviços e plug-ins de com seus aplicativos. Com suporte para muitos modelos de chat, texto para imagem e incorporação, você pode configurar AIseu Java aplicativo habilitado para configurado para uma variedade de AI casos de uso de .
Com o Spring AI, oMongoDB Atlas é suportado como um banco de dados vetorial, todos com o Atlas Vector Search para alimentar sua Atlas Search semântica e implementar seus RAG aplicativos . Para saber mais sobre RAG e outros conceitos-chave em AI, consulte os de MongoDB AI integração de Docs do .
Neste tutorial, Go o que você precisa para começar a usar o Spring AI e o MongoDB, adicionando documentos ao seu banco de dados com o conteúdo vetorizado (embeddings) e pesquisando esse conteúdo com o semântica Atlas Search. O código completo deste tutorial está disponível no repositório doGithub .
Antes de iniciar este tutorial, você precisará ter o seguinte:
- Uma conta MongoDB Atlas e um cluster M10+ executando MongoDB versão 6.0.11, 7.0.2 ou posterior
- Um cluster M10+ é necessário para criar o índice programaticamente (por Spring AI).
- Uma chave de API OpenAI com uma conta OpenAI paga e créditos disponíveis
- Java 21 e um IDE como IntelliJ IDEA ou Eclipse
- Maven 3.9.6+ configurado para o seu projeto
- Projeto: Maven
- Linguagem: Java
- Spring Boot: versão padrão
- Java: 21
Adicione as seguintes dependências:
- Banco de dados vetorial do MongoDB Atlas
- Spring Web
- OpenAI (outros modelos de incorporação estão disponíveis, mas usamos isso para o tutorial)
Gere e baixe seu projeto e abra-o em seu IDE.
Abra o aplicativo no IDE de sua escolha e a primeira coisa que vamos fazer é inspecionar nosso
pom.xml
. Para usar a versão mais recente do Spring AI, altere a versãospring-ai.version
do BOM do Spring AI para 1.0.0-SNAPSHOT
. No momento em que escrevemos este artigo, ele será 1.0.0-M1
por padrão.Configure seu aplicativo Spring para configurar o armazenamento de vetores e outros feições necessárias.
Nas propriedades do aplicativo, vamos configurar nosso banco de MongoDB database, bem como tudo o que precisamos para pesquisar semanticamente nossos dados. Também adicionaremos informações como nosso modelo de incorporação OpenAI e a chave de API.
Você verá no final que estamos definindo o esquema inicializado para ser
true
. Isso significa que nosso aplicativo configurará nosso índice do Atlas Search (se ele não existir) para que possamos pesquisar semanticamente nossos dados. Se você já tiver um índice do Atlas Search configurado com este nome e configuração, você poderá defini-lo como false
.No seu IDE, abra seu projeto. Crie um arquivo
Config.java
em um pacoteconfig
. Aqui, vamos configurar nosso modelo de incorporação OpenAI. A AI do Spring torna este um processo muito simples.Agora podemos enviar nossos dados para serem vetorizados e receber os resultados vetorizados.
Crie um pacote chamado
model
, para nossa classeDocumentRequest
entrar. É isso que Go armazenar em nosso banco de MongoDB database. O conteúdo será o que estamos incorporando - letras, no nosso caso. Os metadados serão qualquer coisa que quisermos armazenar junto com eles, sejam atores, discos ou gêneros. Esses metadados serão retornados junto com nosso conteúdo e também podem ser usados para filtrar nossos resultados.Crie um pacote
repository
e adicione uma interfaceLyricSearchRepository
. Aqui, definiremos alguns dos métodos que implementaremos mais tarde.Crie uma classe
LyricSearchRepositoryImpl
para implementar a interface do repositório.Estamos usando os métodos
add
, delete
e similaritySearch
, todos já definidos e implementados no Spring AI. Isso nos permitirá incorporar nossos dados ao adicioná-los ao banco de MongoDB database, e podemos pesquisar essas incorporações com o Atlas Search vetorial.Crie um pacote
service
e, dentro dele, uma classeLyricSearchService
para lidar com a lógica de negócios de nosso aplicativo lírico do Atlas Search. Implementaremos esses métodos mais tarde no tutorial:Crie um pacote de controlador e uma classe
LyricSearchController
para lidar com solicitações HTTP . Vamos adicionar uma chamada para adicionar nossos dados, uma chamada para excluir quaisquer documentos de que não precisamos mais e uma chamada do Atlas Search, para semanticamente o Atlas Search nossos dados.Eles chamarão de volta os métodos que definimos anteriormente. Vamos implementá-los nas próximas etapas:
Em nossa classe
LyricSearchService
, vamos adicionar um pouco de lógica para incluir nossos documentos e adicioná-los ao banco de MongoDB database.Esta função recebe um único parâmetro,
documents
, que é uma lista de DocumentRequest
objetos. Eles representam os documentos que precisam ser processados e adicionados ao repositório.A função primeiro verifica se a lista
documents
é nula ou vazia.A lista
documents
é convertida em um fluxo para facilitar as operações de estilo funcional.O filtro é um pouco de pré-processamento para ajudar a limpar nossos dados. Ele remove quaisquer objetos
DocumentRequest
que sejam nulos, tenham conteúdo nulo ou tenham conteúdo vazio (ou somente espaços em branco). Isso garante que somente documentos válidos sejam processados posteriormente.Conheça seus limites! O filtro remove quaisquer objetos
Document
cujo conteúdo exceda o limite máximo de token (MAX_TOKENS
) para a API OpenAI. O limite de token é estimado com base na contagem de palavras, supondo que uma palavra seja um pouco mais de um token (não muito fora da verdade). Essa estimativa funciona para a demonstração, mas, para a produção, provavelmente queremos implementar uma forma de agrupamento, em que grandes corpos de texto são separados em pedaços menores e mais digeríveis.Cada objeto
DocumentRequest
é transformado em um objetoDocument
. O construtorDocument
é chamado com o conteúdo e os metadados de DocumentRequest
.Os objetos
Document
filtrados e transformados são coletados em uma lista e esses documentos são adicionados ao nosso armazenamento de vetores do MongoDB, junto com uma incorporação das letras.Também adicionaremos nossa função para excluir documentos enquanto estivermos aqui:
E as importações apropriadas:
Agora que temos a lógica, vamos adicionar os endpoints ao nosso
LyricSearchController
.E nossas importações:
Para testar nossa incorporação, vamos mantê-la simples com algumas cantadas por enquanto.
Construa e execute seu aplicativo. Use o seguinte comando CURL para adicionar documentos de amostra:
Vamos definir nosso método de pesquisa em nosso
LyricSearchService
. É assim que procuraremos semanticamente o Atlas Search nossos documentos em nosso banco de dados.Este método aceita: -
query
: um String
representando a query do Atlas Search ou o texto para o qual você deseja encontrar letras semanticamente semelhantes - topK
: um int
especificando o número dos principais resultados a serem recuperados (ou seja, , top 10) - similarityThreshold
: um double
indicando a pontuação mínima de similaridade que um resultado deve ter para ser incluído nos resultadosIsso retorna uma lista de
Map<String, Object>
objetos. Cada mapa contém o conteúdo e metadados de um documento que corresponde aos critérios de Pesquisa do Atlas.E as importações para o nosso serviço:
Vamos adicionar um endpoint ao nosso controlador, construir e executar nosso aplicativo.
E as importações:
Use o seguinte comando CURL para o Atlas Search em suas bancos de dados letras sobre pequenos corpos celestiais:
E pronto! Temos nossa pequena estrela no topo da nossa lista.
Para filtrar nossos dados, precisamos ir ao nosso índice no MongoDB. Você pode fazer isso por meio da UI do Atlas , selecionando a collection onde seus dados estão armazenados e acessando os índices do Atlas Search. Você pode editar esse índice selecionando os três pontos à direita do nome do índice e adicionaremos nosso filtro para o artista.
Vamos voltar ao nosso
LyricSearchService
e adicionar um método com um parâmetro de artista para que possamos filtrar nossos resultados.E as importações de que precisaremos:
E, por último, um endpoint em nosso controlador:
Agora, podemos não apenas Atlas Search como antes, mas podemos dizer que queremos restringi-la apenas a intérpretes específicos.
Use o seguinte comando CURL para tentar uma Atlas Search semântica com filtragem de metadados:
Ao contrário de antes, e mesmo solicitando os cinco principais resultados, só nos é devolvido um documento porque só temos um documento da artista Jane Swift. Viva!
Agora você tem um aplicativo Spring que permite a você Atlas Search através de seus dados realizando pesquisas semânticas. Esta é uma etapa importante quando você deseja implementar seus aplicativos RAG , ou apenas um recurso de Pesquisa do Atlas aprimorado por IA em seus aplicativos.
Se você quiser saber mais sobre a MongoDB AI integração da do Spring do , acompanhe o início rápido da integração do Spring e,AI se tiver alguma dúvida ou quiser nos mostrar o que está construindo, junta-se a nós na MongoDB Community Fóruns.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.