Docs Menu
Docs Home
/ /

Comience a utilizar la integración de Spring AI

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:

  1. Configura el entorno.

  2. Crear un índice de búsqueda vectorial de MongoDB.

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

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

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.

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

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

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

2
  1. Spring AI proporciona configuración automática de Spring Boot para MongoDB Vector Search.

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

    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 obtener más información sobre Spring AI BOM, consulte 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.

    Después de terminar de editar el archivo pom.xml, vuelva a cargar su proyecto para asegurarse de que sus dependencias estén instaladas.

3

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:

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 su cadena de conexión, consulte el tutorial Introducción a Atlas.

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.

1

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:

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

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.

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

/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, 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.

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:

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

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

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:

/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 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:

/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

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.

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

Cree y ejecute su aplicación con las herramientas de su IDE. Si usa la configuración predeterminada, su aplicación se ejecutará localmente en el puerto 8080.

2

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

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