SISTEMI ESPERTI

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:

  1. La base di conoscenza
  2. I fatti noti
  3. Il Motore Inferenziale
  4. l'Interfaccia Utente

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.