turbovec: Comprime embeddings RAG 16x con TurboQuant en Rust
TurboVec lleva TurboQuant de Google a Rust y reduce los índices de incrustación RAG 16 veces sin necesidad de entrenamiento. En qué supera a FAISS y cuándo otro herramienta es más adecuada.
Fuentes: turbovec for RAG: A Practical Guide to Faster, Smaller Vector Search
Considere un pipeline de recuperación del tipo que realmente se utiliza en la práctica: diez millones de documentos, cada uno con un embedding de text-embedding-3-small de OpenAI con 1536 dimensiones y almacenado en formato float32. Antes incluso de agregar un solo byte de metadatos, los vectores por sí solos ocupan 31 GB. Con ese tamaño, la pregunta “¿dónde se ejecuta esto?” deja de ser algo casual; implica necesitar una máquina en la nube con mucha memoria, probablemente alojada por terceros, además de todos los problemas de privacidad y operativos que eso conlleva.
Si se procesan los mismos datos con turbovec utilizando 2 bits por dimensión, el tamaño se reduce a unos 4 GB, lo cual cabe sin problemas en la RAM de una laptop, dejando espacio de sobra. El resto de este texto explica por qué funciona así, cuándo es la opción adecuada y en qué casos otro herramienta es mejor.
Qué es turbovec
turbovec es un índice vectorial en Rust con bindings para Python, licenciado bajo MIT, y contaba con aproximadamente 950 estrellas en GitHub en el momento en que se escribió este texto. Implementa TurboQuant, un algoritmo de cuantización vectorial desarrollado por investigadores de Google Research y NYU que fue aceptado en ICLR 2026.
Un detalle importante es que Google nunca publicó el código de referencia de su propio algoritmo, por lo que la comunidad intervino. El proyecto RyanCodrai/turbovec se enfoca en la búsqueda vectorial, que es el caso de uso relacionado con la recuperación de información, mientras que otro proyecto independiente, hackimov/turboquant-kv, aplica la misma idea para comprimir la caché KV de los modelos de lenguaje. Ambos son esfuerzos independientes de código abierto.
En otras palabras, usar turbovec significa emplear una implementación comunitaria de un algoritmo de Google Research, y en las pruebas de rendimiento que utiliza el propio equipo de FAISS, supera al FAISS de Meta, que durante mucho tiempo ha sido el estándar en búsquedas vectoriales en memoria.
Cómo funciona el algoritmo
Una vez que lo ves, el método resulta sorprendentemente sencillo. Se ejecuta en cuatro pasos.
1. Separar la longitud de la dirección
Cada embedding tiene una magnitud (su norma L2) y una dirección. Se extrae la magnitud y se mantiene como un valor flotante por vector, y lo que queda es una dirección de longitud unitaria en una esfera de alta dimensión. Esto parece algo menor, pero todo lo que sigue depende de ello, ya que los vectores que se encuentran en la superficie de una esfera pueden manejarse mediante geometría.
2. Rotar aleatoriamente
A continuación, cada vector se multiplica por la misma matriz ortogonal aleatoria, generada una sola vez a partir de la descomposición QR de una matriz gaussiana. Este es el paso que parece un truco de magia al leerlo por primera vez.
La intuición: en altas dimensiones, una rotación aleatoria hace que la distribución de cada coordenada sea predecible. Después de rotar, cada coordenada de cada vector sigue una distribución Beta conocida y muy concentrada, la cual se acerca a una gaussiana a medida que aumenta la dimensionalidad. La distribución es la misma independientemente de la entrada. Los documentos legales, las reseñas de productos y la literatura médica terminan pareciéndose estadísticamente, por lo que el esquema no depende de los datos. Los matemáticos denominan esto concentración de medida en la esfera, y explica por qué no se necesita ningún paso de entrenamiento: la rotación realiza el trabajo que de otro modo haría un códigobook entrenado.
3. Elegir los mejores grupos
Saber cuál es la distribución que sigue cada coordenada permite determinar de antemano la mejor forma de agrupar los valores. La cuantización de dos bits proporciona cuatro grupos por coordenada, mientras que la de cuatro bits ofrece dieciséis. Este cálculo se denomina cuantización escalar Lloyd-Max y responde a una pregunta sencilla: dado una distribución conocida, ¿dónde deben situarse las líneas de división para mantener el error de redondeo promedio lo más bajo posible? Con la distribución conocida, la respuesta se obtiene de forma explícita. Y como la distribución posterior a la rotación es idéntica para todos los vectores, los grupos provienen de los cálculos matemáticos y no de los datos.
4. Empaquetar los bits
Cada coordenada ahora es un pequeño número entero: de 0 a 3 en el caso de 2 bits, o de 0 a 15 en el de 4 bits. Al empaquetarlos de forma compacta, un vector de 1536 dimensiones que ocupaba 6,144 bytes en formato float32 necesita 384 bytes con 2 bits o 768 bytes con 4 bits. Esto representa una compresión de 16 veces y 8 veces, respectivamente.
Búsqueda sin descomprimir
Las consultas nunca descomprimen los datos almacenados. La consulta se inserta una vez en el mismo espacio y luego se compara directamente con los códigos cuantizados mediante tablas de búsqueda preparadas de antemano. El bucle interno utiliza instrucciones SIMD, con NEON para ARM, AVX-512BW para los x86 más recientes y AVX2 como solución alternativa.
Es aquí donde la biblioteca, a diferencia del algoritmo, demuestra su valor. Sus núcleos SIMD escritos a mano superan a FastScan de FAISS en un 12 al 20 por ciento en ARM y igualan o superan sus resultados en x86.
También existe un resultado teórico detrás de este método. El artículo de TurboQuant demuestra que su distorsión se mantiene dentro de un factor de aproximadamente 2,7 con respecto al límite inferior de la teoría de la información, el límite de tasa de distorsión de Shannon. En términos sencillos: la teoría de la información establece hasta qué punto se pueden comprimir los datos antes de que se pierda información, y TurboQuant logra acercarse a ese límite en un factor de 2,7 sin necesidad de entrenamiento alguno. Nadie puede obtener resultados significativamente mejores con un presupuesto de bits dado, y el artículo lo respalda con una prueba formal.
Tres casos en los que resulta útil
Memoria suficiente
Volviendo a las cifras iniciales: 31 GB de tipo float32 frente a 4 GB mediante turbovec a 2 bits. Tener un índice tan pequeño cambia las posibilidades.
- Puede residir junto a la aplicación en un mismo servidor, sin necesidad de una instancia separada de base de datos vectorial.
- Los desarrolladores pueden ejecutarlo en laptops para pruebas locales.
- Los niveles de memoria más económicos en las instancias en la nube se vuelven viables, lo que reduce significativamente los costos.
- Todo el índice permanece en RAM, sin escritura en disco ni particionamiento entre nodos.
Para colecciones con un rango de vectores de 100K a 100M, que abarca la mayoría de las bases de conocimiento, sitios de documentación, archivos de soporte y catálogos de productos, esta es la diferencia entre tener que diseñar soluciones teniendo en cuenta el índice de vectores y tratarlo como cualquier otro objeto de Python.
Privacidad y configuraciones aisladas
Los pipelines de recuperación plantean un problema de privacidad bastante serio. Dos ataques ilustran esto:
- BadRAG logra una tasa de éxito del 98.2% al envenenar solo el 0.04% de un corpus con documentos adversarios cuidadosamente elaborados.
- Vec2Text recupera textos originales cortos a partir de sus embeddings, coincidiendo con ellos con exactitud en el 92% de los casos.
Los embeddings no cuentan con protección criptográfica, por lo que cualquier persona con acceso de lectura a un almacén de vectores puede recuperar lo que fue incrustado. Cada llamada a una base de datos de vectores en la nube, cada solicitud embed() a OpenAI y cada operación upsert() en Pinecone representan un punto en el que los datos salen de su entorno.
Muchas implementaciones reales ya están completamente aisladas. En la UC San Diego, Onyx gestiona a 37,000 usuarios sin necesidad de Internet, y Ramp, Thales, L3Harris y Astranis operan configuraciones similares. El propio eslogan de turbovec, “sin servicio gestionado y sin datos que salgan de su máquina o VPC”, encaja perfectamente en este grupo. Combínelo con un modelo de embeddings alojado localmente, como BGE-M3 o BGE-large-en-v1.5, y la recuperación de información no requerirá ninguna llamada a la red externa.
Sin libro de códigos para entrenar
Esta ventaja es estructural y fácil de subestimar. La cuantización clásica de productos, la PQ en IndexPQ y IndexIVFPQ, necesita un libro de códigos entrenado con datos representativos. Cuando los datos cambian, como con nuevas categorías de productos, nuevos idiomas o nuevos tipos de documentos, ese libro de códigos se vuelve obsoleto y disminuye la capacidad de recuperación.
TurboQuant no cuenta con libro de códigos alguno. La rotación aleatoria permite que las fórmulas matemáticas funcionen independientemente de la apariencia de la entrada. En la práctica, esto significa:
- Las inserciones en tiempo real se realizan sin problemas, sin necesidad de reentrenamiento por lotes.
- El cambio de modelos de embedding, de OpenAI a BGE o a Voyage, no obliga a reconstruir el índice desde cero.
- Los índices multiinquilinos no requieren calibración por inquilino.
- El problema del arranque en frío, en el que existen pocos vectores para entrenar un libro de códigos adecuado, desaparece.
Para sistemas que crecen gradualmente o abarcan tipos de documentos mixtos, esa simplicidad representa una verdadera ventaja operativa.
Cuándo usar otra opción
Algunos patrones de recuperación se manejan mejor en otros entornos, y es mejor ser claros al respecto.
- Recuperación con alto nivel de recall. HNSW con vectores de precisión total sigue siendo el estándar de oro. turbovec sacrifica algunos puntos de recall a cambio de una compresión 16 veces mayor. Esto es aceptable para la mayoría de las tareas de RAG, pero resulta problemático cuando perder un resultado tiene consecuencias graves.
- Filtrado de metadatos y búsqueda híbrida. turbovec es solo un índice, sin una base de datos asociada. Consultas como “encontrar vectores cercanos a X, limitados a documentos etiquetados como compliance y editados después de diciembre de 2025” requieren una verdadera base de datos vectorial como Qdrant, Weaviate, Milvus o pgvector.
- Embebimientos de baja dimensión (256 dimensiones o menos). Según admite su propio README, turbovec está 3 a 6 puntos por debajo de FAISS en términos de precisión con GloVe a d=200, ya que la aproximación de Beta a gaussiana es menos estricta cuando hay pocas dimensiones y la ventaja teórica disminuye. Si la solución utiliza modelos de embebimiento antiguos o de menor capacidad, FAISS es la opción más segura.
- Escala de mil millones de vectores. turbovec escanea exhaustivamente cada vector comprimido. Esto funciona bien hasta aproximadamente 100 millones de vectores. Más allá de ese número, se necesita un método como IVF o particionamiento basado en grafos, algo que turbovec no incluye.
- Preferencia por servicios alojados. Un equipo que busque una base de datos de vectores gestionada con clave API encontrará que turbovec no es la herramienta adecuada, por buen que sea su desarrollo técnico.
Primeros pasos
Para la recuperación en memoria de entre 100K y 100M de vectores con dimensiones de 384 o más, y cuando hay un equipo listo para gestionar su propia infraestructura, este es el camino práctico. Instálelo desde PyPI:
pip install turbovec
Los proyectos en Rust añaden la crate en su lugar:
cargo add turbovec
El uso básico requiere unas pocas líneas para crear e interrogar un índice:
from turbovec import TurboQuantIndex
# Build the index
index = TurboQuantIndex(dim=1536, bit_width=4)
index.add(document_embeddings)
# Search
scores, indices = index.search(query_embedding, k=10)
# Persist
index.write("kb.tq")
loaded = TurboQuantIndex.load("kb.tq")
Esa es toda la superficie para el caso simple.
Elegir la anchura del bit
Este es el parámetro más importante, y el equilibrio entre ventajas y desventajas es claro.
- 2 bits: compresión 16 veces mayor que la de float32, mayor diferencia en la precisión de recuperación y mayor sensibilidad a la dimensión.
- 4 bits: compresión 8 veces mayor, con una precisión de recuperación prácticamente igual a la de FAISS en embeddings de 1536 y 3072 dimensiones de OpenAI. Ambos alcanzan un valor de 1.0 con k entre 4 y 8.
El valor predeterminado sensato es 4 bits. Pásese a 2 bits solo después de medir la verdadera presión en la memoria y el efecto en la precisión de recuperación para sus consultas específicas.
Elegir el tipo de índice
Hay dos. TurboQuantIndex accede a los vectores por su posición, lo que lo hace sencillo y un poco más rápido cuando los IDs siguen simplemente el orden de inserción. IdMapIndex permite asignar sus propios IDs de tipo uint64 y elimina las entradas en tiempo constante, por lo que es la opción adecuada cuando las claves provienen de una base de datos o se eliminan documentos.
Para la mayoría de los sistemas RAG, IdMapIndex es el valor por defecto mejor, ya que los IDs de la aplicación y de la base de datos sobreviven a las eliminaciones y reconstrucciones sin interrumpir las referencias externas.
from turbovec import IdMapIndex
import numpy as np
index = IdMapIndex(dim=1536, bit_width=4)
index.add_with_ids(vectors, np.array([1001, 1002, 1003], dtype=np.uint64))
scores, ids = index.search(query, k=10) # returns your IDs
index.remove(1002) # O(1) by ID
Modelos de incrustación
Para la recuperación en entornos aislados, el modelo de incrustación debe ejecutarse localmente, ya que llamar a la API de OpenAI anula las ventajas en privacidad. Hay dos combinaciones bien probadas:
- BGE-M3 con turbovec. Un modelo multilingüe potente que funciona localmente y es una buena opción por defecto para bases de conocimiento internacionales.
- BGE-large-en-v1.5 con turbovec. Solo en inglés, más pequeño y rápido, y una buena opción por defecto para documentación en inglés.
Donde la privacidad no es un requisito estricto, text-embedding-3-small (1536 dimensiones) o text-embedding-3-large (3072) de OpenAI funcionan bien con turbovec. Recuerde que son las llamadas a incrustación en la nube, y no el índice, donde ocurren las fugas de datos.
Integraciones con frameworks
turbovec ofrece integraciones de primera clase para LangChain, LlamaIndex y Haystack:
pip install turbovec[langchain]
pip install turbovec[llama-index]
pip install turbovec[haystack]
Una pila ya construida sobre uno de estos sistemas debería seguir ese enfoque, ya que implica la menor fricción.
Límites a tener en cuenta
- Máquina única, en memoria. No existe un modo distribuido, por lo que la escalabilidad horizontal significa la fragmentación en la capa de la aplicación.
- Escaneo exhaustivo. Cada vector comprimido se escanea en cada consulta. SIMD mantiene esta velocidad hasta aproximadamente 100 millones de vectores; más allá de eso se necesita un método como IVF o una capa gráfica.
- Dependencia del hardware. La mejora del 12 al 20 por ciento con ARM se midió en chips de la serie M de Apple. Los modelos ARM más antiguos o x86 sin AVX-512 presentan mejoras menores, aunque siguen superando a FAISS en la mayoría de las configuraciones.
- Recall en bajas dimensiones. Por debajo de unas 256 dimensiones, FAISS gana con una ventaja notable. El método funciona mejor con las 768 dimensiones o más que emiten los modelos de embedding actuales.
El patrón general
turbovec ocupa un nicho específico: búsqueda vectorial en memoria, corpus de tamaño medio, infraestructura propia y las dimensiones que generan los modelos de embedding modernos. No intenta reemplazar a Qdrant o Pinecone. Es un componente de nivel inferior para el lugar donde normalmente se utilizaría FAISS, con una mejor compresión y sin necesidad de proceso de entrenamiento.
La historia detrás de su desarrollo es, sin duda, la parte más interesante. Un artículo de investigación de Google escrito por cuatro autores fue aceptado en ICLR 2026; los autores no publicaron código alguno, y dos desarrolladores de la comunidad crearon implementaciones de forma independiente, una para la compresión de KV-cache y otra para la búsqueda vectorial. La versión de búsqueda vectorial supera al competidor actual en los propios benchmarks de este último.
El camino desde un algoritmo académico hasta su implementación en la comunidad y, finalmente, hasta una biblioteca de nivel industrial que supera a las herramientas estándar, se repetirá, ya que los resultados de la investigación se están desarrollando más rápido de lo que los proveedores pueden transformarlos en productos. turbovec es un ejemplo concreto. Comprender cómo funciona y dónde encaja es útil para cualquiera que diseñe sistemas de recuperación de información en la actualidad.