6 ottobre 2011

Rappresentazione della conoscenza nei chatbot

Con la nascita del Web, i chatbot di cui abbiamo parlato negli scorsi post sono stati usati a fini statistici per studi sul linguaggio naturale.
Molti sperimentatori hanno notato che, dato un fissato sito internet, la distribuzione delle richieste dei diversi files presenti non è uniforme. Indicando con x un arbitrario documento e con y il numero degli accessi a quel documento, la distribuzione delle richieste tende nel tempo alla curva y=1/x. Se questa curva viene tracciata su scala logaritmica su entrambi gli assi, è una retta con coefficiente angolare -1, cioè una distribuzione Zipf.
Come già accennato in precedenza, la Zipf è anche la distribuzione probabilistica dei linguaggi naturali. Se un linguaggio avesse tutte parole la cui occorrenza nelle frasi è equiprobabile, allora la distribuzione delle parole sarebbe una linea retta orizzontale, in realtà quello che si osserva è che ogni lingua ha parole più probabili e parole meno probabili, e la distribuzione è una Zipf.
La comparsa del web nel 1994 ha dato per la prima volta la possibilità di condurre esperimenti di intelligenza artificiale su milioni di clients; i precedenti esperimenti, tra cui anche ELIZA, usavano protocolli come il telnet, ma il web ha dato la possibilità di collezionare dati su una scala precedentemente inimmaginabile.
A differenza di ELIZA, scritto interamente il LISP, i progetti della famiglia di A.L.I.C.E. presentano tutti doppie realizzazioni in Java e in C/C++ con queste ultime usate mediante CGI nelle interfacce web. Inoltre tali progetti si avvalgono di un particolare XML realizzato ad hoc, chiamato AIML (Artificial Intelligence Markup Language) con il quale si implementa la personalità dell'entità.
Il progetto ILN (Interprete di linguaggio naturale), invece ha attualmente un'implementazione in Java e - per scelta implementativa - non si avvale di nessun XML o linguaggio di scripting di supporto, il progetto infatti intende dimostrare, tra le altre cose, anche la non necessità di nessuna struttura di scripting: tutta la definizione della personalità e della conoscenza dell'entità avviene mediante semplici files di testo.
Storicamente, ILN nasce nel marzo 2002 come semplice client telnet, poi nel maggio 2002, al fine di permettere il colloquio con più client in contemporanea, è stata implementata l'interfaccia IRC, attualmente è in fase di sviluppo e test una versione per la chat di Facebook. Anche la caratteristica di poter dialogare cohttp://www.blogger.com/img/blank.gifn più client contemporaneamente è unica, cioè non risulta implementata negli altri progetti come A.L.I.C.E. ed Ella.

ELIZA non prevedeva alcuna rappresentazione di conoscenza.
Nei sistemi della famiglia di A.L.I.C.E., tutta la conoscenza è inserita mediante AIML. L'unità di base di conoscenza viene chiamata "categoria". Una categoria è una coppia ordinata formata da un input e da un output. Ogni categoria può opzionalmente appartenere ad un "contesto". L'input (che spesso è una domanda) viene detto pattern, o anche stimolo la risposta viene detta template.
Non intendiamo addentrarci nei dettagli dell'AIML, rinviando i lettori interessati al manuale AIML.
L'AIML permette di usare due wildcards ("_" e "*") nei pattern, i caratteri sono case insensitive. I template sono le risposte da dare in corrispondenza dei pattern.
Il sistema ILN non fa uso di AIML.
Durante l'implementazione di ILN, si è preferito organizzare la conoscenza in semplici file ascii, ottenendo alla fine performance consistenti con quelle dei sistemi basati su AIML. L'unica limitazione di ILN rispetto ai sistemi AIML è al momento quello della mancanza di wildcards.
La conoscenza in ILN è implementata come segue.
Ogni elemento di conoscenza è una coppia ordinata (r,s) dove r è la risposta allo stimolo ed s è lo stimolo stesso. r ed s possono essere formati da tutti i caratteri alfanumerici con la sola limitazione:

lunghezza(r) + lunghezza(s) < 65535

A livello implementativo, ogni elemento di conoscenza è scritto su una riga, l'elemento separatore tra stimolo e risposta è la sequenza di caratteri " --- ". Di conseguenza, ogni riga ha la forma:

