Hey Boss!

(Dialogflow)


- Hey Boss, come stai?
- Ciao, bene grazie; pensa che il mio ultimo concerto e' stato ad Auckland, in New Zeland
- Qual'e' l'ultima volta che hai suonato in Italia?
- L'ultima volta che ho suonato in Italia e' stato il 16/07/2016 a Roma - Circo Massimo
- Cosa hai cantato?
 ...

Il dialogo riportato sembra tra due umani (di cui uno piuttosto famoso) ma in realta' e' realizzato con un Chatbot ovvero con un semplice programma. L'aggettivo semplice naturalmente e' relativo: per realizzare questo programma si applicano concetti di ML (Machine Learning), AI (Artificial Intelligence), NLP (Natural Language Processing), ASR (Automatic Speech Recognition), TTS (text-to-speech), ...
Per creare un Agent che risponda alle richieste degli utenti e' necessario definire Intent ed Entity da analizzare un contesto fornire Utterance di esempio... infine servono anche alcuni dettagli tecnici come i Web Hook per riuscire ad effettuare il dialogo su uno dei canali integrati come: Facebook Messenger, Twitter, Telegram, Skype, ...

In questo documento viene descritto, in forma semplice e pratica, come realizzare un Chatbot Agent utilizzando Dialogflow di Google [NdE in precedenza chiamato API.AI].

Utilizzeremo un esempio concreto: creare un Chatbot esperto sui concerti di Bruce Springsteen.
Cercheremo tuttavia di generalizzare ogni concetto in modo consentire di comprendere al meglio gli strumenti e le loro potenzialita'. Quanto descritto con esempi su Dialogflow vale infatti per tutti i piu' recenti strumenti di riconoscimento del linguaggio e dei piu' diffusi chatbot: i concetti di base sono infatti gli stessi.

Introduzione

Una breve introduzione e' necessaria per fare un po' di confusione...
Quello che viene presentato e' solo un esempio di Chatbot. Anche se e' in grado di comprendere le domande e di imparare dalle risposte, un Chatbot non puo' ancora sostenere una conversazione su tutti gli argomenti immaginabili. L'idea di base e' che un Chatbot sia in grado di interpretare alcune richieste dell'utente (Intent) ed esaudirli con una risposta (Response) o una azione (Action).

Altra premessa importante: parleremo in Italiano. Sarebbe molto piu' facile farlo in inglese ma questo ci consente di presentare alcune delle difficolta' presenti con lingue differenti. Molti termini sono in inglese in questo documento... ma solo perche' hanno un significato tecnico preciso e tradurli li redenderebbe meno comprensibili. Sarebbe come tradurre "SPAM" con "fastidioso messaggio di posta": troppo lungo ed anche impreciso.

Dialogflow

Per la realizzazione del nostro esempio utilizzeremo API.AI/Dialogflow di Google. Accedere e' semplicissimo, basta utilizzare l'ULR https://dialogflow.com/ registrarsi (o utilizzare un'utenza Google come quella GMail) ed effettuare il login.

L'esempio pratico che vogliamo realizzare con Dialogflow e' un Chatbot in grado di elencare tutti le canzoni suonate ad un concerto, i concerti tenuti in un luogo, ... Per fare questo dobbiamo creare un Agent.

Agent

Un Agent e' un programma che risponde ad un compito specifico.

Potrebbe essere una gentile operatrice per le prenotazioni di una compagnia aerea. Oppure essere un esperto commerciale che conosce tutti i prodotti ed i listini prezzi di un azienda. Oppure un competente tecnico di supporto per gli elettrodomestici che abbiamo acquistato. Oppure uno stereo intelligente a cui chiedere: suonami una canzone triste. Oppure il computer di bordo di un'astronave...

Quello che e' importante e' che un Agent ha uno scopo preciso ed un bagaglio limitato di conoscenze: non ci interessa giocare a scacchi con il bot che effettua le prenotazioni dei voli e comunque non ne sarebbe in grado [NdE nella maggioranza dei casi nessuno dei due interlocutori sarebbe in grado].

Con Dialogflow la creazione di un agente e' molto semplice: basta assegnargli un nome!

