Introdução à integração do Spring AI
Nesta página
Você pode integrar o Atlas Vector Search com Spring AI para construir aplicativos de IA generativos 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 AI e, em seguida, como realizar 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 vetores no Atlas.
Execute uma consulta de pesquisa semântica em seus dados.
Dica
Aplicativo de amostra concluído
Para baixar uma versão completa do aplicativo que este tutorial demonstra como criar, consulte a seção Próximos passos.
Plano de fundo
Spring AI é um framework de aplicativo da Spring que permite combinar vários serviços e plugins de IA com seus aplicativos. Você pode usar a Spring AI em diversos 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 a RAG recuperando documentos semanticamente semelhantes de seus dados. Para saber mais sobre a RAG, consulte RAG (geração aumentada de recuperação) com Atlas Vector Search.
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Uma conta do Atlas com um cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior (incluindo RCs). Garanta que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas . Para saber mais, consulte Criar um cluster.
Uma chave de API OpenAI. Você deve ter uma conta paga do OpenAI 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.
Java Development Kit (JDK) versão 8 ou posterior.
Um ambiente para configurar e executar um aplicação Java . Recomendamos que você use um ambiente de desenvolvimento integrado (IDE) como IntelliJ IDEA ou Eclipse IDE para configurar Maven ou Gradle para construir e executar seu projeto.
Configurar o ambiente
Primeiro, você deve configurar o ambiente para este tutorial, o que inclui adicionar as dependências necessárias e definir propriedades de configuração.
Crie um aplicativo Spring Java.
Navegue até o Spring Initializr e configure seu projeto com as seguintes configurações:
Projeto: Maven
Linguagem: 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 e, em seguida, pesquise e adicione as seguintes dependências:
MongoDB Atlas Vector Database
Spring Data MongoDB
Clique em GENERATE para baixar uma versão compactada do seu projeto Spring. Descompacte o arquivo e abra-o no seu IDE.
Adicione dependências.
O Spring AI fornece configuração automática do Spring Boot para o Atlas Vector Search.
Adicione as seguintes dependências ao 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:pom.xml<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, assegure que seu arquivo
pom.xml
contenha uma entradadependencyManagement
para a Lista de Materiais (BOM) do Spring AI.Importante
Defina a constante
spring-ai.version
usada para a BDM do Spring AI como1.0.0-SNAPSHOT
para implementar os recursos mais recentes do Spring AI em seu aplicação.Para saber mais sobre o BOM do Spring AI, consulte a seção Gerenciamento de dependências da documentação do Spring AI.
Por fim, adicione o repositório do Spring AI snapshot à entrada
repositories
no arquivopom.xml
:pom.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 marcos e instantâneos da documentação do Spring AI.
Depois de terminar de editar o arquivo
pom.xml
, recarregue o projeto para garantir que as dependências estejam instaladas.
Definir propriedades do aplicativo.
Localize o arquivo src/main/resources/application.properties
e substitua o conteúdo desse arquivo pelas seguintes propriedades. Substitua os espaços reservados pela sua chave de API do OpenAI e sua string de conexão 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 obter sua string de conexão, consulte o tutorial Introdução ao Atlas.
Criar o índice Atlas Vector Search Index
Para permitir queries de pesquisa vetorial em seu armazenamento vetorial, você deve criar um índice 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 inicialização de esquema.
Quando você configura o Atlas como o armazenamento vetorial no seu aplicativo, o Spring AI pode inicializar o esquema de back-end automaticamente. Essa inicialização inclui a criação de um índice do Atlas Vector Search na coleção que contém seus embeddings vetoriais.
Para permitir a inicialização do esquema, adicione a seguinte configuração ao seu arquivo application.properties
:
spring.ai.vectorstore.mongodb.initialize-schema=true
Especificar initialize-schema=true
faz com que o Spring AI crie de forma programática um índice Atlas Vector Search no seu cluster. Para saber mais, consulte Criar um índice do Atlas Vector Search.
Observação
Problema conhecido: índice existente
Se você tiver um índice existente da Atlas Vector Search chamado vector_index
na coleção springai_test.vector_store
, o Spring AI não criará um índice adicional. Por isso, você poderá enfrentar erros posteriormente 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 vetorial, 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 desse 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 Spring App.
As etapas a seguir demonstram como criar os objetos Bean
necessários para preparar o repositório de vetores.
Adicione instruções de importação.
Cole o código a seguir 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 a seguir no arquivo Config.java
para fazer referência aos valores que você definiu 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 Spring bean VectorStore
.
Por fim, cole o código a seguir para criar um bean que retorne uma instância VectorStore
. A instância VectorStore
usa o MongoTemplate
que corresponde à sua implantação e o OpenAiEmbeddingModel
criado na etapa anterior.
public VectorStore mongodbVectorStore(MongoTemplate mongoTemplate, EmbeddingModel embeddingModel) { return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.builder().build(), initSchema); }
Armazene dados personalizados e execute uma query de pesquisa semântica
Nesta seção, você aprenderá a 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 crie um arquivo Controller.java
para configurar seus endpoints de API. As etapas a seguir demonstram como criar GET
pontos de extremidade para adicionar dados ao repositório de vetores e executar uma consulta de pesquisa semântica usando o método similaritySearch()
.
Adicione instruções de importação.
Cole o código a seguir 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 a seguir para executar as seguintes tarefas:
Anote a classe
Controller
para marcá-la como controladora do aplicativo.Crie um mapeamento para mapear solicitações para o caminho
/tutorial
.Conecte o bean
VectorStore
automaticamente.
public class Controller { private VectorStore vectorStore; // Add endpoints here... }
Crie um endpoint para adicionar documentos ao repositório de vetores.
Cole o código a seguir em seu controlador para criar um endpoint GET
que cria documentos de amostra e os salva em seu armazenamento vetorial 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 realizar uma pesquisa semântica.
Cole o código a seguir em seu controlador para criar um endpoint GET
que realize uma query de pesquisa semântica para a frase "learn how to grow things"
e retorne 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 Java Sync driver.
Você pode usar uma expressão de correspondência MQL para pré-filtrar documentos. Este exemplo filtra os documentos em que 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 código a seguir:
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 para 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 pesquisa vetorial para saber mais.
Para saber mais sobre a pré-filtragem de metadados, consulte Pré-filtro do Atlas Vector Search.
Acesse os endpoints
Depois de executar o aplicativo, você pode acessar os pontos de extremidade para primeiro adicionar documentos ao armazenamento de vetores e, em seguida, realizar uma query de pesquisa semântica.
Acesse endpoints de dentro do seu terminal.
Depois de confirmar que seu aplicativo está em execução, execute o seguinte comando em seu terminal para acessar o endpoint add
, que converte os dados de amostra em incorporações de vetor e insere as incorporações no Atlas:
curl -X GET http://localhost:8080/tutorial/add
Documents added successfully!
Dica
Depois de acessar o endpoint, você pode visualizar suas incorporações de vetores na interface do Atlas navegando até a coleção springai_test.vector_store
no seu cluster.
Em seguida, execute o seguinte comando em seu terminal para acessar o endpoint search
e realizar a pesquisa semântica:
curl -X GET http://localhost:8080/tutorial/search
[{"content":"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.","metadata":{"type":"post","author":"B"}},{"content":"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.","metadata":{"type":"post","author":"A"}}]
Próximos passos
Você pode visualizar e baixar uma versão completa deste aplicativo no GitHub. Você pode usar o aplicativo completo para solucionar problemas do seu próprio aplicativo ou testar a funcionalidade rapidamente.
O MongoDB também fornece os seguintes recursos para desenvolvedores: