Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ /

Introdução à integração do Spring AI

Nesta página

  • Plano de fundo
  • Pré-requisitos
  • Configurar o ambiente
  • Criar o índice Atlas Vector Search Index
  • Use o Atlas como um Vector Store
  • Armazene dados personalizados e execute uma query de pesquisa semântica
  • Próximos passos

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:

  1. Configure o ambiente.

  2. Crie um índice Atlas Vector Search.

  3. Armazene dados de incorporação de vetores no Atlas.

  4. 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.

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.

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.

Primeiro, você deve configurar o ambiente para este tutorial, o que inclui adicionar as dependências necessárias e definir propriedades de configuração.

1
  1. 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.

  2. 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

  3. Clique em GENERATE para baixar uma versão compactada do seu projeto Spring. Descompacte o arquivo e abra-o no seu IDE.

2
  1. 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 arquivo pom.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>
  2. Em seguida, assegure que seu arquivo pom.xml contenha uma entrada dependencyManagement para a Lista de Materiais (BOM) do Spring AI.

    Importante

    Defina a constante spring-ai.version usada para a BDM do Spring AI como 1.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.

  3. Por fim, adicione o repositório do Spring AI snapshot à entrada repositories no arquivo pom.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.

3

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:

src/main/resources/application.properties
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.

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.

1

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:

src/main/resources/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"
}
]
}

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.

1

Cole o código a seguir no arquivo Config.java para importar as classes necessárias:

/config/Config.java
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;
2

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:

/config/Config.java
@Configuration
@SpringBootConfiguration
@EnableAutoConfiguration
public class Config {
@Value("${spring.ai.openai.api-key}")
private String openAiKey;
@Value("${spring.data.mongodb.database}")
private String databaseName;
@Value("${spring.ai.vectorstore.mongodb.collection-name:vector_store}")
private String collectionName;
@Value("${spring.ai.vectorstore.mongodb.indexName:vector_index}")
private String indexName;
@Value("${spring.data.mongodb.uri}")
private String mongoUri;
@Value("${spring.ai.vectorstore.mongodb.initialize-schema}")
private Boolean initSchema;
// Add beans here...
}
3

Em seguida, cole o seguinte código para gerar a instância OpenAiEmbeddingModel que usa a API OpenAI para criar incorporações vetoriais:

/config/Config.java
@Bean
public EmbeddingModel embeddingModel() {
return new OpenAiEmbeddingModel(new OpenAiApi(openAiKey));
}
4

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.

/config/Config.java
@Bean
public VectorStore mongodbVectorStore(MongoTemplate mongoTemplate, EmbeddingModel embeddingModel) {
return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel,
MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.builder().build(), initSchema);
}

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.

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() .

1

Cole o código a seguir no arquivo Controller.java para importar as classes necessárias:

/controller/Controller.java
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;
2

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.

/controller/Controller.java
@RestController
@RequestMapping("/tutorial")
public class Controller {
@Autowired
private VectorStore vectorStore;
// Add endpoints here...
}
3

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:

/controller/Controller.java
@GetMapping("/add")
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";
}
4

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:

/controller/Controller.java
1@GetMapping("/search")
2public 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}
5

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:

/controller/Controller.java
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.

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.

1

Crie e execute o aplicativo usando as ferramentas IDE. Se você estiver usando configurações padrão, seu aplicativo é executado localmente na porta 8080.

2

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"}}]

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:

Voltar

Haystack