Il nostro Agent si chiama HeyBoss ed e' un esperto di tutti i concerti tenuti da Bruce Springsteen. Dialogflow: Agent

Una nota importante: sono gia' disponibili una serie di Agent (Prebuilt Agents) per alcune tipologie di richieste (eg. Support & CRM) che possono essere personalizzati ed arricchiti per le proprie esigenze [NdE il numero di agenti disponibili dipende dalla lingua, in inglese sono disponibili oltre 30 differenti Agent]

Intent

Un Intent e' quello che un utente finale puo' chiedere ad un Agent.

La prenotazione di un volo e' un Intent; un altro Intent e' la consultazione degli orari per una determinata destinazione oppure la cancellazione di una prenotazione gia' effettuata.

Comprendere qual'e' la richiesta dell'utente e' la parte intelligente dell'Agent perche' sono molteplici i modi in cui una richiesta puo' essere espressa in linguaggio naturale (ovvero quello che noi umani parliamo).
L'Agent cerchera' di interpretare la richiesta dell'utente individando l'Intent che piu' si avvicina. Naturalmente l'associazione non e' sempre precisa, infatti viene restituita una graduatoria delle possibili interpretazioni. Ma da questo punto di vista si possono migliorare le risposte fornendo piu' esempi alternativi delle stesse richieste [NdE e' anche possibile applicare algoritmi di Machine Learning in modo da imparare dalle risposte precedenti].

Nel nostro Agent abbiamo realizzato solo alcuni Intent differenti. Su un progetto completo generalmente sono realizzati decine di Intent ma la tecnica di base non cambia. Dialogflow: Lista Intent

Dialogflow: Intent Con Dialogflow la form definizione di un Intent e' composta da quattro sezioni:

Quando viene inserita una frase di esempio questa viene automaticamente annotata riconoscendone le parti che vengono raccolte come Entity, come vederemo nel seguito.

Un Agent contiene sempre un Default Fallback Intent che raccoglie tutti i casi in cui non e' stato riconosciuto nessun altro Intent.

Il primo Intent realizzato nel nostro esempio risponde alla domanda di conoscere i pezzi cantati nei concerti ed e' presentato nella figura.

Per rispondere correttamente l'Agent deve conoscere il context che e' la prima cosa da compilare nel form di definizione dell'Intent...

Context

A che ora parte? oppure, nel nostro esempio: Cosa hai cantato? sono frasi prive di senso senza un contesto ma che diventano comprensibili nell'ambito di un dialogo piu' ampio: ecco a cosa serve un Context.

La sintassi per raccogliere un parametro dal contesto e' molto semplice #context_name.parameter_name

Con Dialogflow un Context viene mantenuto per dieci minuti o per cinque richieste.

Entity

Se un Intent corrisponde ad una richiesta, l'Entity corrisponde ai dettagli.

Nella prenotazione serve sapere la data precisa, l'aeroporto di partenza e quello di arrivo. Dal punto di vista di progettazione dell'Agent viene definita un Entity Volo che contiene tutti i dettagli necessari.

Dialogflow ha una serie di System Entities gia' create che facilitano la gestione dei concetti piu' semplici (eg. le date). Lo sviluppatore puo' definire una serie di Entities (Dev Entity) per generalizzare il comportamento dell'Agent. Infine l'utente finale crea un Entity ad ogni richiesta.
Una Dev Entity puo' avere valori determinati da un elenco, eseguire un mapping o essere a sua volta composta da altre entity, ...

Ma in realta' la cosa piu' facile e' fare un esempio: Dialogflow: Entity

Per risolvere i problemi di traduzione dei nomi delle citta' tra le diverse lingue una tecnica molto semplice e' quella di utilizzare dei sinonimi: Dialogflow: Entity synonym

Gli elenchi ed i sinonimi possono essere caricati molto facilmente su API AI da file CSV e rendono il nostro Agent un esperto del dominio poiche' vengono riconosciuti dal linguaggio naturale ed associati alle relative entita'.

Action

Fino ad ora ci siamo occupati di intepretare la richiesta dell'utente, ora si tratta di rispondere!

In realta' il concetto e' piu' ampio: una volta compresa una richiesta potremmo esaudirla (eg. prenotando il volo, aprendo un ticket, facendo rotta su Nettuno, ...). Ma se quello che realizziamo e' un Chatbot probabilmente all'azione corrispondera' una risposta.

Nel nostro esempio abbiamo molte possibili Action perche' HeyBoss e' davvero un esperto di Bruce ed ha un intero database a disposizione con tutti i concerti e le canzoni suonate nella sua lunga carriera.

Dialoghi e JSON

E' sempre possibile provare l'Agent utilizzando la form a destra di Dialogflow. Dialogflow: Dialogo -> default In questo modo si controllano facilmente i progressi nell'apprendimento del linguaggio da parte dell'Agent. Dialogflow: Dialogo -> intent riconosciuto E' anche disponibile la funzione di Training che consente al Bot di imparare dai dialoghi effettuati.

Ma in realta' tutto il dialogo interno di Dialogflow avviene in JSON. Il JSON e' un formato facilmente trattabile dai linguaggi di programmazione ma abbastanza comprensibile ed utilizzabile anche da parte degli umani. API IA: JSON

In pratica l'Agent riconosce la domanda dell'utente associandola ad un Intente e gli assegna un punteggio del 43%.

Integrations

Abbiamo visto come realizzare un agente con API AI: ora sa parlare e capire le richieste che gli vengono rivolte. Resta un piccolo problema: non ha le orecchie e la bocca!
Queste le forniamo con le Integrations. Le Integrations sono i programmi con cui API AI si puo' interfacciare in modo da essere richiamato con una Chat di Messenger o da una APP con riconoscimento vocale.

API AI dispone di un ampio numero di integrazioni One Click [NdA ovvero gia' predisposte]. Quante ne riconoscete?

Actions on Google API AI Integration Twitter API AI Integration Twilio API AI Integration Skype API AI Integration Telegram API AI Integration Cortana API AI Integration Facebook Messenger API AI Integration Viber API AI Integration Spark API AI Integration Slack API AI Integration Line API AI Integration Alexa API AI Integration Web API AI Integration Tropo API AI Integration Kik API AI Integration

Beh, tra i tanti: Twitter, Skype, Telegram, Cortana, Facebook Messenger, Viber, Line, Alexa, Kik, ...

Inoltre sono disponibili gli SDK [NdA ovvero ambienti di sviluppo] per i piu' diffusi linguaggi e sistemi: C++, C#, PHP, Python, Java, JavaScript, Node.js, Android, iOS, ...

Per il nostro esempio abbiamo utilizzato l'integrazione con Facebook Messenger perche' e' uno degli strumenti di messaggistica su social piu' utilizzati.
Su Facebook e' sufficiente creare una pagina cui vanno indirizzati i messaggi. Per colloquiare con il Chatbot bastera' cercarlo da Messenger ed inviare un messaggio: rispondera' la nostra AI! API IA: Integrazione con Facebook Messenger

Dal punto di vista tecnico tutto funziona con i Webhook...

Webhook

Questo capitolo e' piu' tecnico ma e' necessario per far funzionare la nostra conversazione.

Il webhook e' l'URL da richiamare che ospita il codice che implementa le Action da eseguire. A differenza di altri ambienti API AI consente di utilizzare anche il protocollo HTTP (e non solo il protocollo HTTPS).

Generalmente le Action sono ricerche da eseguire su un DB relazionale. La definizione con API AI e' semplice: API IA: Webhook

Il codice non da implementare non e' complesso... ma va pur sempre realizzato un programma (in PHP in questo esempio):

...
    $city="";
    if($request->input('result.parameters.geo-city')!=null)
            $city=$request->input('result.parameters.geo-city');
    $date="";
    if($request->input('result.parameters.date')!=null)
            $date=$request->input('result.parameters.date');
    $country="";
    if($request->input('result.parameters.country')!=null)
            $country=$request->input('result.parameters.country');

    $last="";
    if($request->input('result.parameters.last_time')!=null) {
        $items=\DB::select("SELECT
            sl.id_setlist,date_format(sl.dt_setlist,'%d/%m/%Y') dt_setlist,c.ds_city, sl.place from setlists sl, cities c, countries co
            where sl.id_city=c.id_city and c.id_country=co.id_country and
            (c.ds_city=? or co.ds_country=? or co.alt_country=?) order by sl.dt_setlist desc limit 1 ",[$city, $country,$country]);

        if(count($items)==1)
            $ret="L'ultima volta che ho suonato in ".$country." e' stato il ".$items[0]->dt_setlist." a ".$items[0]->ds_city." - ".$items[0]->place;
    }
...

Small Talk

Al contrario del precedente questo ultimo capitolo tecnico e' semplicissimo... ma rende molto piu' naturale la conversazione con l'Agent con pochissimo sforzo.

Abilitando la gestione degli Small Talk e' possibile personalizzare le risposte fornite sulle domande conversazionali piu' frequenti.
In questo modo l'Agent rispondera' a domande retoriche, di cortesia, di saluto, conversazionali, ... o semplicemente a domande stupide in modo personalizzato. API IA: Small Talk

Mille ed un... Chatbot

Quanto presentato in questo documento non esaurisce in nessun modo l'argomento. Anzi e' importante sottolineare che gli approcci possono essere molto, molto diversi tra loro.

Oracle Intelligent Bots Amazon Lex IBM Watson Microsoft LUIS Facebook WIT.AI Google Dialogflow/API.AI Quello che e' certo che i Big Player si sono mossi tutti proponendo le loro soluzioni: Dialogflow/api.ai (Google), wit.ai (Facebook), LUIS (Microsoft), Watson (IBM), Lex (Amazon), Intelligent Bots (Oracle), ...

Pandorabots Una serie di soluzioni sono basate sullo standard AIML (Artificial Intelligence Markup Language). La piattaforma piu' utilizzata per l'hosting e': Pandorabots.

Alexa Skill Botsify Flowxo Massively Octane AI ManyChat Chatfuel Motion.ai Molto interessanti e di immediato utilizzo sono le piattaforme per realizzare Chatbot che non richiedono alcuna programmazione: Motion.ai, Chatfuel, ManyChat, Octane AI, Massively, Flow XO, Botsify, Alexa Skill Blueprints, ...

Indigo Molte sono anche le realta' nate in italia come Indigo e molte altre...

Va ricordata infine, anche perche' e' stata la prima a nascere, la famosa Eliza (in pratica la nonna di tutti i Chatbot):

Liz:	Is something troubling you?
meo:	I'm hungry
Liz:	Do you know anyone else who is hungry?
meo:	Yes, for sure also Umberto is.
Liz:	I understand.
meo:	Are You hungry too?
Liz:	What are your feelings now?
meo:	A bit stressed...
Liz:	Does talking about this bother you?
meo:	I have an enormous amount of email to reply and I'm supposed to prepare a document on AI like You are.   
Liz:	How?
meo:	Bye
Liz:	I think you should talk to a REAL analyst.  Ciao! 

In questa breve presentazione abbiamo utilizzato Dialogflow - API AI (Google): anche questo ambiente viene continuamente aggiornato ed arricchito. L'elenco delle variazioni e' riportato sul Changelog: in meno di due anni lo strumento si e' evoluto in modo notevole e lo stesso e' avvenuto per tutti gli altri ambienti citati in questo capitolo.

Conclusioni

Sugli Smartphone sono disponibili migliaia di applicazioni... pero' quelle effettivamente piu' utilizzate sono quelle di messaggistica: le piu' adatte all'integrazione con i Chatbot. La presenza dei Chatbot diverra' sempre piu' massiccia nel tempo. Ora siamo abituati a chiamare l'ascensore premendo un bottone con il dito, domani lo faremo con la nostra voce [NdE c'era gia' chi lo faceva prima dei Chatbot: ma forse erano troppo avanti per essere capiti ;-].

Cambia il modo di interagire e, per noi tecnici, il modo di programmare le Interfacce Utente. Questa paginetta dovrebbe averne anticipato qualche dettaglio.

Insomma non conta se sei un programmatore o un utente... inizia a chattare!


Titolo: Hey Boss!
Livello: Avanzato (3/5)
Data: 1 Aprile 2017
Versione: 1.0.3 - 14 Febbraio 2018 ❤️ San Valentino
Autori: Cris, mail [AT] meo.bogliolo.name