Docs Menu
Docs Home
/ /

Descripción general del punto de referencia de búsqueda vectorial de MongoDB

Esta página explica las estrategias clave de optimización del rendimiento para MongoDB Vector Search y cómo las utilizamos para crear nuestro benchmark. Para aprender a interpretar esta guía, consulte Cómo utilizar este punto de referencia.

Información sobre el conjunto de datos y la configuración para nuestro punto de referencia.

Para nuestro punto de referencia, utilizamos el Conjunto de datos de reseñas de Amazon 2023, un conjunto masivo de datos de comercio electrónico que contiene 571.54millones de reseñas en 33 categorías de productos, que representan interacciones desde mayo 1996 hasta septiembre 2023. Con aproximadamente 48.2 millones de artículos únicos cubiertos por estas reseñas, proporciona datos multimodales completos que incluyen reseñas de usuarios (calificaciones, texto, votos de utilidad), metadatos de artículos (descripciones, precio, imágenes) y gráficos de interacción usuario-artículo. Analizamos subconjuntos del conjunto de datos de artículos (5.5millones y 15.3millones) que contienen títulos y descripciones, y utilizamos la inteligencia artificial de Voyage. voyage-3-large modelo para incrustarlos utilizando la siguiente lógica:

source = "Item: Title: " + record["title"] + " Description: " + record["description"]
source_embedding = vo.embed(source, model="voyage-3-large", input_type="document", output_dimension=2048)

La calidad de los resultados de los filtros se determina calculando la similitud de Jaccard (intersection / expected number of results) utilizando los resultados de un La consultaANN y la ENN de coma flotante correspondiente arrojan resultados exactos para la misma entrada de texto y el mismo número de vectores solicitados. Larecuperación se calcula hallando la intersección promedio de 50 consultas de muestra que podrían solicitarse a un conjunto de datos de comercio electrónico.

Nota

Para ver el código fuente utilizado para la evaluación comparativa, así como el código utilizado para integrar el conjunto de datos de origen, consulte Repositorio de pruebas de rendimiento.

En esta sección se describen varios factores que afectan el rendimiento de MongoDB Vector Search y cómo configuramos nuestro punto de referencia para probarlos.

La cuantificación reduce la precisión de las incrustaciones vectoriales para disminuir el uso de memoria y mejorar la velocidad de búsqueda, con desventajas en la precisión de la búsqueda.

La cuantificación escalar convierte vectores de punto flotante de 32bits en enteros de 8bits, lo que reduce el uso de memoria en 4veces. Las comparaciones de vectores enteros requieren menos tiempo de cálculo que las de vectores flotantes y requieren menos recursos, pero pueden afectar la precisión de la búsqueda.

La cuantificación binaria convierte vectores en representaciones de 1bits, lo que reduce el uso de memoria en 32veces. Las comparaciones de vectores binarios implican el cálculo de la distancia de Hamming y requieren incluso menos tiempo de cálculo que los vectores enteros y menos recursos. Sin embargo, la pérdida de precisión de la búsqueda es tan significativa al pasar de vectores float a vectores binarios que, para compensarla, añadimos un paso de repunte, lo que aumenta la latencia. En el momento de la consulta, los numCandidates primeros resultados acumulados durante la búsqueda se reordenan según sus vectores de fidelidad completa en el disco antes de generar los limit primeros resultados.

Utilizamos el modelo de Voyage AI para integrar los conjuntos de datos de vectores medianos (voyage-3-large 5.5M) y grandes (15.3M). Elegimos este modelo de integración por su excelente rendimiento en numerosas pruebas de IR y porque está entrenado con el aprendizaje de representación de Matryoshka y la cuantificación. Por lo tanto, funciona bien en dimensiones más pequeñas con la cuantificación activada, incluso con volúmenes de vectores más altos.

Aprovechamos la indexación en vistas para producir campos adicionales que dividen las primeras N dimensiones del vector de dimensiones de origen 2048 para producir 1024, 512 y 256 vectores de dimensiones e indexarlos como lo haríamos con el campo de origen.

Nota

Debe utilizar la versión MongoDB 8.1 o posterior para crear un índice de búsqueda vectorial en una vista.

Al igual que las diferentes representaciones en cada posición, las diferentes dimensionalidades afectan la capacidad de representación de cada vector. Por lo tanto, se puede lograr una mayor precisión con 2048vectores d en comparación con los 256vectores d, especialmente al medir con una 2048línea base ENN flotante d.

Además de requerir más almacenamiento y memoria, los vectores de dimensiones superiores son algo más lentos de consultar en comparación con los vectores de dimensiones inferiores, pero esto se mitiga significativamente ya que MongoDB Vector Search aprovecha las instrucciones SIMD al realizar comparaciones de vectores.

También creamos una definición de índice separada en la colección que contiene todos los 15.3M elementos, que incluye filtros en dos campos para permitir consultas prefiltradas en este conjunto de datos.

Ejecutamos consultas de búsqueda vectorial, tanto filtradas como sin filtrar, contra el gran conjunto de datos indexados:

