Comece com a integração do Spring AI
Nesta página
Você pode integrar o Atlas Vector Search com Spring AI para construir aplicativos de IA generativas usando o MongoDB Java Sync Driver. Este tutorial demonstra como começar a usar o Atlas Vector Search como o armazenamento de vetores para o Spring IA e, em seguida, como executar uma pesquisa semântica em seus dados.
Especificamente, você executa as seguintes ações:
Configure o ambiente.
Crie um índice Atlas Vector Search.
Armazene dados de incorporação de vetor no Atlas.
Execute uma query de pesquisa semântica em seus dados.
Dica
Aplicativo de amostra concluído
Para baixar uma versão concluída do aplicativo que este tutorial demonstra como criar, consulte a seção Próximas etapas .
Plano de fundo
Spring AI é uma estrutura de aplicativo da Spring que permite combinar vários serviços de IA e plug-ins com seus aplicativos. Você pode usar o Spring AI para uma variedade de casos de uso de IA baseados em texto.
Você pode usar o Atlas como um banco de dados vetorial e usar o Atlas Vector Search para implementar o RAG recuperando documentos semanticamente semelhantes de seus dados. Para saber mais sobre o RAG, consulte Geração de Recuperação Aumentada (RAG) com Atlas Vector Search .
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Um Atlas cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior. Garanta que seu endereço IP esteja incluído na lista de acessodo seu projeto Atlas.
Uma chave de API OpenAI. Você deve ter uma conta OpenAI paga com créditos disponíveis para solicitações de API. Para saber mais sobre como registrar uma conta OpenAI, consulte o site da API OpenAI.
Um ambiente para configurar e executar um aplicativo Java. Recomendamos que você use um ambiente de desenvolvimento integrado (IDE) como IntelliJ IDEA ou Eclipse IDE para configurar o Maven para construir e executar seu projeto.
Configurar o ambiente
Você deve primeiro configurar o ambiente para este tutorial, que inclui adicionar as dependências necessárias e definir propriedades de configuração.
Crie um aplicativo Java Spring.
Navegue até o Initializr do Spring e defina seu projeto com as seguintes configurações:
Projeto: Maven
Idioma: Java
Spring Boot: você pode usar a versão padrão selecionada.
Metadados do projeto:
Java: 21
Você pode usar valores padrão para todos os outros campos.
No lado direito do Spring Initializr, clique em ADD DEPENDENCIES, procure e adicione as seguintes dependências:
MongoDB Atlas Vector Database
Spring Data MongoDB
Por fim, clique em GENERATE para baixar uma versão compactada do seu projeto Spring. Descompacte o arquivo e abra-o em seu IDE.
Adicionar dependências.
O Spring AI fornece configuração automática do Spring Boot para o Atlas Vector Search.
Adicione as seguintes dependências à array
dependencies
no arquivopom.xml
do seu projeto. Essas dependências adicionam o Spring AI e a biblioteca de configuração automática ao seu aplicativo:<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> Em seguida, certifique-se de que seu arquivo
pom.xml
contenha uma entradadependencyManagement
para o Lista de materiais (BOM) do Spring AI.Importante
Configure a constante do
spring-ai.version
utilizada para o BOM do Spring AI como1.0.0-SNAPSHOT
para implementar os recursos mais recentes do Spring AI em seu aplicativo.Para saber mais sobre o BOM da IA da Spring, consulte Gerenciamento de dependência seção da documentação da IA do Spring.
Por fim, adicione o repositório Spring AI Snapshot à entrada
repositories
no arquivopom.xml
:<repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> </repository> Para saber mais sobre esses repositórios, consulte a seção Adicionar repositórios de etapas e snapshots seção da documentação da IA do Spring.
Depois de terminar de editar o arquivo
pom.xml
, recarregue seu projeto para garantir que suas dependências estejam instaladas.
Defina as propriedades do aplicativo.
Localize o arquivo src/main/resources/application.properties
e substitua o conteúdo desse arquivo pelas seguintes propriedades. Substitua os placeholders por sua chave de API OpenAI e sua connection string do Atlas:
spring.application.name=springai-mongodb spring.ai.openai.api-key=<OpenAI API Key> spring.ai.openai.embedding.options.model=text-embedding-ada-002 spring.data.mongodb.uri=<connection string> spring.data.mongodb.database=springai_test spring.ai.vectorstore.mongodb.indexName=vector_index spring.ai.vectorstore.mongodb.collection-name=vector_store
Observação
Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net/?<settings>
Para saber mais sobre como recuperar sua connection string, consulte o tutorial Introdução ao Atlas .
Criar o índice Atlas Vector Search Index
Para habilitar consultas de pesquisa de vetor em seu armazenamento de vetor, você deve criar um índice do Atlas Vector Search na coleção springai_test.vector_store
.
Observação
Acesso necessário
Para criar um Atlas Vector Search índice de pesquisa, você deve ter acesso Project Data Access Admin
ou superior ao Atlas projeto.
Habilitar a inicialização do esquema.
Quando você configura o Atlas como o armazenamento de vetores em seu aplicativo, a IA do Spring pode inicializar o esquema de backend automaticamente. Esta inicialização inclui a criação de um índice do Atlas Vector Search na collection que contém suas incorporações vetoriais. Você pode habilitar a inicialização do esquema adicionando a seguinte configuração ao seu arquivo application.properties
:
spring.ai.vectorstore.mongodb.initialize-schema=true
A especificação de initialize-schema=true
faz com que a Spring AI crie programaticamente um índice do Atlas Vector Search em seu cluster. Por esse motivo, você deve conectar seu aplicativo a um cluster dedicado. Se você estiver executando um cluster de nível gratuito ou compartilhado, deverá criar separadamente o índice por meio da UI do Atlas, da Administration API do Atlas ou do Atlas CLI.
Para saber mais, consulte Criar um Índice do Atlas Vector Search.
Observação
Problema conhecido: índice existente
Se você tiver um índice existente do Atlas Vector Search chamado vector_index
na collection springai_test.vector_store
, a IA do Spring não criará um índice adicional. Por isso, você pode enfrentar erros mais tarde no tutorial se o índice existente tiver sido configurado com configurações incompatíveis, como um número diferente de dimensões.
Certifique-se de que seu índice tenha a seguinte configuração:
{ "fields": [ { "numDimensions": 1536, "path": "embedding", "similarity": "cosine", "type": "vector" } ] }
Use o Atlas como um Vector Store
Esta seção demonstra como configurar o Atlas como um banco de dados vetorial, também conhecido como armazenamento de vetor, para que você possa armazenar as incorporações vetoriais de seus dados personalizados.
Localize o arquivo src/main/java/com/example/demo/DemoApplication.java
em seu projeto. No mesmo nível deste arquivo, crie um diretório chamado config
e, em seguida, crie um arquivo nesse diretório chamado Config.java
para definir a configuração do aplicativo Spring.
As etapas a seguir demonstram como criar os objetos Bean
necessários para preparar o armazenamento de vetores.
Adicione declarações de importação.
Cole o seguinte código no arquivo Config.java
para importar as classes necessárias:
import org.springframework.ai.embedding.EmbeddingModel; import org.springframework.ai.openai.OpenAiEmbeddingModel; import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.ai.vectorstore.MongoDBAtlasVectorStore; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.MongoTemplate;
Propriedades do aplicativo de referência.
Cole o código abaixo no arquivo Config.java
para fazer referência aos valores definidos no arquivo de propriedades do aplicativo:
public class Config { private String openAiKey; private String databaseName; private String collectionName; private String indexName; private String mongoUri; private Boolean initSchema; // Add beans here... }
Crie o VectorStore
bean Spring .
Por fim, cole o seguinte código para criar um bean que retorne uma instância VectorStore
. A instância do VectorStore
utiliza o MongoTemplate
que corresponde ao seu sistema e o OpenAiEmbeddingModel
criado na etapa anterior.
public VectorStore mongodbVectorStore(MongoTemplate mongoTemplate, EmbeddingModel embeddingModel) { return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.builder().build(), initSchema); }
Armazenar dados personalizados e executar uma query de pesquisa semântica
Nesta seção, você pode aprender como criar endpoints em seu aplicativo Java para armazenar incorporações vetoriais de dados personalizados no Atlas e, em seguida, executar uma query de pesquisa semântica nesses dados.
Criar endpoints
No mesmo nível da pasta config
, crie uma pasta controller
e, em seguida, crie um arquivo Controller.java
para configurar seus pontos de conexão de API. As etapas a seguir demonstram como criar endpoints GET
para adicionar dados ao seu armazenamento de vetores e executar uma query de pesquisa semântica usando o método similaritySearch()
.
Adicione declarações de importação.
Cole o seguinte código no arquivo Controller.java
para importar as classes necessárias:
import org.springframework.ai.document.Document; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import java.util.stream.Collectors;
Crie o controlador.
Cole o código abaixo para executar as seguintes tarefas:
Anote a classe
Controller
para marcá-la como controlador de aplicativo.Crie um mapeamento para mapear solicitações para o caminho
/tutorial
.Ligue automaticamente o bean
VectorStore
.
public class Controller { private VectorStore vectorStore; // Add endpoints here... }
Crie um endpoint para adicionar documentos ao armazenamento de vetores.
Cole o código a seguir no seu controlador para criar um endpoint GET
que crie documentos de amostra e os salve no seu armazenamento de vetores como incorporações vetoriais:
public String addDocuments() { List<Document> docs = List.of( new Document("Proper tuber planting involves site selection, proper timing, and exceptional care. Choose spots with well-drained soil and adequate sun exposure. Tubers are generally planted in spring, but depending on the plant, timing varies. Always plant with the eyes facing upward at a depth two to three times the tuber's height. Ensure 4 inch spacing between small tubers, expand to 12 inches for large ones. Adequate moisture is needed, yet do not overwater. Mulching can help preserve moisture and prevent weed growth.", Map.of("author", "A", "type","post")), new Document("Successful oil painting necessitates patience, proper equipment, and technique. Begin with a carefully prepared, primed canvas. Sketch your composition lightly before applying paint. Use high-quality brushes and oils to create vibrant, long-lasting artworks. Remember to paint 'fat over lean,' meaning each subsequent layer should contain more oil to prevent cracking. Allow each layer to dry before applying another. Clean your brushes often and avoid solvents that might damage them. Finally, always work in a well-ventilated space.", Map.of("author", "A")), new Document("For a natural lawn, selection of the right grass type suitable for your climate is crucial. Balanced watering, generally 1 to 1.5 inches per week, is important; overwatering invites disease. Opt for organic fertilizers over synthetic versions to provide necessary nutrients and improve soil structure. Regular lawn aeration helps root growth and prevents soil compaction. Practice natural pest control and consider overseeding to maintain a dense sward, which naturally combats weeds and pest.", Map.of("author", "B", "type","post")) ); vectorStore.add(docs); return "Documents added successfully!\n"; }
Crie um endpoint para executar uma pesquisa semântica.
Cole o código a seguir no seu controlador para criar um endpoint GET
que executa uma query de pesquisa semântica para a frase "learn how to grow things"
e retorna os dois resultados mais relevantes:
1 2 public List<Map<String, Object>> searchDocuments() { 3 4 List<Document> results = vectorStore.similaritySearch( 5 SearchRequest 6 .query("learn how to grow things") 7 .withTopK(2) 8 ); 9 10 return results.stream().map(doc -> Map.of( 11 "content", doc.getContent(), 12 "metadata", doc.getMetadata() 13 )).collect(Collectors.toList()); 14 }
(Opcional) Realize uma pesquisa semântica com filtragem de metadados.
Para executar uma pesquisa com filtragem de metadados, você pode usar a classe de construtor Filter.Expression
do driver Java Sync.
Você pode usar uma expressão de correspondência MQL para pré-filtrar documentos. Este exemplo filtra documentos nos quais o valor do campo author
é "A"
. Em seguida, ele executa uma query de pesquisa semântica para a frase "learn how to grow things"
.
No corpo do método searchDocuments()
definido na etapa anterior, substitua o código que chama o método similaritySearch()
(linhas 4-8 no bloco anterior) pelo seguinte código:
FilterExpressionBuilder b = new FilterExpressionBuilder(); List<Document> results = vectorStore.similaritySearch( SearchRequest.defaults() .withQuery("learn how to grow things") .withTopK(2) .withSimilarityThreshold(0.5) .withFilterExpression(b.eq("author", "A").build()) );
Observação
Você deve adicionar o caminho do seu campo de metadados ao seu índice do Atlas Vector Search. Consulte a seção Sobre o tipo filter
do tutorial Como indexar campos para o Vector Search para saber mais.
Para saber mais sobre a pré-filtragem de metadados, consulte Pré-filtro do Atlas Vector Search.
Pontos de conexão de acesso
Depois de executar o aplicativo, você pode acessar os endpoints para primeiro adicionar documentos ao Vector Store e, em seguida, realizar uma query de pesquisa semântica.
Acesse endpoints de dentro do seu terminal.
Após confirmar que seu aplicativo está em execução, execute o seguinte comando no seu terminal para acessar o endpoint add
, que converte os dados de amostra em incorporações vetoriais e insere as incorporações no Atlas:
curl -X GET http://localhost:8080/tutorial/add
Dica
Depois de acessar o endpoint, você pode visualizar suas incorporações vetoriais na UI do Atlas navegando até a coleção springai_test.vector_store
em seu cluster.
Em seguida, execute o seguinte comando no seu terminal para acessar o endpoint search
para executar a pesquisa semântica:
curl -X GET http://localhost:8080/tutorial/search
Próximos passos
Você pode ver e baixar uma versão concluída deste aplicativo do GitHub. Você pode usar o aplicativo completo para solucionar problemas do seu próprio aplicativo ou para testar a funcionalidade rapidamente.
O MongoDB também fornece os seguintes recursos para desenvolvedores: