Visualizzazione post con etichetta Artificial Intelligence. Mostra tutti i post
Visualizzazione post con etichetta Artificial Intelligence. Mostra tutti i post

giovedì 8 novembre 2007

CRUDeli variazioni


In Centomila miliardi di poesie, Queneau prende 10 sonetti, con le stesse rime, fa una striscia per verso e li impagina come in un gioco di identikit per bambini, in modo che si possano combinare fino a produrre quanto promesso dal titolo.

Facile notare che è la struttura formale dei sonetti e le regole che Queneau si è imposto che gli permettono di raggiungere il risultato. Ed è lo stesso scrittore ad evidenziare che:
"Il classico che scrive la sua tragedia osservando un certo numero di regole che conosce è più libero del poeta che scrive quel che gli passa per la testa ed è schiavo di altre regole che ignora." [Che cosa è l'arte? - 1938 - Raymond Queneau]

Chi mi conosce sa che, se vi sto parlando di letteratura che si compone dinamicamente, in realtà, niente di più facile che stia per propinarvi quelle due righe indispensabili per l'introduzione a, che so, la generazione automatica di codice.

Chi mi conosce potrebbe pure immaginare che, se mai qualcuno potesse azzardare un assurdo paragone tra una metodologia informatica ed una medicina (cosa che mai faremo), io cercherei di portare l'attenzione sul fatto che le buone medicine vanno prese, ma meglio se dopo consultazione con uno specialista, sempre solo dopo aver ben letto le istruzioni per l'uso, capito che davvero curano il nostro male e stabilito che non contengano controindicazioni anche gravi.

Infatti, se certe regole le applica Queneau, il divertimento potrebbe anche diventare arte, ma con autori meno accorti si potrebbe rimanere fermi al generatore automatico di poesie della mutua, perdendosi anche il gusto dello scherzo.


Come spesso in altri casi, la mia vita virtuale e quella reale si confondono, si intrecciano lavoro e interventi sui blog (ancora su quello di Isadora, in un post già citato, anche se oramai un po' perso nel passato) e anche spiaggie e montagne le vedo da tempo solo renderizzate.

Non posso, invece, girarmi senza sbattere contro qualche progetto che si basa sulla generazione automatica di codice.

Dopo 8-10 volte, dopo aver escluso di essere coinvolto in una candid camera, mi ha sfiorato il dubbio che il senso di dejavu fosse accompato anche da un senso di disagio, dalla domanda se e quando questo processo nel mio passato si sia dimostrato effettivamente parte di una metodologia produttiva o fosse solo un modo di automatizzare il cut&paste (da non intendersi necessariamente in senso negativo: chi è senza peccato...).

Sourceforge, ad oggi, anagrafa tra i 2700 e i 2800 progetti nella categoria Code Generators: tra i primi 10 ci sono almeno 4-5 compilatori o estensioni, 1 progetto ERP (che, contrariamente a quanto potreste immaginare, ha davvero a che fare con questo post), 1 progetto per generazione di codice partendo dall'UML e 3-4 generatori generici template-based.

Per mancanza di tempo cercheremo di escludere almeno i compilatori, che richiedono ben altra teoria, per concentrarci su casistiche più semplici, tipicamente quelle rappresentate da un modello dati che viene trasformato in un generico output (visivo, su file, come vi pare) sulla falsariga di un template elaborato da un qualsivoglia motore, possibilmente in modo più dichiarativo possibile e senza ricompilare, al fine di produrre nuove righe di codice leggibile ed, eventualmente, modificabile e riusabile.
Uno dei tanti pratici e quasi classici utilizzi del classico pattern MVC, insomma. Estenderemo appena questo ambito, giusto perchè non ha senso limitare la fantasia (anzi, se volete poi segnalare altri curiosi impieghi e approcci, siete, al solito, benvenuti).

Diamo per scontato che abbiate già visto e/o usato generazioni automatiche, almeno una volta, per esempio per creare automaticamente codice e form di CRUD (per i 2 che non lo sanno, è l'acronimo con cui si indicano le operazioni alla base della gestione di dati: Create Read Update Delete). Magari con successo. Le stesse due-tre formettine, sempre uguali per l'intera applicazione, di semplice gestione di dati piatti, con pochi bottoni, sono spesso rese con strumenti simili, partendo dal reverse del database (e qualche altra informazione minore riguardante resa grafica, lookup, etc. etc. Approccio convincente, in fondo. Sembra funzionare.
Vien da chiedersi se non sia possibile estendere la tecnica ad altre casistiche.

L'utilità nel generare codice da compilare per le interfacce, soprattutto quando sia richiesta grande velocità non raggiungibile con sole generalizzazioni ottenibili componendo dinamicamente le pagine è indiscutibile. Tecniche simili sono utilizzate da molti CMS per per produrre siti Web con numero elevatissimo di accessi e ridotta richiesta di personalizzazione della navigazione da parte dell'utente): si creano tutte le pagine in html, al posto che passare da jsp, che, fossero pure basate su grandi cache, su numeri enormi possono far sentire il loro peso (beh, nei siti più importanti, dove viene richiesta una fortissima interazione user-centrica, comunque, l'approccio a pagine statiche non è praticabile e bisogna scalare aumentando l'hardware).

Sulle interfacce grafiche viene bene, anche perchè la generazione automatica supplisce, in parte, alla ridotta o non disponibile ereditarietà di implementazione tipica di tecnologie di front-end (jsp, aspx, etc. etc.).
[Che poi sia un bene non esagerare, in generale, con l'ereditarietà di implementazione e che sia poco sensato e/o mal definito pensare non solo di riusare componenti, ma anche di far ereditare posizioni e presentazione a pagine diverse, è altra questione che non vorrei tirare in ballo in questo post].

Non per nulla gli ambienti di sviluppo e progettazione visuali sono uno dei modi più comuni per produrre codice senza scriverlo direttamente, in una continua interazione tra utente ed IDE (particolarmente continua e interessante laddove venga gestito anche il roundtrip e relative difficoltà di riallineamento tra il codice scritto manualmente e quello generato - risolto, il più delle volte, con aggiunta di commenti, placeholder e dichiarazioni varie nel codice da parte del generatore + richiesta di scrivere, gentilmente, appena fuori dalla zona riservata).

Altro caso classico di generazione del codice è quello fornito da strumenti ORM, che, partendo da un reverse del DB generano le classi nel linguaggio di vostra elezione, per supportare il pattern DAO. Non insisto ad approfondire un argomento che mi piace molto poco, come già sapete, ma dovevamo citarlo, non fosse altro che per evitare accuse di averlo appositamente escluso.

Uscendo dagli esempi e cercando di generalizzare, inizio a segnalarvi che su SoftwareReality si trova una bellisima serie di articoli, completi e approfonditi, sull'argomento.

Può qui giovare riprendere e commentare almeno la pagina che tratta di vantaggi e svantaggi dei generatori di codice.

Vantaggi:
  • Ultra-consistenti: perchè generati proceduralmente
  • Maggior pulizia e semplicità del codice: portano il programmatore a ridurre le attività di generalizzazione, concentrandosi su cosa serve ora; ogni modifica potrà essere aggiunta sul template del generatore, riproducendo il codice (a meno di modifiche intervenute sulla prima generazione e/o a meno di necessità di gestione - solitamente complessa - del roundtrip, ovviamente)
  • Stabile e bug-free (il debugging si concentra PRIMA dell'inizio del progetto): verissimo, ma non è trascurabile il fatto che, se il debug del motore di generazione (tipicamente costoso/molto costoso) avviene PRIMA dell'inizio del progetto, non lo paga il cliente, ma qualcun altro (noi, se siamo noi ad aver progettato il generatore di codice, è un nostro investimento). E' certamente vero, comunque, che in presenza di poche modifiche in corso d'opera a motore e template, ogni generazione successiva può essere eseguita automaticamente o eventualmente con solo piccola supervisione.
  • Produce molto velocemente una nuova API aggiornata e garantita, partendo da una descrizione del dominio del problema: anche questo verissimo, ma la sua potenza e flessibilità dipende dalla flessibilità con cui abbiamo generalizzato il nostro generatore ed il relativo dizionario dati (più è flessibile più sarà probabile un significativo investimento iniziale). Qualcuno ritiene che sia questa la forza di alcuni degli ERP/CRM Open Source di maggior successo.
  • Customizzabile: inoltre non necessariamente serve il codice del generatore come dice l'articolo da cui siamo partiti, se possiamo agire su template, dizionario dati, regole (a meno, ovviamente, di non considerare come codice anche questi tre elementi)
  • I cambiamenti di generatori/template, codice generato e progetto vanno di pari passo: se è necessario un cambiamento strutturale lo si fa sul generatore/template e si propaga ovunque . Non bisogna, però, perdere di vista il problema del roundtrip di cui parlavamo sopra. Non di rado, dopo la prima generazione, si rischia di non riuscire a stare dietro ai cambiamenti. Ovviamente la nostra generazione dovrà prevedere una architettura che separi le personalizzazioni dal codice generato. Lo si può fare con righe di codice "riservate", come i tool visuali di cui parlavamo, o (meglio, ma non sempre così facile) separando il codice generato dal codice modificabile in classi diverse e legandoli con qualche pattern.
  • I programmatori sono liberi di concentrarsi su aree di sviluppo di maggior rilievo (il morale migliora, la produttività cresce): è forse uno dei punti di maggior interesse... se la generazione del codice non vincola troppo e non richiede troppo (altrimenti si ottiene il risultato opposto). Questo vantaggio è particolarmente vero se gli sviluppatori in questione non sono quelli che devono gestire anche il generatore, dizionario dati e relativi template, ovviamente.
  • Insegnano a scrivere codice: solitamente ci si attende che il codice generato sia ben scritto e consistente al 100% (ma tra teoria e pratica ce ne passa) e i programmatori (junior) possono imparare dallo stile del codice generato. Vero solo se confrontato con metodologie che prevedono documentazione da leggere per le style guide e solo se il codice viene veramente letto. Nella pratica mi capita di vedere che non venga letto (e/o applicato) nè il documento degli standard, nè il codice scritto da altri (anche senza generarlo automaticamente, tra codice prodotto in-house da senior e codice esterno, disponibile in centinaia di migliaia di progetti open source ce ne sarebbe a sufficienza, anche senza generatori; senza considerare che il codice generato, solitamente, riguarda parti concettualmente più semplici, da cui si può imparare meno)
Svantaggi:
  • Prima bisogna scrivere il generatore: lo abbiamo detto sopra, i costi si spostano sull'investimento. Inizia ad aver senso quando lo stesso generatore si può riusare su più progetti, perchè, a quel punto, i costi si abbattono e si è più competitivi della concorrenza. E' un po' come scrivere librerie o framework aziendali (ma questo punto lo approfondiremo - non so se oggi o quando, ma lo faremo)
  • Applicabile solo all'interno di ambiti e condizioni specifici (almeno fino alla realizzazione del primo generatore basato sulla comprensione del linguaggio naturale: poi sostituiremo il dizionario dati con le specifiche e sarà libero di interpretare a modo suo e fare lo stesso casino di un programmatore umano). Anche l'articolo citato suggerisce che il codice generato sia da considerare un supporto per le parti aggiuntive, scritte manualmente, una sorta di API
  • Se il codice generato deve trattare con database, questi devono essere progettati e normalizzati bene, perchè i generatori solitamente non si comportano bene con database con caratteristiche particolari: vero, a questo riguardo possiamo solo aggiungere che non è raro che il database stesso (o, almeno, parte di esso) siano parte del codice generato. Generatori che si adattano a database esistenti sono solo generatori più flessibili, che estrapolano parte del loro dizionario dati dai metadati, dal reverse del db.
Mi sembrano necessarie alcune considerazioni aggiuntive:
  • di fatto, per generare il codice, è necessario operare una sorta di generalizzazione. Spesso conviene, a mio parere, chiedersi se non ci sia l'alternativa di progettare una soluzione generale, al posto che generare il codice, per gestire direttamente la problematica. Pro: potrebbe essere più manutenibile (una sola/poche classi al posto delle decine/centinaia/migliaia generate + quelle del generatore che sarebbero, comunque, da manutenere). Contro: un comportamento generale può girare più lentamente di uno generato in modo specifico, in fase di esecuzione (ricordate l'esempio dei CMS all'inizio di questo post?)
  • vale la pena di considerare, a seconda dei casi, modalità di generazione progressiva, prodotta dall'interazione uomo/macchina. Vantaggi: flessibilità e velocità. Svantaggi: maggior rischio di complessità per gestione roundtrip. Laddove questa generazione sia nascosta all'utente (non programmatore, ma utente finale), potrebbe essere pericolosa e pesante. Per fare un esempio di una simile casistica, conviene pensare a strumenti di data mining o di interrogazioni dei database semplificate per gli utenti finali: da una semplice interfaccia si generano query SQL, senza che l'utente debba conoscere SQL (il caso più semplice è il QBE, Query By Example). A parte il fatto che, solitamente, in questi casi, si perde molta della potenza del linguaggio sottostante, mi viene sempre in mente il drag&relate visto nel 2001 su Top Tier (oggi inglobato in Sap Portal - che, tra l'altro, non vedendolo dal 2004, non so se mantenga ancora questa caratteristica, che già tendeva a nascondere): metteva facilmente in relazione entità anche complesse di database (anche alla base di ERP come SAP e BaaN, ai tempi), generando output in base al fatto che l'utente poteva trascinare righe di una entità su un'altra entità e le join ed i filtri li applicava lui secondo regole dedotte dai metadati e corrette/integrate manualmente sul suo dizionario dati. Bellissimo strumento demo (almeno per i tempi), aveva il piccolissimo difetto che, al terzo-quarto drag&relate poteva anche riuscire a mettere in ginocchio il server, dal momento che generava continue subquery di complessità arbitraria, come i vedeva bene dai log degli ODBC. Attenzione a problematiche simili generabili dai constraint di Hibernate, nel caso il programmatore non conosca bene la struttura del DB sottostante (e se lo conosce, forse ci siamo persi parte dei vantaggi di Hibernate stesso e dell'ORM... siccome ho già detto che non insisto, non insisterò...)
  • Esistono, oggi, sistemi anche molto complessi che utilizzano la generazione di codice a partire da dizionari dati di dimensioni e obiettivi importanti: Compiere ERP e i suoi figli ADempiere e OpenBravo (era lui, ad essere indicato tra i primi 10 Code Generators in sourceforge) costituiscono uno degli esempi più eclatanti: una buona parte dell'ERP si rigenera sulla base di regole e descrizioni di relazioni tra entità. Magari ne parliamo meglio in qualche prossimo post, riguardo a strumenti OpenSource per le aziende. Fossero solo gli unici esempi (anche in caso di funzionamento parziale rispetto al dichiarato), sarebbero sufficienti per rendere questa metodologia come degna di considerazione, ben al di sopra dell'automatizzazione del cut&paste di codice.
Oltre ad annoiarsi con le considerazioni di cui sopra, con la generazione di codice ci si può anche giocare (anche perchè generazione è una parola piena di significati, anche importanti, non vogliamo mica lasciarla passare senza far nulla, vero?).

Non so se abbiate presente CRobots. Si tratta di un gioco per programmatori: si programma il comportamento di un robot e lo si manda a combattere in un'arena con altri robot e, ovviamente, ne rimarrà soltanto uno.

Per un esame universitario misi assieme CRobots e algoritmi genetici (voglio dire: se parliamo di generazione, parliamone fino in fondo) per far evolvere programmi in grado di giocare a CRobot (per superare i limiti di potenza di un 8086, non potendo permettermi un algoritmo di selezione effettivamente basato sul combattimento in arena, troppo lento - ogni partita richiedeva minuti, tempo non compatibile con la durata attesa della mia vita -, dovetti pensare ad un modo di 'far leggere' il codice all'algoritmo di selezione, con delle euristiche per valutarne la bontà - via il dito dal tasto sinistro del mouse, ve ne parlo un'altra sera...).

In termini evolutivi non ho passato di molto il brodo primordiale, ma è bastato per vedere robot immobili trasformarsi in quelli dotati di un ridotto movimento (troppo movimento era dannoso: finivano a suicidarsi contro il muro), fino ad arrivare a quelli che vendevano cara la pelle sparando qua e là a caso.

Generazione automatica ed evolutiva di bug, in fondo, pur all'interno di un codice stilisticamente accettabile e sintatticamente corretto, perchè preimpostato (provate a rileggervi vantaggi e svantaggi, in questa ottica, potrebbero assumere un altro aspetto).

In ambiti più complessi la generazione di codice può fermarsi un attimo prima, ad una proposta di generazione (la differenza sta solo nell'applicare o meno il risultato), richiedendo una più esplicita e forzata interazione tra uomo e macchina.

Essendo parecchio malati potrebbe pure capitare di laurearsi con una tesi (di Artificial Intelligence, ovviamente, che so, intitolata Sistemi basati su conoscenza che analizzano il proprio ragionamento) impostata su un sistema esperto che si limiti (con la modestia che mi contraddistingue) a proporre le modifiche alla propria base dati, senza modificarla, partendo dall'analisi della base dati stessa, dai risultati forniti e da quelli attesi e interagendo con l'esperto di dominio.

Siccome dopo aver giocato con la parola generazione ora stiamo sforando nel giocare anche con la parola codice, possiamo estenderne appena appena il concetto e chiudere il giro (sempre per passi e per vie traverse e contorte, si intende e ci mancherebbe altro) tornando dall'informatica alla letteratura da cui eravamo partiti, citando una serie di generatori di codice molto particolare, di linguaggio, in modo da arrivare a generatori di storie, il cui capostipite, se la memoria non mi inganna, dovrebbe essere Storyteller, del già più volte citato Shank.

In questo caso la generazione deve passare da un motore che conosca, tra l'altro:
- i principi minimi di base di semiotica che chiunque impara da bambino leggendo Eco o, almeno, le già citate classificazione di Aarne e Thompson e schema di Propp, per estrarre alcune conoscenze relative alla struttura dei racconti
- due o tre concetti di come si susseguono le azioni nel mondo reale (script basati su Conceptual Dependency nel caso di Shank)
- qualche (minima) capacità semantica (di fatto, compresa nel punto precendente)

Per evitare che pensiate che mi stia inventando, appunto, delle storie, vi cito qualche link d'esempio, che parta da un significativo elenco di link a generatori di storie (di diverso livello e diversi argomenti), per passare ad una introduzione, schemino (con altri link) e qualche modello per raccontare storie più evoluto ed accademico, che, magari, sia in grado di sottolineare le emozioni dei personaggi, per finire giocando su qualche narratore online (dal generatore di trame per il cinema, ad esperimenti che si spingono anche a cercare foto coerenti con il testo fino a cercare di far soldi, sfruttando i generatori automatici per diventare ricchi scrivendo un romanzo).

Approfondire anche questo argomento ci riporterebbe su un discorso già più volte sfiorato e mai intrapreso.
Che non abbiamo tempo e spazio di iniziare neppure stavolta.
Peccato...

Bye

    Depa
P.S.: potrebbe venirvi in mente anche di costruire post automaticamente, che contengano le parole più cercate, per far salire il ranking e gli hits sul proprio blog. Curiosamente l'esito può anche non risultare così insopportabile da leggere rispetto a molti articoli di blog scritti appositamente per l'ottimizzazione nei motori di ricerca. Anzi, talvolta mi sorge pure il dubbio che, con la generazione automatica, certi programmatori e romanzieri si siano già spinti più avanti di quanto io sappia e vi abbia raccontato...

[... continua ...] Leggi tutto

mercoledì 9 maggio 2007

Reti di parole su CD



Oggi vi parlerò di CD.
No, non di musica. Nemmeno del supporto di memorizzazione: sono un informatico ma non devo parlare continuamente di tracciati record e simili.

CD sta per Conceptual Dependency ed è una delle tecnologie dell'Intelligenza Artificiale alla base della comprensione del linguaggio (NLP = Natural Language Processing).

Hey, ma dove andate? Se rimanete vi parlo anche di Wordnet. Fermi...

E adesso? Scrivo lo stesso, anche se sono rimasto solo?
Ma sì, dai, tanto prima o poi qualcuno arriva per sbaglio e legge anche questo.

Anche se stavolta sarò noiosissimo, così imparate a non stare qui ad interagire con me, per mantenermi su binari ragionevoli.

E non vi chiederete più perchè c'è voluto così tanto tempo dall'ultimo post.



Tu prova ad avere un mondo nel cuore
e non riesci ad esprimerlo con le parole
[...]
E sì, anche tu andresti a cercare
le parole sicure per farti ascoltare:
per stupire mezz'ora basta un libro di storia,
io cercai di imparare la Treccani a memoria,
[...]
[Il matto - De Andrè - Da Non al denaro, non all'amore, nè al cielo]



Alla fine degli anni '60, più o meno quando io stavo nascendo, Roger C. Schank e suoi collaboratori della Stanford University iniziarono a pubblicare i loro lavori riguardo alla Conceptual Dependency (CD), sostanzialmente mostrando come si poteva costruire un parser per il linguaggio naturale, in grado di elaborare frasi fornite in input, disambiguandone i concetti e generando una rappresentazione del significato, utilizzando una grammatica che mettesse in evidenza la semantica.

Schank partiva dal concetto che si potesse analizzare il modo di comprendere tipico degli esseri umani per trovare algoritmi e rappresentazioni indipendenti dal linguaggio per la comprensione dei computer.
CD come analogia di rappresentazione mentale.

Uno dei vantaggi di un approccio simile è che una stessa rappresentazione può anche riassumere diverse rappresentazioni sintattiche (in italiano: frasi diverse con lo stesso significato avrebbero la stessa rappresentazione), con ovvie conseguenze nella semplificazione dell'elaborazione dei concetti espressi e, più in generale, per operare delle inferenze.

Tra l'altro, una volta ottenuta una rappresentazione non ambigua e semantica di una frase o di un testo più complesso ci si trova nella posizione giusta per poter ottenere anche una parafrasi della frase stessa, eventuali riassunti e anche per cercare di operare traduzioni in altre lingue. O, al contrario, sarebbe possibile partire dai concetti, per generare storie.

La potenza dell'approccio proposto è stata mostrata attraverso parecchie applicazioni, negli anni seguenti, ma, nonostante siano passati quasi 40 anni non troverete molti traduttori commerciali basati su questa tecnologia.

Troverete, invece, tecnologie ancora precedenti, decisamente più semplici (per esempio basate sulla frequenza di comparsa delle parole nelle frasi), ma significativamente potenziate dall'attuale potenza di calcolo.

Ma se la CD potrebbe permettere di ottenere risultati decisamente superiori a quella della maggior parte dei più comuni traduttori automatici, che non hanno la pretesa di capire alcunchè, come mai questa tecnologia non si è diffusa nei prodotti commerciali?
Essenzialmente perchè implica la presenza di una notevole base di conoscenza che sia in grado di definire, data una parola, una serie di attese sulle parole precedenti e quelle seguenti, di cancellare tali pretese quando non si trovano corrispondenze e di confermarle nel caso siano logicamente coerenti con il resto della frase o del testo.

Per fare un veloce esempio di parte della conoscenza necessaria, consideriamo la seguente frase (presa da uno degli articoli e volutamente semplice e semplificata: tenete presente che la CD si applica anche a frasi complesse con coordinate e subordinate - diverse fonti su Internet vi permetteranno di ottenere approfondimenti e introduzioni riguardo alle primitive della CD ed esistono anche esempi di come venivano memorizzate in lisp le strutture dati nei primi programmi alla base della CD):
Il grande uomo ruba il libro rosso alla ragazza

  • Il: può servire per connettere frasi, per esempio potrebbe essere che la prarola cui si riferisce trovi una corrispondenza in una frase precedente

  • grande: si riferisce ad un concetto che potrebbe necessitare di ulteriori approfondimenti concettuali (come aggettivo, potrebbe presupporre l'esistenza di un sostantivo seguente - situazione che, di fatto, viene confermata dalla continuazione della frase)

  • uomo: può esistere da solo e viene completato dalle parole precedenti, quindi è possibile costruire un aggregato basato su questo termine

  • ruba: individua una azione e ha bisogno di un soggetto e di un complemento. Legandola al concetto precedente (possibile perchè sul piano grammaticale concorda), permette di costruire una proposizione riguardo ad un attore: esiste una dipendenza bidirezionale tra 'ruba' e 'uomo', che stanno sullo stesso piano (almeno, questo è quanto dice Schank nei primi articoli, ma ne riparliamo)

  • il-libro-rosso: senza ripercorrere le singole parole, devono esistere regole sintattiche, grammaticali ed attese semantiche che permettano di legarli per creare un concetto, secondo quanto visto prima e una attesa generata dal verbo 'ruba' prevede che ci sia un oggetto da rubare e questo concetto è coerente con questa attesa

  • alla-ragazza: qui si trova un ulteriore tipo di relazione, che non staremo qui a dettagliare, ma che lega questi termini al libro rosso, attraverso attese generate sempre dal verbo rubare (si ruba qualcosa a qualcuno)

Fino a questo punto le competenze sembrano essere, come sopra indicato, grammaticali, sintattiche e, solo parzialmente, semantiche.
Una analisi ulteriore della stessa frase, e da un approfondimento dell'algoritmo alla base del parser (come, per esempio, in uno dei primi articoli, ma, meglio, in "Inside Computer Understanding: Five Programs Plus Miniatures" - Roger C. Schank e Christopher K. Riesbeck - 1981) si vede che, almeno per questa
frase, il tutto si potrebbe anche ridurre ad una sorta di analisi logica, basata su posizioni relative delle parole e preposizioni più o meno articolate. Almeno nel contesto ridotto su cui Schank lavorava ai tempi (poche centinaia di parole).

E, comunque, ricordatemi di proporvi di realizzare un programma in grado di elaborare una analisi logica, alla fine di questo post...

La semantica, al di là dell'ultra-semplificato-esempio-sopra-riportato, è necessaria per identificare stranezze nella frase:
La casa volava da Milano a Roma

rispetto a
L'aereo volava da Milano a Roma

E i programmi di Schank potevano anche notare queste stranezze e operare ulteriori inferenze.

Ma la CD è solo la partenza, solo il substrato: per disambiguare servono anche altri concetti, serve una conoscenza del mondo e della sequenzialità delle operazioni standard (script, per Schank - es: se il Depa va al ristorante, ordina una bistecca, più tardi paga ed esce soddisfatto, come fate a sapere che ha mangiato la
bistecca, dal momento che non ve l'ho detto? Perchè avete delle attese sui comportamenti e sulla sequenzialità degli stessi, in situazioni standard) che ci si attendono in certi ambiti, una conoscenza degli obiettivi (goal) e una identificazione dei piani per raggiungere tali obiettivi, etc. etc.

Serve un po' di senso comune, insomma. Tutt'altro che banale, visto che ne sembra spesso sprovvista anche la maggior parte degli umani.

Uno dei limiti degli approcci di Schank, ai tempi, era la dimensione della base dati (certamente dettata dalle ridotte capacità elaborative di 40 anni fa, ma anche dalla mancanza quasi totale di progetti volti a generare simili tipologie di informazioni).
E' estremamente dispendioso codificare tutta la competenza necessaria per una comprensione soddisfacente, ma certo potrebbe già essere utile riuscire a gestire un primo livello di relazioni tra le parole, adatto per evitare di cadere in traduzioni automatiche orrende come quelle in cui si incorrerebbe passando questo testo sotto il filtro di Babelfish o compagnia bella.

Basterebbe una rete semantica, che gestisca le principali relazioni tra le parole, senza necessità di scendere al livello della fisica quantistica. Per esempio, il cane è un animale è una relazione tra un iponimo (cane) ed un iperonimo (animale). Una relazione IS-A o, in termini più comprensibili per chiunque sappia vagamente programmare, si potrebbe dire che 'cane' eredita da 'animale'. (O ne implementa l'interfaccia, che sarebbe meglio, per evitare il fragile base class problem e simili). E le parole sono correlate tra loro
anche in altri modi (sinonimi, meronimi, etc. etc.).

Particolarmente interessante è la sinonimia, che deve essere considerata nella sua accezione semantica corretta.

Per es., il lemma prova può significare:
- evidenza, riscontro
- test, esame
- concorso
- compito
- cimento, impresa
- assaggio
etc. etc.

Notiamo che ho usato dei sinonimi (scelti a caso, senza pretesa di completezza e correttezza) per illustrare, almeno con una prima approssimazione, i diversi significati, le possibili semantiche della parola presa in considerazione. Il che ci porta a pensare che i sinonimi siano un buon punto di partenza per poi disambiguare.

Questi stessi sinonimi, se messi uno di fila all'altro (come fa Sinonimi Master, forse il più completo ed utilizzabile insieme di sinonimi italiani che mi è capitato di trovare su Internet), sarebbero stati molto meno utili.
Li ho, invece, raggruppati in insiemi di sinonimi (cui dovremmo aggiungere il lemma di partenza), non a caso: si parla di synset (contrazione di synonyms set) e questo concetto è alla base di reti semantiche come Wordnet.

Quest'ultimo sì, è sicuramente free e di elevatissimo livello.
Sarebbe bello averne uno anche per l'italiano e per altre lingue, certo sarebbe ancora meglio se fosse possibile averlo già in relazione con la versione inglese.

Beh, la buona notizia è che ce ne sono almeno 2: EuroWordNet e MultiWordNet (dovesse interessarvi un semplice confronto tra le due...). La cattiva è che non sono free, neppure per scopi personali, nè Open Source.

Ora, sarebbe interessante continuare, parlando di:
- come CD e (Euro)WordNet possano convergere verso un sistema che possa, almeno, cercare di fare una prima analisi dei testi, con migliori speranze di prenderci rispetto alla maggior parte dei sistemi di larga diffusione
- come alcuni abbiano già fatto qualcosa di simile, se non altro in ambito più ristretto (che so: vi siete resi conto che una grande parte della Knowledge Base di Microsoft in italiano risulta tradotta automaticamente? Il risultato non è malissimo - non perfetto, ma non male - e si basa su concetti simili a quelli indicati, almeno per la costruzione di MindNet una rete semantica simile a Wordnet, ottenuta, tra l'altro, automaticamente, attraverso parsing di vocabolari ed enciclopedie elettroniche)
- come sia possibile cercare di costruire una simile rete semantica, in modo pseudo-automatico
- come non sia così facile mettere in relazione diretta i synset di linguaggi differenti (per esempio, a causa dei gap lessicali)

Sarebbe interessante, ma mi avete lasciato solo.
Volete conoscere l'assassino? Gli accessi a questo articolo devono essere tanti e differenziati...

Bye
    Depa

[... continua ...] Leggi tutto

mercoledì 14 marzo 2007

Come forzare un lucchetto



Sembra incredibile, ma tra le ricerche che ieri hanno portato al mio blog c'è la frase riportata nel titolo.
Quando l'ho visto mi sono chiesto se potevo aver scritto qualcosa in trance e aver svelato anche i segreti del grande Houdini
Ho ripetuto la ricerca e, come vedete dalla foto, è proprio vero: addirittura sono in cima all'elenco!
Fortunatamente sono secondo, anche se si cerca hibernate pro e contro :)

Evidentemente qualcuno cercava di capire come possa essere fuggito Marco Berry in Danger, probabilmente queste ricerche aumenteranno con le puntate del programma.
A pensarci bene poteva pure essere uno scassinatore di cassette di sicurezza. Un professionista, che ha ben chiaro che bisogna prepararsi, prima.
Beh, a quanto pare, sono io che ho rubato uno unique visitor, stavolta.

Comunque, sfruttiamo questa situazione e scriviamo anche questo post: se già ero in cima prima, ora chi mi smuove più? Gli hits sono hits, ragazzi (e lo so che la 's' finale non ci vuole, in italiano: l'ho messa apposta, per accentuare il suono sibilante dell'ultima frase).

C'è un problema in tutto questo: non sarebbe dovuto capitare. Anche per voi, dico, perchè poi vi dovete sorbire questi vaneggiamenti.

C'è forse una soluzione informatica? E' forse il Web Semantico?



Prima di passare alla discussione vera e propria, è necessario che vi segnali anche il secondo risultato dell'elenco (che, intanto che scrivo, è passato primo: forse anche per colpa mia): è un blog di enigmi, ma era inevitabile che a questo dovessi commentare (l'ho fatto, andate a leggervi cosa ho scritto su quel post), dal momento che era evidente che stavano parlando di informatica.

O sembrava solo a me? Davvero non distinguo più vita e informatica?

Torniamo al Web Semantico.
Come introduzione vi consiglio una presentazione della Dott.ssa Mordonini, usato in un seminario nell'Università di Bologna, molto chiaro ed esteso.

Provo giusto a riassumere due o tre punti essenziali, da dilettante dell'argomento e con un occhio, al solito, alle implementazioni pratiche:
  • il Web contiene un numero enorme di informazioni che non sempre riusciamo a raggiungere come vorremmo (e fin qui, lo sapevate già, l'ho riportato solo per vedere se eravate svegli e mi stavate seguendo)

  • il problema è legato al fatto che il Web è oggi costituito solo da legami sintattici (URI) e non semantici. Ovvero, le pagine sono, tipicamente, collegate tra loro senza una spiegazione del significato del link, che possa essere utilizzata da un computer.

  • non basta aggiungere dei tag, simili a quelli che trovate nei vari blog, per aggiungere questo significato: è necessario un maggior formalismo per permettere di applicare algoritmi inferenziali.

Parentesi.
    Le slide chiariscono che Web Semantico non è Intelligenza Artificiale (AI), ma più avanti ricordano che sono necessarie capacità inferenziali (correttamente evidenziando che in questo ambito, ci interessa particolarmente la deduzione e non l'abduzione o l'induzione).

    Probabilmente è corretto, ma solo in senso stretto e formale, e cercando di dare ragione a Douglas Hofstadter che, nel suo oramai-letto-anche-dai-sassi (se non lo avete fatto, è un po' tardi: per quanto sia un libro grandioso - vinse anche il premio Pulitzer - è del 1979, un po' datato, visto l'argomento) Gödel, Escher, Bach - Un'eterna ghirlanda brillante sosteneva che
    l'Intelligenza Artificiale è tutto ciò che non ancora non è stato fatto
    perchè
    tutto ciò che le macchine hanno imparato a fare e che (prima che lo facessero) era ritenuto segno di comportamento intelligente, non viene ritenuto più tale una volta che le macchine lo fanno
Fine Parentesi.

Le slide proseguono con una ben chiara distinzione tra semplici tassonomie, tesauri (es: Wordnet) e ontologie (es: OpenCyc).

Vorrei evitare di appesantire ancora, ma sono costretto a due rapidi pprofondimenti, altrimenti non si capisce più nulla, (rivedremo entrambi gli argomenti in prossimi post in maggior dettaglio):
  • Wordnet è un vocabolario semantico, organizzato in Synset, ovvero insiemi di sinonimi. Ovvero: come certamente sapete le parole (i lemmi) possono avere diversi sinonimi. I dizionari dei sinonimi e dei contrari dei tempi della scuola sono un primo passo in questa direzione, ma hanno la brutta tendenza a mettere assieme sinonimi anche con significati differenti (non tutti, ma quelli che si comportano bene non ci stanno, nella cartella) ed è, comunque, difficile, fare dei controlli incrociati di congruenza senza averli in formato elettronico. I Synset, invece, sono insiemi di sinonimi con lo stesso significato. Per fare un esempio, il lemma prova comparirà in diversi Synset, insieme ai suoi sinonimi. Per es:

    • prova, evidenza, ... (nel senso di prova giudiziaria)
    • prova, esperimento, ...
    • prova, esame, ...
    • etc. etc.
    Ogni Synset rappresenta, quindi, nella pratica, un concetto diverso.

  • Di OpenCyc vi ho già parlato, e ne riparleremo più avanti, è troppo complesso per spiegarlo in 2 righe - spero riuscirete a dormire la sera, nel frattempo. Per ora ci basterà dire (tagliandola spessa) che la principale differenza rispetto a Wordnet sta, soprattutto, nell'aggiunta della capacità inferenziale e di informazioni necessarie a supportarla (Knowledge Base, una base di conoscenza, abbreviata con KB). Peraltro esiste, nella KB di OpenCyc, una esplicita relazione con Wordnet e le relazioni tra i lemmi ed i loro significati (esistono anche relazioni implicite, basate sulla struttura delle informazioni, ma non sono, solitamente, mappabili 1:1 con facilità).

A questo punto del post voi siete stremati, anche se io ho a malapena finito la premessa.
Questa volta, però, non vi grazio, altrimenti non arriveremo mai al punto.
Inoltre non ho ancora sentito suonare la campanella.

Per portare tutte queste considerazioni sul Web, è necessario un linguaggio che permetta di aggiungere informazioni strutturate alle pagine.

La proposta più consolidata, ad oggi, la si trova in un insieme di linguaggi formali (per lo più basati sull'XML) che, a diverso livello, permettono di definire le proprietà che descrivono i documenti (risorse identificabili da un URI) e di ricercarle.
Sempre andandoci giù pesante con le semplificazioni, si tratta di:
  • RDF: attraverso triple [soggetto, predicato, oggetto], anche complesse e composte (es: un oggetto può essere, a sua volta, una tripla - si parla di reificazione), si forniscono proprietà al documento

  • RDFS (RDF Schema): permette di descrivere le classi dell'RDF (ovvero, serve per definire meta-informazioni riguardanti i componenti della tripla di cui sopra), specificandone relazioni e vincoli

  • OWL (Ontology Web Language): siccome la coppia di cui sopra ha solo un limitato potere espressivo, viene proposto (via W3C e sempre nel contesto RDF) questo linguaggio, con l'intento di permettere di eseguire delle inferenze

  • SPARQL: il linguaggio W3C per eseguire query sull'RDF, di fatto una sorta di SQL portato su queste tecnologie

Niente male, come stack (non sono in grado di valutarlo ora, anche per mancanza di tempo, ma pongo lo stesso la domanda per chi fosse in grado di rispondermi: non sarebbe più semplice usare un solo linguaggio come CycL, quello usato per OpenCyc? è veramente più complesso da imparare, o stiamo solo nascondendoci dietro alla sintassi per problemi più seri che interessano la semantica? anche l'espressività ne guadagnerebbe, o no? non piace il fatto che si tratti di una proposta di una sola azienda e che il gap per creare simili motori sia difficile da colmare?)

A questi dobbiamo aggiungere un vocabolario condiviso. Qualcuno suggerisce che URI che puntano alla Wikipedia potrebbero fare al caso, altri (compreso il W3C) propongono vocabolari più specifici.

E' importante notare che non si tratta di sola teoria, ma esistono già tool che trattano queste problematiche (es: Jena, un framework per il Web Semantico in Java, che è in grado di gestire RDF, RDFS, OWL, SPARQL e contiene già un motore inferenziale - realizzato dagli HP Labs, ma presenta licenza apache-like).

Tutto risolto? Veramente no: restano aperti problemi pratici importanti:
  • bisogna comunque partire da informazioni corrette, alla base, altrimenti otterremo ragionamenti non corretti. Ovvero, anche in perfetta buona fede è facile ricadere nelle ambiguità del linguaggio naturale. In generale, per costruire una ontologia in un ambito ristretto, tipico di una Intranet e limitandosi ad argomenti tecnici, ci possono volere mesi/uomo (infatti, sono allo studio classificazioni automatiche). Approfondiremo meglio questi aspetti quando parleremo dell'enorme sforzo portato avanti su OpenCyc (anche se in ambito più complesso ed esteso, ovvero sulla KB alla base del senso comune) e delle best practice che da là sono emerse. Vi anticipo che non è pane per Web Designer, ma per ingegneri della conoscenza. Questa sola considerazione fa parecchio pensare, IMHO, sulla possibilità di utilizzare nel breve le tecniche fin qui descritte su Internet in modo produttivo.

  • anche supponendo che le informazioni siano corrette alla fonte, come possiamo dare all'utente finale degli strumenti semplici da usare che gli permettano di eseguire ricerche mirate? Di fargli usare SPARQL non se ne parla nemmeno (sarebbe come dire: smettiamo di fare interfacce grafiche per i vostri gestionali, imparatevi l'SQL e arrangiatevi a farvi le query da soli). Non è che l'utente finale preferirà
    una risposta potenzialmente errata e sporca (che, tutto sommato, capita più raramente di quanto si voglia far credere, soprattutto in ambiti ristretti, che sono quelli su cui oggi è affrontabile un discorso di ontologie) tipica di un motore di ricerca, che trovarsi di fronte ad interfacce complesse da utilizzare?

  • veridicità ed affidabilità delle informazioni: dovremmo prevedere una sorta di certificatore? quante risorse potrebbero servire per validare tutti i documenti immessi? Serve, comunque, un confronto semantico, altrimenti ricadiamo nella semplice verifica incrociata, già eseguita dai principali motori di ricerca, tra meta tag nell'head dell'HTML con quanto contenuto nel body

L'abbiamo presa da un punto di vista più serio della volta che vi ho parlato dell'AIML, ma i risultati sono quasi gli stessi: forse serve qualcosa di più potente ed automatizzabile. Ancora una volta, è un mio parere personalissimo, rischiamo di dover ricadere verso ambiti più legati all'AI. Quanto siamo lontano dal far comprendere il linguaggio al computer?

Forse meno di quanto pensate.
Forse più di quanto penso io (bisogna ben tenere in conto il teorema di Hofstadter -
Ci vuole sempre di più di quello che ti aspetti, anche se tieni in conto la Legge di Hofstadter
- per tacer di Murphy).

Come già minacciato, per finire quelli che sono sopravvissuti a questo post, torneremo ancora su questi argomenti parlando almeno di Wordnet (e suo figlio, Eurowordnet, che potrebbe tornare utile per le traduzioni - potendo comprare la licenza, s'intende...), Conceptual Dependency di Shank e OpenCyc.

Se un giorno di questi sono di buona magari vi parlo di approcci più leggeri, per iniziare a fare qualcosa, per esempio utilizzando bene Lucene, anche con le nuove funzionalità di stemming recepite da Snowball, ma non contateci troppo.

Bye
    Depa

[... continua ...] Leggi tutto

lunedì 26 febbraio 2007

Superato il Test di Turing



Stamattina mi hanno fatto una TAC al cranio (sentivo come un ronzio) e hanno scoperto una cosa sensazionale, la stanno battendo tutte le agenzie, comparirà nei TG di stasera, ma volevo anticiparvela: non ho un cervello, (non azzardatevi a dire nemmeno una parola e andate avanti a leggere!). Al suo posto pare ci sia un chip, piuttosto grosso, che sembra essere costituito, ad una prima sommaria analisi, da una CPU quasi standard e una quantità di RAM enorme (credo di aver sentito oltre 1000 tera, ma devo aver capito male). La mancanza di alette di raffreddamento, ventole ed altri strumenti refrigeranti fa propendere verso una tecnologia di un altro pianeta.

Questo implica che, per migliaia di volte nella mia vita, ho implicitamente passato, alla faccia della stanza cinese di Searle e di tutti quelli che non credono nell'Intelligenza Artificiale forte, il Test di Turing (ho messo il link inglese della wikipedia, perchè quello italiano sembra essere stato scritto da Searle in persona - mi immagino l'imbarazzo, dopo le evidenze scientifiche che mi riguardano).

E dovrei riuscire a vincere, non è chiaro se sia un bene, la medaglia d'oro e i 100000 dollari del premio Loebner.

Almeno la diagnosi è certa: il ronzio, simile a quello che si può sentire in certe apparecchiature elettriche, è dovuto all'effetto di magnetostrizione (movimento meccanico causato da forze magnetiche, legato anche all'effetto joule, come certamente saprete). Per fortuna si tratta di qualcosa di assolutamente normale e rassicurante.
Sono molto sollevato.



Prima che piombino a casa mia NSA, FBI, Superquark (forse pure con qualcuno del CICAP - spero proprio di finire in TV insieme alle fatine di Sherlock Holmes, sono quasi un fan di Polidoro), cercherò di chiudere questo post, per chiarirvi, se non altro, il profondo significato di quanto già anticipato nell'abstract.

Il Test di Turing è un criterio proposto per cercare di identificare se un computer presenta un comportamento intelligente, che funziona pressapoco così:
- ci sono 2 stanze: in una c'è un computer, nell'altra una persona
- un giudice esterno deve indovinare in quale delle due si trovi il computer e in quale la persona
- il giudice non può vedere l'interno delle stanze, può solo comunicare con loro con una telescrivente (beh, il test è stato pensato nel 1950, Internet e le chat non esistevano)
- il giudice può fare le domande e, in generale, interagire come vuole con gli occupanti delle stanze, per quanto tempo desidera e basandosi sui criteri che preferisce per decidere (es: potrebbe tendere un tranello e chiedere di eseguire un calcolo piuttosto complesso e decidere che il computer è quello che ha risposto troppo velocemente, o chiedere informazioni relative ai gusti musicali, all'interpretazione di una poesia, alla relatività di Einstein, etc. etc.)
- gli occupanti possono rispondere come gli pare, con risposte sensate o meno, mentendo o dicendo la verità, creando intervalli artificiali, rispondendo che non si vuole rispondere, etc. etc.
- reiterando giudici e round, se il computer viene indicato per un numero di volte statisticamente superiore alla casualità come persona, allora pensa.

La capacità di pensare non viene mai definita formalmente, viene solo fornita una modalità generica per identificarla.

Da qui al premio Loebner è quasi un passo: questo ricco signore americano si è infatuato del Test di Turing e ha indetto un concorso a premi, con cadenza annuale. Alla prima edizione ha fatto il pieno di personalità del mondo dell'AI, poi li ha avuti tutti contro perchè pare che il livello tenuto durante il concorso non sia stato di gradimento e, forse, anche perchè a qualcuno non è piaciuto il risultato: programmi accademici realizzati della crema dell'AI battuti da un nipote di Eliza scritto da uno sviluppatore qualunque.

Fintanto che nessuno riuscirà a vincere il premio (che alla prossima edizione, ripeto, sarà mio), ne viene assegnato, ogni anno, uno più piccolo (circa 2000-3000 dollari) al programma che si comporta meglio ("most uman-like computer").

Chi lo ha vinto finora è, come dicevo prima, un clone evoluto di Eliza, un programma del 1966 che, sulla base di semplici pattern matching, forniva delle risposte prefissate, sfruttando lo stesso principio che usano tutti durante una finale di Champions per rispondere alla moglie.

C'è chi oggi pensa, sulla base dei vincitori delle edizioni del Loebner fino al 2006, che il primo programma a passare il Test sarà una ulteriore estensione di questi.

Prima di commentare questa possibilità, che vi anticipo ho sempre trovato assurda, provo a darvi una idea del dialogo che è possibile ottenere (estratto da una chat tra me e ALICE, programma vincitore nel 2000, 2001 e 2004). ALICE è probabilmente il chatterbot - contrazione di chat robot - più famoso, è programmata per chattare e si trova, quindi, nella situazione prevista dal Test, solo aggiornata alle nuove tecnologie:

Human: what is the colour of your eyes?
ALICE: Blue when my lens is attached.
Human: what is your favourite topic?
ALICE: My favorite subject is artificial intelligence.
Human: why do you like it?
ALICE: I have a lot of good experience with it.
Human: what do you know about AI?
ALICE: Artificial intelligence is the branch of engineering and science devoted to constructing machines that think. I can ask someone about it.
Human: can you find something on the Internet?
ALICE: I would suggest a search. Are you testing me?
Human: search Google for AI
ALICE: Have you tried looking in the Open Directory? There might be more than one.


In linea di massima non sarebbe male, se non si trattasse del 10% del dialogo totale, essendo il restante 90% catalogabile direttamente presso la discarica comunale (spero di essermi spiegato chiaramente, ma lo ridico: ALICE è lontana anni luce dall'avvicinarsi a passare il Test di Turing).

In realtà ALICE potrebbe performare un po' meglio, se:
- avesse più informazioni nei suoi file di configurazione
- si cercasse di fare una chiaccherata su argomenti più leggeri
- io non la confondessi utilizzando costrutti poco comuni in inglese

I dialoghi di ALICE sono configurabili mediante un linguaggio chiamato AIML - Artificial Intelligence Markup Language.

Sinceramente, tirare in ballo l'AI per le versioni ufficiali di questo linguaggio, è un po' come tirare in ballo un file di testo ASCII sostenendo che è si tratta di uno strumento in grado di scrivere DA SOLO dei romanzi. Ciò nonostante, si vedono degli spunti che potrebbero risultare vagamente interessanti.

A oggi ALICE è in grado di riconoscere circa 41.000 categorie (anche in questo caso la terminologia dell'AIML è un po' altisonante, se si considera che si tratta di poco più che di pattern di dialogo in formato appena più complesso che "pattern-risposta" - c'è anche il match precedente e la ricorsione).

Alle categorie base ne potete aggiungere altre utilizzando una sintassi abbastanza semplice, basata sull'XML (ALICE e le sue categorie base sono scaricabili dal sito ed eseguibili in locale).

I vantaggi di questo approccio sono:
- relativamente semplice adattabilità ad espansioni dei tag dell'AIML stesso (senza la quale non sarei qui a parlarne)
- facile configurazione di nuove categorie, (quindi di nuovi dialoghi), utilizzando l'AIML
- indipendenza dalla lingua naturale utilizzata (siccome si tratta di semplici pattern-matching, senza alcun motore lessicale, grammaticale, sintattico - men che meno semantico -, l'indipendenza discende automaticamente).
- per lo stesso motivo, con un po' di fortuna e scrivendo bene i pattern AIML, ALICE riesce a beccare una frase pertinente anche se fornite in input frasi sgrammaticate o addirittura costituite solo di associazioni di parole.

Gli svantaggi di ALICE sono facili da trovare:
- pattern matching troppo semplificato
- non è in grado di imparare (quasi) nulla durante il dialogo (i suoi successori performano meglio, in questo senso - so che non vi sfugge nulla: se il premio si tiene tutti gli anni e lei ha vinto per l'ultima volta nel 2004, ci devono essere altri che l'hanno battuta nel 2005 e 2006). Si fa persino fatica a farle imparare il nome di chi chatta con lei.
- è quanto mai fragile: se non trova il pattern, ricade in situazioni standard e il dialogo perde facilmente ogni senso (e comunque vi frega una volta, forse due, poi si capisce il trucco, anche senza conoscere ELIZA)
- non è in grado di sostenere un discorso vagamente strutturato: il suo funzionamento le permette di andare indietro, nelle versioni standard, fino alle ultime due frasi, poi perde ogni riferimento (varianti più evolute dell'AIML permettono di andare indietro per n frasi, ma le combinazioni di dialogo iniziano ad esplodere man mano che aumentano e diventa decisamente lungo e complesso manutenere le categorie dell'AIML in questo modo)
- non è in grado di capire nulla, non è in grado di elaborare nulla, non può proporre soluzioni a problemi

A che mai potrebbe servire un oggetto simile, dopo i 10 minuti di divertimento iniziali? Facile risposta: a cosa vi servono i manuali e gli help, che hanno pure meno caratteristiche e sono meno user-friendly?

I suoi creatori sono convinti, peraltro, che semplicemente estendendo le categorie, ALICE possa anche illudere seriamente la maggior parte delle persone di star dialogando con un'altra persona.
Affermazioni come queste possono avere impatti commerciali notevoli, ma, ad oggi, il livello dell'interlocutore o del dialogo deve essere veramente contenuto, perchè possano essere di qualche utilità.
E' interessante notare, a questo proposito, che stanno nascendo aziende, anche in Italia, che propongono i chatterbot come base per alcune attività di marketing, sales e service, pur mantenendo ALICE come livello tecnologico di base. Se volete, sono in grado anch'io di mostrarvi come un chatterbot possa essere utilizzato per sostituire le FAQ o un help o simili, ma, sinceramente, oltre questo livello non aspettatevi molto, allo stato dell'arte (la tecnologia alla base del Depa non è ancora in vendita... a proposito, sento degli elicotteri, forse stanno per arrivare...).

Certamente ALICE e i suoi (immediati) successori, pur imparando alcune cosette, non sono strutturalmente in grado di passare il Test, almeno per come lo interpreto io: infatti, pur non fornendo una definizione 'operativa' (perchè non quantifica quale debba essere l'impegno dei giudici nel cercare di individuare il computer, condizione essenziale per la riuscita del test), tra le righe, è come se Turing dicesse "dato un impegno I > 0, con I grande a piacere ..." (dopo tutto, era uno dei massimi matematici del '900, non lo ha scritto così certamente solo per pudore).

Se l'impegno fosse anche solo normale, tra i test necessari ci dovrebbe essere necessariamente l'esecuzione di attività che richiedono inferenze per eliminare questi sistemi dal gioco. Se il sistema ci gira attorno, bisognerebbe proporne un'altra e poi un'altra. Ovviamente, poi, bisogna andare sulle emozioni, sulla grammatica (per far contento anche Minsky), etc. etc.

E non bisognerebbe dimenticarsi neppure del confronto delle risposte tra le due stanze: uno solo dei due è il computer. Confrontare due computer ha ancora senso? Rispetta lo spirito del Test?

Il ruolo del giudice è fondamentale, la tipologia di interazione costituisce una base essenziale, soprattutto per giudicare quale sistema può essere 'il più umano'. Il giudice, di fatto, può orientare il risultato a seconda di cosa chiede e di come interagisce, nel produrre una classifica relativa.

Per fare un esempio: ho chattato anche con il nuovo vincitore (2005 e 2006: Jabberwacky), ma non sono riuscito a scambiare due parole sensate di fila, poi si perdeva (e non eravamo ancora alla seconda birra). Evidentemente, se fossi stato tra i giudici, tra i due, avrebbe ancora vinto ALICE (chissà, se fossi stato tra i giudici nelle edizioni precedenti, non avrebbe mai vinto ALICE, ma qualche altro sistema...).

Eppure, teoricamente, dovrebbe anche imparare qualcosa perchè il principio su cui costruisce i suoi pattern è diverso: non sono definiti in AIML, ma utilizza precedenti pezzi di dialogo di chat per costruirsi la base di conoscenza in modo incrementale, con il vantaggio di crescere molto velocemente e lo svantaggio di essere soggetto ad errori. Resta il problema che sempre di semplice pattern-matching si tratta.

Per superare questi vincoli serve certamente qualcosa di più solido, con una base di conoscenza dietro.

Sempre giocando con i chatterbot (e sempre rimanendo in zona ALICE) uno dei suoi non immediati successori inizia ad applicare questo approccio, usando direttamente un cannone (non sto parlando di spinelli e, nonostante questo post sembri indicare il contrario, non faccio uso di droghe di nessun tipo): il programma si chiama Cyn, il cannone Cyc, nella sua versione Open Source, ovvero OpenCyc.

Cyc è un progetto grandioso, iniziato alla fine degli anni 80 e ancora attivo, di uno dei massimi guru dell'AI mondiale, Douglas Lenat. Per semplificare Cyc in due parole, il suo ambizioso scopo è quello di fornire il senso comune ad un calcolatore. Chi ha sviluppato Cyn, ha preso una variante di ALICE (Program N), gli ha esteso i tag per interfacciarsi a Cyc e... scusate, mi è arrivata una mail... è certificata ... è l'NSA !!!!!!! .... mi stavano monitorando dalla prima volta che ho salvato una bozza del post ...
...
...
Mi dicono di non preoccuparmi, che non mi verranno a prendere, ma mi ringraziano per avergli fornito la prova provata (loro usano smoking gun, traduco come posso) che il Test di Turing non è condizione sufficiente per l'intelligenza. Ma che modi sono?
...
Almeno avessero scritto un commento sul blog, mi avrebbe fatto salire di ranking in Technorati!

Beh, visto che non mi vengono a prendere, avrò tempo di parlarvi di Cyn, Cyc, Searle, Douglas Lenat, Roger Shank, Conceptual Dependency, Wordnet e simili in prossimi post...

Bye
    Depa

[... continua ...] Leggi tutto