FAISS: la biblioteca detrás de la búsqueda vectorielle
FAISS (Facebook AI Similarity Search) es una biblioteca de código abierto bajo licencia MIT, desarrollada por el grupo de investigación en IA de Meta, que busca los vectores más cercanos a un vector dado. No es una base de datos: no hay servidor, no hay filtrado por metadatos, no hay persistencia integrada. Tenía más de 41.000 estrellas en GitHub a finales de septiembre de 2026 y sirve como motor interno de varias bases vectoriales.
FAISS es una biblioteca de búsqueda por similitud en vectores densos, desarrollada principalmente por el grupo de investigación en IA fundamental de Meta y utilizada dentro de una gran cantidad de herramientas que nunca la mencionan. No es una base de datos: ni servidor, ni filtrado por metadatos, ni control de acceso, ni persistencia. Para un flujo de procesamiento documental local con un único proceso, es la opción más ligera que funciona, y deja de ser la herramienta adecuada en cuanto se necesitan permisos de acceso o intervienen varios procesos de escritura.
#Una biblioteca, no una base de datos
A menudo se compara FAISS con las bases de datos vectoriales como si fueran alternativas. No pertenecen a la misma categoría. Una base de datos vectorial es un servicio con una API, almacenamiento, filtrado y permisos. FAISS es un componente: está escrito en C++ con interfaces completas para Python y NumPy; tú le proporcionas vectores, construye un índice en memoria y responde a la pregunta «¿cuáles son los más cercanos a ese?». Varias bases de datos vectoriales lo utilizan, o utilizan algo similar, internamente. El proyecto está publicado bajo licencia MIT, tenía más de 41 000 estrellas en GitHub a finales de septiembre de 2026 y sus autores indican que algunos de sus métodos pueden escalar a miles de millones de vectores en la memoria principal de un solo servidor.
La consecuencia práctica es que elegir FAISS significa aceptar que tendrás que encargarte de todo lo demás: guardar el índice en disco, recargarlo, mantenerlo coherente con tus documentos, establecer la relación entre la posición de un vector y el texto del que procede, y decidir qué ocurre cuando dos procesos quieren escribir al mismo tiempo. Nada de esto se proporciona por defecto; es una decisión de arquitectura deliberada, no un olvido del proyecto.
#Los índices que importan
Tus documentos, tu IA: un RAG local fiable sobre tus PDF, notas y correos — sin enviar nada a la nube.
- Espacio en línea de por vida
- PDF + archivos
- Reembolsado 30 j
| Index | Cómo busca | Cuándo usarlo |
|---|---|---|
| Exacto (Flat) | Compara con todos los vectores | Hasta unas decenas de miles: resultados exactos, sin ajustes, realmente lo bastante rápido |
| IVF (particiones invertidas) | Divide el espacio en clusters, solo explora algunas particiones | A partir de cientos de miles; requiere una fase de aprendizaje con datos representativos |
| HNSW (grafo de vecinos) | Navega por un grafo de enlaces | Mucha RAM disponible o corpus modesto: rápido y preciso, pero sin eliminación de vectores |
| PQ / OPQ (cuantización de producto) | Almacena vectores comprimidos en códigos de M bytes | Cuando el índice ya no cabe en memoria: la precisión disminuye, pero el consumo de memoria disminuye mucho más |
| RaBitQ (compresión máxima) | Comprime a 1 bit por dimensión más una pequeña sobrecarga | El último recurso para ahorrar memoria, con una etapa de rotación aleatoria para mantener una buena precisión |
El consejo que más tiempo ahorra: empezar por la búsqueda exacta. Los índices aproximados existen para resolver un problema de escala; adoptarlos antes de tener ese problema equivale a comprar parámetros que ajustar y una exhaustividad (recall) que medir, a cambio de milisegundos que nadie ha notado. A la escala de un corpus local, la recuperación casi nunca es la etapa lenta — es la generación por parte del modelo de lenguaje la que domina el tiempo de respuesta percibido por el usuario final.
#Lo mínimo para empezar en Python
- 01Instalar la bibliotecapip install faiss-cpu installe le paquet officiel PyPI (version 1.15.1 fin septembre 2026). Pour la variante GPU, le projet documente une installation via conda : conda install -c pytorch -c nvidia -c conda-forge faiss-gpu=1.15.1.
- 02Construir un índice exactoindex = faiss.IndexFlatL2(dimension) crea un índice de búsqueda exacta para vectores de la dimensión de tu modelo de embedding.
- 03Añadir vectoresindex.add(vecteurs), donde vecteurs es un array de NumPy de forma (n, dimension) con números de coma flotante de 32 bits.
- 04Consultardistances, indices = index.search(requete, k) devuelve los k vecinos más cercanos y sus distancias; te corresponde asociar indices con los fragmentos de texto originales.
- 05Guardar y recargarfaiss.write_index(index, chemin) y después faiss.read_index(chemin) permiten conservar el índice en disco entre dos ejecuciones, ya que FAISS no lo hace por sí mismo.
#Elegir un índice según el tamaño del corpus
El wiki oficial del proyecto proporciona referencias precisas, expresadas como cadenas para pasar a su función de creación de índices (index_factory). Con menos de un millón de vectores, IVF_K basta, con K elegido entre 4×√N y 16×√N según el número de vectores N, y un conjunto de entrenamiento de 30×K a 256×K vectores. Entre 1 y 10 millones, la combinación recomendada es IVF65536_HNSW32, que utiliza HNSW para acelerar la asignación a los clusters. Entre 10 y 100 millones, IVF262144_HNSW32; por encima, hasta mil millones, IVF1048576_HNSW32 — en este punto, el entrenamiento se vuelve claramente más lento y se realiza generalmente en GPU mientras el resto funciona en CPU.
| Tamaño del corpus | Configuración recomendada |
|---|---|
| Menos de 1 millón | IVF_K (K entre 4×√N y 16×√N) |
| 1 a 10 millones | IVF65536_HNSW32 |
| 10 a 100 millones | IVF262144_HNSW32 |
| 100 millones a 1 mil millones | IVF1048576_HNSW32 |
Para un corpus documental local —de unos pocos miles a unos pocos cientos de miles de fragmentos de texto—, estas referencias confirman sobre todo que estamos lejos del umbral en el que un índice aproximado se vuelve necesario: el índice exacto o, en el peor de los casos, un simple IVF_K cubren la práctica totalidad de los casos reales, y las configuraciones con varios cientos de miles de entradas de entrenamiento siguen estando fuera del alcance de un uso documental habitual.
#La memoria, cifras en mano
Un vector de 1.024 dimensiones con valores de coma flotante de 32 bits ocupa aproximadamente 4 KB. Un millón de vectores ocupa, por tanto, unos 4 GB, sin contar la propia estructura del índice. Para un índice HNSW en concreto, la wiki oficial da la fórmula (d×4 + M×2×4) bytes por vector, donde d es la dimensión y M el número de enlaces por vector (entre 4 y 64: más enlaces, más precisión, más memoria). Esta aritmética determina la mayoría de las arquitecturas: por eso existe la compresión y por eso una máquina que también aloja un modelo de lenguaje dispone de menos margen del que se suele suponer.
En cuanto a la compresión, la cuantización de producto (PQ) codifica cada vector en M octetos, normalmente con un máximo de 64; por encima de esa cifra, una cuantización escalar (SQ) suele ser igual de precisa y más rápida. Cuando la calidad de la compresión es realmente importante, la guía oficial recomienda añadir una transformación OPQ antes de la cuantización: primero reduce la dimensión del vector mediante una transformación lineal que facilita su compresión y luego aplica la cuantización de producto al resultado. Es un paso adicional que hay que calcular durante la indexación, pero reduce la pérdida de precisión frente a una cuantización de producto directa, con el mismo tamaño de código. RaBitQ, la opción de compresión máxima, reduce el tamaño a aproximadamente (d/8 + 8) octetos por vector al conservar solo un bit por dimensión, a costa de una etapa de rotación aleatoria necesaria para mantener una precisión adecuada; existen variantes con varios bits por dimensión para recuperar un poco de precisión a cambio de un poco más de almacenamiento.
#La función que falta y lo determina todo
Las preguntas reales incluyen condiciones: solo los documentos de este cliente, solo después de esta fecha, solo lo que esta persona tiene derecho a leer. FAISS no tiene ninguna noción de metadatos. La solución alternativa habitual —recuperar más resultados de los necesarios y luego filtrar en Python— falla de una forma concreta: si los cincuenta mejores pertenecen todos a otro departamento, el filtrado no deja ningún resultado, y tu asistente declara no haber encontrado ninguna información en lugar de decir que no ha encontrado ninguna que puedas ver.
El filtrado por permisos, en particular, no debe implementarse después de la recuperación. Este es el argumento práctico más sólido a favor de un sistema que filtre durante la búsqueda: una base de datos vectorial, o vectores en PostgreSQL, donde el filtrado se realiza mediante una cláusula WHERE.
- pgvector: filtrar durante la búsqueda, en SQL
- Qdrant: el servicio dedicado
- Milvus: la base vectorial para grandes volúmenes
- Cadena RAG completa
- El kit RAG local QuelLLM
- Fuente: repositorio oficial FAISS en GitHub
- Fuente: guía oficial de selección de índice
- Fuente: guía de inicio rápido de FAISS en Python
#Cuándo FAISS es la opción adecuada
- Una aplicación de proceso único
- Que carga un índice al arrancar y lo consulta: una herramienta de escritorio, un procesamiento por lotes, un cuaderno de notas.
- Un corpus fijo
- Se reconstruye según un calendario en lugar de actualizarse continuamente.
- Sin filtrado por usuario
- O un filtrado tan poco granular que un índice por categoría sigue siendo razonable.
- Una latencia crítica
- Cuando el costo de una comunicación de ida y vuelta por la red con una base de datos es precisamente lo que buscas eliminar, por ejemplo en una herramienta integrada en un sistema sin conexión garantizada.
Fuera de estos casos, el servicio que evitas instalar suele costar menos a largo plazo que el código de persistencia, filtrado y concurrencia que terminas reescribiendo tú mismo a medida que el proyecto crece.
Un último punto de referencia útil antes de decidir: varias bases de datos vectoriales que encontrarás por otros medios no sustituyen a FAISS por arte de magia, sino que lo encapsulan o se inspiran en las mismas familias de índices (IVF, HNSW, cuantización de producto), con una API de red, un sistema de persistencia gestionado y un motor de filtrado como interfaz. Entender FAISS equivale, por tanto, a comprender buena parte del funcionamiento interno de las propias bases de datos vectoriales: un rodeo útil incluso si el proyecto final utiliza Qdrant o Milvus en lugar de FAISS directamente, porque los mismos compromisos entre memoria y precisión aparecen bajo otros nombres de parámetros.
#FAQ
¿Es FAISS una base de datos vectorial?+
¿Es FAISS gratuito y de código abierto?+
¿Cuántos vectores puede manejar?+
¿Se pueden filtrar los resultados por metadatos?+
¿FAISS o una base vectorial?+
¿Con qué índice empezar?+
¿Puede HNSW reemplazar IVF en todos los casos?+
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.