Cosa è l’indice FAISS e come si usa : Tecniche RAG

AI, INTELLIGENZA ARTIFICIALE

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:

  1. 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.
  2. 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:

  1. 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).
  2. 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.
  3. 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.
  4. 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.

 

Se vuoi farmi qualche richiesta o contattarmi per un aiuto riempi il seguente form

    Comments