Puedes 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.
Crea un índice de MongoDB Vector Search.
Almacenar datos de incrustación de vectores en MongoDB.
Ejecute una consulta de búsqueda semántica en sus datos.
Tip
aplicación de muestra completada
Para descargar una versión completada de la aplicación cuya creación se muestra en este tutorial, 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 encontrando documentos semánticamente similares en tus datos. Para obtener más información sobre RAG, consulta 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.
Crea una aplicación Java Spring.
Navega al Spring Initializr y configura tu proyecto con los siguientes ajustes:
Proyecto: Maven
Lenguaje: Java
Spring Boot: puedes utilizar la versión por defecto que está seleccionada.
Metadatos del proyecto:
Java: 21
Se pueden utilizar valores por defecto para todos los demás campos.
En el lado derecho del Spring Initializr, haz clic en ADD DEPENDENCIES, luego busca y agrega las siguientes dependencias:
MongoDB Atlas Vector Database
Spring Data MongoDB
Haz clic en GENERATE para descargar una versión comprimida en zip de tu proyecto Spring. Descomprime el archivo y ábrelo en tu IDE.
Agrega dependencias.
Spring AI proporciona autoconfiguración de Spring Boot para MongoDB Vector Search.
Agregue las siguientes dependencias a
dependenciesarreglo en el archivopom.xmlde tu proyecto. Estas dependencias agregan Spring AI y la librería de configuración automática 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 el Proyecto de Materiales de Spring IA (BOM).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 aprender más sobre el Spring AI BOM, consulta 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.
Cuando termines de editar el archivo
pom.xml, vuelve a cargar tu proyecto para asegurarte de que tus dependencias estén instaladas.
Definir propiedades de la aplicación.
Ubica el archivo src/main/resources/application.properties y reemplaza el contenido de ese archivo con las siguientes propiedades. Reemplaza los marcadores de posición con tu clave API de OpenAI y tu 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 tu cadena de conexión, consulta la guía de cadenas de conexión.
Cree el índice de búsqueda vectorial de MongoDB
Para habilitar las consultas de búsqueda de vectores en tu almacén de vectores, debes crear un índice de MongoDB Vector Search 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.
Cuando configuras Atlas como el almacén vectorial en tu aplicación, Spring AI puede inicializar automáticamente el esquema del backend. Esta inicialización incluye la creación de un índice de MongoDB Vector Search en la colección que contiene tus embeddings vectoriales.
Para habilitar la inicialización del esquema, añade la siguiente configuración a tu 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 tienes un índice de MongoDB Vector Search existente llamado vector_index en la colección springai_test.vector_store, Spring IA no creará un índice adicional. Debido a esto, podrías encontrar errores más adelante en el tutorial si el índice existente estaba configurado con ajustes incompatibles, como un número diferente de dimensiones.
Asegúrate de que tu índice tenga la siguiente configuración:
{ "fields": [ { "numDimensions": 1536, "path": "embedding", "similarity": "cosine", "type": "vector" } ] }
Usa MongoDB como Vector Store
Esta sección muestra cómo configurar MongoDB como una base de datos vectorial, también conocida como vector store, para que puedas almacenar las incrustaciones vectoriales de tus datos personalizados.
Localiza el archivo src/main/java/com/example/demo/DemoApplication.java en tu proyecto. Al mismo nivel que este archivo, crea un directorio llamado config, luego crea un archivo en este directorio llamado Config.java para configurar la configuración de tu aplicación Spring.
Los siguientes pasos demuestran cómo crear los objetos Bean necesarios para preparar el almacén vectorial.
Añade instrucciones 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 bean EmbeddingModel de 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 bean VectorStore de Spring.
Finalmente, pega el siguiente código para crear un bean que devuelva una instancia de VectorStore. La instancia VectorStore utiliza el MongoTemplate que corresponde a tu implementación y el OpenAiEmbeddingModel creado en el paso anterior.
public VectorStore mongodbVectorStore(MongoTemplate mongoTemplate, EmbeddingModel embeddingModel) { return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.builder().build(), initSchema); }
Guarde datos personalizados y ejecute una query de búsqueda semántica
En esta sección, puedes aprender a crear endpoints en tu aplicación Java para almacenar incrustaciones vectoriales de datos personalizados en MongoDB y luego ejecutar una query de búsqueda semántica sobre 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ñade instrucciones 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;
Crea el controlador.
Pegue el siguiente código para realizar las siguientes tareas:
Anota la clase
Controllerpara marcarla como el controlador de la aplicación.Cree una asignación para asignar solicitudes a la ruta
/tutorial.Inyecte automáticamente el bean
VectorStore.
public class Controller { private VectorStore vectorStore; // Add endpoints here... }
Crear un endpoint para añadir documentos a la tienda de vectores.
Pega el siguiente código en tu controlador para crear un endpoint GET que cree documentos de muestra y los guarde en tu vector store como incrustaciones vectoriales:
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 endpoint para realizar una búsqueda semántica.
Pegue el siguiente código en su controlador para crear un endpoint de GET que realice una query 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) Ejecuta una búsqueda semántica con filtrado por 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
Debes añadir la ruta de tu campo de metadatos a tu índice MongoDB Vector Search. Consulta la sección Acerca del tipo filter 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, consulta MongoDB Vector Search.
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 está en funcionamiento, ejecute el siguiente comando en su terminal para acceder al endpoint 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.
A continuación, ejecuta el siguiente comando en tu terminal para acceder al endpoint search y 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: