Getting started: DialogFlow

La Linguistica Computazionale è lo studio di
sistemi informatici per la comprensione e la
produzione di linguaggio naturale
– Ralph Grishman

Nel 201o Apple acquista da un istituto di ricerca californiano Siri, un’agente in grado di comprendere e rispondere alle richieste dell’utente impiegando il linguaggio naturale, presentadolo al mondo nell’autunno 2011 con l’iPhone 4s.

Il linguaggio naturale è la forma di comunicazione che ci risulta più facile, e non solo nella sua versione parlata, anche quella scritta sta crescendo esponenzialmente tanto che possiamo affermare che “l’interfaccia utente è il testo” (2018).

DialogFlow

Quando ci loggiamo per la prima volta a Dialogflow ci si  sente spaesati, perché non si sa esattamente da dove iniziare. In questo primo tutorial vedremo di rendere più chiari termini come: agente, intents, entities.
Il nostro obiettivo sarà di trasformare le richieste dell’utente (query) fatte in linguaggio naturale in dati fruibili e comprensibili ad un computer. Questo processo di trasformazione viene chiamato Natural Language Understanding (NLU) e si concentra principalmente sulla classificazione degli intenti di una frase e sull’estrazione delle entities (entities extraction).

Un sistema NLU cerca di comprendere il significato di un testo tentando di risolvere le ambiguità del linguaggio naturale, come esseri umani lo facciamo c0ntinuamente, anche senza rendercene conto, quando leggiamo o ascoltiamo. Ad esempio, dalla nostra esperienza del mondo sappiamo che mangeremo il dolce e non il tavolo e disambigueremo frasi come: “Andres prese il dolce sopra il tavolo e lo mangiò” (ambiguità referenziale). Inoltre sappiamo che una parola può avere più di un significato (ambiguità lessicale),  frasi e sintagmi possono avere più significati (ambiguità sintattica) come: “Andres discute la relazione con Veronica”.
Comprendere il testo senza ambiguità conoscendo le regole e la struttura del linguaggio  sono solo alcune delle sfide affrontate dai sistemi NLU.
Spesso il termine NLU viene ritenuto sinonimo di natural language processing (NLP) e viceversa,  ma possiamo considerare NLU come un sottoinsieme della NLP. D’altronde se una macchina non è in grado di comprendere il contenuto di un testo, come può di conseguenza elaborarlo?
NLP  è un’area così attiva dell’intelligenza artificiale (AI) e di natura interdisciplinare (linguistica, data science, computer science, etc ) che nascono di continuo nuovi termini tecnici che senza un quadro di riferimento possono causare confusione. Infatti succede che involontariamente i ricercatori utilizzino termini diversi per uno stesso concetto o termini che sono ambigui.

Agente intelligente

In che modo siamo in grado di capire,
descrivere, prevedere gli atteggiamenti,
le attività dei nostri simili, gli esseri umani?
Daniel Dennett, 1993

Il concetto di “intelligenza”, e di conseguenza quello di “agente intelligente”, è stato oggetto di studio di diverse discipline come: la filosofia, le scienze cognitive,  l’economia, la sociologia, ecc.. che ne hanno proposto diverse definizioni. Particolarmente interessante è la definizione debole (weak) di agente data dai computer scientists Nicholas Robert Jennigs e Michael Wooldridge (1995):

Un agente come un sistema informatico situato in un certo ambiente, capace di azioni autonome e flessibili al fine di ottenere i suoi obiettivi di progetto.

Che mettono in risalto la capacità dell’agente di reagire all’ambiente (reattività) in cui è situato senza l’intervento umano (autonomia) , di raggiungere i propri obiettivi e in caso di collaborare con altri agenti per raggiungerli (abilità sociali).
Possiamo  considerare intelligente un agente che esibisce un comportamento razionale o più correttamente si tratta di un  sistema che, data la sua complessità, è conveniente descrivere tramite gli stati intenzionali (Wooldridge). Per il filosofo della mente Daniel Dennett avremmo la capacità di “trattare l’oggetto di cui si vuole prevedere il comportamento come un’agente razionale” attribuendogli una serie di ​ “credenze ”, ipotizzando i suoi “desideri” e infine deducendone il comportamento razionale.
Un agente non deve necessariamente possedere tutte queste capacità, sta a noi scegliere quali moduli progettare, in base agli obiettivi da conseguire.

Step 1 – Creare un’agente

Iniziamo con creare un nuovo agente (1) dandogli un nome (2) ricordandoci di selezionare la lingua (3) e la time zone (4) corretta. Inoltre DialogFlow consente di sviluppare un’agente in grado di supportare più lingue al suo interno, dando così la possibilità di impostare diverse risposte per ciascuna lingua.

Inoltre ad ogni agente viene associato un progetto Google che possiamo selezionare dal menu a discesa fra quelli pre-esistenti o lasciando l’opzione predefinita ne verrà creato in automatico uno nuovo con il nome dell’agente nella piattaforma Google Cloud. 

Nel mio caso, come possiamo vedere dall’immagine,  il mio agente su DialogFlow si chiama InHerShoes , in lingua italiana (it), a cui è stato associato l’ID del progetto Google Cloud inhershoes-e1afa.

Intents: qual è l’obiettivo?

Quando un’utente parla al microfono del proprio device o digita sulla tastiera la sua richiesta (query) al nostro agente dobbiamo chiederci: “Che cosa voleva l’utente con questa frase?”
L’intento rappresenta l’obiettivo della frase e dev’essere indipendente dai dettagli che comunica, ad esempio per la frase:

Dobbiamo creare l’intento “trova_posizione” invece di “trova_ristorante_cinese”. Inoltre un’utente può esprimere lo stesso intento in modi diversi:

In entrambi i casi l’azione (action) é probabilmente la stessa: trovare una posizione.


In questo altro esempio l’obiettivo è prenotare un volo.

Termini come “ristorante cinese”,“biblioteca” , “Roma”, “Milano” ,”domani” invece sono dettagli che verranno estratti con le entities.

Step 2 – Creare un intent

Una volta che abbiamo creato il nostro agente si viene reindirizzati alla schermata “Intents” dalla quale possiamo cliccare sul pulsante “Create intent”:

L’intent è una mappatura tra ciò che l’utente dice e quali azioni (action and parameters) dovrebbero compiere il nostro agente. Se volessimo accendere le luci delle diverse stanze di un appartamento l’azione sarebbe la stessa (a cui potremmo dare il nome di  powerOnLights) e molto probabilmente anche l’intento sarà  lo stesso (ad es: powerOn).

Quando facciamo il training  di quello che potrebbe dire o digitare un’utente (training phrases) stiamo semplicemente ricercando quelle frasi comuni che potrebbero innescare una stessa azione (action). Ora immaginiamo di voler acquistare delle scarpe quali sono le possibili frasi?

Durante una conversazione vengono utilizzati i contesti (contexts) per mantenere un riferimento ai valori dei parametri mentre l’utente si sposta fra gli intents. In questo modo si tiene traccia della conversazione (2) fra utente e agente e ogni frase non risulta isolata da quella precedente (1).

Come reagiresti se senza un contesto ti dicessi:“vorrei comprare un paio di scarpe rosse?” Allo stesso modo un’agente, senza la direzione dello scambio verbale,  non saprebbe come comportarsi ed è qui che entrano in gioco i contesti guidando la conversazione e rispettando così il principio di cooperazione di Grice (“Bot design: come fare cose con le parole in chat”, 2017).

conforma il tuo contributo conversazionale a quanto è richiesto, nel momento in cui avviene, dall’intento comune accettato o dalla direzione dello scambio verbale in cui sei impegnato

I contesti ci permettono di prendere decisioni in base alle risposte precedenti, di riparare le conversazioni che verrebbero chiuse o che possono divergere in intenti che non vogliamo.

Entities: estrarre i dettagli

Quando l’utente parla o digita Dialogflow ricerca le entities e il loro valore in modo da poter comprendere la richiesta che viene formulata in linguaggio naturale. Di solito sarà una parola chiave come un nome, la data o la posizione etc.
Immaginiamo che l’utente chieda al nostro agente:

Nell’esempio “rosso” e “scarpe” sono entities e cambiandone il valore il significato della frase verrebbe alterato, ma non l’intento (ad esempio “comprareScarpe” ) che rimarebbe lo stesso perché l’utente ha espresso in tutti i casi il desiderio di acquistare qualcosa.

A seconda dell’agente che stiamo creando, in questo caso un chatbot per la vendita di scarpe, possiamo creare delle entities per tipologia:per colore (rosse, nere, blu, etc) o per modello di scarpa (sandalo, stivali, tacchi, etc..). Riprendiamo quest’altro esempio:

Le entities sono la città di partenza, la città di destinazione e la data.
Una funzionalità molto utile è che dopo il training delle frasi il sistema NLU è in grado di assegnare nuovi valori per una entity in base agli intents e i valori addestrati. Ad esempio può estrarre il valore “blu” c0me entity anche se nessuno degli esempi di addestramento conteneva la parola blu.

Step 3 – Creare una entity

Dialogflow contiene già un insieme di entities predefinite che possiamo utilizzare quando creaimo i nostri intents, ma spesso ne abbiamo bisogno di personalizzate. Iniziamo con il cliccare su Entities (1) e poi su Create Entity (2)

Immaginiamo di voler creare la entity “Scarpe”, sul lato sinistro (3) definiremo il valore per l’Entity ed invece su quello destro i sinonimi in questo modo aumentiamo la possibilità di riconoscere le richieste degli utenti.

La possibilità di usare sinomi rendono la conversazione più “naturale” e meno “artificiale”  perché possiamo includere abbreviazioni, termini gergali e anche errori di ortografia comuni.
Quando definiamo i valori per l’Entity, questo è lo stesso che verrà rivelato da DialogFlow quando andremo a costruire gli Intents aggiungendo le diverse frasi:

 

Bibliografia
[1] Ralph Grishman, Computational Linguistics: An Introduction, Cambridge University Press, 1987
[2] Daniel Dennett, L’atteggiamento intenzionale, Il Mulino, Bologna, 1993
[3] D. Dennett, Rompere l’incantesimo, Cortina Raffaello, Milano, 2007
[4] D. Dennett, Coscienza. Che cosa è? , Laterza, Bari, 2012
[5] Erik Brynjolfsson, La nuova rivoluzione delle macchine, Feltrinelli,2017

Sitografia
[1] Kyle Wagner,Siri Is Actually Incredibly Useful Now, 2012
[2] What Are The Differences Between AI, Machine Learning, NLP, And Deep Learning?, Quora

DialogFlow tutorials
[1] Wassim Chegham, Build multi-lingual Actions for the Google Assistant,
Google Developers Experts, 2017

DialogFlow documentation
[1] Create and query your first agent
[2] Extract data with entities
[3] Entities