Retrieval dense e sparse: compromessi
Comprenda quando gli embedding dense non individuano corrispondenze esatte tra parole chiave e quando BM25 non riconosce parafrasi semantiche, e perché la combinazione dei due metodi supera costantemente ciascuno di essi preso singolarmente.
Retrieval dense e sparse: compromessi è una lezione AI Engineering Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Engineering Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Engineering Academy include 4 lezioni in totale.
Due segnali di recupero fondamentalmente diversi
I moderni sistemi di recupero si basano su due segnali distinti: il recupero denso codifica il significato in spazi vettoriali continui, mentre il recupero sparso conta le occorrenze esatte dei termini. Questi segnali sono complementari, non intercambiabili. Comprendere i punti di forza e di debolezza di ciascuno è il primo passo per costruire un sistema che li utilizzi entrambi in modo efficace.
Come funzionano gli embedding densi
Il recupero denso mappa la query e ogni documento in un vettore ad alta dimensionalità utilizzando un encoder neurale. La similarità viene misurata tramite la distanza coseno o il prodotto scalare tra i vettori. Poiché l'encoder è stato addestrato su grandi corpora di testo, le frasi semanticamente correlate finiscono vicine nello spazio vettoriale anche se non condividono alcuna parola: questo è il principale vantaggio del recupero denso.
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed(text: str) -> list[float]:
resp = client.embeddings.create(
model='text-embedding-3-small',
input=text,
)
return resp.data[0].embedding
def cosine_similarity(a, b):
a, b = np.array(a), np.array(b)
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
q = embed('How do I cancel my subscription?')
d = embed('Steps to unsubscribe from the service')
print(cosine_similarity(q, d)) # high similarity despite different wordsDove il recupero denso non funziona
I modelli densi incontrano difficoltà con i termini rari scarsamente rappresentati durante l'addestramento dell'encoder. Una query contenente un numero di modello specifico come RTX-4090-Ti-OC, il nome di un farmaco o un identificatore interno proprietario spesso non riesce a trovare il documento corretto, perché l'encoder non dispone di una rappresentazione appresa per quella sequenza di token. Il vettore finisce semplicemente in una posizione poco utile nello spazio degli embedding.
Come funziona il recupero sparso BM25
BM25 (Best Matching 25) è una funzione probabilistica di ranking che assegna un punteggio ai documenti in base alla frequenza con cui i termini della query compaiono nel documento, normalizzando il risultato in base alla lunghezza del documento e attenuandolo in caso di saturazione della frequenza dei termini. Produce un vettore di punteggi sparso: la maggior parte delle dimensioni è pari a zero, perché i documenti contengono solo una piccola frazione del vocabolario.
# BM25 scoring formula (conceptual)
# score(D, Q) = sum over query terms t of:
# IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D|/avgdl))
# k1 controls term frequency saturation (typically 1.2-2.0)
# b controls document length normalization (typically 0.75)
# IDF(t) = log((N - df(t) + 0.5) / (df(t) + 0.5))
# N = total documents, df(t) = documents containing term t
# tf(t,D) = frequency of t in document D, |D| = doc length, avgdl = average doc lengthPunti di forza di BM25: termini esatti e gergo tecnico
BM25 eccelle nelle query che contengono termini tecnici esatti, nomi di prodotto, codici di errore e identificatori numerici che devono corrispondere con precisione. Una query per ORA-01017 (un codice di errore Oracle) assegnerà ai documenti contenenti quella stringa esatta un ranking molto più alto rispetto ai documenti che parlano semplicemente di autenticazione dei database in termini generali. Ciò è impossibile per un modello denso che non abbia mai incontrato quel codice specifico.
from rank_bm25 import BM25Okapi
corpus = [
'Oracle database ORA-01017 invalid username or password logon denied',
'Database authentication and connection troubleshooting guide',
'How to resolve login errors in Oracle and MySQL databases',
]
tokenized_corpus = [doc.lower().split() for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus)
query = 'ORA-01017 error fix'
scores = bm25.get_scores(query.lower().split())
print(dict(zip(range(len(corpus)), scores)))
# doc 0 scores highest because it contains ORA-01017Dove BM25 non funziona: parafrasi e sinonimi
BM25 non riconosce le parafrasi semantiche. Un documento sulla "riparazione del motore di un'automobile" otterrà un punteggio pari a zero per una query sulla "manutenzione del motore di un'auto", perché nessuna delle parole esatte coincide. Questo problema di mancata corrispondenza del vocabolario, talvolta chiamato divario lessicale, fa sì che la ricerca basata esclusivamente sulle parole chiave perda enormi quantità di contenuti pertinenti che esprimono semplicemente la stessa idea con parole diverse.
from rank_bm25 import BM25Okapi
corpus = [
'automobile engine repair and maintenance tips',
'car motor maintenance guide for beginners',
'vehicle powertrain service intervals',
]
tokenized = [doc.split() for doc in corpus]
bm25 = BM25Okapi(tokenized)
scores = bm25.get_scores(['car', 'motor', 'maintenance'])
print(scores)
# doc 1 scores high, doc 0 and 2 score lower despite being semantically relatedRisultati dei benchmark: la ricerca ibrida vince con costanza
I benchmark su BEIR, MS MARCO e sui dataset aziendali di domande e risposte mostrano con costanza che il recupero ibrido supera il recupero esclusivamente denso o sparso del 5-15 percento in termini di NDCG@10. Il miglioramento è maggiore nei dataset che combinano ricerche di fatti (dove BM25 è utile) e query formulate come parafrasi (dove sono utili gli embedding densi). Nessun singolo metodo di recupero prevale su tutti i tipi di query.
Analisi del tipo di query: quale retriever vince
È possibile prevedere quale retriever avrà prestazioni migliori analizzando il tipo di query. Il recupero denso prevale nelle domande concettuali, nelle parafrasi e nelle query su argomenti generali. BM25 prevale nelle query che contengono nomi propri, numeri di versione, frammenti di codice, acronimi e termini tecnici rari. Il recupero ibrido vince sempre quando il tipo di query non è noto in anticipo, situazione che in produzione si verifica quasi sempre.
# Query type heuristics
def predict_retriever_advantage(query: str) -> str:
tokens = query.split()
has_numbers = any(t[0].isdigit() for t in tokens)
has_uppercase_acronyms = any(t.isupper() and len(t) > 2 for t in tokens)
is_short = len(tokens) <= 4
if has_numbers or has_uppercase_acronyms:
return 'BM25 likely wins (exact terms)'
elif is_short:
return 'Dense likely wins (semantic matching needed)'
else:
return 'Hybrid recommended (mixed signals)'Problema dell'incompatibilità dei punteggi
La combinazione di risultati densi e sparsi non è banale, perché i relativi punteggi si trovano su scale incompatibili. La similarità coseno produce valori compresi tra -1 e 1, mentre BM25 produce punteggi positivi non limitati che dipendono dalle dimensioni del corpus. Non è possibile semplicemente sommarli. La soluzione standard consiste nell'utilizzare una fusione basata sul ranking anziché una fusione basata sui punteggi, unendo liste ordinate invece dei punteggi grezzi.
Decisione pratica: quando utilizzare ciascun metodo
Utilizzate il recupero solo denso quando il corpus appartiene a un ambito ristretto, con un vocabolario coerente, e avete bisogno di generalizzazione semantica tra parafrasi. Utilizzate solo BM25 quando le query sono principalmente di tipo lookup, con identificatori esatti, e il dataset è abbastanza piccolo da rendere praticabile la ricerca esaustiva. Utilizzate un approccio ibrido in tutti i sistemi RAG di produzione in cui i tipi di query variano: l'overhead è contenuto e il miglioramento del recall è significativo.
Compromessi tra prestazioni e infrastruttura
Il recupero denso richiede una ricerca approssimata dei vicini più prossimi accelerata da GPU o un database vettoriale, con un conseguente aumento dei costi infrastrutturali. BM25 viene eseguito interamente sulla CPU con un indice invertito ed è estremamente veloce. Il recupero ibrido richiede entrambi i componenti infrastrutturali, oltre a un passaggio di fusione. La complessità aggiuntiva è giustificata dal miglioramento del recall nella maggior parte dei casi d'uso di produzione, ma deve essere valutata in rapporto al budget infrastrutturale.
Verifica rapida
Verificate la vostra comprensione dei compromessi tra recupero denso e sparso illustrati in questa lezione.
Riepilogo della lezione
In questa lezione avete imparato che il recupero denso cattura il significato semantico, ma non gestisce bene i termini esatti rari; il recupero sparso BM25 gestisce le parole chiave esatte, ma non riconosce le parafrasi; e il recupero ibrido supera costantemente entrambi i metodi presi singolarmente per tipi di query diversi. I relativi punteggi sono incompatibili e devono essere combinati tramite la fusione dei ranking, anziché tramite la somma dei punteggi. Nel prossimo passaggio implementeremo la ricerca per parole chiave BM25 in Python.
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Retrieval dense e sparse: compromessi» è gratuita?
Sì — il testo completo di «Retrieval dense e sparse: compromessi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Engineering Academy, passa a CoddyKit PRO. Il corso AI Engineering Academy include 4 lezioni in totale.
Cosa imparerò in «Retrieval dense e sparse: compromessi»?
Comprenda quando gli embedding dense non individuano corrispondenze esatte tra parole chiave e quando BM25 non riconosce parafrasi semantiche, e perché la combinazione dei due metodi supera costantem… Eserciti AI Engineering Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Engineering Academy?
Non è richiesta alcuna esperienza precedente. AI Engineering Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Retrieval dense e sparse: compromessi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Engineering Academy?
Sì. Ogni lezione AI Engineering Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Retrieval dense e sparse: compromessi
- Implementare la ricerca per parole chiave con BM25
- Reciprocal Rank Fusion per unire i punteggi
- Ricerca ibrida in Pinecone e pgvector