Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Comienza con la integración Spring AI

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:

  1. Configura el entorno.

  2. Crea un índice de MongoDB Vector Search.

  3. Almacenar datos de incrustación de vectores en MongoDB.

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

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.

Para completar este tutorial, debes tener lo siguiente:

  • Uno de los siguientes tipos de clúster de MongoDB:

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

Primero debe configurar el entorno para este tutorial, lo que incluye agregar las dependencias necesarias y establecer las propiedades de configuración.

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

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

  3. Haz clic en GENERATE para descargar una versión comprimida en zip de tu proyecto Spring. Descomprime el archivo y ábrelo en tu IDE.

2
  1. Spring AI proporciona autoconfiguración de Spring Boot para MongoDB Vector Search.

    Agregue las siguientes dependencias a dependencies arreglo en el archivo pom.xml de 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>
  2. A continuación, asegúrese de que su archivo pom.xml contenga una entrada dependencyManagement para el Proyecto de Materiales de Spring IA (BOM).

    Importante

    Establezca la constante spring-ai.version utilizada para la lista de materiales de Spring AI en 1.0.0-SNAPSHOT para 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.

  3. Finalmente, añade el repositorio Spring AI Snapshot en la entrada repositories en el archivo 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 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.

3

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:

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

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.

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.

1

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:

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

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.

1

Pegue el siguiente código en el archivo Config.java para importar las clases necesarias:

/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

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:

/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

A continuación, pegue el siguiente código para generar la instancia OpenAiEmbeddingModel que utiliza la API de OpenAI para crear incrustaciones vectoriales:

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

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.

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

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.

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

1

Pegue el siguiente código en el archivo Controller.java para importar las clases necesarias:

/controlador/Controlador.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

Pegue el siguiente código para realizar las siguientes tareas:

  • Anota la clase Controller para 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.

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

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:

/controlador/Controlador.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

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:

/controlador/Controlador.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 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:

/controlador/Controlador.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())
);

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.

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.

1

Compila y ejecuta tu aplicación utilizando las herramientas del IDE. Si estás utilizando la configuración por defecto, tu aplicación se ejecuta localmente en el puerto 8080.

2

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

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:

Volver

Haystack

En esta página