20 – GraphRAG: quando cercare significa seguire relazioni

Dentro l’IA 20, GraphRAG: cercare seguendo le relazioni. Tessere avorio con bordi petrolio collegate da aste in ottone, sul pannello della collana con libri, taccuino e mappamondo.

Un documento dice quale ente ha emesso un atto. Un secondo indica il progetto approvato. Un terzo ne nomina il responsabile. La risposta esiste, ma non si trova tutta nello stesso frammento. Cercare soltanto passaggi simili alla domanda può lasciare fuori un collegamento decisivo.

La domanda di questo episodio è: quando conviene trasformare persone, enti, atti e progetti in una rete di relazioni, invece di limitarsi a recuperare testo? GraphRAG mette al centro questa possibilità. Per valutarla occorre distinguere il meccanismo generale di recupero su grafi dal progetto Microsoft che porta questo nome, e confrontare il beneficio con il lavoro necessario a costruire e mantenere la rete.

In breve

  • I frammenti rispondono alla domanda «quali passaggi sono pertinenti?»; il grafo permette anche di seguire relazioni esplicite tra entità.
  • Le due rappresentazioni possono collaborare: il grafo orienta la ricerca e i documenti sostengono la risposta.
  • Un collegamento nel grafo è affidabile solo quanto l’estrazione, l’identificazione delle entità e le fonti che lo giustificano.
  • Nel progetto Microsoft, ricerca locale e sintesi globale dei temi usano il grafo in modi diversi.
  • Per domande semplici, dati già strutturati o archivi piccoli, il costo aggiuntivo può non convenire.

Dalla somiglianza al collegamento

In un RAG basato su frammenti, il sistema seleziona testi mediante ricerca lessicale, vettoriale o ibrida, eventualmente seguita da un riordinamento. Questo funziona bene quando il passaggio cercato contiene direttamente la risposta. Non implica che ogni sistema debba fermarsi alla prima ricerca: sono possibili riscrittura della domanda, ricerche iterative e filtri sui metadati.

Un grafo introduce un’altra rappresentazione. I nodi identificano oggetti del dominio, come un ente o un progetto. Gli archi registrano relazioni, come «emette», «approva» e «è responsabile di». La ricerca può partire da un’entità riconosciuta nella domanda e percorrere collegamenti pertinenti, recuperando infine anche i testi associati. Un arco non dimostra causalità: «collabora con» non significa «controlla» o «finanzia».

Non è necessario che ogni grafo provenga da un LLM o sia ospitato in un database specializzato. Alcune relazioni possono arrivare da dati strutturati verificati. L’elemento distintivo dell’approccio è usare quella struttura per costruire il contesto della risposta, conservando il collegamento alle evidenze.

Un esempio svolto: chi segue il progetto?

Consideriamo un archivio minuscolo e interamente inventato. Tutte le informazioni dell’esempio sono riferite allo stesso momento; non ci sono sostituzioni di incarico o atti revocati. I quattro documenti contengono queste affermazioni:

FonteAffermazione
D1L’ente Aurora emette l’Atto 17.
D2L’Atto 17 approva il progetto Orione.
D3Marta è responsabile del progetto Orione.
D4L’ente Aurora nomina Marta.

Chiediamo: «Chi è responsabile del progetto approvato da un atto emesso da Aurora?». D1 identifica l’atto, D2 collega l’atto al progetto e D3 collega il progetto alla persona. La risposta è Marta, sulla base di D1, D2 e D3. D4 aggiunge contesto, ma da una generica nomina non possiamo ricavare l’incarico sul progetto specifico.

Grafo sintetico: Aurora emette l’Atto 17, che approva Orione; Marta è responsabile di Orione ed è nominata da Aurora. Ogni arco riporta la propria fonte D1, D2, D3 o D4.
Schema originale con dati inventati. Il percorso di risposta richiede D1, D2 e D3. D4 non prova, da solo, l’incarico specifico.

Se il contesto iniziale contenesse soltanto D1 e D2, sapremmo quale progetto cercare ma non chi lo segue. Una ricerca successiva su Orione potrebbe trovare D3 anche senza grafo. La rete rende esplicito questo passaggio e permette di controllare quali tipi di relazione stiamo seguendo. Non elimina il problema del recupero: lo organizza diversamente.

Costruire il grafo è già una parte del problema

Per un archivio reale proporrei una costruzione in quattro passaggi: riconoscere le entità nel testo; assegnare identificativi stabili; estrarre relazioni con tipo e fonte; verificare le associazioni prima di usarle. È una scelta progettuale per il nostro scenario, non la descrizione obbligatoria di ogni implementazione GraphRAG.

