Rete neurale e grafo di conoscenza: come funzionano insieme
Quando le informazioni aumentano, il problema non è soltanto conservarle. È riuscire a trovare quelle pertinenti e, soprattutto, capire come sono collegate.
Un documento può rimandare a una procedura, una procedura può richiedere una competenza e quella competenza può essere associata a un corso. Le singole informazioni sono utili, ma spesso la risposta che serve si trova proprio nelle relazioni tra loro.
È da questa osservazione che sono partito per realizzare un sistema nel quale una rete neurale semplice e un grafo di conoscenza svolgono compiti diversi e complementari. Alla rete ho affidato un ruolo di orientamento. Al grafo ho affidato la rappresentazione dei dati e dei loro collegamenti.
L’immagine che descrive meglio questa scelta è quella di un viaggio: la rete neurale è il pilota, il grafo è la mappa. Il pilota contribuisce a scegliere la direzione; la mappa descrive i luoghi raggiungibili e le strade disponibili. Il viaggio, però, richiede anche regole: non basta indicare una destinazione per autorizzare qualsiasi percorso.
Prima della rete, ho costruito la mappa
Per spiegare il funzionamento di questa architettura conviene partire dal grafo, non dall’intelligenza artificiale.
Un grafo è una struttura composta da elementi e collegamenti. Nel linguaggio tecnico, gli elementi si chiamano nodi, mentre i collegamenti si chiamano archi. Un grafo di conoscenza usa questa struttura per descrivere oggetti identificabili e relazioni con un significato preciso.
In un esempio ipotetico dedicato alla formazione, un nodo potrebbe rappresentare un corso e un altro una competenza. La relazione tra i due potrebbe indicare che quel corso richiede quella competenza come prerequisito:
Corso avanzato ── richiede ──> Competenza di base
Questo collegamento non equivale a scrivere due parole vicine in un documento. È un’associazione esplicita, che un programma può verificare e percorrere.
Ho scelto il grafo perché mi permette di distinguere ciò che esiste da ciò che lo collega ad altro. Un corso, una competenza e un documento mantengono la propria identità; le relazioni descrivono come possono essere consultati insieme.
Il risultato è una mappa interrogabile. Una domanda come «Quali corsi richiedono questa competenza?» diventa la ricerca di nodi collegati attraverso una relazione definita.
Non significa che il grafo sia sempre la scelta migliore. Per un semplice elenco, una tabella può essere più che sufficiente. Il grafo diventa interessante quando le relazioni fanno parte della domanda, non quando serve soltanto mostrare righe e colonne.
Il ruolo della rete: riconoscere una direzione possibile
Una volta organizzati i dati, resta un problema: come collegare una richiesta dell’utente alle operazioni disponibili sulla mappa?
Una persona non descrive necessariamente ciò che cerca usando i nomi esatti presenti nei dati. Può utilizzare un sinonimo, omettere un dettaglio o formulare una domanda in modo diverso da quello previsto dall’applicazione.
Ho introdotto la rete neurale per contribuire a questo passaggio. Il suo compito non è contenere tutte le informazioni, ma assegnare un punteggio a possibili direzioni della ricerca.
Per esempio, una richiesta potrebbe essere orientata verso la consultazione di un elemento specifico, un elenco di elementi collegati oppure un conteggio. Sono operazioni differenti: prima di recuperare i dati, occorre stabilire quale abbia senso prendere in considerazione.
La rete che ho realizzato è un classificatore feed-forward. Il termine può sembrare complicato, ma il principio è semplice: riceve numeri in ingresso, li elabora e produce punteggi in uscita. “Feed-forward” significa che il calcolo procede in avanti, senza tornare ciclicamente sui passaggi precedenti.
Non è un modello linguistico generativo e non scrive liberamente la risposta. In questa architettura il suo ruolo è più ristretto e osservabile: aiutare a scegliere una destinazione tra quelle previste.
Come trasformo una domanda in numeri
Una rete neurale lavora con valori numerici, non direttamente con le frasi. Prima di eseguire il calcolo devo quindi trasformare il testo in una rappresentazione adatta.
Ho scelto una soluzione semplice: un vocabolario di termini utili alla ricerca. Dopo aver uniformato il testo, verifico quali termini sono presenti e costruisco una sequenza di valori. Ogni posizione corrisponde a una parola: vale 1 se quella parola compare e 0 se non compare.
Un esempio didattico chiarisce il meccanismo. Con il vocabolario:
[corsi, competenze, fotografia, disponibili]
la richiesta «Corsi di fotografia» può essere rappresentata così:
[1, 0, 1, 0]
Questa sequenza si chiama vettore: in questo caso è semplicemente un elenco ordinato di numeri. Il suo compito è segnalare alla rete quali indizi ha trovato nel testo.
La semplicità ha però un costo. La presenza delle parole non descrive tutto il significato della frase. «Cerco corsi di fotografia» e «Non cerco corsi di fotografia» contengono segnali simili, ma esprimono intenzioni diverse.
Per questo non considero questa codifica una comprensione generale del linguaggio. È una rappresentazione limitata, utile per un compito circoscritto e da accompagnare con controlli appropriati.
Dentro la rete: pesi, somme e attivazione
Il passaggio successivo consiste nel dare un’importanza diversa ai segnali individuati.
In una rete neurale questa importanza è espressa dai pesi. Un peso stabilisce quanto un ingresso contribuisce al punteggio di una determinata uscita. Se un termine è utile a riconoscere una destinazione, può ricevere un peso positivo; se non è pertinente, il suo contributo può essere zero.
Ho utilizzato un solo strato denso, senza strati nascosti. Significa che ogni uscita dispone di un peso per ciascun ingresso. I pesi sono raccolti in una matrice, cioè una tabella numerica: le righe corrispondono alle uscite e le colonne agli ingressi.
Per ogni uscita, il sistema moltiplica gli ingressi per i rispettivi pesi, somma i contributi e aggiunge un termine chiamato bias. Quest’ultimo permette di spostare il valore di partenza di una determinata uscita.
La formula riassume queste operazioni:
y = ReLU(W × x + b)
Qui x è il vettore di ingresso, W la matrice dei pesi, b il vettore dei bias e y l’insieme dei punteggi ottenuti. La funzione ReLU lascia invariati i valori positivi e porta a zero quelli negativi.
Non serve conoscere l’algebra delle matrici per seguire l’idea: ogni possibile destinazione accumula un punteggio in base ai segnali ricevuti.
Se, in un esempio inventato, due segnali contribuiscono con valori pari a 3 e 2, il totale è 5, prima di eventuali altri contributi. Quel numero esprime il risultato del calcolo. Non significa “5% di probabilità” e non certifica che la destinazione sia corretta.
Una distinzione importante: calcolo non significa addestramento
Nella versione che ho realizzato, i pesi sono costruiti attraverso regole esplicite. Non sono il risultato di un addestramento sui dati.
L’addestramento è il processo con cui i pesi vengono modificati sulla base di esempi e di un criterio di ottimizzazione. L’inferenza, invece, è l’utilizzo dei pesi già disponibili per calcolare un’uscita a partire da nuovi ingressi.
Ho realizzato il secondo passaggio senza attribuirgli le proprietà del primo. Questa scelta mi permette di esaminare i coefficienti e seguire il contributo dei singoli segnali. Non dimostra, da sola, che il sistema sappia generalizzare a qualsiasi formulazione della richiesta.
Dal punteggio al percorso sul grafo
Il punto più delicato non è ottenere un numero. È decidere che cosa quel numero consente di fare.
Ho mantenuto separate la proposta della rete e l’esecuzione dell’operazione. Le uscite vengono associate a percorsi previsti dall’applicazione: consultare un elemento, seguirne determinati collegamenti, recuperare un insieme di risultati.
Tra proposta ed esecuzione intervengono controlli sui riferimenti e sui parametri. Il sistema deve verificare che l’elemento esista, che l’operazione sia disponibile e che la richiesta non presenti un’ambiguità irrisolta.
Il percorso generale è questo:
Richiesta dell’utente
↓
Riconoscimento dei riferimenti e dei segnali utili
↓
Proposta della direzione di ricerca
↓
Controllo dell’operazione e dei parametri
↓
Consultazione del grafo
↓
Presentazione dei dati recuperati
Non ho imposto che ogni ricerca debba passare necessariamente dalla rete. Se l’utente fornisce un identificativo esatto, una regola deterministica può risolvere il riferimento direttamente. Per “deterministica” intendo una regola che, a parità di dati e condizioni, restituisce lo stesso risultato.
La componente neurale è quindi una parte del sistema, non un obbligo da applicare a ogni passaggio.
Che cosa accade quando la richiesta non è chiara
La metafora del pilota diventa particolarmente utile quando la destinazione è incerta.
Se qualcuno chiede di raggiungere “il centro”, un navigatore non dovrebbe scegliere arbitrariamente tra più luoghi possibili. Allo stesso modo, una ricerca può corrispondere a più elementi del grafo.
Ho distinto due situazioni. Nella prima esistono alternative plausibili: il sistema può mostrarle e chiedere una scelta. Nella seconda mancano riferimenti sufficienti: il sistema può dichiarare di non avere trovato una corrispondenza utilizzabile.
Questa seconda situazione viene chiamata astensione. Non significa che la rete abbia maturato una consapevolezza dei propri limiti. Significa che l’applicazione applica criteri espliciti per non procedere in determinate condizioni.
Anche la richiesta di un chiarimento è una decisione progettuale. Non scegliere può essere più corretto che trasformare un punteggio debole in una risposta apparentemente certa.
Una mappa completa, un’area di lavoro alla volta
Quando i dati crescono, distinguo l’insieme complessivo delle informazioni dalla porzione utilizzata per una singola operazione.
È ciò che accade consultando una mappa: l’intero territorio rimane disponibile, ma sullo schermo viene mostrata soprattutto l’area utile al percorso. Nel sistema ho adottato lo stesso principio, mantenendo separati la ricerca dei riferimenti e il contesto attivo di elaborazione.
Questa scelta aiuta a contenere il lavoro richiesto a ogni interrogazione e a rendere più leggibili i risultati. Impone però una distinzione da non nascondere all’utente: ciò che è presente nell’intero insieme dei dati non coincide necessariamente con ciò che è stato interrogato nella vista corrente.
Un riepilogo globale e il risultato di un’operazione su una selezione sono due informazioni diverse. Le considero entrambe utili, purché sia chiaro da dove provengono.
Perché questo metodo può adattarsi a contesti diversi
L’architettura non dipende dal nome degli oggetti rappresentati. Dipende dalla possibilità di definire entità, relazioni e operazioni significative.
In una biblioteca, le relazioni potrebbero collegare opere, autori e argomenti. Nella formazione, potrebbero descrivere corsi e prerequisiti. In un catalogo di prodotti, potrebbero rappresentare accessori e compatibilità. Nella documentazione, potrebbero unire procedure, versioni e riferimenti.
Sono esempi di possibili applicazioni, non sistemi che dichiaro già realizzati. Il principio trasferibile è la divisione del lavoro: una componente orienta la ricerca, una struttura conserva le relazioni e un insieme di controlli stabilisce come consultarle.
Adattare il metodo richiede comunque progettazione. Bisogna scegliere quali relazioni rappresentare, quali domande supportare e come verificare i risultati. Non basta sostituire il vocabolario per ottenere automaticamente una soluzione adatta a un nuovo settore.
Che cosa rende utile questa separazione
Il vantaggio che cerco non è affidare tutto a un unico componente intelligente. È poter ricostruire ciò che è successo.
Se una ricerca non funziona, posso distinguere un problema di riconoscimento della richiesta da un collegamento mancante o da una fonte non aggiornata. Se un risultato viene mostrato, posso separare il punteggio che ha contribuito a orientare la ricerca dai dati effettivamente recuperati.
Questa leggibilità non elimina gli errori. Un grafo può contenere informazioni sbagliate; un classificatore può proporre una direzione non pertinente. Anche l’utilità della rete va misurata confrontandola con alternative più semplici, su richieste di valutazione separate da quelle utilizzate per mettere a punto il sistema.
Ho quindi costruito una base osservabile, non una promessa di infallibilità. La sua caratteristica centrale è mantenere riconoscibili tre responsabilità: orientare la richiesta, rappresentare le informazioni ed eseguire operazioni controllate.
La rete è il pilota. Il grafo è la mappa. I controlli stabiliscono quali strade si possono percorrere.
È questa collaborazione, più della dimensione del modello, a dare forma al lavoro che ho realizzato.