risposta allo stimolo --- stimolo

Possono esistere anche più risposte in corrispondenza di uno stesso stimolo:

risposta 1 allo stimolo --- stimolo

risposta 2 allo stimolo --- stimolo

...

risposta n allo stimolo --- stimolo

In tal caso la risposta che verrà effettivamente data durante un dialogo viene selezionata casualmente al momento dell'esecuzione; di conseguenza, sottoponendo due volte lo stesso stimolo, si possono ottenere risposte differenti.
Tutti gli elementi di conoscenza sono organizzati in due file. Un primo file, chiamato base viene caricato ad ogni esecuzione di un qualunque ILN, di conseguenza, gli elementi di conoscenza presenti nel file base sono comuni a tutti gli ILN. Un secondo file, il cui nome varia da ILN a ILN, viene caricato al momento dell'esecuzione di una particolare istanza di ILN, di conseguenza, ILN diversi avranno il secondo file diverso. Tale secondo file contiene gli elementi di conoscenza che servono a fissare gusti e personalità di un particolare personaggio realizzato mediante ILN. E' possibile realizzare nuove personalità semplicemente costruendo una nuova istanza di questo secondo file e modificando le risposte ai diversi stimoli.
Con l'AIML si implementa la ricorsione mediante un apposito tag. Anche con ILN è possibile la ricorsione all'interno della base di conoscenza.
La ricorsione viene usata per molteplici scopi, nel settore dell'intelligenza artificiale, all'interno del sistema ILN viene usata in particolare per:

Symbolic Reduction: una frase grammaticalmente complessa viene ridotta ad una frase più semplice.
Mappatura dei sinonimi: per ottenere la stessa risposta ad input che dicono la stessa cosa ma con parole diverse.
Correzione di errori di ortografia o di digitazione nello stimolo.
Una qualunque combinazione dei tre casi precedenti.

La ricorsione viene implementata mediante la sequenza di caratteri "REC" posizionata in testa ad una riga; la sintassi di REC è:

REC stimolo al quale rivolgersi --- stimolo

Se c'è una riga del tipo:

risposta --- stimolo uno

si può forzare la stessa risposta anche ad un nuovo stimolo inserendo una riga come la seguente:

REC stimolo uno --- stimolo due

Il rischio nell'uso della ricorsione è che essa permette di cadere in errori durante la costruzione di una personalità che possono generare dei loop, per cui è necessario fare attenzione ad evitare di inserire righe come le seguenti:

REC stimolo uno --- stimolo due
REC stimolo due --- stimolo uno

Symbolic Reduction
Per Symbolic reduction si intende il processo di semplificazione di forme grammaticali complesse in forme più semplici. Si tratta di un processo che a livello subconscio viene eseguito costantemente dal cervello umano; per esempio se qualcuno chiede ad una persona "chi è Socrate?" ottiene in generale la stessa risposta all'eventuale domanda: "conosci chi fu Socrate?", questo avviene perchè il nostro cervello effettua una riduzione da un'espressione più complicata ad una più semplice, riconoscendo che si tratta di frasi che presentano gli stessi contenuti. La riduzione simbolica può essere realizzata in un ILN senza lavorare a livello di codice, ma semplicemente inserendo nel file di conoscenza una riga del tipo:

REC espressione semplice --- espressione complessa

Nel caso del nostro esempio:

REC conosci chi fu Socrate --- chi è Socrate

Correzione errori
L'errore più comune di chi dialoga con un ILN è il commettere errori di digitazione, cosa frequente in una chat, ad esempio al posto di "ciao" l'utente digita spesso "cia".
Un piccolo numero di errori di questo tipo può essere corretto a livello di ricorsione nelle righe di conoscenza, ad esempio:

REC ciao --- cia

In certi casi è possibile anche fare in modo che sia l'ILN a correggere l'utente.
I sistemi AIML supportano anche un complesso sistema per il calcolo dei predicati unari. Tale meccanismo negli ILN è ancora in fase di analisi e sviluppo.

2 commenti:

  1. Molto completo e interessante l'articolo (e in generale l'intero blog), complimenti!

    RispondiElimina
  2. Grazie Tobby! Passa da queste parti ogni tanto ;)

    RispondiElimina