← Atrás

FLAT vs IVF: Cómo funciona el índice de archivo invertido

Mismos datos, misma consulta, pero una estrategia de búsqueda diferente. Arrastra el punto de consulta, ajusta nprobey pulsa «Ejecutar búsqueda » para ver cómo « IVF » omite la mayor parte de los datos.

nprobe2
2 e de búsqueda de clústeres 8
Velocidad20ms
Cuanto más bajo, más rápida es la animación

FLAT — Búsqueda exhaustiva

escanea cada punto
Comparaciones
200 / 200
Estado
✓ Listo
Recuperación
100%

IVF — Archivo invertido

búsquedas nprobe clústeres
Comparaciones
33 / 33
Estado
✓ Listo
Recuperación@5
100%

¿Qué está pasando?

  1. Fase de construcción (ya realizada): K-means ha dividido los puntos 200 en 8 clústeres. Cada clúster tiene un centroide (las marcas ×).
  2. Paso 1 — evaluar los centroides: « IVF » calcula primero la distancia entre la consulta y cada centroid. Eso supone solo 8 comparaciones, independientemente del tamaño del conjunto de datos.
  3. Paso 2: selecciona los clústeres « nprobe » más cercanos; estos se iluminan. El resto de clústeres se omiten por completo.
  4. Paso 3: escanear los puntos dentro de los clústeres seleccionados: solo ~50 de los puntos 200.

La disyuntiva: cuantos nprobe → más clústeres escaneados → mayor recuperación, pero más lento. Más pequeño nprobe → más rápido, pero es posible que se pierdan verdaderos vecinos que se encuentran en clústeres no escaneados. Prueba a colocar nprobe = 1 y arrastrar la consulta cerca del límite de un clúster para ver cómo disminuye la recuperación.

¿Qué es un índice « IVF »?

IVF (Inverted File) es un índice de vecino más cercano aproximado basado en agrupamientos. En el momento de la construcción, el método k-means divide todos los vectores en nlist clústeres, cada uno representado por su centroide. En el momento de la consulta, la búsqueda compara primero la consulta únicamente con los centroides, selecciona los nprobe y examina únicamente los vectores que contienen, omitiendo todo lo demás.

Milvus Incluye varias variantes de « IVF » que sacrifican memoria a cambio de precisión: IVF_FLAT almacena vectores sin procesar (la opción más precisa), IVF_SQ8 comprime cada dimensión a un byte (aprox. 4 veces menos memoria, pequeño coste de recuperación), y IVF_PQ aplica la cuantización de productos para lograr una compresión mucho mayor con un mayor coste de recuperación.

Ajuste nlist y nprobe

  • nlist (tiempo de construcción): el número de clústeres de k-means. Un punto de partida habitual es 4 × sqrt(N) para N vectores. Un mayor número de clústeres implica que cada uno es más pequeño — lo que permite escaneos más rápidos—, pero el barrido de centroides cuesta más y aumentan los efectos de borde.
  • nprobe (tiempo de consulta): cuántos clústeres se deben escanear por consulta. Este es el principal control de recuperación/latencia —exactamente lo que controla el control deslizante de arriba—. Empieza por nlist / 16 y auméntalo hasta que la recuperación alcance tu objetivo.
  • Opciones alternativas: empieza con « IVF_FLAT ». Pasa a « IVF_SQ8 » cuando la memoria sea escasa, y a « IVF_PQ » solo cuando el conjunto de datos sea demasiado grande para « SQ8 »; verifica la recuperación con tus propios datos tras cada paso hacia abajo.

IVF vs HNSW vs DiskANN

IVF Se compila rápidamente, tiene una pequeña sobrecarga de memoria además de los vectores y es fácil de entender; sin embargo, con el mismo objetivo de recuperación, « HNSW » suele responder a las consultas más rápido en memoria. Elige « IVF » cuando reconstruyas índices con frecuencia (la rapidez de compilación es importante), cuando la memoria sea limitada (IVF_SQ8/IVF_PQ) o cuando desees un comportamiento de exploración predecible y ajustable. Elige HNSW para obtener la menor latencia posible en las consultas en memoria, y DiskANN cuando los vectores ya no quepan en absoluto en RAM.

Preguntas frecuentes

¿Cuál es la diferencia entre IVF_FLAT, IVF_SQ8 y IVF_PQ?

Los tres agrupan vectores de la misma manera; se diferencian en cómo se almacenan los vectores dentro de los clústeres. « IVF_FLAT » conserva vectores flotantes sin procesar (mejor recuperación). « IVF_SQ8 » cuantifica cada dimensión a 8 bits, reduciendo la memoria aproximadamente 4 veces con una pequeña pérdida de recuperación. « IVF_PQ » sustituye los vectores por códigos cortos de cuantificación por producto para obtener la mayor compresión y la mayor pérdida de recuperación.

¿Cómo debo elegir entre « nlist » y « nprobe »?

Una regla empírica habitual es que « nlist » = 4 × √(N) para N vectores; a continuación, ajuste « nprobe » en el momento de la consulta. Un « nprobe » mayor escanea más clústeres: mayor recuperación, mayor latencia. Empiece por unos valores de « nlist » /16 y aumente hasta que la recuperación en un conjunto de consultas retenido alcance su objetivo.

¿Por qué « IVF » omite algunos vecinos más cercanos reales?

Debido a los límites de los clústeres. Si la consulta se sitúa cerca del borde de un clúster, algunos de sus verdaderos vecinos pueden encontrarse en un clúster adyacente que no se encontraba entre los clústeres nprobe analizados. Esto se puede observar en la visualización arrastrando el punto de consulta cerca de un límite con nprobe = 1.

¿Debo utilizar « IVF » o « HNSW »?

Con la misma precisión de recuperación, « HNSW » suele ser más rápido para la búsqueda en memoria, pero consume más memoria y se compila más lentamente. « IVF » se compila rápidamente y combina bien con la cuantificación (SQ8/PQ) cuando la memoria es escasa. Para conjuntos de datos que superen por completo RAM, considera utilizar DiskANN en su lugar.

Más información: lee la documentación de «IVF_FLAT » sobre los parámetros de índice, o consulta «Index Explained» para obtener la guía de decisión completa.

Sigue explorando