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?

Domanda, recupero, fonti versionate, sintesi LLM e verifica delle affermazioni
La verifica delle citazioni è un passaggio distinto dalla generazione del testo. Il recupero deve conservare identità e versione delle fonti.

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.

02 / Contesto con riferimentiPython 3 · libreria standard
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.

ProvenienzaDocumento, versione e passaggio devono restare associati.
AstensioneSe l’evidenza manca, il sistema lo dichiara.
VerificaLe affermazioni vanno confrontate con le fonti, non solo con gli ID.

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 ↗