Il punto delicato è l’identità. «Ente Aurora», una sua abbreviazione e un vecchio nome potrebbero indicare la stessa organizzazione. Due persone chiamate Marta potrebbero invece essere diverse. Fonderle soltanto perché condividono il nome crea percorsi inesistenti. Servono identificativi, regole di disambiguazione e un modo per lasciare irrisolti i casi ambigui.

Ogni relazione dovrebbe conservare documento, versione, pagina o passaggio, data di validità e stato della verifica. «Marta era responsabile» e «Marta è responsabile» non sono intercambiabili. Se una fonte descrive una proposta, la relazione non va promossa silenziosamente a decisione approvata. Contraddizioni e negazioni devono rimanere riconoscibili, non dissolversi in un unico arco senza qualificazioni.

Che cosa fa il progetto Microsoft GraphRAG

Il flusso documentato da Microsoft parte da unità testuali, estrae entità e relazioni e costruisce comunità di entità collegate. Produce inoltre resoconti delle comunità e rappresentazioni vettoriali per gli elementi che richiedono ricerca semantica. L’estrazione delle affermazioni è un passaggio opzionale. Questa descrizione si riferisce al flusso standard: esistono configurazioni e metodi differenti, da verificare nella versione adottata.

Il paper di Darren Edge e colleghi, presentato il 24 aprile 2024 e rivisto il 19 febbraio 2025, studia in particolare domande globali su collezioni testuali. Riporta miglioramenti di completezza e diversità delle risposte rispetto alla baseline usata dagli autori, per i compiti e i dataset esaminati. Questo risultato non prova una superiorità generale su qualunque domanda, lingua o archivio amministrativo.

Stato del software al 30 ottobre 2026: il repository Microsoft dichiara il progetto prevalentemente in manutenzione, con correzioni e aggiornamenti delle dipendenze ma senza nuovi sviluppi previsti. Specifica inoltre che il codice dimostrativo non è un’offerta Microsoft ufficialmente supportata. Questo conta nella scelta operativa del software e non annulla l’interesse del metodo.

Ricerca locale e visione globale

La ricerca locale del progetto Microsoft usa entità semanticamente collegate alla richiesta come punti d’accesso. Combina informazioni strutturate del grafo con testi originali e altri elementi pertinenti, selezionandoli entro un budget di contesto. È vicina all’intuizione del nostro esempio, pur essendo più articolata del semplice percorso su quattro relazioni.

La ricerca globale affronta invece domande come «quali temi ricorrono nell’intero archivio?». Usa resoconti generati sulle comunità, ricava risposte intermedie e le aggrega. Scegliere comunità più dettagliate può aumentare il materiale da elaborare. Una sintesi dei temi è un prodotto diverso da una verifica puntuale dell’incarico di una persona: per quest’ultima occorre tornare alle prove specifiche.

È quindi impreciso ridurre tutto GraphRAG a «fare tre salti nel grafo». Il piccolo laboratorio seguente isola soltanto quel meccanismo di collegamento. Non implementa estrazione automatica, comunità, embedding o generazione di una risposta linguistica.

Una piccola prova riproducibile

Questo Python usa solo la libreria standard. Le quattro relazioni sono codificate manualmente dai documenti inventati; non sono state estratte da un modello. La funzione segue i tipi di relazione richiesti e restituisce nome e fonti:

edges = [
('Aurora', 'emette', 'Atto17', 'D1'),
('Atto17', 'approva', 'Orione', 'D2'),
('Marta', 'responsabile', 'Orione', 'D3'),
('Aurora', 'nomina', 'Marta', 'D4'),
]
def answer(rows):
out = []
for a, r, act, s1 in rows:
if (a, r) != ('Aurora', 'emette'):
continue
for b, t, project, s2 in rows:
if (b, t) != (act, 'approva'):
continue
for person, role, p, s3 in rows:
target = ('responsabile', project)
if (role, p) == target:
sources = (s1, s2, s3)
out.append((person, sources))
return out
print(answer(edges))
expected = [('Marta', ('D1', 'D2', 'D3'))]
assert answer(edges) == expected
assert answer(edges[:2]) == []
reduced = [e for e in edges if e[3] != 'D3']
assert answer(reduced) == []

Il codice è stato eseguito per questo articolo e restituisce [('Marta', ('D1', 'D2', 'D3'))]. Le asserzioni verificano anche che D1 e D2 da soli non bastino e che, eliminando D3, non esista più una risposta sostenuta dal percorso definito. Il programma non conclude che nessuno sia responsabile: segnala che nel piccolo insieme disponibile manca la relazione necessaria.

