{"id":834,"date":"2019-08-09T11:13:43","date_gmt":"2019-08-09T09:13:43","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=834"},"modified":"2021-03-17T12:51:56","modified_gmt":"2021-03-17T11:51:56","slug":"amazon-lex-anatomia-di-un-chatbot","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/amazon-lex-anatomia-di-un-chatbot\/","title":{"rendered":"Amazon Lex: anatomia di un chatbot"},"content":{"rendered":"
Con il crescente impiego dell\u2019intelligenza artificiale e con l\u2019avvento di nuove interfacce uomo-macchina, diventa sempre pi\u00f9 importante esplorare le nuove tecnologie ed impiegarle al meglio per trarne la massima utilit\u00e0 ed il massimo valore.<\/span><\/p>\n Uno degli impieghi dell\u2019intelligenza artificiale e del deep learning pi\u00f9 orientato all\u2019utente finale \u00e8 certamente la realizzazione di nuovi tipi di <\/span>interfacce uomo-macchina<\/b> basate sul riconoscimento degli intenti, sia su messaggi di testo sia da interazioni vocali.<\/span><\/p>\n Per avere alcuni esempi di questa tipologia di applicazioni basta pensare agli assistenti vocali sugli smartphone, a quelli domestici come ad esempio Amazon Alexa e a tutti i servizi con cui \u00e8 possibile interagire via chat.<\/span><\/p>\n In questo articolo vi mostreremo come realizzare uno <\/span>Slack bot usando Amazon Lex.<\/b><\/p>\n In ambito informatico, riconoscimento vocale e comprensione del linguaggio naturale sono tra i problemi pi\u00f9 complessi affrontati, tanto da necessitare algoritmi di deep learning molto complessi. Tali algoritmi richiedono enormi quantit\u00e0 di dati per essere addestrati efficacemente, oltre ad apposite infrastrutture di calcolo dai costi particolarmente elevati. <\/span>Amazon Lex rende queste tecnologie accessibili a tutti<\/b> aprendo la strada verso una categoria completamente nuova di prodotti.<\/span><\/p>\n Amazon Lex \u00e8 un servizio per la creazione di interfacce di comunicazione tramite voce e testo realizzato per essere sufficientemente generico da essere impiegato in qualsiasi applicazione. Offre funzionalit\u00e0 avanzate di apprendimento per il riconoscimento vocale e la dettatura, nonch\u00e9 per il riconoscimento del linguaggio naturale e per la comprensione di testi, consentendo la creazione di applicazioni con una user-experience coinvolgente, basata su conversazioni realistiche. Con Amazon Lex, le stesse tecnologie di apprendimento approfondito su cui si basa Amazon Alexa sono a disposizione di tutti gli sviluppatori, consentendo cos\u00ec la creazione di <\/span>bot di conversazione<\/b> (\u201cchatbot\u201d) sofisticati e naturali in modo semplice, veloce e a basso effort.<\/span><\/p>\n Lex consente una facile integrazione con Facebook Messenger, Slack e Twilio SMS.\u00a0<\/span><\/p>\n Attualmente, Lex supporta solamente la lingua Inglese, ma \u00e8 possibile realizzare bot in altre lingue costruendo una soluzione ad-hoc che sfrutti Amazon Translate.<\/span><\/p>\n Prima di entrare nei dettagli di implementazione occorre definire il gergo ed i concetti fondamentali di Lex.<\/span><\/p>\n Un bot realizzato mediante Lex si compone sostanzialmente di 3 parti:<\/span><\/p>\n Ora definiamo meglio i concetti sopra citati.<\/span><\/p>\n Il modello di interazione consiste di un file json che modellizza tutti gli <\/span>intenti<\/b>, cio\u00e8 il tipo di azioni rese possibili agli utenti e che il bot pu\u00f2 gestire. Per ogni <\/span>intento<\/b> \u00e8 necessario definire anche quali siano i <\/span>parametri<\/b> necessari e il loro <\/span>tipo<\/b>.<\/span><\/p>\n Questo file pu\u00f2 essere redatto testualmente e fornito a Lex, oppure essere realizzato per via grafica utilizzando la web console di AWS.<\/span><\/p>\n Il modello contiene anche molte frasi di esempio per ogni intento (<\/span>utterances<\/b>), frasi che verranno utilizzate dalla IA per riconoscere le richieste degli utenti verso il bot ed indirizzarle opportunamente alle specifiche funzioni Lambda per essere processate.<\/span><\/p>\n Il back-end di un bot Lex, ovvero la parte di computazione che permette di soddisfare gli intenti e che contiene quindi tutta la business logic, deve essere realizzato con <\/span>AWS Lambda.<\/b> Attualmente, al contrario di amazon Alexa, non sono previste modalit\u00e0 di integrazione generiche e cross provider.<\/span><\/p>\n AWS garantisce la sicurezza delle invocazioni mediante <\/span>IAM policy e trust relationship.<\/b><\/p>\n I canali sono le vie di comunicazione con il bot.<\/b> Al momento vengono supportati Facebook Messenger, Slack e Twilio SMS.<\/span><\/p>\n \u00c8 possibile definire uno o pi\u00f9 canali direttamente dalle impostazioni del bot; per tutti i canali gestiti non \u00e8 necessario implementare funzioni, n\u00e9 effettuare il provisioning di risorse. \u00c8 sufficiente configurare l\u2019integrazione con i servizi esterni.<\/span><\/p>\n Sono altres\u00ec disponibili guide ufficiali dettagliate per integrare tutti i servizi supportati con Lex.<\/span><\/p>\n L\u2019infrastruttura \u00e8 molto semplice e si compone di <\/span>soli servizi gestiti.<\/b><\/p>\n Il trigger tra Lex e Lambda \u00e8 completamente gestito da AWS<\/b>; per configurarlo basta indicare l\u2019arn della funzione nel modello del bot, ed abbinarlo all\u2019intento desiderato.<\/span><\/p>\n Anche i canali supportati non richiedono il provisioning di risorse all\u2019interno dell\u2019account AWS. La gestione di eventuali endpoint o canali di comunicazioni con servizi esterni sono gestiti automaticamente da Lex.<\/span><\/p>\n Una volta definito il modello e configurato un canale, il bot \u00e8 pronto a ricevere input dall\u2019utente. Ogni input verr\u00e0 scandagliato in cerca dell\u2019intento; Lex guider\u00e0 poi la conversazione per reperire tutti gli <\/span>slot<\/b>, o <\/span>parametri<\/b>, definiti nel modello per poter elaborare l\u2019intento individuato.<\/span><\/p>\n Ottenuti tutti i <\/span>parametri<\/b> necessari, Lex invocher\u00e0 la funzione lambda indicata passandogli un oggetto in cui sono definiti <\/span>l\u2019intento<\/b> ed i <\/span>parametri<\/b> raccolti.<\/span><\/p>\n Il risultato della lambda sar\u00e0 il messaggio di risposta fornito all\u2019utente.<\/span><\/p>\n Abbiamo definito tutti i concetti chiave di Lex e possiamo cominciare ad entrare nel merito della realizzazione di un bot.<\/span><\/p>\n Quello che segue \u00e8 un esempio di bot funzionante realizzato utilizzando esclusivamente Amazon Lex.<\/span><\/p>\n Si tratta di un bot triviale, al solo fine di dimostrare i concetti ed il principio di funzionamento.<\/span><\/p>\n Per questo primo bot non saranno utilizzate funzioni di back-end in quanto ci limiteremo a riconoscere l\u2019intento di salutare o di essere salutati e rispondere con un messaggio preimpostato.<\/span><\/p>\n Questo \u00e8 l\u2019aspetto di un <\/span>modello di interazione.<\/b> Come gi\u00e0 accennato si tratta di un file json che contiene l\u2019elenco di tutti gli intenti, nel nostro esempio\u00a0 \u201cgreetings\u201d.<\/span><\/p>\n Per ogni intento vengono definite le frasi di esempio, definite nell\u2019array \u201csampleUtterances\u201d e anche il tipo di azione da intraprendere per soddisfare l\u2019intento, definito nel campo \u201cfulfillmentActivity\u201d e valorizzato a ReturnIntent\u201d nel nostro esempio, per rispondere al client con un messaggio fisso.<\/span><\/p>\n Il messaggio preimpostato viene scelto casualmente tra quelli indicati in \u201cconclusionStatement\u201d.\u201dmessages\u201d.<\/span><\/p>\n\n
Modello di interazione<\/span><\/h2>\n
Lambda Back-end<\/span><\/h2>\n
Interfacce\/Canali di comunicazioni<\/span><\/h2>\n
Infrastruttura<\/span><\/h2>\n
<\/p>\n
Interazione con il bot<\/span><\/h2>\n
Un bot triviale<\/span><\/h2>\n
Modello di interazione<\/span><\/h3>\n
{<\/span>\r\n\u00a0<\/span>\"metadata\"<\/span>: {<\/span>\r\n\u00a0\u00a0\u00a0<\/span>\"schemaVersion\"<\/span>: <\/span>\"1.0\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0<\/span>\"importType\"<\/span>: <\/span>\"LEX\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0<\/span>\"importFormat\"<\/span>: <\/span>\"JSON\"<\/span>\r\n },<\/span>\r\n\u00a0<\/span>\"resource\"<\/span>: {<\/span>\r\n\u00a0\u00a0\u00a0<\/span>\"name\"<\/span>: <\/span>\"TestBot\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0<\/span>\"version\"<\/span>: <\/span>\"1\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0<\/span>\"intents\"<\/span>: [<\/span>\r\n \u00a0\u00a0\u00a0\u00a0{<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"name\"<\/span>: <\/span>\"greetings\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"version\"<\/span>: <\/span>\"2\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"fulfillmentActivity\"<\/span>: {<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"type\"<\/span>: <\/span>\"ReturnIntent\"<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"sampleUtterances\"<\/span>: [<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"greet me\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"please greet me\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"greetings\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"make the greetings for me\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"would you greet me please\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"would you greet me\"<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"slots\"<\/span>: [],<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"conclusionStatement\"<\/span>: {<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"messages\"<\/span>: [<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"groupNumber\"<\/span>: <\/span>1<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"contentType\"<\/span>: <\/span>\"PlainText\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"content\"<\/span>: <\/span>\"Hello\"<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"groupNumber\"<\/span>: <\/span>1<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"contentType\"<\/span>: <\/span>\"PlainText\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"content\"<\/span>: <\/span>\"Greetings\"<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"groupNumber\"<\/span>: <\/span>1<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"contentType\"<\/span>: <\/span>\"PlainText\"<\/span>,<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span>\"content\"<\/span>: <\/span>\"Hi :-)\"<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<\/span>\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/span>\r\n