Configuración con Facebook AI Similarity Search (FAISS)
¡Hola, entusiastas de la tecnología! Hoy emprendemos un viaje para explorar una herramienta que ha estado causando sensación en la inteligencia artificial: Similarity Search (FAISS) de Facebook AI. Supón que te has preguntado cómo Spotify encuentra canciones que suenan inquietantemente similares a tus favoritas o cómo Google Photos logra agrupar fotos de la misma persona. En ese caso, estás a punto de descubrir el misterio.
La búsqueda por similitud, o búsqueda del vecino más cercano, es un aspecto crucial de muchas aplicaciones de IA y aprendizaje automático. Se trata de encontrar los puntos de datos más similares a un punto de consulta dado. Por ejemplo, cuando buscas una canción en Spotify, el sistema necesita encontrar las canciones que son más “similares” a tu consulta de búsqueda; de ahí, una búsqueda por similitud.
Por impresionante que suene esta búsqueda por similitud eficiente, hay un inconveniente. Los métodos tradicionales de búsqueda por similitud pueden volverse terriblemente lentos con grandes cantidades de datos. Ahí es donde entra FAISS y resuelve las limitaciones de los motores de búsqueda de consultas tradicionales. Es una biblioteca para similitud eficiente desarrollada por Facebook AI que proporciona soluciones fiables a problemas de búsqueda por similitud, especialmente cuando se trabaja con datos a gran escala.
¡Pero basta de charla! Esta publicación de blog te guiará para configurar FAISS, ponerlo en marcha y demostrar su potencia mediante un programa de ejemplo de búsqueda por similitud. Así que abróchate el cinturón porque estamos a punto de sumergirnos de lleno en el fascinante mundo de la búsqueda por similitud eficiente con FAISS. ¡Va a ser un viaje divertido!
Comprender FAISS (Facebook AI Similarity Search)
Ahora que hemos abierto el apetito con una rápida introducción, profundicemos en FAISS. FAISS, o Facebook AI Similarity Search, es una biblioteca de algoritmos para búsqueda por similitud vectorial y agrupamiento de vectores densos. Es una creación del equipo de IA de Facebook, que la diseñó para manejar grandes bases de datos de manera eficiente.
FAISS funciona principalmente sobre el concepto de “similitud vectorial.” En términos sencillos, los vectores son esencialmente una lista de números, y la similitud trata de cuán parecidos son dos vectores. Imagina que intentas encontrar una canción que coincida con el estado de ánimo de tu favorita actual. Los vectores pueden representar ambas canciones, con diferentes elementos de vectores similares representando diferentes características de las canciones. Puedes comparar la “similitud” entre estas canciones comparando la distancia de sus vectores en un espacio de alta dimensión. La distancia euclidiana desempeña un papel crucial en la medición de esta similitud entre vectores.
Aquí es donde FAISS muestra su fuerza. Proporciona una forma de comparar rápida y precisamente millones, o incluso miles de millones, de estos vectores. Es como tener un motor de búsqueda superpotenciado que puede escanear una enorme biblioteca musical en un abrir y cerrar de ojos, localizando las canciones más similares a tu favorita. Los vectores indexados son esenciales en este proceso, ya que permiten al sistema buscar de manera eficiente las coincidencias más cercanas a un vector de consulta dado.
Pero la magia de FAISS no se detiene en las recomendaciones musicales. Muchas aplicaciones usan FAISS, desde el reconocimiento de imágenes y la recuperación de textos hasta el agrupamiento y el análisis de datos. Siempre que tengas una gran cantidad de datos y necesites encontrar elementos similares rápidamente, FAISS podría ser tu herramienta de referencia.
Configuración de FAISS
Esta sección te guiará sobre cómo configurar FAISS en un sistema Linux.
Instalación de Conda
Antes de instalar FAISS, necesitas tener Conda instalado en tu sistema. Conda es un sistema de gestión de paquetes y entornos de código abierto que se ejecuta en Windows, macOS y Linux.
Sigue estos pasos para instalar Conda en un sistema Linux:
Descarga el instalador de Miniconda para Linux desde el sitio web oficial.
Verifica los hashes de tu instalador.
Abre una ventana de terminal y ejecuta el siguiente comando para iniciar la instalación:
bash Miniconda3-latest-Linux-x86_64.sh
Cuando se inicie el instalador, te hará algunas preguntas. Si no estás seguro de algo, elige las opciones predeterminadas. Siempre puedes cambiar las cosas más adelante.
Una vez que hayas terminado con la instalación, cierra la ventana de terminal y ábrela de nuevo. Esto garantizará que cualquier cambio que realices se active.
Ahora querrás comprobar si todo está instalado correctamente. Para hacerlo, escribe conda list en tu ventana de terminal o Anaconda Prompt y pulsa enter. Si todo funciona correctamente, verás una lista de paquetes instalados.
Instalación de FAISS
Puedes instalar FAISS mediante Conda. El paquete FAISS tiene dos versiones: una versión solo para CPU (faiss-cpu) y una versión que incluye índices tanto de CPU como de GPU (faiss-gpu). Según tus necesidades, puedes instalar cualquiera de estas versiones.
La forma recomendada de instalar FAISS es a través del canal Conda de PyTorch. Estos son los comandos para instalar la última versión estable de FAISS.
Para la versión de CPU:
conda install -c pytorch faiss-cpu
Para la versión de GPU:
conda install -c pytorch faiss-gpu
Además, FAISS está empaquetado por conda-forge, que es un ecosistema de empaquetado impulsado por la comunidad para Conda. Puedes instalar FAISS desde conda-forge usando los siguientes comandos. Para la versión solo para CPU:
conda install -c conda-forge faiss-cpu
Para la versión de GPU:
conda install -c conda-forge faiss-gpu
Recorrido por el código de ejemplo usando SQuAD
Puedes comprobar de qué canal provienen tus paquetes Conda usando el comando conda list.
Usemos el Stanford Question Answering Dataset (SQuAD) para esta demostración. SQuAD es un conjunto de datos popular para el procesamiento del lenguaje natural (NLP) y una excelente manera de ilustrar cómo funciona FAISS. Este conjunto de datos contiene pares de pregunta-respuesta, donde la respuesta a cada pregunta es un segmento de texto, o “span”, del pasaje de lectura correspondiente. En el proceso de búsqueda, los vectores de consulta se utilizan para encontrar las respuestas más relevantes comparándolos con el conjunto de datos.
Antes de profundizar en el código, primero descarguemos y preparemos el conjunto de datos SQuAD:
Descargar el conjunto de datos SQuAD: Puedes descargar el conjunto de datos desde el sitio web de SQuAD. Para simplificar, usaremos SQuAD 1.1. Puedes descargar el conjunto de datos usando el siguiente enlace: SQuAD 1.1 Train. Descarga y guarda el archivo JSON (train-v1.1.json) en tu directorio de trabajo.
Leer el archivo JSON: Ahora puedes usar la biblioteca JSON de Python para cargar los datos:
with open('train-v1.1.json', 'r') as file: squad_data = json.load(file)
Los vectores numéricos son esenciales en el índice FAISS, ya que permiten mediciones de distancia y consultas eficientes dentro de IndexFlatL2.
Importación de las bibliotecas necesarias
El primer paso es importar todas las bibliotecas necesarias. Necesitaremos numpy para operaciones numéricas, Faiss para nuestra búsqueda de similitud vectorial, JSON para cargar nuestro conjunto de datos y nltk para tokenizar nuestro texto.
import numpy as np
import faiss
import json
from nltk.tokenize import word_tokenize
Carga y preprocesamiento de datos
Carguemos el conjunto de datos SQuAD. Es un archivo JSON, así que podemos usar la función load del módulo JSON.
with open('train-v1.1.json', 'r') as file:
squad_data = json.load(file)
Asumiremos que el objeto JSON es un diccionario que contiene una clave data y una lista de diccionarios. Cada diccionario de la lista representa un artículo que contiene una clave paragraph con una lista de párrafos.
Ahora, preprocesaremos los datos. Tokenizaremos cada párrafo usando la función word_tokenize de nltk, que divide una oración en palabras individuales. Luego representaremos cada palabra como un vector codificado one-hot.
vocabulary = set(word for article in squad_data['data'] for paragraph in article['paragraphs'] for word in word_tokenize(paragraph['context']))
word_to_index = {word: index for index, word in enumerate(vocabulary)}
def convert_text_to_vector(text):
words = word_tokenize(text)
bow_vector = np.zeros(len(vocabulary))
for word in words:
word in word_to_index:
bow_vector[word_to_index[word]] = 1
return bow_vector
paragraph_vectors = [convert_text_to_vector(paragraph['context']) for article in squad_data['data'] for paragraph in article['paragraphs']]
Construcción del índice
Ahora que tenemos nuestros datos en el formato correcto, podemos construir nuestro índice FAISS. Usaremos el tipo de índice IndexFlatL2, un índice básico de distancia L2.
dimension = len(vocabulary)
index = faiss.IndexFlatL2(dimension)
# Convert our list of NumPy arrays to a single 2D array
paragraph_vectors = np.stack(paragraph_vectors).astype('float32')
index.add(paragraph_vectors)
El tipo IndexFlatL2 requiere que especifiquemos la dimensión de nuestros datos. Como cada uno de nuestros vectores está codificado en one-hot, la dimensión es el tamaño de nuestro vocabulario.
Luego añadimos nuestros datos al índice usando el método add, que requiere un array NumPy 2D.
Realización de una búsqueda vectorial con FAISS
Con nuestro índice ya configurado, ahora podemos jugar al detective y encontrar párrafos en nuestro conjunto de datos que coincidan más estrechamente con nuestra consulta de búsqueda.
Aquí está nuestra función de búsqueda:
def search_for_paragraphs(search_term, num_results):
search_vector = convert_text_to_vector(search_term)
search_vector = np.array([search_vector]).astype('float32')
distances, indexes = index.search(search_vector, num_results)
for i, (distance, index) in enumerate(zip(distances[0], indexes[0])):
print(f"Result {i+1}, Distance: {distance}")
print(squad_data['data'][index]['paragraphs'][0]['context'])
print()
Nuestro término de búsqueda es "What is the capital of France?" y queremos encontrar 5 resultados:
search_term = "What is the capital of France?"
search_for_paragraphs(search_term, 5)
search_for_paragraphs() primero convierte nuestro término de búsqueda en un vector codificado. Luego usamos esta representación vectorial como el método de búsqueda en nuestro índice. Esto necesita un array 2D, así que añadimos una dimensión extra a nuestro vector de búsqueda.
El método de búsqueda de similitud también necesita que indiquemos cuántos resultados queremos (para eso es num_results). El método search nos da dos arrays 2D: uno para las distancias de los resultados más cercanos y otro para sus índices. Podemos usar estos índices para encontrar los párrafos reales en nuestro conjunto de datos. Luego, imprimimos la clasificación de cada resultado, la distancia de similitud y el texto del párrafo.
¡Y ahí lo tienes! Este es un ejemplo básico de cómo usar FAISS para encontrar datos de texto similares. Por supuesto, FAISS puede hacer cosas mucho más complejas, como buscar en espacios vectoriales de alta dimensión. Sin embargo, este ejemplo debería darte un buen punto de partida para usar FAISS.
Mejores prácticas y consejos
¿Tienes tus datos? Conócelos: Antes de usar FAISS, tómate un momento para conocer tus datos. Haz preguntas como estas: ¿Está lleno de números altos? ¿Está lleno de huecos o repleto de información? Conocer tus datos te ayudará a elegir el tipo correcto de índice FAISS y a determinar la mejor manera de preparar tus datos.
El preprocesamiento es clave: La forma en que preparas tus datos puede afectar significativamente qué tan bien funciona FAISS. Para datos de texto, piensa en usar formas más inteligentes de convertir palabras en números, como TF-IDF o Word2Vec, en lugar de solo codificación one-hot. Para imágenes, intenta usar características de una red neuronal convolucional (CNN).
Elige el mejor índice para ti: FAISS tiene varios tipos de índices, cada uno con fortalezas especiales. Algunos son excelentes para tratar con datos que tienen muchas dimensiones, otros son perfectos para vectores binarios, y algunos están hechos para manejar datos muy, muy grandes. Así que asegúrate de elegir el que funcione mejor para tus necesidades.
Agrupa tus consultas por lotes: Si tienes demasiadas consultas para ejecutar contra tu índice, es más eficiente agruparlas y ejecutarlas todas a la vez. FAISS está optimizado para el procesamiento por lotes.
Ajusta tus parámetros: FAISS tiene varios parámetros ajustables, como el número de clústeres en la etapa de indexación y el número de sondas en la etapa de búsqueda de similitud vectorial. No te quedes simplemente con los valores predeterminados; experimenta con diferentes configuraciones para ver qué funciona mejor para tus datos.
Bases de datos vectoriales vs FAISS
FAISS es una gran solución para la búsqueda ANN. Además, FAISS proporciona código de apoyo que ofrece funcionalidades adicionales para la evaluación y el ajuste de parámetros relacionados con la búsqueda por similitud y el agrupamiento de vectores densos. Aun así, tiene algunas limitaciones cuando tienes decenas de millones de vectores para almacenamiento y recuperación y, al mismo tiempo, requieres respuestas en tiempo real o funciones avanzadas relacionadas con vectores de consulta.
En comparación con FAISS, las bases de datos vectoriales creadas específicamente como Milvus y Zilliz Cloud pueden abordar los desafíos mencionados anteriormente y tienen capacidades más avanzadas en:
Funcionalidades básicas como compatibilidad con CRUD, consistencia de datos y búsqueda con filtros
Disponibilidad del sistema con fuerte persistencia de datos y mejor recuperación ante desastres
Escalabilidad del sistema con soporte de balanceo de carga, una arquitectura distribuida que separa cómputo y almacenamiento, y mejor usabilidad
RBAC con soporte para multiinquilino, SDKs de varios lenguajes de programación, API restful y un sistema de monitoreo.
Milvus es la primera y más popular base de datos vectorial de código abierto del mundo para búsqueda por similitud a escala de miles de millones y aplicaciones de IA. Milvus puede almacenar, indexar y gestionar más de mil millones de embeddings vectoriales generados por redes neuronales profundas y otros modelos de aprendizaje automático (ML). Para hacer que las bases de datos vectoriales sean accesibles para todos los desarrolladores y organizaciones, Zilliz contribuyó Milvus a la LF AI & Data Foundation como un proyecto en etapa de incubación, y se graduó en junio de 2021.
Milvus Lite es una versión ligera de Milvus que se ejecuta localmente dentro de tu aplicación Python. Basado en la popular base de datos vectorial de código abierto Milvus, Milvus Lite reutiliza los componentes principales para la indexación vectorial y el análisis de consultas, al tiempo que elimina elementos diseñados para una alta escalabilidad en sistemas distribuidos. Este diseño crea una solución compacta y eficiente ideal para entornos con recursos informáticos limitados, como portátiles, Jupyter Notebooks y dispositivos móviles o perimetrales.
Zilliz Cloud es un servicio de base de datos vectorial totalmente gestionado construido sobre Milvus. Con Zilliz Cloud, la recuperación vectorial es diez veces más rápida, y desplegar y escalar aplicaciones de búsqueda vectorial es más fácil que nunca. Zilliz Cloud también ofrece un nivel gratuito, dando a cada desarrollador acceso a esta tecnología de vanguardia sin requerir ningún compromiso financiero.
Conclusión
¡Y ahí lo tienes! Juntos, hemos recorrido el emocionante mundo de Facebook AI Similarity Search, o FAISS. Desde entender qué es y cómo funciona hasta configurarlo en tu sistema, pasando por algunos ejemplos de código con el conjunto de datos SQuAD y cómo se diferencia de las bases de datos vectoriales creadas específicamente, hemos cubierto mucho terreno.
Recuerda, FAISS es una herramienta increíblemente poderosa diseñada para hacer que la búsqueda en cantidades masivas de datos no solo sea posible, sino también eficiente. Su versatilidad para adaptarse a diferentes tipos y tamaños de datos es un testimonio de su diseño.
A medida que avanzas, armado con este conocimiento, recuerda las mejores prácticas y consejos que comentamos. Comprender tus datos, elegir el índice adecuado, preprocesar tus datos de manera efectiva, agrupar tus consultas por lotes y ajustar tus parámetros: todos estos pasos pueden mejorar significativamente tus resultados.
Pero no te detengas aquí. Continúa explorando, experimentando y aprendiendo. Ya sea profundizando en los diferentes tipos de índices que ofrece FAISS, explorando técnicas de preprocesamiento de datos más complejas o experimentando con casos de uso más sofisticados, siempre hay más por aprender.
Esta publicación está escrita por Keshav Malik, un ingeniero de seguridad altamente capacitado y entusiasta. Keshav siente pasión por la automatización, el hacking y la exploración de diferentes herramientas y tecnologías. Le encanta encontrar soluciones innovadoras a problemas complejos y busca constantemente nuevas oportunidades para crecer y mejorar como profesional. Está dedicado a mantenerse a la vanguardia y siempre está buscando las herramientas y tecnologías más recientes y mejores.
Sigue leyendo

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

Why and How to Migrate from Self-Hosted Milvus to Zilliz Cloud
A simple, step-by-step guide to migrating from Milvus to Zilliz Cloud. Learn both endpoint and backup methods for a smooth, scalable vector database migration.

Our Journey to 35K+ GitHub Stars: The Real Story of Building Milvus from Scratch
Join us in celebrating Milvus, the vector database that hit 35.5K stars on GitHub. Discover our story and how we’re making AI solutions easier for developers.



