Oltre il RAG ingenuo
Limiti del recupero di base.
Oltre il RAG ingenuo è una lezione AI Prompt Engineering 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 Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa fa il RAG ingenuo
Il RAG ingenuo è la baseline: suddivide i documenti in chunk, li incorpora, memorizza i vettori, incorpora la query, recupera i top-k in base alla similarità coseno, inserisce i chunk nel prompt e genera la risposta. È un ottimo punto di partenza, ma su larga scala presenta modalità di errore prevedibili.
Comprendere queste modalità di errore è il prerequisito per le tecniche avanzate (re-ranking, compressione e riscrittura delle query) trattate in questo corso.
def naive_rag(query, k=5):
q = embed(query)
chunks = vector_store.search(q, k) # top-k by cosine
context = '\n\n'.join(c.text for c in chunks)
return llm('Context:\n' + context + '\n\nQ: ' + query)Recall e precisione del retrieval
Il top-k ingenuo ottimizza la similarità vettoriale grezza, che confonde la rilevanza con la vicinanza semantica superficiale. Si presenta quindi un compromesso: un k piccolo rischia di non trovare la risposta (recall basso); un k grande inonda il contesto di elementi fuorvianti (precisione bassa).
La similarità degli embedding che guida il retrieval è un'approssimazione grossolana della rilevanza effettiva ed è all'origine di diversi problemi a valle.
# The core dilemma
# small k -> may miss the gold chunk (recall problem)
# large k -> distractors crowd context (precision + cost problem)
# Advanced RAG decouples 'retrieve many' from 'use few'Il problema del disallineamento degli embedding
Le query e i documenti appartengono spesso a registri linguistici diversi: una domanda breve rispetto a un lungo passaggio dichiarativo. Gli embedding di un bi-encoder possono collocare una risposta rilevante lontano dalla domanda perché sono formulate in modo diverso (il problema del disallineamento del vocabolario).
Questo porta a tecniche come la riscrittura delle query e HyDE, che adattano la query allo spazio dei documenti prima del retrieval.
# Query: 'how do I revoke a token?'
# Doc: 'Token invalidation is performed via the /sessions endpoint.'
# Lexically and semantically distant -> bi-encoder may miss it
sim = cos(embed('how do I revoke a token?'),
embed('Token invalidation via /sessions')) # may be lowPerso nel mezzo
Anche quando il chunk corretto viene recuperato, l'inserimento di molti chunk provoca l'effetto lost-in-the-middle: il modello presta meno attenzione ai contenuti collocati al centro di un contesto lungo. Un chunk corretto, sepolto alla posizione 3 su 10, può essere di fatto ignorato.
Questo motiva il re-ranking (per collocare il chunk migliore dove il modello presta attenzione) e la compressione (per ridurre il contesto ed evitare che qualcosa rimanga sepolto).
# Retrieval rank != attention rank
# Place the highest-relevance chunk at the START or END,
# never stranded in the middle of a large concatenation.Sensibilità agli elementi fuorvianti
Gli LLM sono sensibili al contesto irrilevante. L'aggiunta di chunk plausibili ma errati può portare la risposta fuori strada, anche quando il chunk corretto è presente. Un contesto recuperato più ampio non è necessariamente migliore.
Per questo la precisione è importante: un contesto conciso, sottoposto a re-ranking e compresso spesso supera un grande insieme di chunk vagamente correlati.
# Empirically: appending a single highly-similar but WRONG chunk
# can flip a previously-correct answer. RAG quality depends on
# keeping distractors OUT, not just getting the gold chunk IN.Problemi del chunking
Il chunking a dimensione fissa divide le idee a metà frase, separa un'affermazione dalle relative prove e rimuove il contesto strutturale (quale sezione, quale documento). Un chunk che letto isolatamente sembra coerente può essere inutile o fuorviante senza ciò che lo circonda.
Le pipeline avanzate usano chunking consapevole della struttura, sovrapposizione, espansione al documento padre e metadati per preservare il significato.
def structure_aware_chunks(doc, max_tokens=400, overlap=50):
sections = split_by_headings(doc) # respect document structure
chunks = []
for sec in sections:
for c in sliding_window(sec.text, max_tokens, overlap):
chunks.append(Chunk(c, meta={'section': sec.title}))
return chunksLimiti del retrieval basato solo sulla semantica
Il retrieval denso puro non soddisfa le esigenze di corrispondenza esatta: identificatori, codici di errore, nomi propri rari e nomi di API. Sono proprio i casi in cui gli utenti si aspettano una precisione letterale. Il retrieval ibrido combina segnali densi (semantici) e sparsi (BM25/keyword) per coprire entrambe le esigenze.
La reciprocal rank fusion è un modo semplice e robusto per unire le due liste ordinate senza dover regolare un peso.
def rrf(dense_ranks, sparse_ranks, k0=60):
scores = {}
for ranks in (dense_ranks, sparse_ranks):
for rank, doc_id in enumerate(ranks):
scores[doc_id] = scores.get(doc_id, 0) + 1.0 / (k0 + rank)
return sorted(scores, key=scores.get, reverse=True)Contesto obsoleto e non verificabile
Il RAG ingenuo non considera la freschezza né la provenienza. Può recuperare documenti obsoleti e non offre un modo integrato per attribuire le affermazioni alle fonti, minando la fiducia e rendendo difficile rilevare le allucinazioni.
I sistemi avanzati associano metadati (timestamp, fonte, versione), applicano filtri su di essi e richiedono al generatore di citare gli ID dei chunk, così che le risposte siano verificabili.
def filtered_retrieve(q, after_date):
cands = vector_store.search(embed(q), k=50)
fresh = [c for c in cands if c.meta['date'] >= after_date]
return fresh # then re-rank; generator must cite c.idNessun feedback, nessun adattamento
Il RAG ingenuo recupera i contenuti alla cieca: non può capire quando il retrieval è fallito, non può decidere che non sia necessario alcun retrieval e non può iterare. I pattern avanzati aggiungono un controllo di rilevanza, il retrieval condizionale e un retrieval multi-step (agentico) che riformula la query quando i risultati sembrano deboli.
La pipeline diventa un ciclo con autovalutazione anziché un'unica esecuzione in avanti.
def adaptive_rag(q):
chunks = retrieve(q)
if relevance_score(q, chunks) < 0.4:
q2 = rewrite_query(q) # reformulate and retry
chunks = retrieve(q2)
if relevance_score(q, chunks) < 0.4:
return 'I could not find this in the sources.'
return generate(q, chunks)Lo stack RAG avanzato
Riunendo i diversi problemi, una pipeline avanzata stratifica: chunking consapevole della struttura con metadati, retrieval ibrido ad alto recall, un re-ranker basato su cross-encoder per la precisione, compressione del contesto per adattarlo e focalizzarlo, riscrittura delle query / HyDE per risolvere il disallineamento e un gate di rilevanza con citazioni.
Nelle prossime lezioni verrà costruito ciascun livello. Il filo conduttore è: recuperare in modo ampio, poi filtrare e perfezionare in modo deciso.
def advanced_rag(q):
cands = hybrid_retrieve(rewrite_query(q), k=50) # high recall
top = rerank(q, cands)[:8] # precision
ctx = compress(q, top) # focus + fit
return generate_with_citations(q, ctx) # verifiableMisurare prima di ottimizzare
Prima di aggiungere complessità, diagnostichi quale problema si sta realmente verificando. Misuri separatamente il retrieval recall@k (il chunk di riferimento viene recuperato?) e l'accuratezza della risposta (il generatore lo utilizza?). Un problema di recall e uno di precisione richiedono correzioni diverse.
Strumenti entrambe le parti; non aggiunga un re-ranker quando il problema reale riguarda il chunking o il disallineamento della query.
def diagnose(eval_set):
return {
'recall@5': recall_at_k(eval_set, k=5), # retrieval health
'recall@50': recall_at_k(eval_set, k=50), # ceiling with rerank
'answer_acc': answer_accuracy(eval_set), # generation health
}Verifica rapida
Diagnostichi una modalità di errore del RAG.
Riepilogo
Punti chiave:
- Il RAG ingenuo (chunk, embedding, top-k, inserimento nel prompt, generazione) è una baseline solida con modalità di errore prevedibili.
- La similarità del bi-encoder è un'approssimazione grossolana della rilevanza; il disallineamento tra il registro della query e quello del documento riduce il recall.
- Più contesto non significa risultati migliori: la sensibilità agli elementi fuorvianti e l'effetto lost-in-the-middle peggiorano le risposte all'aumentare di k.
- I problemi del chunking, i limiti del retrieval basato solo sulla semantica, l'obsolescenza e l'assenza di feedback limitano il RAG ingenuo.
- Il RAG avanzato recupera in modo ampio e poi filtra: retrieval ibrido, re-ranking, compressione, riscrittura delle query e gate di rilevanza. Prima di ottimizzare, misuri separatamente recall e accuratezza della risposta.
Domande Frequenti
La lezione «Oltre il RAG ingenuo» è gratuita?
Sì — il testo completo di «Oltre il RAG ingenuo» è 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 Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa imparerò in «Oltre il RAG ingenuo»?
Limiti del recupero di base. Eserciti AI Prompt Engineering 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 Prompt Engineering?
Non è richiesta alcuna esperienza precedente. AI Prompt Engineering 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 «Oltre il RAG ingenuo»?
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 Prompt Engineering?
Sì. Ogni lezione AI Prompt Engineering 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
- Oltre il RAG ingenuo
- Riordinamento dei chunk recuperati
- Compressione del contesto
- Riscrittura delle query e HyDE