Cosa è l’indice FAISS e come si usa : Tecniche RAG
FAISS (Facebook AI Similarity Search) è una libreria open-source sviluppata da Facebook AI Research che permette di cercare in maniera efficiente e veloce all’interno di grandi raccolte di vettori. Questi vettori rappresentano dati come parole, frasi, immagini o altri tipi di informazioni, che sono stati trasformati in rappresentazioni numeriche tramite tecniche di machine learning, come gli embeddings. L’obiettivo principale di FAISS è facilitare la ricerca di vettori simili, spesso utilizzato nel contesto di sistemi di raccomandazione, classificazione e tecniche avanzate di Retrieval-Augmented Generation (RAG).
Che cos’è l’indice FAISS?
Un indice FAISS è una struttura dati progettata per consentire ricerche rapide di vettori simili all’interno di grandi dataset. Il concetto chiave è quello della similarità tra vettori, misurata attraverso distanze metriche, come la distanza euclidea o il coseno. La creazione di un indice FAISS consente di comprimere e organizzare i dati in modo tale da rendere più efficiente il processo di ricerca di elementi simili, riducendo così il tempo di calcolo e il consumo di memoria.
Come funziona l’indice FAISS?
FAISS utilizza tecniche di indicizzazione avanzate come:
- Quantizzazione vettoriale: Riduce le dimensioni dei vettori e semplifica la ricerca.
- Partizionamento: Divide il dataset in sottoinsiemi più piccoli per migliorare la velocità.
- Clustering e grafi approssimativi: Raggruppa i dati in cluster per eseguire ricerche approssimate, ma accurate.
Tecniche di Retrieval-Augmented Generation (RAG)
Le tecniche RAG sono metodi ibridi che combinano modelli di recupero delle informazioni con modelli generativi di linguaggio. In questo contesto, FAISS gioca un ruolo cruciale. RAG opera in due fasi:
- Fase di Recupero: Viene utilizzato FAISS per cercare documenti o frammenti di testo rilevanti in base alla query o alla domanda iniziale. L’indice FAISS recupera i vettori di contesto simili alla query dell’utente, permettendo di circoscrivere le informazioni rilevanti.
- Fase di Generazione: Dopo aver ottenuto i documenti più pertinenti tramite FAISS, un modello generativo come GPT o BERT elabora questi dati per fornire una risposta contestuale e precisa.
Come si usa FAISS?
L’utilizzo di FAISS segue diversi passaggi chiave:
- Creazione dell’Indice: Il primo passo è costruire un indice FAISS a partire da un insieme di dati. Ad esempio, se si desidera indicizzare un corpus di testi, è necessario prima trasformare i documenti in vettori numerici attraverso una tecnica di embedding (ad esempio, usando modelli come BERT o OpenAI).
- Aggiunta dei Vettori: Una volta creato l’indice, si aggiungono i vettori che rappresentano i dati. FAISS permette di memorizzare milioni (o miliardi) di vettori.
- Ricerca: Quando un utente pone una query, questa viene trasformata in un vettore, e FAISS effettua una ricerca nell’indice per trovare i vettori più simili.
- Restituzione dei Risultati: I risultati della ricerca vengono utilizzati per recuperare i dati originali o per fornire ulteriori risposte generate con modelli di intelligenza artificiale.
Vantaggi di FAISS
- Efficienza e Scalabilità: FAISS è ottimizzato per funzionare su enormi dataset, anche su scala miliardaria.
- Supporto per GPU: FAISS supporta l’accelerazione hardware con GPU, rendendo le ricerche ancora più veloci.
- Flessibilità: Permette di utilizzare diverse tecniche di indicizzazione e metriche di similarità.
Esempio:
import faiss from sentence_transformers import SentenceTransformer import numpy as np import openai # Imposta la tua API key di OpenAI openai.api_key = 'LA_TUA_API_KEY' # Sostituisci con la tua chiave API # 1. Carica il modello per generare gli embeddings model = SentenceTransformer('all-MiniLM-L6-v2') # 2. Dataset di esempio documents = [ "Il gatto siede sul tappeto.", "Il cane abbaia alla luna.", "Gli uccelli volano nel cielo.", "Il pesce nuota nell'acqua.", "Il sole splende luminoso oggi.", "Piove molto in autunno.", "La luna è piena stasera.", "Le stelle brillano nel cielo notturno.", "Il vento soffia forte questa mattina.", "La neve cade silenziosamente." ] # 3. Genera gli embeddings per i documenti document_embeddings = model.encode(documents) # 4. Crea un indice FAISS embedding_dimension = document_embeddings.shape[1] index = faiss.IndexFlatL2(embedding_dimension) # 5. Aggiungi gli embeddings all'indice index.add(document_embeddings) # 6. Query di esempio query = "C'è una tempesta di neve in arrivo." # 7. Genera l'embedding della query query_embedding = model.encode([query]) # 8. Effettua la ricerca nell'indice k = 3 # Numero di risultati desiderati distances, indices = index.search(query_embedding, k) # 9. Recupera i documenti più simili retrieved_documents = [documents[idx] for idx in indices[0]] # 10. Combina i documenti in un unico contesto context = "\n".join(retrieved_documents) # 11. Definisci il prompt per il modello generativo prompt = f""" Context: {context} Domanda: {query} Risposta:""" # 12. Chiamata all'API di OpenAI response = openai.Completion.create( engine="text-davinci-003", # Assicurati che l'engine sia disponibile per te prompt=prompt, max_tokens=150, temperature=0.7, n=1, stop=None, ) # 13. Stampa la risposta generata print("\nRisposta Generata:") print(response.choices[0].text.strip())
Di seguito il risultato:
Risposta Generata: Sembra che presto nevicherà intensamente. Preparati per la tempesta di neve in arrivo!
La ricerca semantica è stata effettuata confrontando i vettori generati, che rappresentano documenti, tramite la distanza distanza euclidea (L2), che misura la differenza tra due vettori nello spazio n-dimensionale. E’ importante sapere che FAISS ordina i risultati in base alla distanza, dove i vettori con la distanza più breve rispetto al vettore di query sono considerati i più simili, da cui l’algoritmo euclideo per verificare frasi semanticamente simili. |
Oltre alla distanza euclidea (L2), FAISS supporta diversi altri algoritmi e metriche di distanza per il recupero di informazioni simili. Alcuni di questi includono:
1. Distanza Coseno (Cosine Similarity)
L’algoritmo basato sulla similarità coseno misura l’angolo tra due vettori, piuttosto che la distanza euclidea tra essi. È particolarmente utile quando la direzione dei vettori è più importante della loro magnitudine, come accade nei testi o negli embeddings di parole. Questo metodo è spesso utilizzato in Natural Language Processing (NLP), poiché confronta vettori su una scala da -1 a 1, dove 1 indica la massima somiglianza (stessa direzione) e -1 la massima diversità (direzioni opposte).
Quando usarlo: Se vuoi confrontare documenti, parole o frasi, dove il contenuto semantico è più importante della lunghezza assoluta dei vettori.
2. Distanza Manhattan (L1 Norm)
La distanza Manhattan, o L1, misura la somma delle differenze assolute tra le componenti dei vettori. Rispetto alla distanza euclidea, questo algoritmo è più robusto rispetto agli outliers (valori estremamente grandi o piccoli). In alcuni casi, specialmente in immagini o dati che contengono rumore, può offrire risultati più stabili.
Quando usarlo: In scenari in cui i dati contengono rumore o valori estremamente variabili, e si desidera una metrica meno sensibile a questi cambiamenti rispetto alla distanza euclidea.
3. Distanza di Jaccard
La distanza di Jaccard è una misura della dissimilarità tra due insiemi. Si utilizza spesso in problemi di clustering o matching tra insiemi o dati discreti, come sequenze di parole, stringhe o insiemi di elementi distinti. Viene calcolata come 1 meno l’intersezione divisa per l’unione degli insiemi.
Quando usarlo: Se stai confrontando insiemi di dati o stringhe, come nel caso di analisi di testo o matching di profili o prodotti.
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.
Comments