Non è un confronto sperimentale con la ricerca vettoriale: non abbiamo misurato richiamo, latenza o accuratezza di un retriever. Abbiamo verificato una proprietà circoscritta, cioè la dipendenza della risposta da tre collegamenti espliciti. Cambiando schema o dati, vanno aggiornati anche i controlli.

Il costo: prima costruire, poi mantenere

Un conto economico utile comprende preparazione dei documenti, estrazione, verifica delle identità, generazione delle sintesi, memorizzazione e aggiornamento. A ogni domanda aggiungiamo identificazione delle entità, selezione del sottografo, recupero delle prove ed eventuali chiamate al modello. Il repository ufficiale invita a considerare il costo dell’indicizzazione e a sperimentare su scala ridotta.

Come esempio puramente ipotetico, supponiamo che il grafo costi 60 euro in più da costruire e faccia risparmiare 0,02 euro per domanda, senza differenze di qualità o manutenzione. Servirebbero 3.000 domande per recuperare quel costo. Se ogni aggiornamento richiedesse altri 20 euro, il punto di equilibrio cambierebbe. Sono numeri illustrativi, non prezzi o misure di GraphRAG: il beneficio può anche essere una qualità superiore, anziché un risparmio per chiamata.

Occorre poi limitare l’espansione. Un ente collegato a migliaia di atti può riempire il contesto di materiale irrilevante. Si controllano tipi di relazione, profondità, date, numero di candidati e budget di token. Più collegamenti non equivalgono automaticamente a più informazione utile.

Quando il grafo non conviene

SituazionePrima opzione da valutare
Risposta in un singolo paragrafoRicerca ibrida e buon riordinamento.
Dati con chiavi e relazioni già verificateQuery sul sistema strutturato, eventualmente con spiegazione tramite LLM.
Pochi documenti letti raramenteRicerca semplice o lettura diretta.
Molti nomi ambigui e pochi riscontriMigliorare identificazione e fonti prima di ampliare il grafo.
Domande frequenti tra documenti diversiProvare l’espansione per relazioni e misurarne il vantaggio.

Se tutte le relazioni necessarie esistono già in tabelle affidabili, ricostruirle da testo con un LLM può aggiungere errori inutili. Viceversa, un archivio narrativo può richiedere un lavoro di estrazione importante prima di diventare interrogabile come rete. La scelta dipende dalla domanda e dalla forma dei dati, non dalla presenza di un database a grafo nel progetto.

Come valutare il vantaggio sul proprio archivio

  • Preparare domande con risposte e prove annotate: fatti singoli, collegamenti tra documenti, sintesi globali e casi senza elementi sufficienti.
  • Confrontare con una baseline credibile: ricerca lessicale e vettoriale, metadati, riordinamento ed eventualmente una seconda ricerca. Usare gli stessi documenti e modello di risposta.
  • Misurare correttezza, copertura delle prove e citazioni, oltre a tempi, costi iniziali e manutenzione. Controllare anche le relazioni estratte erroneamente.
  • Provare omonimie, atti revocati, incarichi scaduti e contraddizioni. Un percorso formalmente valido su dati sbagliati produce una risposta sbagliata.
  • Applicare i permessi anche a relazioni e sintesi: filtrare solo il documento finale non basta se il resoconto ha già incorporato informazioni riservate.

Partirei da un sottoinsieme e da un tipo di relazione utile, mantenendo una traccia delle evidenze per ogni risposta. Solo dopo un confronto favorevole allargherei il grafo. La rete deve aiutare a trovare e verificare i collegamenti che servono, senza diventare una nuova fonte opaca da credere sulla parola.

Il valore del grafo non è mostrare più connessioni: è rendere controllabile il percorso che porta dalla domanda alle prove.

DALLA MIA BIBLIOTECA

Ingegneria dell’IA di Chip Huyen, presente nel catalogo Libri del blog, è una lettura pertinente per collocare retrieval, valutazione e costi nella progettazione dell’applicazione completa. Il riferimento specifico a GraphRAG resta affidato al paper e alla documentazione primaria qui sotto.

Per approfondire

La documentazione online evolve: per una prova di produzione conviene registrare release, configurazione, modelli e prompt effettivamente usati.

Nel percorso: 03 — Context engineering; 04 — Quando la ricerca vettoriale non basta; 09 — LLM in produzione. Sono le basi per comprendere contesto, recupero e costo del sistema.


← Torna al percorso Dentro l’IA

Commenti

Lascia un commento