Intermedio 11 minStack

FAISS: la biblioteca detrás de la búsqueda vectorielle

Respuesta directa

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.

Por Mohamed Meguedmi·Actualización 2026-09-28·Probado en Windows, macOS y Linux

#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

El kit RAG Local

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
Cuatro familias, tres compromisos
IndexCómo buscaCuándo usarlo
Exacto (Flat)Compara con todos los vectoresHasta unas decenas de miles: resultados exactos, sin ajustes, realmente lo bastante rápido
IVF (particiones invertidas)Divide el espacio en clusters, solo explora algunas particionesA partir de cientos de miles; requiere una fase de aprendizaje con datos representativos
HNSW (grafo de vecinos)Navega por un grafo de enlacesMucha 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 bytesCuando 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 sobrecargaEl ú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

  1. 01
    Instalar la biblioteca
    pip 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.
  2. 02
    Construir un índice exacto
    index = faiss.IndexFlatL2(dimension) crea un índice de búsqueda exacta para vectores de la dimensión de tu modelo de embedding.
  3. 03
    Añadir vectores
    index.add(vecteurs), donde vecteurs es un array de NumPy de forma (n, dimension) con números de coma flotante de 32 bits.
  4. 04
    Consultar
    distances, 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.
  5. 05
    Guardar y recargar
    faiss.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.

Referencias oficiales por tamaño de corpus
Tamaño del corpusConfiguración recomendada
Menos de 1 millónIVF_K (K entre 4×√N y 16×√N)
1 a 10 millonesIVF65536_HNSW32
10 a 100 millonesIVF262144_HNSW32
100 millones a 1 mil millonesIVF1048576_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.

i
Índice en RAM, modelo en VRAM
Los índices FAISS se almacenan por defecto en la memoria del sistema. Existe la posibilidad de ejecutarlos en GPU para volúmenes muy grandes —la documentación oficial especifica que acepta datos tanto desde la memoria de la CPU como desde la de la GPU—, pero competir con tu modelo de lenguaje por los recursos de la tarjeta rara vez compensa en una instalación local. Ten en cuenta también que un índice HNSW solo admite inserciones secuenciales (no admite identificadores personalizados a menos que se encapsule en IDMap) y no permite eliminar vectores uno a uno, a diferencia de IVF.

#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.

#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?+
No, es una biblioteca de búsqueda por similitud, escrita en C++ con interfaces para Python y NumPy. No incluye servidor, filtrado por metadatos, control de acceso ni durabilidad integrada: eso es precisamente lo que añade una base de datos vectorial como Qdrant o Milvus sobre un motor comparable, a menudo inspirado en los mismos principios de indexación.
¿Es FAISS gratuito y de código abierto?+
Sí. El proyecto está publicado bajo licencia MIT, una licencia permisiva que permite el uso comercial sin regalías, y lo desarrolla principalmente el grupo de investigación en IA fundamental de Meta. No hay que prever ningún coste de licencia, solo el tiempo de integración, operación y mantenimiento de la biblioteca actualizada en tu entorno tecnológico.
¿Cuántos vectores puede manejar?+
Millones, e incluso miles de millones según los autores del proyecto, con el índice adecuado y suficiente memoria RAM. La limitación es la RAM: unos 4 kB por vector de 1.024 dimensiones en precisión completa, sin contar la estructura del índice, o considerablemente menos con cuantización de producto o RaBitQ para volúmenes muy grandes.
¿Se pueden filtrar los resultados por metadatos?+
No durante la búsqueda. El filtrado se hace después, en tu propio código, lo que puede dejarte sin resultados si ninguno de los mejores supera el filtro. Para filtrar por permisos de acceso, hace falta un sistema que filtre durante la propia recuperación, como pgvector o una base de datos vectorial dedicada.
¿FAISS o una base vectorial?+
FAISS para un único proceso, un corpus fijo y sin filtrado. Una base de datos en cuanto haya varios clientes, actualizaciones continuas, persistencia o permisos de acceso que deban hacerse respetar durante la propia búsqueda, en lugar de hacerlo después en el código de tu aplicación.
¿Con qué índice empezar?+
El índice exacto (IndexFlatL2 o IndexFlatIP según la distancia). No requiere ajustes ni una fase de entrenamiento, ni hay que medir el recall, y es lo bastante rápido incluso con tamaños muy superiores a los de la mayoría de los corpus locales: la wiki oficial solo recomienda un índice aproximado por encima del millón de vectores.
¿Puede HNSW reemplazar IVF en todos los casos?+
No. HNSW es adecuado cuando la RAM es abundante o el corpus es modesto, pero solo acepta añadidos secuenciales y no soporta la eliminación de vectores. IVF, aunque más lento si se considera únicamente la consulta, es más flexible para un corpus que evoluciona y se combina con HNSW cuando supera un millón de vectores. La ejecución en GPU reemplaza directamente el índice CPU equivalente (por ejemplo, GpuIndexFlatL2 para IndexFlatL2), pero rara vez es útil a escala de un corpus local.
¿Esta guía te ha ayudado?

¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.