Puede integrar MongoDB Vector Search con Spring AIPara crear aplicaciones de IA generativa con el controlador de sincronización de Java de MongoDB. Este tutorial muestra cómo empezar a usar MongoDB Vector Search como almacén de vectores para Spring AI y, posteriormente, cómo realizar una búsqueda semántica en sus datos.
En concreto, realizas las siguientes acciones:
Configura el entorno.
Crear un índice de búsqueda vectorial de MongoDB.
Almacenar datos de incrustación de vectores en MongoDB.
Ejecute una consulta de búsqueda semántica en sus datos.
Tip
Solicitud de muestra completa
Para descargar una versión completa de la aplicación que este tutorial demuestra cómo construir, consulte la sección Próximos pasos.
Segundo plano
Spring AI es un framework de aplicaciones de Spring que te permite combinar diversos servicios y plugins de IA con tus aplicaciones. Puedes usar Spring AI para diversos casos de uso de IA basada en texto.
Puede utilizar MongoDB como una base de datos vectorial y utilizar MongoDB Vector Search para implementar RAG recuperando documentos semánticamente similares de sus datos. Para obtener más información sobre RAG, consulte Recuperación-Generación Aumentada (RAG) con MongoDB.
Requisitos previos
Para completar este tutorial, debes tener lo siguiente:
Uno de los siguientes tipos de clúster de MongoDB:
Un clúster de Atlas que ejecuta la versión 6.0.11, 7.0.2 o posterior de MongoDB. Asegúrese de que su dirección IP esté incluida en la lista de acceso de su proyecto Atlas.
Una implementación local de Atlas creada usando Atlas CLI. Para obtener más información, consulta Crear una Implementación local de Atlas.
Un clúster de MongoDB Community o Enterprise con Search y Vector Search instalados.
Una llave de API de OpenAI. Debes tener una cuenta de OpenAI con créditos disponibles para las solicitudes de API. Para obtener más información sobre cómo registrar una cuenta de OpenAI, consulta el sitio web de la API de OpenAI.
Java Development Kit (JDK) versión 8 o posterior.
Un entorno para configurar y ejecutar una aplicación Java. Recomendamos utilizar un entorno de desarrollo integrado (IDE) como IntelliJ IDEA o Eclipse IDE para configurar Maven o Gradle para compilar y ejecutar el proyecto.
Configurar el entorno
Primero debe configurar el entorno para este tutorial, lo que incluye agregar las dependencias necesarias y establecer las propiedades de configuración.
Crear una aplicación Java Spring.
Navegue hasta Spring Initializr y configure su proyecto con las siguientes configuraciones:
Proyecto: Maven
Lenguaje: Java
Spring Boot: puedes utilizar la versión por defecto que está seleccionada.
Metadatos del proyecto:
Java: 21
Puede utilizar valores predeterminados para todos los demás campos.
En el lado derecho de Spring Initializr, haga clic en ADD DEPENDENCIES, luego busque y agregue las siguientes dependencias:
MongoDB Atlas Vector Database
Spring Data MongoDB
Haz clic en GENERATE para descargar una versión comprimida de tu proyecto Spring. Descomprime el archivo y ábrelo en tu IDE.
Agrega dependencias.
Spring AI proporciona configuración automática de Spring Boot para MongoDB Vector Search.
Agregue las siguientes dependencias a
dependenciesMatriz en el archivopom.xmlde tu proyecto. Estas dependencias añaden Spring AI y la biblioteca de autoconfiguración a tu aplicación: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> A continuación, asegúrese de que su archivo
pom.xmlcontenga una entradadependencyManagementpara la lista de materiales (BOM) de Spring AI.Importante
Establezca la constante
spring-ai.versionutilizada para la lista de materiales de Spring AI en1.0.0-SNAPSHOTpara implementar las funciones más recientes de Spring AI en su aplicación.Para obtener más información sobre Spring AI BOM, consulte la sección Gestión de dependencias de la documentación de Spring AI.
Finalmente, añade el repositorio Spring AI Snapshot en la entrada
repositoriesen el archivopom.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 obtener más información sobre estos repositorios, consulte la sección Agregar repositorios de Milestone y Snapshot de la documentación de Spring AI.
Después de terminar de editar el archivo
pom.xml, vuelva a cargar su proyecto para asegurarse de que sus dependencias estén instaladas.
Definir propiedades de la aplicación.
Localice el archivo src/main/resources/application.properties y reemplace su contenido con las siguientes propiedades. Reemplace los marcadores de posición con su clave de API de OpenAI y su cadena de conexión de 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
Nota
Su cadena de conexión debe usar el siguiente formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net/?<settings>
Para obtener más información sobre cómo recuperar su cadena de conexión, consulte el tutorial Introducción a Atlas.
Cree el índice de búsqueda vectorial de MongoDB
Para habilitar consultas de búsqueda de vectores en su tienda de vectores, debe crear un índice de búsqueda de vectores de MongoDB en la colección springai_test.vector_store.
Nota
Acceso requerido
Para crear un índice de búsqueda vectorial Project Data Access Admin de MongoDB, debe tener o acceso superior al proyecto MongoDB.
Habilitar la inicialización del esquema.
Al configurar Atlas como almacén de vectores en su aplicación, Spring AI puede inicializar automáticamente el esquema de backend. Esta inicialización incluye la creación de un índice de búsqueda de vectores de MongoDB en la colección que contiene sus incrustaciones de vectores.
Para habilitar la inicialización del esquema, agregue la siguiente configuración a su archivo application.properties:
spring.ai.vectorstore.mongodb.initialize-schema=true
Al especificar, Spring AI crea initialize-schema=true programáticamente un índice de búsqueda vectorial de MongoDB en su clúster. Para obtener más información, consulte Crear un índice de búsqueda vectorial de MongoDB.
Nota
Problema conocido: índice existente
Si ya tiene un índice de búsqueda vectorial de MongoDB llamado vector_index en la colección springai_test.vector_store, Spring AI no creará un índice adicional. Por ello, podría experimentar errores más adelante en el tutorial si el índice existente se configuró con parámetros incompatibles, como un número diferente de dimensiones.
Asegúrese de que su índice tenga la siguiente configuración:
{ "fields": [ { "numDimensions": 1536, "path": "embedding", "similarity": "cosine", "type": "vector" } ] }
Utilice MongoDB como almacén de vectores
Esta sección demuestra cómo configurar MongoDB como una base de datos vectorial, también conocida como almacén vectorial, para que pueda almacenar las incrustaciones vectoriales de sus datos personalizados.
Localiza el archivo src/main/java/com/example/demo/DemoApplication.java en tu proyecto. En el mismo nivel que este archivo, crea un directorio llamado config y, a continuación, un archivo en este directorio llamado Config.java para configurar tu aplicación Spring.
Los siguientes pasos demuestran cómo crear los objetos Bean necesarios para preparar el almacén de vectores.
Añadir declaraciones de importación.
Pegue el siguiente código en el archivo Config.java para importar las clases necesarias:
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;
Propiedades de la aplicación de referencia.
Pegue el siguiente código en el archivo Config.java para hacer referencia a los valores que estableció en el archivo de propiedades de su aplicación:
public class Config { private String openAiKey; private String databaseName; private String collectionName; private String indexName; private String mongoUri; private Boolean initSchema; // Add beans here... }
Crea el EmbeddingModel bean Spring.
A continuación, pegue el siguiente código para generar la instancia OpenAiEmbeddingModel que utiliza la API de OpenAI para crear incrustaciones vectoriales:
public EmbeddingModel embeddingModel() { return new OpenAiEmbeddingModel(new OpenAiApi(openAiKey)); }
Crea el VectorStore bean Spring.
Finalmente, pegue el siguiente código para crear un bean que devuelva una instancia VectorStore. La instancia VectorStore usa la instancia MongoTemplate correspondiente a su implementación y la instancia OpenAiEmbeddingModel creada en el paso anterior.
public VectorStore mongodbVectorStore(MongoTemplate mongoTemplate, EmbeddingModel embeddingModel) { return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.builder().build(), initSchema); }
Almacenar datos personalizados y ejecutar una consulta de búsqueda semántica
En esta sección, puede aprender cómo crear puntos finales en su aplicación Java para almacenar incrustaciones vectoriales de datos personalizados en MongoDB y luego ejecutar una consulta de búsqueda semántica en esos datos.
Crear puntos finales
En el mismo nivel que la carpeta config, cree una carpeta controller y, a continuación, un archivo Controller.java para configurar los puntos de conexión de su API. Los siguientes pasos muestran cómo crear puntos de conexión GET para añadir datos a su almacén de vectores y ejecutar una consulta de búsqueda semántica mediante el método similaritySearch().
Añadir declaraciones de importación.
Pegue el siguiente código en el archivo Controller.java para importar las clases necesarias:
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;
Crear el controlador.
Pegue el siguiente código para realizar las siguientes tareas:
Anote la clase
Controllerpara marcarla como el controlador de la aplicación.Cree una asignación para asignar solicitudes a la ruta
/tutorial.Conectar automáticamente el bean
VectorStore.
public class Controller { private VectorStore vectorStore; // Add endpoints here... }
Cree un punto final para agregar documentos al almacén de vectores.
Pegue el siguiente código en su controlador para crear un punto final GET que cree documentos de muestra y los guarde en su almacén de vectores como incrustaciones de vectores:
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"; }
Crea un punto final para realizar una búsqueda semántica.
Pegue el siguiente código en su controlador para crear un punto final GET que realice una consulta de búsqueda semántica para la frase "learn how to grow things" y devuelva los dos resultados más 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) Realice una búsqueda semántica con filtrado de metadatos.
Para realizar una búsqueda con filtrado de metadatos, puedes utilizar la clase builder Filter.Expression del Java Sync driver.
Puede usar una expresión de coincidencia MQL para prefiltrar documentos. Este ejemplo filtra documentos cuyo valor del author campo "A" sea. A continuación, realiza una consulta de búsqueda semántica para la "learn how to grow things" frase.
En el cuerpo del método searchDocuments() definido en el paso anterior, reemplace el código que llama al método similaritySearch() (líneas 4-8 en el bloque anterior) con el siguiente 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()) );
Nota
Debe agregar la ruta de su campo de metadatos al índice de búsqueda vectorial de MongoDB. Consulte la sección "Acerca del filter tipo " del tutorial "Cómo indexar campos para la búsqueda vectorial" para obtener más información.
Para obtener más información sobre el prefiltrado de metadatos, consulte Prefiltrado de búsqueda vectorial de MongoDB.
Puntos finales de acceso
Después de ejecutar tu aplicación, puedes acceder a los endpoints para agregar primero documentos al almacén de vectores y luego realizar una query de búsqueda semántica.
Accede a los endpoints directamente desde tu terminal.
Después de confirmar que su aplicación se está ejecutando, ejecute el siguiente comando en su terminal para acceder al punto final add, que convierte los datos de muestra en incrustaciones vectoriales e inserta las incrustaciones en Atlas:
curl -X GET http://localhost:8080/tutorial/add
Documents added successfully!
Tip
Después de acceder al punto final, si está usando Atlas, puede verificar sus incrustaciones vectoriales navegando al espacio de springai_test.vector_store nombres en la interfaz de usuario de Atlas.
Luego, ejecute el siguiente comando en su terminal para acceder al punto final search para realizar la búsqueda 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 pasos
Puedes ver y descargar una versión completa de esta aplicación desde GitHub. Puedes usarla para solucionar problemas de tu propia aplicación o para probar su funcionalidad rápidamente.
MongoDB también proporciona los siguientes recursos para desarrolladores: