RAG es una técnica que mejora cuantos más documentos haya disponibles en un indice. Un corpus amplio cubre consultas que una colección pequeña no contiene, pero también obliga a buscar entre muchos más vectores en cada query.

Con pocos vectores, una búsqueda exacta compara la query con todos los embeddings y ordena los resultados. El coste de esa fuerza bruta crece con el corpus y deja de ser sostenible con millones o miles de millones de vectores si el sistema necesita responder con poca latencia. Los índices de búsqueda aproximada de vecinos cercanos, o ANN, reducen el espacio que se explora antes de recuperar los candidatos. A cambio, puede ser que no devuelvan el vecino exacto, sino una aproximación.

Dos familias de índices aparecen a menudo en este escenario. HNSW construye un grafo navegable de vectores y suele conseguir buen recall con baja latencia. Su grafo y los vectores necesarios para recorrerlo crecen con el corpus y deben mantenerse en RAM en muchas configuraciones. IVF divide el espacio en regiones y primero elige cuáles merece la pena explorar. Puede dejar las listas de vectores fuera de memoria y mantener en RAM la capa que dirige la búsqueda.

En nuestro trabajo, Memory Optimization of IVF Indices for RAG Systems Using FP8 Centroid Quantization, nos centramos en la capa de routing de IVF por esa separación. Con IVF, los centroides pueden mantenerse en memoria mientras que los vectores de documentos pueden almacenarse en SSDs.

Estudiamos si los centroides pueden pasar de float32 a FP8 sin tocar los vectores de documentos ni sus listas de posting y cómo afecta eso a la calidad del routing.

Por qué los centroides están en el camino crítico

Un índice IVF divide los embeddings en nlist regiones. Cada región tiene un centroide. Para resolver una query, el índice compara su embedding con todos los centroides y selecciona las nprobe regiones más cercanas. Después busca solo dentro de esas listas de posting.

El índice empieza sin clusters asignados.

Ejemplo animado de búsqueda IVFEjemplo animado de búsqueda IVF

Esta separación permite que el corpus grande esté en almacenamiento más barato, pero la tabla de centroides se consulta en cada query y necesita permanecer en memoria. Su coste es:

M=nlist×d×bM = nlist \times d \times b

donde MM es la memoria de routing, dd es la dimensionalidad del embedding y bb son los bytes por coordenada. En float32, bb es 4. En FP8 es 1.

El objetivo no es comprimir todo el índice, sino solo las representaciones usadas para decidir qué listas explorar. Una vez seleccionadas, los vectores de documentos y el ranking siguen usando la representación original del índice, ya que se cargan desde un almacenamiento más barato.

Precisión o rango

Probamos los formatos FP8: E4M3FN y E5M2. Ambos usan 8 bits, pero los reparten de forma diferente entre exponente y mantisa. E5M2 tiene más rango dinámico, mientras que E4M3FN dedica un bit adicional a la mantisa y representa los valores pequeños con más precisión.

Cuantización FP32 y FP8 en dos dimensionesUn scatter plot bidimensional de valores muestreados de una distribución normal centrada en cero.

Para la tabla de centroides, esa precisión local resultó más útil que un rango más amplio, ya que la asignación de clusters depende de comparaciones finas entre distancias similares. Un pequeño desplazamiento en un centroide puede cambiar qué lista se explora, aunque los vectores almacenados no hayan cambiado.

Evaluación

Para cada dataset, motor de búsqueda y formato FP8, entrenamos un índice IVF independiente. Extrajimos sus centroides en float32, los convertimos a E4M3FN o E5M2 y los restauramos a float32 antes de volver a insertarlos en el índice. El motor de búsqueda sigue así la misma ruta en float32 en todas las ejecuciones. Solo cambia el error de redondeo que deja la conversión a FP8 en la tabla de routing.

Ejecutamos el protocolo en FAISS y ScaNN, con el mismo corpus y la misma configuración de índice para cada baseline en FP32 y su versión FP8.

Para retrieval geométrico usamos glove-100-angular, que pide al índice recuperar los vectores más cercanos con distancia angular. Reportamos Recall@10 y comparamos los resultados para ver si los centroides FP8 cambian las zonas del espacio vectorial que explora IVF.

Para retrieval semántico codificamos tres datasets del benchamrk MTEB Retrieval con el modelo de 384 dimensiones all-MiniLM-L6-v2: FiQA2018, MLQuestions y QuoraRetrieval. Cubren preguntas financieras, retrieval de preguntas multilingües y preguntas duplicadas, con tamaños de corpus distintos. Reportamos nDCG@10, que recompensa documentos relevantes cerca del inicio del ranking, y MRR@10, que mide la posición del primer resultado relevante. En conjunto, los dos benchmarks evalúan la recuperación geométrica de vecinos y la calidad de retrieval sobre embeddings semánticos.

Resultados

E4M3FN tiene una mejor distribución de recall

Medimos la degradación absoluta de Recall@10 en todo el barrido de configuraciones de glove-100-angular. E4M3FN se mantiene más cerca del baseline FP32 en los dos motores, mientras que E5M2 produce una distribución más amplia y valores atípicos más altos. El bit extra de mantisa importa más que el rango adicional del exponente de E5M2 cuando IVF decide qué listas explorar.

E4M3FN conserva el recall de forma más consistenteDegradación absoluta de Recall@10 (%)FAISS0.000.380.751.11.5FP8 E4M3FN · valor atípico: 0.410%FP8 E4M3FN · valor atípico: 0.330%FP8 E4M3FN · valor atípico: 0.469%FP8 E4M3FN · valor atípico: 0.385%FP8 E4M3FNFP8 E5M2 · valor atípico: 1.047%FP8 E5M2 · valor atípico: 1.261%FP8 E5M2 · valor atípico: 1.164%FP8 E5M2 · valor atípico: 1.386%FP8 E5M2ScaNNFP8 E4M3FN · valor atípico: 0.254%FP8 E4M3FN · valor atípico: 0.353%FP8 E4M3FNFP8 E5M2 · valor atípico: 1.322%FP8 E5M2

Retrieval geométrico

En todo el barrido de configuraciones, la degradación media de Recall@10 con E4M3FN fue de 0,085% en FAISS y de 0,095% en ScaNN. E5M2 promedió 0,304% y 0,405%, respectivamente. Las fronteras de QPS y recall permanecen casi superpuestas a sus equivalentes en FP32. Incluimos QPS para mostrar las configuraciones evaluadas, no para afirmar que FP8 haga los motores más rápidos. Los centroides se restauran a FP32 antes de buscar, por lo que el experimento conserva la ruta de búsqueda y unicamente mide el error de routing que deja la conversión.

FP32FP8 E4M3FNFP8 E5M2
El retrieval geométrico conserva el mismo equilibrio entre QPS y recallQueries por segundo (log scale)FAISS1001k10k100k0.310.540.771.00FP32 Recall@10: 0.3283 QPS: 253670.4FP32 Recall@10: 0.3639 QPS: 182303.0FP32 Recall@10: 0.5539 QPS: 109727.3FP32 Recall@10: 0.5952 QPS: 75959.4FP32 Recall@10: 0.6494 QPS: 65779.9FP32 Recall@10: 0.6903 QPS: 41314.9FP32 Recall@10: 0.7291 QPS: 22626.7FP32 Recall@10: 0.8238 QPS: 16002.4FP32 Recall@10: 0.8556 QPS: 9137.5FP32 Recall@10: 0.8799 QPS: 8424.8FP32 Recall@10: 0.8879 QPS: 4870.3FP32 Recall@10: 0.9068 QPS: 4707.6FP32 Recall@10: 0.9235 QPS: 4369.8FP32 Recall@10: 0.9329 QPS: 2494.2FP32 Recall@10: 0.9458 QPS: 2409.5FP32 Recall@10: 0.9564 QPS: 1271.0FP32 Recall@10: 0.9660 QPS: 1265.6FP32 Recall@10: 0.9755 QPS: 657.4FP32 Recall@10: 0.9826 QPS: 639.7FP32 Recall@10: 0.9940 QPS: 327.7FP32 Recall@10: 0.9995 QPS: 162.7FP32 Recall@10: 1.0000 QPS: 130.1FP8 E4M3FN Recall@10: 0.3268 QPS: 249076.7FP8 E4M3FN Recall@10: 0.3627 QPS: 181839.3FP8 E4M3FN Recall@10: 0.5526 QPS: 109837.0FP8 E4M3FN Recall@10: 0.5938 QPS: 75983.8FP8 E4M3FN Recall@10: 0.6478 QPS: 65415.2FP8 E4M3FN Recall@10: 0.6891 QPS: 41362.7FP8 E4M3FN Recall@10: 0.7288 QPS: 22621.3FP8 E4M3FN Recall@10: 0.8231 QPS: 16149.2FP8 E4M3FN Recall@10: 0.8553 QPS: 9137.2FP8 E4M3FN Recall@10: 0.8794 QPS: 8438.3FP8 E4M3FN Recall@10: 0.8873 QPS: 4870.3FP8 E4M3FN Recall@10: 0.9062 QPS: 4691.3FP8 E4M3FN Recall@10: 0.9230 QPS: 4376.7FP8 E4M3FN Recall@10: 0.9327 QPS: 2494.2FP8 E4M3FN Recall@10: 0.9455 QPS: 2415.9FP8 E4M3FN Recall@10: 0.9563 QPS: 1270.3FP8 E4M3FN Recall@10: 0.9656 QPS: 1263.8FP8 E4M3FN Recall@10: 0.9755 QPS: 658.4FP8 E4M3FN Recall@10: 0.9825 QPS: 639.7FP8 E4M3FN Recall@10: 0.9940 QPS: 328.2FP8 E4M3FN Recall@10: 0.9995 QPS: 162.7FP8 E4M3FN Recall@10: 1.0000 QPS: 130.1FP8 E5M2 Recall@10: 0.3245 QPS: 244140.2FP8 E5M2 Recall@10: 0.3593 QPS: 182603.6FP8 E5M2 Recall@10: 0.5498 QPS: 110568.1FP8 E5M2 Recall@10: 0.5902 QPS: 76758.2FP8 E5M2 Recall@10: 0.6451 QPS: 65688.4FP8 E5M2 Recall@10: 0.6874 QPS: 41571.0FP8 E5M2 Recall@10: 0.7276 QPS: 22741.6FP8 E5M2 Recall@10: 0.8213 QPS: 16076.3FP8 E5M2 Recall@10: 0.8541 QPS: 9225.5FP8 E5M2 Recall@10: 0.8784 QPS: 8463.4FP8 E5M2 Recall@10: 0.8863 QPS: 4895.1FP8 E5M2 Recall@10: 0.9056 QPS: 4727.1FP8 E5M2 Recall@10: 0.9224 QPS: 4377.5FP8 E5M2 Recall@10: 0.9320 QPS: 2505.6FP8 E5M2 Recall@10: 0.9449 QPS: 2420.7FP8 E5M2 Recall@10: 0.9560 QPS: 1273.0FP8 E5M2 Recall@10: 0.9655 QPS: 1269.4FP8 E5M2 Recall@10: 0.9751 QPS: 659.4FP8 E5M2 Recall@10: 0.9821 QPS: 640.8FP8 E5M2 Recall@10: 0.9939 QPS: 328.7FP8 E5M2 Recall@10: 0.9996 QPS: 162.7FP8 E5M2 Recall@10: 1.0000 QPS: 130.2Recall@10ScaNN0.350.570.781.00FP32 Recall@10: 0.3652 QPS: 64312.3FP32 Recall@10: 0.4876 QPS: 59201.6FP32 Recall@10: 0.5945 QPS: 52323.3FP32 Recall@10: 0.6779 QPS: 42325.5FP32 Recall@10: 0.8512 QPS: 20403.3FP32 Recall@10: 0.8617 QPS: 19324.4FP32 Recall@10: 0.8668 QPS: 17987.8FP32 Recall@10: 0.8748 QPS: 16483.8FP32 Recall@10: 0.8817 QPS: 15997.4FP32 Recall@10: 0.8923 QPS: 14354.7FP32 Recall@10: 0.9005 QPS: 13227.8FP32 Recall@10: 0.9048 QPS: 12581.5FP32 Recall@10: 0.9134 QPS: 11796.6FP32 Recall@10: 0.9230 QPS: 10062.6FP32 Recall@10: 0.9348 QPS: 8657.0FP32 Recall@10: 0.9458 QPS: 7503.4FP32 Recall@10: 0.9547 QPS: 6664.4FP32 Recall@10: 0.9591 QPS: 5838.1FP32 Recall@10: 0.9676 QPS: 5091.2FP32 Recall@10: 0.9714 QPS: 4429.2FP32 Recall@10: 0.9756 QPS: 3893.6FP32 Recall@10: 0.9805 QPS: 3583.4FP32 Recall@10: 0.9863 QPS: 2851.7FP32 Recall@10: 0.9920 QPS: 2201.5FP32 Recall@10: 0.9976 QPS: 1362.3FP8 E4M3FN Recall@10: 0.3648 QPS: 66226.6FP8 E4M3FN Recall@10: 0.4869 QPS: 60636.0FP8 E4M3FN Recall@10: 0.5930 QPS: 52991.4FP8 E4M3FN Recall@10: 0.6755 QPS: 43778.2FP8 E4M3FN Recall@10: 0.8505 QPS: 20788.0FP8 E4M3FN Recall@10: 0.8604 QPS: 19310.5FP8 E4M3FN Recall@10: 0.8661 QPS: 18545.7FP8 E4M3FN Recall@10: 0.8739 QPS: 16785.0FP8 E4M3FN Recall@10: 0.8809 QPS: 16111.2FP8 E4M3FN Recall@10: 0.8912 QPS: 14476.6FP8 E4M3FN Recall@10: 0.8990 QPS: 13444.0FP8 E4M3FN Recall@10: 0.9035 QPS: 12784.1FP8 E4M3FN Recall@10: 0.9129 QPS: 11900.4FP8 E4M3FN Recall@10: 0.9222 QPS: 10250.1FP8 E4M3FN Recall@10: 0.9337 QPS: 8964.8FP8 E4M3FN Recall@10: 0.9451 QPS: 7774.2FP8 E4M3FN Recall@10: 0.9543 QPS: 6712.6FP8 E4M3FN Recall@10: 0.9587 QPS: 6119.2FP8 E4M3FN Recall@10: 0.9672 QPS: 5172.3FP8 E4M3FN Recall@10: 0.9714 QPS: 4453.5FP8 E4M3FN Recall@10: 0.9753 QPS: 3948.7FP8 E4M3FN Recall@10: 0.9802 QPS: 3530.0FP8 E4M3FN Recall@10: 0.9860 QPS: 2915.4FP8 E4M3FN Recall@10: 0.9919 QPS: 2251.1FP8 E4M3FN Recall@10: 0.9975 QPS: 1402.1FP8 E5M2 Recall@10: 0.3615 QPS: 66387.3FP8 E5M2 Recall@10: 0.4828 QPS: 59903.9FP8 E5M2 Recall@10: 0.5867 QPS: 52996.3FP8 E5M2 Recall@10: 0.6710 QPS: 43072.0FP8 E5M2 Recall@10: 0.8476 QPS: 20716.9FP8 E5M2 Recall@10: 0.8578 QPS: 19357.4FP8 E5M2 Recall@10: 0.8619 QPS: 18477.6FP8 E5M2 Recall@10: 0.8702 QPS: 16781.2FP8 E5M2 Recall@10: 0.8770 QPS: 16104.5FP8 E5M2 Recall@10: 0.8881 QPS: 14535.7FP8 E5M2 Recall@10: 0.8970 QPS: 13515.3FP8 E5M2 Recall@10: 0.9016 QPS: 12717.6FP8 E5M2 Recall@10: 0.9096 QPS: 11717.7FP8 E5M2 Recall@10: 0.9192 QPS: 10118.3FP8 E5M2 Recall@10: 0.9321 QPS: 8950.2FP8 E5M2 Recall@10: 0.9436 QPS: 7768.2FP8 E5M2 Recall@10: 0.9529 QPS: 6535.6FP8 E5M2 Recall@10: 0.9576 QPS: 6117.0FP8 E5M2 Recall@10: 0.9667 QPS: 5179.9FP8 E5M2 Recall@10: 0.9711 QPS: 4365.4FP8 E5M2 Recall@10: 0.9752 QPS: 3949.5FP8 E5M2 Recall@10: 0.9796 QPS: 3584.9FP8 E5M2 Recall@10: 0.9854 QPS: 2875.9FP8 E5M2 Recall@10: 0.9916 QPS: 2231.3FP8 E5M2 Recall@10: 0.9976 QPS: 1389.0Recall@10

Retrieval semántico

En todos los valores de métrica del benchmark semántico, E4M3FN tuvo una diferencia absoluta media de 0,262 puntos porcentuales frente a FP32. E5M2 alcanzó 0,295 puntos porcentuales. Las diferencias son lo bastante pequeñas como para que el routing conserve el ranking. Pueden aparecer pequeñas mejoras puntuales cuando el routing aproximado intercambia candidatos casi empatados, no porque la cuantización mejore el retrieval. Las gráficas de abajo desglosan Recall@10, nDCG@10 y MRR@10 por motor y tarea.

FP32FP8 E4M3FNFP8 E5M2

Cuándo tiene sentido

FP8 para centroides es una optimización muy localizada. No reduce automáticamente el tamaño completo del índice, porque las listas de posting, los vectores, los metadatos y la estructura auxiliar pueden ocupar bastante más memoria. Su caso de uso aparece cuando la tabla de routing es suficientemente grande como para presionar la RAM, especialmente en arquitecturas híbridas donde el corpus vive fuera de memoria.

En estos experimentos, E4M3FN fue la opción FP8 más consistente. Conviene probarla con el modelo, la métrica y la distribución de embeddings que se usen en concreto. IVF busca una lista de posting o la descarta, así que el efecto de cuantizar los centroides depende del margen entre los centroides candidatos.

El paper completo, con el protocolo experimental y las tablas de resultados, está disponible en Springer.