Curso
La indexación vectorial se ha convertido en una herramienta poderosa para crear aplicaciones modernas. Te permite realizarbúsquedas de similitud rápidas y eficientes en datos de alta dimensión, a menudo denominadas incrustaciones vectoriales. Esta capacidad ahora está perfectamente integrada en MongoDB, lo que permite a los programadores crear funciones sofisticadas directamente en sus bases de datos.
Este artículo es una guía práctica para configurar y utilizar la indexación vectorial en MongoDB. Recorreremos el proceso paso a paso, desde la creación de tu primer índice hasta la ejecución de consultas complejas. También aprenderás las mejores prácticas y explorarás un ejemplo real de creación de un sistema de recomendación de productos para una tienda de comercio electrónico.
¿Qué es la indexación vectorial?
En esencia, la indexación vectorial es una técnica para organizar incrustaciones vectoriales con el fin de acelerar las búsquedas por similitud. A diferencia de los índices tradicionales que funcionan con valores escalares (como números o cadenas), un índice vectorial está optimizado para encontrar vectores «vecinos» en un espacio multidimensional.
Las incrustaciones vectoriales son representaciones numéricas de datos complejos, incluyendo texto, imágenes y audio. Por ejemplo, la descripción de un producto se puede convertir en un vector en el que los productos similares tienen vectores más cercanos entre sí en el espacio. Esta proximidad permite aplicaciones potentes como:
- Búsqueda semántica: Encontrar productos basándose en el significado de una consulta, no solo en la coincidencia de palabras clave.
- Sistemas de recomendación: Sugerir productos o contenidos a los usuarios en función de sus preferencias.
- Reconocimiento de imágenes: Identificar imágenes similares en una gran base de datos.
Configuración de la indexación vectorial en MongoDB
Para empezar, necesitarás un clúster de MongoDB Atlas. La búsqueda vectorial es una función nativa de la nube. Puedes probar esta función en MongoDB Atlas o en la edición gratuita Community Edition. En este artículo, utilizaremos MongoDB Atlas.
Paso 1: Crear un clúster de MongoDB Atlas
Crea un nuevo clúster en MongoDB Atlas. El nivel M0 gratuito es suficiente para realizar pruebas.
Paso 2: Crear una colección e insertar datos
En primer lugar, conéctate a tu clúster utilizando MongoDB Terminal (mongosh) o tu controlador preferido. A continuación, crea una nueva colección llamada« » (Productos de la tienda) e inserta documentos que contengan un campo vectorial. Cada documento debe representar un producto e incluir un campode incrustación , que contendrá la representación vectorial del producto.
Aquí hay un ejemplo más completo con tres documentos de productos distintos, cada uno con un vector generado aleatoriamente para mostrar cómo podrían verse los datos. En un escenario real, los reemplazarías por incrustaciones generadas por un modelo de IA.
db.products.insertMany([
{
"name": "Wireless Noise-Canceling Headphones",
"category": "Electronics",
"description": "Premium over-ear headphones with active noise cancellation and a 30-hour battery life.",
"price": 249.99,
"embedding": [0.012, 0.054, 0.089, -0.031, 0.067, 0.021, -0.045, 0.098, 0.011, -0.076, 0.033, -0.015, -0.087, 0.059, 0.009, 0.042]
},
{
"name": "Smart Coffee Maker",
"category": "Home Goods",
"description": "Programmable coffee machine that can be controlled from your smartphone. Brews up to 12 cups.",
"price": 129.99,
"embedding": [0.056, 0.023, 0.011, 0.078, -0.029, 0.041, 0.087, -0.019, 0.065, 0.002, -0.093, 0.018, 0.057, -0.041, 0.022, 0.064]
},
{
"name": "Ultra-light Backpack",
"category": "Travel",
"description": "Durable and lightweight backpack with multiple compartments, perfect for hiking or daily commutes.",
"price": 79.99,
"embedding": [-0.072, 0.034, 0.019, 0.068, -0.055, 0.081, 0.004, -0.025, 0.039, 0.016, -0.044, 0.062, 0.008, 0.071, -0.013, 0.053]
}
]);
Cada documento contiene un nombre, una categoría, una descripción y un precio, junto con el campo crucial « » (ID de documento). La incrustación es un arreglo de números de tamaño fijo que representa el significado semántico de la descripción del producto. El tamaño de este arreglo, ola dimensionalidad de un , depende del modelo utilizado para crear las incrustaciones. En este ejemplo, la dimensionalidad es 128.
Estos son los datos sobre los que construiremos nuestro índice vectorial para permitir la búsqueda semántica y recomendaciones de productos.
Paso 3: Crear un índice vectorial
Una vez que tengas tus datos con las incrustaciones en una colección, el siguiente paso es crear un índice vectorial. Este índice es fundamental para permitir búsquedas de similitud rápidas y eficientes. El siguiente comando utiliza createSearchIndex para crear un índice vectorial en el campode incrustación.
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"dynamic": true,
"fields": [
{
"type": "vector",
"path": "embedding",
"numDimensions": 128,
"similarity": "cosine"
}
]
},
}
});
Comprender la configuración
La configuración del índice se define dentro de los campos del objeto de definición, en el arreglo « ». Esta estructura es el modelo que utiliza MongoDB Atlas para organizar tus vectores y permitir una recuperación a alta velocidad.
Los parámetros principales para la indexación vectorial son:
- ruta: Esto especifica el nombre exacto del campo de tus documentos que contiene el arreglo vectorial, que en este ejemplo es «embedding» de .
- numDimensions: Este es el parámetro más importante. debe coincidir exactamente con el número de elementos del arreglo vectorial generado por tu modelo de incrustación (por ejemplo, 128, 768, 1536).
- similitud: Esto define la métrica matemática utilizada para calcular la «proximidad» entre dos vectores durante una búsqueda.
- El coseno se suele recomendar para la búsqueda semántica, ya que mide el ángulo entre vectores, centrándose en la dirección semántica.
- Otras opciones incluyen euclidiana (distancia en línea recta) y producto escalar.
Parámetros de rendimiento opcionales
Para un ajuste del rendimiento, MongoDB Atlas te permite especificar parámetros opcionales para optimizar el almacenamiento y la memoria:
- cuantización: Este parámetro se utiliza para comprimir tus vectores, lo que reduce significativamente el tamaño del índice y el consumo de memoria.
- escalar o binario para cuantificar los vectores, sacrificando una pequeña cantidad de recuperación a cambio de importantes ganancias en almacenamiento y velocidad.
Realización de consultas de búsqueda vectorial
Una vez creado el índice, puedes utilizar $vectorSearch agregación para realizar consultas de similitud.
Busquemos los productos más similares a un vector de consulta. Esta consulta se generaría normalmente a partir de la búsqueda introducida por el usuario.
// A sample query vector, generated from a user's search for "wireless audio device"
const queryVector = [0.11, 0.22, 0.33, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": queryVector,
"path": "embedding",
"numCandidates": 100, // Number of documents to scan
"limit": 5 // Number of results to return
}
},
{
"$project": {
"name": 1,
"description": 1,
"_id": 0
}
}
]);
- queryVector: El vector que estás buscando.
- ruta: El nombre del campo que contiene las incrustaciones vectoriales.
- numCandidates: El número de documentos candidatos que se van a escanear en el índice. Un número más alto mejora la precisión, pero aumenta la latencia.
- límite: El número de resultados principales que se mostrarán.
El etapa $project es opcional, pero útil para dar forma a la salida y excluir los datos vectoriales del resultado.
Mejores prácticas para la indexación vectorial
Al ajustar tu índice vectorial para obtener un rendimiento óptimo, debes encontrar el equilibrio entre precisión y velocidad. La clave está en ajustar los parámetros del índice en función de tu conjunto de datos específico y tus objetivos de rendimiento.
Elegir la métrica de similitud adecuada
La elección de la métrica es fundamental, ya que define el grado de «similitud» entre dos vectores. Puedes consultar la documentación de MongoDB para obtener más información sobre los campos.
- coseno: Ideal para la similitud semántica, especialmente con texto. Mide el ángulo entre vectores, sin tener en cuenta su longitud. Esto es crucial para los modelos en los que la longitud del vector no es significativa.
- euclidiano: Mide la distancia en línea recta entre dos vectores. Utiliza esto si la magnitud (o longitud) de los vectores es significativa para su significado, como en ciertos tipos de datos en los que un valor mayor significa una característica más fuerte.
- dotProduct: Calcula el producto escalar de dos vectores. Esta métrica se utiliza a menudo en los sistemas de recomendación. Cuando las incrustaciones vectoriales se normalizan a una longitud de 1, el producto escalar es funcionalmente equivalente a la similitud coseno.
Gestión de las dimensiones de incrustación
El parámetro de dimensiones es fundamental y debe coincidir exactamente con la salida de tu modelo de incrustación. Un error común es elegir un número que no coincide con el resultado del modelo. Un modelo con un mayor número de dimensiones puede capturar más detalles, pero dará lugar a un índice más grande y a consultas potencialmente más lentas. Comprueba siempre la documentación de tu modelo para confirmar su dimensionalidad (por ejemplo,text-embedding-ada-002 de OpenAI genera 1536 dimensiones).
Ajuste del índice
Los parámetros numCandidates y numLists son cruciales para equilibrar la velocidad y la precisión. Una buena regla general es comenzar con un número bajode candidatos numCandidates y aumentarlo hasta alcanzar un nivel satisfactorio de precisión. También puedes probar diferentesnumLists para los índicesivf hasta encontrar el punto óptimo para tu conjunto de datos.
Ejemplo de caso de uso: Creación de un sistema de recomendaciones sencillo
Apliquemos estos conceptos a un ejemplo práctico: un sistema de recomendación de productos de comercio electrónico.
Paso 1: Almacenar datos de productos con incrustaciones
En primer lugar, almacenaremos los nombres de los productos, las categorías y una incrustación vectorial para cada uno de ellos. La incrustación se puede generar a partir de la descripción o las características del producto.
db.products.insertMany([
{
"name": "Smart Speaker",
"category": "Electronics",
"embedding": [0.8, 0.9, 0.1, ...]
},
{
"name": "Wireless Earbuds",
"category": "Electronics",
"embedding": [0.7, 0.8, 0.2, ...]
},
{
"name": "Leather Wallet",
"category": "Fashion",
"embedding": [0.1, 0.2, 0.9, ...]
}
]);
Paso 2: Crear un índice vectorial enuna incrustación de tipo « »
db.products.createSearchIndex({
"name": "vector_index",
"definition": {
"mappings": {
"fields": [
{
"type": "vector",
"path": "embedding", // The field containing the vectors
"numDimensions": 128, // The correct field name is 'numDimensions'
"similarity": "cosine" // The correct field name is 'similarity'
// Index algorithm (like HNSW) is managed automatically by Atlas
}
]
}
}
});
Paso 3: Buscar productos similares
Ahora, busquemos productos similares al altavoz inteligente. Usaremos la incrustación para Smart Speaker como nuestro vector de consulta.
const smartSpeakerEmbedding = [0.8, 0.9, 0.1, ...];
db.products.aggregate([
{
"$vectorSearch": {
"queryVector": smartSpeakerEmbedding,
"path": "embedding",
"numCandidates": 50,
"limit": 3
}
},
{
"$project": {
"name": 1,
"category": 1,
"_id": 0
}
}
]);
Esta consulta devolverá los tres productos principales cuyas incrustaciones vectoriales sean más cercanas a la incrustación del altavoz inteligente, recomendando de manera efectiva artículos similares, como los auriculares inalámbricos.
Conclusión
Las capacidades de búsqueda vectorial de MongoDB abren nuevas posibilidades para crear aplicaciones inteligentes y personalizadas. Al integrar la indexación vectorial directamente en la base de datos, MongoDB simplifica la arquitectura, lo que facilita la gestión de datos y la realización de búsquedas rápidas por similitud.
Con el poder de la búsqueda vectorial, puedes ir más allá de la simple coincidencia de palabras clave y crear funciones que comprendan el contexto y el significado de tus datos. Te animamos a que empieces a experimentar con el nivel gratuito de MongoDB Atlas y a explorar cómo la indexación vectorial puede mejorar tus aplicaciones.
Preguntas frecuentes
¿Qué es una incrustación vectorial y por qué es necesaria para la búsqueda vectorial?
Una incrustación vectorial es una representación numérica de datos como texto o imágenes. Es necesario para la búsqueda vectorial porque permite a la base de datos medir la similitud semántica entre elementos calculando la distancia entre sus vectores, yendo más allá de la simple coincidencia de palabras clave.
¿Necesitas una versión específica de MongoDB para utilizar Vector Search?
Sí. La búsqueda vectorial es una función integrada de MongoDB Atlas, la versión alojada en la nube de MongoDB. No está disponible en las ediciones Community ni On-Premise de la base de datos.
¿Es necesario generar incrustaciones vectoriales por mi cuenta?
Sí, es necesario generar las incrustaciones vectoriales para tus datos antes de poder almacenarlos en MongoDB y crear un índice vectorial. MongoDB no genera estas incrustaciones por ti. Normalmente, utilizarás un servicio de terceros o un modelo preentrenado de una plataforma como OpenAI, Hugging Face o Google AI para convertir tu texto, imágenes u otros datos en vectores numéricos.
¿Puedes combinar la búsqueda vectorial con otras consultas de MongoDB?
Sí, puedes. La búsqueda vectorial es una etapa de agregación ($vectorSearch), lo que significa que puedes utilizarla dentro de un canal de agregación MongoDB más amplio. Esto te permite combinar la búsqueda vectorial con otras potentes etapas como $match, $project, $limit y $lookup para crear consultas sofisticadas que realizan filtrado, clasificación y enriquecimiento de datos en una sola operación. Esta capacidad se conoce como búsqueda híbrida y es esencial para crear aplicaciones del mundo real.
¿Cuál es la diferencia entre los tipos de índices IVF y HNSW?
Tanto IVF como HNSW son algoritmos utilizados para la búsqueda aproximada del vecino más cercano (ANN). La principal diferencia radica en cómo estructuran los datos.
Karen es Ingeniera de Datos y le apasiona crear plataformas de datos escalables. Tiene experiencia en automatización de infraestructuras con Terraform y le entusiasma compartir sus aprendizajes en entradas de blog y tutoriales. Karen es una creadora de comunidades, y le apasiona fomentar las conexiones entre los profesionales de los datos.