Una risposta RAG non diventa affidabile perché contiene un link. Serve un contratto tra recupero, modello e lettore: quale passaggio è stato usato, di quale versione del documento, e quale affermazione sostiene?
Un contratto minimo per i passaggi
Ogni frammento recuperato dovrebbe portare almeno document_id, version, chunk_id, testo e punteggio. L'identificativo rende citabile il passaggio; la versione permette di capire se la fonte era corrente al momento della risposta.
Questo esempio filtra passaggi con versione attuale e punteggio sufficiente. Se non resta alcuna evidenza, restituisce None invece di costruire un contesto vuoto e sperare che il modello inventi una risposta.
from dataclasses import dataclass
@dataclass(frozen=True)
class Chunk:
document_id: str
version: str
chunk_id: str
text: str
score: float
def build_context(chunks, current_versions, min_score=0.75):
accepted = [c for c in chunks
if c.score >= min_score
and current_versions.get(c.document_id) == c.version]
if not accepted:
return None, [] # abstain: no current evidence
citations = [f"{c.document_id}@{c.version}#{c.chunk_id}"
for c in accepted]
context = "\n\n".join(f"[{ref}] {chunk.text}"
for ref, chunk in zip(citations, accepted))
return context, citations
chunks = [Chunk("policy-7", "v3", "p12", "Serve una verifica.", 0.91)]
context, citations = build_context(chunks, {"policy-7": "v3"})
assert citations == ["policy-7@v3#p12"]Esempio eseguibile con dati in memoria. Il punteggio non è una garanzia di verità: la soglia va calibrata sui dati e sulla domanda. Il controllo di versioni richiede un catalogo affidabile.
Il passaggio che manca in molte demo
Il contesto costruito sopra è solo l'input del modello. Dopo la generazione serve verificare che le citazioni presenti nella risposta siano tra quelle recuperate e che le affermazioni importanti siano effettivamente sostenute dai passaggi. Un riferimento formalmente valido può essere comunque irrilevante.
Un test utile
Metterei nello stesso indice una procedura corrente e una superata, molto simili nel testo. La risposta corretta deve usare solo quella corrente, conservare l'ID del passaggio e astenersi quando la versione valida non risponde alla domanda. È un test più interessante del semplice “la risposta sembra buona?”.
Nel libro tratto RAG e Agentic RAG come scelte architetturali: quando il sistema decide autonomamente nuove ricerche, occorre osservare anche la sequenza di query, i documenti scartati e i motivi della selezione.
Se questi temi ti interessano, li approfondisco in Architetture Agentiche, con pattern, casi guida, scelte di progetto, metriche e modalità di guasto.
Scopri il libro su Amazon ↗