Contextual Retrieval
Il recupero contestuale antepone a ogni segmento una nota scritta da un LLM che ne indica la posizione nel documento, così gli embedding e BM25 trovano i passaggi giusti.
Il recupero contestuale è una tecnica di indicizzazione per la generazione aumentata dal recupero (RAG) in cui un modello linguistico di grandi dimensioni (LLM) legge ogni documento completo e scrive una breve nota, di solito da 50 a 100 token, che colloca al suo interno un blocco di testo. La nota viene anteposta al blocco prima che questo venga trasformato in embedding e aggiunto a un indice per parole chiave, così la ricerca può trovare informazioni che il blocco, da solo, non menziona. Anthropic ha introdotto il recupero contestuale nel settembre 2024.
Il problema che risolve#
Le pipeline RAG suddividono i documenti in blocchi abbastanza piccoli da consentire un embedding preciso e inserirne diversi nella finestra di contesto di un modello; spesso, però, un blocco estratto dal documento perde i fatti che ne consentirebbero il recupero. L'esempio di Anthropic è un blocco tratto da un documento finanziario che recita: «I ricavi dell'azienda sono aumentati del 3% rispetto al trimestre precedente». Non specifica né l'azienda né il trimestre, quindi non contiene nulla che corrisponda a una domanda sui ricavi di ACME nel secondo trimestre del 2023, né per gli embedding né per la ricerca per parole chiave. Il recupero contestuale lo archivia così: «Questo blocco proviene da un documento depositato presso la SEC sulla performance di ACME corp nel secondo trimestre del 2023; i ricavi del trimestre precedente erano pari a 314 milioni di dollari. I ricavi dell'azienda sono aumentati del 3% rispetto al trimestre precedente».
Anche i ritagli di oggetti perdono il contesto, proprio come i blocchi di testo. La soluzione di ritaglio degli oggetti di Ultralytics esegue YOLO26 su immagini o video e salva ogni rilevamento in un file separato, crop_1.jpg, crop_2.jpg e così via, per cui un ritaglio mostra un camion ma non indica da quale fotocamera, sito o scena proviene. Indicizzare ogni ritaglio con un breve prefisso che descriva il fotogramma di origine, per esempio il nome della fotocamera, l'ora e gli altri oggetti rilevati nelle vicinanze, ripristina il contesto per la ricerca per parole chiave e la ricerca semantica.
Come funziona il recupero contestuale#
Per ogni blocco, l'LLM riceve il documento completo e il blocco, con la richiesta di «fornire un contesto breve e conciso che collochi questo blocco all'interno del documento complessivo, allo scopo di migliorare il recupero del blocco nelle ricerche». Anthropic ha usato Claude 3 Haiku con la memorizzazione nella cache dei prompt, che elabora ogni documento una volta e lo riutilizza per tutti i suoi blocchi, stimando il costo una tantum in 1,02 dollari per milione di token del documento. I blocchi contestualizzati vengono inseriti in un indice di embedding («embedding contestuali») e in un indice per parole chiave BM25 («BM25 contestuale»). Al momento della query, si eseguono ricerche in entrambi gli indici e si uniscono i risultati, come nella ricerca ibrida; poi un riordinatore assegna un punteggio ai primi 150 candidati e i 20 blocchi migliori vengono inseriti nel prompt.
L'embedding del blocco di esempio, con e senza contesto, mostra l'effetto sulla ricerca vettoriale:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# Anthropic's example chunk and the context an LLM wrote for it from the full filing
chunk = "The company's revenue grew by 3% over the previous quarter."
context = "This chunk is from an SEC filing on ACME corp's performance in Q2 2023; the previous quarter's revenue was $314 million."
other = "Globex Corporation reported that Q2 2023 revenue fell 2% on weaker demand."
query = "How did ACME's revenue change in Q2 2023?"
candidates = {"plain chunk": chunk, "contextual chunk": f"{context} {chunk}", "Globex chunk": other}
# Cosine similarity of the query to each indexed text
scores = model.similarity(model.encode(query), model.encode(list(candidates.values())))[0]
for name, score in zip(candidates, scores):
print(f"{name}: {score:.2f}")Il blocco semplice ottiene un punteggio di 0.49 rispetto alla domanda, uguale a quello di un blocco relativo a un'altra azienda. Anteponendo il contesto, il punteggio del blocco sale a 0.83 e si colloca nettamente al primo posto.
Recupero contestuale e tecniche correlate#
- Late chunking: fornisce all'embedding di ogni chunk il contesto del documento tramite l'attenzione del modello di embedding, senza chiamate a un LLM per ogni chunk. Il testo memorizzato del chunk resta invariato, quindi la ricerca per parole chiave non trae alcun vantaggio.
- Chunking semantico: determina dove iniziano e finiscono i chunk. Si combina con il recupero contestuale, che integra ciò che ogni chunk lascia implicito.
- Prefissi di titoli e intestazioni: la pratica più economica e ormai superata di anteporre a ogni chunk lo stesso titolo del documento o della sezione. Il recupero contestuale scrive una nota diversa per ogni chunk.
- Ingegneria del contesto: la pratica più ampia di decidere cosa inserire nella finestra di contesto di un modello al momento dell'inferenza. Il recupero contestuale interviene un passaggio prima, su ciò che viene indicizzato.
Incrementi misurati#
Anthropic ha misurato gli errori di recupero come 1 meno recall@20, ovvero la percentuale di query il cui chunk pertinente mancava dai primi 20 risultati. La pipeline di riferimento ha fallito nel 5,7% delle query. Gli embedding contestuali hanno ridotto il valore al 3,7%, con una riduzione del 35%; aggiungendo BM25 contestuale, il valore è sceso al 2,9%, con una riduzione del 49%. Il reranking dei risultati combinati ha portato il tasso di errore all'1,9%, con una riduzione del 67% rispetto al riferimento.