# unfiltered query
query = [
{
"$vectorSearch": {
"index": "large_vector_index",
"path": "embedding",
"queryVector": embedding.tolist(),
"limit": k,
"numCandidates": candidates,
}
},
{
"$project": {"embedding": 0}
}
]
# filtered query
query = [
{
"$vectorSearch": {
"index": "large_vector_index",
"path": "embedding",
"queryVector": embedding.tolist(),
"limit": k,
"numCandidates": candidates,
"filter": {"$and": [{'price': {'$lte': 1000}}, {'category': {'$eq': "Pet Supplies"}}]}
}
},
{
"$project": {"embedding": 0}
}
]

Nota

Ambos patrones de consulta excluyen los campos de incrustación en la salida mediante la $project etapa. Esto siempre se recomienda para reducir la latencia, a menos que necesite incrustaciones en sus resultados.

El rendimiento de MongoDB Vector Search escala con nodos de búsqueda dedicados, que gestionan los cálculos vectoriales independientemente de la carga de trabajo de la base de datos principal y hacen un uso eficiente de las instancias de hardware dedicadas. Todas las pruebas se realizaron con un M20 clúster base, pero, según el tipo de prueba, reconfiguramos los nodos de búsqueda utilizados para que se ajustaran mejor a nuestro caso de prueba. Todas las pruebas se ejecutaron con nodos de búsqueda en AWS 1us-east-, con una2 instancia EC también en us-east-1 realizando solicitudes. Hay tres tipos de nodos de búsqueda que se pueden aprovisionar en AWS, que varían en cuanto a la capacidad de disco, RAM y vCPU disponibles:

Tipo de nodo
Perfil de recursos
Uso recomendado

Low-CPU

Baja relación disco a memoria (~6:1), baja vCPU

Buen punto de partida para muchas cargas de trabajo vectoriales que no aprovechan la cuantificación

High-CPU

Alta proporción de disco a memoria (~25:1), vCPU alta

Opción de alto rendimiento para cargas de trabajo de alto QPS o cargas de trabajo que aprovechan la cuantificación

Optimizado para almacenamiento

Alta relación de disco a memoria (~25:1), baja vCPU

Opción rentable para cargas de trabajo que aprovechan la cuantificación

Un vector flotante de dimensión 768ocupa aproximadamente3kb de espacio en disco. Este requerimiento de recursos aumenta linealmente con el número de vectores y el número de dimensiones de cada vector: 1M 768d vectores ocupan aproximadamente3GB; 1M 1536d ocupa aproximadamente6GB.

Utilizando la cuantización, producimos vectores de representación que se mantienen en memoria a partir de los vectores de fidelidad completa almacenados en disco. Esto reduce la cantidad de memoria requerida por 3.75veces para la cuantización escalar y 24veces para la cuantización binaria, pero incrementa la cantidad de disco necesaria para almacenar los vectores sin cuantizar y cuantizados.

El vector 1 escalar cuantificado 768d requiere 0.8kb de memoria (3/3.75) y ~3.8kb de disco (3 + 3/3.75). Considerando estas opciones de hardware y los requisitos de recursos para la cuantificación, seleccionamos los siguientes niveles de nodos de búsqueda para los diferentes casos de prueba:

Caso de prueba
Recursos necesarios (RAM, almacenamiento)
Search Node Tier RAM, disk, vCPUs
Precio para 2x nodos

Conjunto de datos mediano (5.5M vectores, todas las dimensiones), cuantificación escalar

22, 104.5 GB

S50-almacenamiento optimizado 32 GB, 843 GB, 4 vCPU

$1.04/hr

Conjunto de datos mediano (5.5M vectores, todas las dimensiones), cuantificación binaria

3.43, 104.5 GB

S30-alta CPU 8 GB 213 GB 4 vCPU

$0.24/hr

Conjunto de datos grande (15.3M vectores, 2048d), cuantificación escalar

32.64, 155.04 GB

S50-almacenamiento optimizado 32 GB, 843 GB, 4 vCPU

$1.04/hr

Conjunto de datos grande (15.3M vectores, 2048d), cuantificación binaria

5.1, 155.04 GB

S30-alta CPU 8 GB 213 GB 4 vCPU

$0.24/hr

Para el gran conjunto de datos, aprovechamos una función adicional llamada compresión vectorial, que reduce la huella de cada vector en la colección de origen en aproximadamente un 60%. Esto acelera el paso dentro de una consulta cuando los ID se hidratan en la colección de origen, y es un paso recomendado para todas las cargas de trabajo grandes.

Evaluamos no solo la latencia de las consultas en serie, sino también el rendimiento total/QPS cuando se emiten solicitudes 10 y 100 simultáneamente.

Nota

El mecanismo recomendado para manejar un mayor rendimiento es escalar la cantidad de nodos de búsqueda horizontalmente, lo que no medimos en estas pruebas.

Evaluamos el impacto de la fragmentación de nuestro clúster y colección en el _id campo en el rendimiento del sistema, centrándonos en la concurrencia de solicitudes de 10 y 100 para el gran índice binario cuantificado.

Volver

Benchmark de rendimiento

En esta página