Configurazione con Facebook AI Similarity Search (FAISS)
Ciao, appassionati di tecnologia! Oggi intraprendiamo un viaggio per esplorare uno strumento che sta facendo parlare di sé nell’intelligenza artificiale: la Ricerca di similarità (FAISS) di Facebook. Supponiamo che vi siate chiesti come Spotify trovi brani che suonano inquietantemente simili ai vostri preferiti o come Google Photos riesca a raggruppare le foto della stessa persona. In tal caso, state per svelare il mistero.
La ricerca di similarità, o ricerca del vicino più prossimo, è un aspetto cruciale di molte applicazioni di IA e machine learning. Si tratta di trovare i punti dati più simili a un determinato punto di query. Ad esempio, quando cercate un brano su Spotify, il sistema deve trovare i brani più “simili” alla vostra query di ricerca—da qui, una ricerca di similarità.
Per quanto questa ricerca di similarità efficiente sembri impressionante, c’è un problema. I metodi tradizionali di ricerca di similarità possono diventare terribilmente lenti con grandi quantità di dati. È qui che entra in gioco FAISS e risolve i limiti dei motori di ricerca di query tradizionali. È una libreria per la similarità efficiente sviluppata da Facebook AI che fornisce soluzioni affidabili ai problemi di ricerca di similarità, soprattutto quando si ha a che fare con dati su larga scala.
Ma basta chiacchiere! Questo post del blog vi guiderà nella configurazione di FAISS, nel metterlo in funzione e nel dimostrarne la potenza attraverso un programma di esempio di ricerca di similarità. Quindi allacciate le cinture, perché stiamo per immergerci a fondo nell’affascinante mondo della ricerca di similarità efficiente con FAISS. Sarà un viaggio divertente!
Comprendere FAISS (Facebook AI Similarity Search)
Ora che abbiamo stuzzicato l’appetito con una rapida introduzione, approfondiamo FAISS. FAISS, o Facebook AI Similarity Search, è una libreria di algoritmi per la ricerca di similarità vettoriale e il clustering di vettori densi. È il frutto del lavoro del team di IA di Facebook, che l’ha progettata per gestire in modo efficiente database di grandi dimensioni.
FAISS funziona principalmente sul concetto di “similarità vettoriale.” In parole semplici, i vettori sono essenzialmente una lista di numeri, e la similarità riguarda quanto due vettori siano simili tra loro. Immaginate di cercare un brano che corrisponda all’atmosfera del vostro preferito attuale. I vettori possono rappresentare entrambi i brani, con diversi elementi di vettori simili che rappresentano diverse caratteristiche del brano. Potete confrontare la “similarità” tra questi brani confrontando la distanza dei loro vettori in uno spazio ad alta dimensionalità. La distanza euclidea svolge un ruolo cruciale nella misurazione di questa similarità tra vettori.
È qui che FAISS mostra i muscoli. Fornisce un modo per confrontare rapidamente e accuratamente milioni, o persino miliardi, di questi vettori. È come avere un motore di ricerca potenziato che può scansionare un’enorme libreria musicale in un batter d’occhio, individuando i brani più simili al vostro preferito. I vettori indicizzati sono essenziali in questo processo, poiché consentono al sistema di cercare in modo efficiente le corrispondenze più vicine a un determinato vettore di query.
Ma la magia di FAISS non si ferma alle raccomandazioni musicali. Molte applicazioni usano FAISS, dal riconoscimento delle immagini e il recupero di testi al clustering e all’analisi dei dati. Ogni volta che avete una grande quantità di dati e dovete trovare rapidamente elementi simili, FAISS potrebbe essere lo strumento giusto per voi.
Configurare FAISS
Questa sezione vi guiderà su come configurare FAISS su un sistema Linux.
Installazione di Conda
Prima di installare FAISS, è necessario avere Conda installato sul vostro sistema. Conda è un sistema open-source di gestione dei pacchetti e degli ambienti che funziona su Windows, macOS e Linux.
Seguite questi passaggi per installare Conda su un sistema Linux:
Scaricate l’installer di Miniconda per Linux dal sito web ufficiale.
Verifica gli hash del tuo installer.
Apri una finestra del terminale ed esegui il seguente comando per avviare l'installazione:
bash Miniconda3-latest-Linux-x86_64.sh
Quando l'installer si avvia, ti farà alcune domande. Se non sei sicuro di qualcosa, scegli le opzioni predefinite. Potrai sempre modificare le impostazioni in seguito.
Una volta completata l'installazione, chiudi la finestra del terminale e riaprila. Questo garantirà che eventuali modifiche apportate vengano attivate.
Ora dovrai verificare che tutto sia installato correttamente. Per farlo, digita conda list nella finestra del terminale o in Anaconda Prompt e premi invio. Se tutto funziona correttamente, vedrai un elenco dei pacchetti installati.
Installazione di FAISS
Puoi installare FAISS tramite Conda. Il pacchetto FAISS ha due versioni: una versione solo CPU (faiss-cpu) e una versione che include sia indici CPU sia GPU (faiss-gpu). A seconda delle tue esigenze, puoi installare una di queste versioni.
Il metodo consigliato per installare FAISS è tramite il canale Conda di PyTorch. Ecco i comandi per installare l'ultima versione stabile di FAISS.
Per la versione CPU:
conda install -c pytorch faiss-cpu
Per la versione GPU:
conda install -c pytorch faiss-gpu
Inoltre, FAISS è pacchettizzato da conda-forge, che è un ecosistema di pacchettizzazione per Conda guidato dalla comunità. Puoi installare FAISS da conda-forge usando i seguenti comandi. Per la versione solo CPU:
conda install -c conda-forge faiss-cpu
Per la versione GPU:
conda install -c conda-forge faiss-gpu
Esempio di walkthrough del codice utilizzando SQuAD
Puoi verificare da quale canale provengono i tuoi pacchetti Conda usando il comando conda list.
Usiamo lo Stanford Question Answering Dataset (SQuAD) per questa dimostrazione. SQuAD è un dataset popolare per l'elaborazione del linguaggio naturale (NLP) e un ottimo modo per illustrare come funziona FAISS. Questo dataset contiene coppie domanda-risposta, in cui la risposta a ciascuna domanda è un segmento di testo, o “span,” tratto dal passaggio di lettura corrispondente. Nel processo di ricerca, i vettori di query vengono utilizzati per trovare le risposte più rilevanti confrontandoli con il dataset.
Prima di immergerci nel codice, scarichiamo e prepariamo prima il dataset SQuAD:
Scarica il dataset SQuAD: puoi scaricare il dataset dal sito web di SQuAD. Per semplicità, useremo SQuAD 1.1. Puoi scaricare il dataset usando il seguente link: SQuAD 1.1 Train. Scarica e salva il file JSON (train-v1.1.json) nella tua directory di lavoro.
Leggi il file JSON: ora puoi usare la libreria JSON di Python per caricare i dati:
with open('train-v1.1.json', 'r') as file: squad_data = json.load(file)
I vettori numerici sono essenziali nell'indice FAISS poiché consentono misurazioni delle distanze e interrogazioni efficienti all'interno di IndexFlatL2.
Importazione delle librerie necessarie
Il primo passo è importare tutte le librerie necessarie. Avremo bisogno di numpy per le operazioni numeriche, Faiss per la nostra ricerca di similarità vettoriale, JSON per caricare il nostro dataset e nltk per tokenizzare il nostro testo.
import numpy as np
import faiss
import json
from nltk.tokenize import word_tokenize
Caricamento e pre-elaborazione dei dati
Carichiamo il dataset SQuAD. È un file JSON, quindi possiamo usare la funzione load del modulo JSON.
with open('train-v1.1.json', 'r') as file:
squad_data = json.load(file)
Assumeremo che l'oggetto JSON sia un dizionario contenente una chiave data e un elenco di dizionari. Ogni dizionario nell'elenco rappresenta un articolo contenente una chiave paragraph con un elenco di paragrafi.
Ora, pre-elaboriamo i dati. Tokenizzeremo ogni paragrafo usando la funzione word_tokenize di nltk, che divide una frase in singole parole. Quindi rappresenteremo ogni parola come un vettore codificato 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']]
Costruzione dell'indice
Ora che abbiamo i nostri dati nel formato corretto, possiamo costruire il nostro indice FAISS. Useremo il tipo di indice IndexFlatL2, un indice di base basato sulla distanza 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)
Il tipo IndexFlatL2 richiede di specificare la dimensione dei nostri dati. Poiché ciascuno dei nostri vettori è codificato one-hot, la dimensione è la dimensione del nostro vocabolario.
Poi aggiungiamo i nostri dati all'indice usando il metodo add, che richiede un array NumPy 2D.
Esecuzione di una ricerca vettoriale FAISS
Con il nostro indice tutto configurato, ora possiamo giocare agli investigatori e trovare nel nostro dataset i paragrafi che corrispondono più da vicino alla nostra query di ricerca.
Ecco la nostra funzione di ricerca:
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()
Il nostro termine di ricerca è "Qual è la capitale della Francia?" e vogliamo trovare 5 risultati:
search_term = "What is the capital of France?"
search_for_paragraphs(search_term, 5)
search_for_paragraphs() prima trasforma il nostro termine di ricerca in un vettore codificato. Poi usiamo questa rappresentazione vettoriale come metodo di ricerca sul nostro indice. Questo richiede un array 2D, quindi aggiungiamo una dimensione extra al nostro vettore di ricerca.
Il metodo di ricerca per similarità richiede anche di indicare quanti risultati vogliamo (è a questo che serve num_results). Il metodo search ci fornisce due array 2D: uno per le distanze dei risultati più vicini e uno per i loro indici. Possiamo usare questi indici per trovare i paragrafi effettivi nel nostro dataset. Quindi stampiamo il ranking di ciascun risultato, la distanza di similarità e il testo del paragrafo.
Ed ecco fatto! Questo è un esempio di base dell'uso di FAISS per trovare dati testuali simili. Naturalmente, FAISS può fare cose molto più complesse, come cercare in spazi vettoriali ad alta dimensionalità. Tuttavia, questo esempio dovrebbe offrirti un buon punto di partenza per usare FAISS.
Best practice e suggerimenti
Hai i tuoi dati? Impara a conoscerli: Prima di usare FAISS, prenditi un momento per conoscere i tuoi dati. Poniti domande come queste: sono pieni di numeri elevati? Sono pieni di lacune o ricchi di informazioni? Conoscere i tuoi dati ti aiuterà a scegliere il tipo corretto di indice FAISS e a determinare il modo migliore per preparare i tuoi dati.
Il preprocessing è fondamentale: Il modo in cui prepari i tuoi dati può influire in modo significativo su quanto bene funziona FAISS. Per i dati testuali, considera l'uso di modi più intelligenti per trasformare le parole in numeri, come TF-IDF o Word2Vec, invece della semplice codifica one-hot. Per le immagini, prova a usare caratteristiche da una rete neurale convoluzionale (CNN).
Scegli l'indice migliore per te: FAISS offre vari tipi di indici, ciascuno con punti di forza specifici. Alcuni sono ottimi per gestire dati con molte dimensioni, altri sono perfetti per vettori binari e alcuni sono progettati per gestire dati molto, molto grandi. Quindi assicurati di scegliere quello che funzionerà meglio per le tue esigenze.
Raggruppa le tue query in batch: se hai troppe query da eseguire sul tuo indice, è più efficiente raggrupparle ed eseguirle tutte in una volta. FAISS è ottimizzato per l'elaborazione in batch.
Ottimizza i tuoi parametri: FAISS ha diversi parametri configurabili, come il numero di cluster nella fase di indicizzazione e il numero di probe nella fase di ricerca della similarità vettoriale. Non limitarti ai valori predefiniti; sperimenta con impostazioni diverse per vedere cosa funziona meglio per i tuoi dati.
Database vettoriali vs FAISS
FAISS è un'ottima soluzione per la ricerca ANN. Inoltre, FAISS fornisce codice di supporto che offre funzionalità aggiuntive per la valutazione e l'ottimizzazione dei parametri relative alla ricerca per similarità e al clustering di vettori densi. Tuttavia, presenta alcune limitazioni quando hai decine di milioni di vettori per l'archiviazione e il recupero e, contemporaneamente, richiedi risposte in tempo reale o funzionalità avanzate relative ai vettori di query.
Rispetto a FAISS, i database vettoriali appositamente progettati come Milvus e Zilliz Cloud possono affrontare le sfide menzionate sopra e dispongono di capacità più avanzate in termini di:
Funzionalità di base come il supporto CRUD, la coerenza dei dati e la ricerca con filtri
Disponibilità del sistema con una forte persistenza dei dati e un migliore ripristino di emergenza
Scalabilità del sistema con supporto al bilanciamento del carico, un'architettura distribuita che separa elaborazione e archiviazione, e una migliore usabilità
RBAC con supporto multi-tenant, SDK per vari linguaggi di programmazione, API RESTful e un sistema di monitoraggio.
Milvus è il primo e più popolare database vettoriale open-source al mondo per la ricerca di similarità su scala di miliardi e applicazioni di IA. Milvus può archiviare, indicizzare e gestire oltre un miliardo di embedding vettoriali generati da reti neurali profonde e altri modelli di machine learning (ML). Per rendere i database vettoriali accessibili a ogni sviluppatore e organizzazione, Zilliz ha contribuito Milvus alla LF AI & Data Foundation come progetto in fase di incubazione, e si è laureato nel giugno 2021.
Milvus Lite è una versione leggera di Milvus che viene eseguita localmente all'interno della tua applicazione Python. Basato sul popolare database vettoriale open-source Milvus, Milvus Lite riutilizza i componenti principali per l'indicizzazione vettoriale e l'analisi delle query, rimuovendo al contempo gli elementi progettati per l'elevata scalabilità nei sistemi distribuiti. Questo design la rende una soluzione compatta ed efficiente, ideale per ambienti con risorse di calcolo limitate, come laptop, Jupyter Notebook e dispositivi mobili o edge.
Zilliz Cloud è un servizio di database vettoriale completamente gestito basato su Milvus. Con Zilliz Cloud, il recupero vettoriale è dieci volte più veloce e distribuire e scalare applicazioni di ricerca vettoriale è più facile che mai. Zilliz Cloud offre anche un piano gratuito, dando a ogni sviluppatore accesso a questa tecnologia all'avanguardia senza richiedere alcun impegno finanziario.
Conclusione
Ed eccoci qui! Insieme, abbiamo attraversato l'entusiasmante mondo di Facebook AI Similarity Search, o FAISS. Dalla comprensione di cos'è e come funziona, alla sua configurazione sul tuo sistema, passando per del codice di esempio con il dataset SQuAD e il modo in cui si differenzia dai database vettoriali appositamente progettati, abbiamo coperto molti argomenti.
Ricorda, FAISS è uno strumento incredibilmente potente progettato per rendere la ricerca attraverso enormi quantità di dati non solo possibile, ma efficiente. La sua versatilità nell'adattarsi a diversi tipi e dimensioni di dati è una testimonianza della sua progettazione.
Mentre vai avanti, armato di questa conoscenza, ricorda le migliori pratiche e i consigli di cui abbiamo discusso. Comprendere i tuoi dati, scegliere l'indice giusto, preelaborare i tuoi dati in modo efficace, raggruppare le tue query in batch e ottimizzare i tuoi parametri: tutti questi passaggi possono migliorare significativamente i tuoi risultati.
Ma non fermarti qui. Continua a esplorare, sperimentare e imparare. Che si tratti di approfondire i diversi tipi di indice offerti da FAISS, esplorare tecniche di preelaborazione dei dati più complesse o sperimentare casi d'uso più sofisticati, c'è sempre altro da imparare.
Questo post è scritto da Keshav Malik, un ingegnere della sicurezza altamente qualificato ed entusiasta. Keshav è appassionato di automazione, hacking ed esplorazione di diversi strumenti e tecnologie. Ama trovare soluzioni innovative a problemi complessi ed è costantemente alla ricerca di nuove opportunità per crescere e migliorare come professionista. Si dedica a rimanere un passo avanti ed è sempre alla ricerca degli strumenti e delle tecnologie più recenti e migliori.
Continua a leggere

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.

Announcing the General Availability of Single Sign-On (SSO) on Zilliz Cloud
SSO is GA on Zilliz Cloud, delivering the enterprise-grade identity management capabilities your teams need to deploy vectorDB with confidence.

Build for the Boom: Why AI Agent Startups Should Build Scalable Infrastructure Early
Explore strategies for developing AI agents that can handle rapid growth. Don't let inadequate systems undermine your success during critical breakthrough moments.



