Un
Sistema Esperto è un programma che può essere scritto in qualsiasi
linguaggio, può risiedere su qualsiasi supporto di memoria ed essere
eseguito da un qualsiasi calcolatore.
La sua denominazione esplicita già in partenza il suo compito: un sistema
esperto trasforma il calcolatore in un "esperto"
in un certo campo.
Un sistema esperto è un programma in cui è memorizzata "un'esperienza"
opportunamente codificata. Dal punto di vista dell'utente, l'uso di un sistema
esperto consiste in un dialogo fra l'uomo e la macchina. Un Sistema Esperto
è in grado di operare in un dominio non descrivibile da modello matematico;
a differenza dei programmi tradizionali non vede un mondo fatto di numeri, ma
un universo composto di parole e frasi. Le informazioni di cui si avvale possono
derivare da una conoscenza empirica, non formalizzata, fondata esclusivamente
sulla pratica e sull'esperienza, senza cognizioni teoriche e scientifiche (empirica
deriva dalla parola greca empeirikos).
Lo scopo di un sistema esperto è quello di fornire all'utente un certo
risultato, vale a dire la soluzione di un determinato problema. Tale risultato
viene ottenuto attraverso una ricerca euristica.
La parola "euristica" deriva dal
greco eurisko (trovare) e significa metodo di ricerca della verità basato
sulla documentazione dei fatti. La ricerca euristica in contrapposizione a quella
algoritmica consiste nel trovare una soluzione ipotizzando tutte le soluzioni
possibili verosimili e cercando di verificarle attraverso una documentazione
di cause e fonti.
L'unico punto a favore dei metodi algoritmici è che sono più sicuri,
in quanto effettuano una ricerca esaustiva senza venire influenzati da informazioni
fuorvianti. I metodi euristici sono invece più efficenti e "umani"
ma anche più rischiosi: può capitare infatti che la soluzione
non venga trovata semplicemente perchè non viene tentata, o venga trovata
solo in parte a causa di documentazioni insufficienti o male interpretate.
Un Sistema Esperto si definisce trasparente quando si "vede" il suo
funzionamento e si capisce perchè ha prodotto un certo risultato. Nel
dialogo con un Sistema Esperto, l'utente può chiedere il perchè
di una certa domanda o di una certa deduzione e il Sistema Esperto fornisce
prontamente la spiegazione. Durante il colloquio con l'utente esso assume un
ruolo di maestro, di consulente; ha un atteggiamento personale e superiore e
non ammetterebbe mai di poter imparare qualcosa dall'utente; il motivo di ciò
è legato al fatto che l' esperienza di un Sistema Esperto è fissata
nella base di conoscenza e stabilisce che l'utente sia meno esperto del sistema.
La base di conoscenza viene redatta a mano dal programmatore o meglio da una
persona che viene chiamata "ingegnere della conoscenza".
La base di conoscenza di un Sistema Esperto può venire ampliata e modificata,
ma sempre in sessioni separate dal dialogo con l'utente. Un sistema esperto
ha un'interfaccia amica poichè permette di dialogare con esso senza essere
degli specialisti, nè tantomeno competenti in informatica.
Struttura di un Sistema Esperto
Nella maggior parte dei casi l'architettura di un Sistema Esperto è formata da quattro caratteristiche principali:
La
base di conoscenza contiene l'esperienza del Sistema Eperto; è un'area
di memoria in cui sono immagazinate frasi (che possono essere in qualsiasi lingua)
che costituiscono la "conoscenza" del campo di applicazione. Per rappresentare
la conoscenza sono spesso utilizzati gli alberi di classificazione o di decisione
(A.D.). Infatti, essendo essi costituiti
da diversi rami, con maggiore facilità è possibile ricavare la
regola che corrisponde ad ogni ramo completo dell'albero di decisione.
I fatti noti contengono informazioni temporanee attinenti al problema che il
sistema esperto sta tentando di risolvere in quel momento, cioè i dati
del problema.
Queste informazioni sono utili al fine di risolvere il problema attuale, una
volta ottenuta la soluzione si possono cancellare. Il motore inferenziale è
un algoritmo che scandisce in ordine opportuno la base di conoscenza al fine
di reperire documentazione, selezionare ipotesi e costruire la soluzione del
problema.
La selezione di una regola dalla base di conoscenza avviene in seguito a un'analisi
dei fatti noti e a un colloquio con l'utente. In sostanza il motore inferenziale
è quella parte di programma che, utilizzando l'esperienza contenuta nella
base di conoscenza, effettua delle riduzioni e rende possibile un colloquio
senz'altro pertinente. Ciò significa che le domande vengono poste all'utente
solo se correlate ai fatti che fino a quel momento sono noti.
L'interfaccia utente analizza la frase, risolve le eventuali ambiguità,
la interpreta in maniera pertinente al problema e la codifica in un formato
comprensibile al motore inferenziale. Quest'ultimo utilizzerà l'informazione
per proseguire il suo lavoro di scanzione della base di conoscenza.
La
Base di Conoscenza
L'esperienza di un Sistema Esperto può essere rappresentata in diversi
modi, la più comune è quella che fa uso di regole di produzione.
Una regola di produzione ha la seguente forma:
SE X ALLORA Y
dove x e y sono stringhe di caratteri, ad esempio:
SE è freddo ALLORA devi coprirti
Le
frasi comprese fra se e allora si chiamano antecedenti, quella che appare dopo
allora si chiama conseguente. Il nome produzione è dovuto al fatto che
il conseguente descrive lo stato di cose che viene prodotto se gli antecedenti
sono soddisfatti.
Quando in una regola compaiono più antecedenti, separati da una virgola,
questi si intendono concatenati da una "e". Quando più regole
hanno lo stesso conseguente, significa che i rispettivi antecedenti sono concatenati
da una "o". Quando il conseguente di una regola è uguale all'antecedente
di un'altra regola, queste si intendono concatenate da una deduzione.
Una base di conoscenza formata da regole come quelle viste sopra viene detta
sinergica (attività simultanee più
enti che collaborano per un medesimo effetto).
Per riempire una base di conoscenza non è necessario analizzare il problema
nella sua concretezza nè avere una visione di insieme nè tantomeno
studiare reti a grafici che evidenzino le correlazioni fra varie regole. Basterà
inserire regole sparse, preoccupandosi solo del fatto che abbiano un senso compiuto
di per se e un significato nell'ambito del programma in questione.
Il motore inferenziale, scandendo in modo opportuno tale base di conoscenza,
darà all'utente l'impressione di dialogare con un sistema estremamente
ordinato, in cui si segue un filo logico e ogni domanda è pertinente.
In una base di conoscenza è possibile modificare una regola o aggiungerne
altre senza di dover conoscere le restanti, poichè le regole sono indipendenti
una dall'altra. Questo è un enorme vantaggio, soprattutto quando il numero
di regole è elevato.
Il
motore Inferenziale
Il motore inferenziale e'un programma costituito da un interprete che decide
quale regola applicare per poter aumentere la base di conoscenza e da uno schedulatore
che organizza le regole da sviluppare e il loro ordine di esecuzione. Il compito
del motore è estrarre le regole utili alla soluzione del problema secondo
un meccanismo di riconoscimento e attivazione delle stesse, eseguendo un esame
delle regole nella base di conoscenza, selezionare la regola più appropriata,
eseguire la regola e registrare nella memoria di lavoro l'azione, ripetendo
finchè non trova la possibile soluzione. Esso è organizzato in
due parti : una memoria di lavoro (o lavagna) dove viene memorizzato il piano
generale di soluzione ed un'agenda delle cose ancora da fare, oltre ad una descrizione
della soluzione o delle soluzioni per ora ipotizzate. Nel motore inferenziale
vi è inoltre il rafforzatore di consistenza; questo è un modulo
che una volta che sia stata generata un'ipotesi di soluzione cerca, sfruttando
specifiche sorgenti di conoscenza, evidenze che permettono di rafforzare o scartare
l'ipotesi fatta. Quindi, se l'inferenza è una singola deduzione che il
sistema è in grado di trarre dalle premesse (ad esempio un singolo calcolo),
il motore inferenziale è lo strumento con cui il sistema determina, in
maniera ordinata, il complesso delle inferenze.
A tal proposito va ricordato che esistono due tipi di inferenza:
Inferenza
Deduttiva\Inferenza Induttiva
La parola deduzione significa procedimento logico per ricavare una verità
particolare a partire da una verità generale. Data una regola generale,
una deduzione consiste nell'applicare la regola a un caso particolare per ottenere
un risultato. Il contrario di deduzione è induzione in cui si ricava
una regola generale a partire da un insieme di esempi particolari.
Un algoritmo di inferenza deduttiva applica le regole, contenute nella base
di conoscenza, a un caso particolare, contenuto nei fatti noti, e ne trae alcune
conclusioni.
L'inferenza deduttiva viene chiamata dagli addetti ai lavori "forward
chaining" cioè concatenamento in avanti, perchè
partendo da fatti noti si applicano le regole in avanti allo scopo di dedurre
altri fatti.
In contrapposizione al forward chaining vi è il "bachward
chaining", cioè il concatenamento all'indietro. Questo
algoritmo parte da un possibile risultato e va a verificare l'esistenza di una
regola capace di fornire un risultato simile; man mano che si applicano le regole,
se ne rendono applicabile altre con un procedimento ciclico, fino a quando non
si trova una regola i cui antecedenti siano fatti noti, quindi verificati per
definizione.
L'Interfaccia
Utente
L'interazione tra l'utente e il sistema esperto avviene tramite un dialogo.
Tale dialogo viene reso possibile con l'impiego di display grafici che sono
in grado di mostrare immaggini di varia natura, grafica, sonora o linguaggio
naturale.
Il sistema consente all'utente di chiedere il "perchè" dei
quesiti che gli vengono proposti al terminale ed, a conclusione della sessione
di lavoro e cioè dopo aver visualizzato o parlato una particolare deduzione,
"come" questa è stata ricavata da parte del sistema. Inoltre
deve prevedere funzioni di salvataggio, stampa in vari formati ecc..
Shell
di un Sistema Esperto
Nell'ambito
dei Sistemi Esperti lo Shell, che è una parola inglese che significa
conchiglia, guscio, rivestimento, viene utilizzato per indicare il rivestimento
della base di conoscenza, cioè tutto ciò che si trova tra quest'ultima
e l'utente: il motore inferenziale è l'interfaccia utente.
Lo shell quindi è un Sistema Esperto privo di conoscenza, perchè
ha una conoscenza vuota. Esso è il programma privo di dati, e di conseguenza
non eseguibile.
Uno shell è uno strumento molto appetibile commercialmente perchè
mette in grado un utente di costruirsi il propio Sistema Esperto con pochissimo
sforzo.
Per creare una base di conoscenza non è necessario essere specialisti
di programmazione nè di informatica, basterà prendere il concetto
di regola di produzione e conoscere il formato con cui esprimerla. Per poter
sviluppare una base di conoscenza occorre essere esperti nel dominio di applicazione:
la base di conoscenza di un Sistema Esperto in medicina, ad esempio sarà
necessariamente elaborata da un medico; quella di un Sistema Esperto in legge
da un avvocato e così via. Naturalmente non si può pretendere
che un medico o un avvocato conoscano i linguaggi di programmazione; occorre
dunque separare lo sviluppo di un programma, a cura di specialisti di informatica,
da quello di una base di conoscenza, effettuato da esperti nel settore di applicazione.
Sviluppare una base di conoscenza ben fatta e ben interpretabile dallo shell
a disposizione non è un impresa facile. Innanzitutto, ogni shell richiederà
un certo qual formato per le regole di produzione, in secondo luogo ogni dominio
di applicazione avrà le proprie regole correlate più o meno strettamente
fra di loro.
Al fine di facilitare lo sviluppo e la manutenzione delle basi di conoscenza,
è utile definire un linguaggio di sviluppo che permette di esprimere
le regole di produzione in maniera facilmente comprendibile e offra all'utente
dei comandi per la gestione della base di conoscenza. La maggior parte degli
shell in commercio è corredata di strumenti ausiliari per lo sviluppo
incrementale della base di conoscenza (compilatori interfacce, strumenti di
verifica, ...).
Per trasformare un Sistema Esperto in uno shell occorre:
Nonostante
l'esistenza di questi strumenti, lo sviluppo di una base di conoscenza rimane
sempre il punto critico per la buona riuscita del Sistema Esperto. Il problema
sta nel fatto che il cervello umano non è sempre pienamente cosciente
dei ragionamenti che sta effettuando; i problemi, spesso, vengono elaborati
nel subconscio e la soluzione appare sotto la forma di intuizione. Questa caratteristica
tipica della mente umana rende difficile il compito di tradurre in regole di
produzione la propia esperienza personale. Per sviluppare una base di conoscenza
è quindi preferibile che l'esperto sia affiancato da una persona che
conosca a fondo il linguaggio di sviluppo e abbia la capacità di modellare
la realtà in termini di regole di produzione. Tale persona prenderà
il nome di "ingegnere della conoscenza"
e svolgerà un ruolo intermedio fra l'esperto nel campo di applicazione
e il programmatore.
Il compito dell'ingegnere della conoscenza è di effettuare una serie
di colloqui con l'esperto, o gli esperti, al fine di individuare la struttura
del problema da risolvere e tradurre nel linguaggio di sviluppo le associazioni
mentali e i processi deduttivi emersi durante i colloqui. La base di conoscenza
viene poi costruita in modo incrementale e modulare, aggiungendo o modificando
di volta in volta le opportune regole di produzione.
La figura dell'ingegnere della conoscenza differisce sia da quella dell'analista
sia da quella del programmatore. Non sarà infatti necessario conoscere
i linguaggi di programmazione nè tantomeno le problematiche hardware
e software del sistema. Sarà sufficiente avere una certa pratica del
linguaggio di sviluppo e della funzionalità dello shell a disposizione.
Ovviamente la medesima persona potrà assumere il ruolo di ingegnere della
conoscenza per lo sviluppo di più basi di conoscenza, nei più
svariati campi.
Differenze
rispetto ai programmi tradizionali
Tradizionalmente
i computer vengono utilizzati in quei settori dove le capacità umane
sono limitate e i compiti affidati al calcolatore sono complessi, ripetitivi
e gestiscono grandi quantità di dati. Con i sistemi esperti, il calcolatore
diventa più simile all'uomo perchè cerca di imitarlo. Per questo
motivo rientrano nella sfera dell'Intelligenza Artificiale, poichè tentano
di riprodurre artificialmente dei comportamenti che richiedono capacità
intellettive. I sistemi esperti tendono a subire una presenza umana al contrario
dei sistemi tradizionali che servono a potenziare le capacità dell'uomo,
ma non prevedono di sostituirle.
Un'altra differenza fondamentale riguarda la struttura interna; tradizionalmente
un programma è definito passo passo in modo deterministico e la sua abilità
si trova nei codici; nei sistemi esperti invece l'esperienza non è espressa
tramite dei codici ma memorizzata in forma simbolica nella così detta
base di conoscenza, una struttura di dati facilmente dominabile e modificabile
dall'uomo.
L'aspetto più innovativo è il fatto che la conoscenza, o l'esperienza
non deve necessariamente essere coerente e seguire uno schema predefinito, infatti
può anche operare su una base di conoscenza contradittoria, incopleta
o incerta.