Università degli Studi di Padova - SIAGAS

Pagina creata da Mirko Cozzolino
 
CONTINUA A LEGGERE
Università degli Studi di Padova
 Dipartimento di Matematica "Tullio Levi-Civita"
               Corso di Laurea in Informatica

Sviluppo di un chatbot serverless con i servizi
AWS ed integrato su una Web App Angular
                        Tesi di laurea triennale

Relatore
Prof.Franceso Ranzato

                                                      Laureando
                                                   Enrico Trinco

                    Anno Accademico 2018-2019
Enrico Trinco: Sviluppo di un chatbot serverless con i servizi AWS ed integrato su una
Web App Angular, Tesi di laurea triennale, c Dicembre 2019.
Sommario

Il presente documento descrive il lavoro svolto durante il periodo di stage, della durata
di circa trecento ore, dal laureando Enrico Trinco presso l’azienda Zero12 s.r.l.

Lo stage consisteva nella realizzazione di un chatbot, basato su interfaccia conversazio-
nale, in modo da rendere più facile e veloce l’accesso alle informazioni di viaggio per i
dipendenti di un’azienda.
In secondo luogo doveva essere realizzata una Web App che esponesse il chatbot ed
offrisse opzioni di salvataggio ed eliminazione di una chat.

Il presente documento ha lo scopo di esporre il contesto aziendale nel quale ho operato,
l’attività di stage svolta e una valutazione finale sul lavoro eseguito.

                                           iii
Ringraziamenti

Innanzitutto, vorrei esprimere la mia gratitudine al Prof. Francesco Ranzato, relatore
della mia tesi, per l’aiuto e il sostegno fornitomi durante la stesura del lavoro.

Desidero ringraziare con affetto i miei genitori per il sostegno, il grande aiuto e per
essermi stati vicini in ogni momento durante gli anni di studio.

Ringrazio l’azienda Zero12 s.r.l. per avermi concesso l’opportunità di svolgere questo
progetto, in particolar modo Andrea Barcaro e Nicola dalla Costa per il supporto datomi
nell’apprendimento di diversi concetti.

Ultimi, ma non meno importanti, vorrei ringraziare i miei amici, veneti e non, per
aver reso indimenticabili questi miei anni universitari.

Padova, Dicembre 2019                                                    Enrico Trinco

                                           v
Indice

1 Introduzione                                                                                                                       1
  1.1 Stage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                1
  1.2 Suddivisione dei capitoli . . . . . . . . . . . . . . . . . . . . . . . . . .                                                  1
  1.3 Note sul testo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                 2

2 L’azienda                                                                                                                         3
  2.1 L’azienda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                 3
       2.1.1 Filosofia dell’azienda . . . . . . . . . . . . . . . . . . . . . . . .                                                 3
       2.1.2 Metodologia di lavoro . . . . . . . . . . . . . . . . . . . . . . .                                                    4

3 Il progetto                                                                                                                       5
  3.1 Introduzione del progetto . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   5
  3.2 Vincoli lavorativi . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   5
       3.2.1 Ambiente di lavoro . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   5
       3.2.2 Metodologia adottata .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   5
       3.2.3 Composizione del team          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   6
       3.2.4 Orario di lavoro . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   6
  3.3 Svolgimento del progetto . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   6
       3.3.1 Requisiti fissati . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   7

4 Tecnologie utilizzate                                                                                                              9
  4.1 Tecnologie chatbot . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                   9
      4.1.1 Amazon Web Services . . . . . . . . . . . . . . . . . . . . . . .                                                        9
  4.2 Tecnologie Web App . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                    13

5 Progettazione                                                                                                                     15
  5.1 Visione dell’architettura generale . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   15
  5.2 Progettazione del chatbot . . . . . . . . . . . . . . . . . . .                                       .   .   .   .   .   .   16
      5.2.1 Prima presentazione del progetto e studio tecnologie                                            .   .   .   .   .   .   16
      5.2.2 Comprensione dei servizi adottati . . . . . . . . . . .                                         .   .   .   .   .   .   17
      5.2.3 AWS Lex . . . . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   18
      5.2.4 Progettazione AWS DynamoDB . . . . . . . . . . .                                                .   .   .   .   .   .   22
      5.2.5 Progettazione AWS API Gateway . . . . . . . . . .                                               .   .   .   .   .   .   25
      5.2.6 Definizione funzioni Lambda . . . . . . . . . . . . .                                           .   .   .   .   .   .   25
  5.3 Progettazione parte utente Web App . . . . . . . . . . . . .                                          .   .   .   .   .   .   26
      5.3.1 Studio tecnologie . . . . . . . . . . . . . . . . . . . .                                       .   .   .   .   .   .   26
      5.3.2 Definizione risorse AWS API Gateway . . . . . . . .                                             .   .   .   .   .   .   26
      5.3.3 Pagina login . . . . . . . . . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   26
      5.3.4 Dashboard . . . . . . . . . . . . . . . . . . . . . . .                                         .   .   .   .   .   .   27

                                            vii
viii                                                                                                            INDICE

             5.3.5 Chat . . . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
       5.4   Progettazione parte admin Web App . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
             5.4.1 Definizione risorse AWS API Gateway          .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
             5.4.2 Pagina di gestione utenti . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
             5.4.3 Pagina di gestione delle utterances . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
             5.4.4 Pagine di gestione tabelle . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   30

6 Codifica                                                                                                              31
  6.1 Organizzazione directory . . . . . . . . . . . . . . . . . . . . .                            .   .   .   .   .   31
  6.2 Pacchetti utilizzati per la comunicazione con i servizi AWS .                                 .   .   .   .   .   32
  6.3 Codifica del chatbot . . . . . . . . . . . . . . . . . . . . . . .                            .   .   .   .   .   32
      6.3.1 Invio di un messaggio al chatbot . . . . . . . . . . . .                                .   .   .   .   .   32
      6.3.2 Gestione del messaggio con AWS Lex e AWS Lambda                                         .   .   .   .   .   33
  6.4 Integrazione del Chatbot sulla Web App . . . . . . . . . . . .                                .   .   .   .   .   34
      6.4.1 Interfaccia di conversazione . . . . . . . . . . . . . . .                              .   .   .   .   .   34
      6.4.2 Integrazione . . . . . . . . . . . . . . . . . . . . . . . .                            .   .   .   .   .   35
      6.4.3 Salvataggio dei messaggi . . . . . . . . . . . . . . . . .                              .   .   .   .   .   36
      6.4.4 Caricamento dei messaggi . . . . . . . . . . . . . . . .                                .   .   .   .   .   36
      6.4.5 Autenticazione . . . . . . . . . . . . . . . . . . . . . .                              .   .   .   .   .   37
  6.5 Operazioni database . . . . . . . . . . . . . . . . . . . . . . .                             .   .   .   .   .   38
      6.5.1 Lettura dal database dei messaggi salvati di una chat                                   .   .   .   .   .   38
      6.5.2 Scrittura nel database di una conversazione di chat . .                                 .   .   .   .   .   38

7 Conclusioni                                                                                                           39
  7.1 Adempimento delle tempistiche e dei requisiti             .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
      7.1.1 Adempimento tempistiche . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
      7.1.2 Adempimento requisiti . . . . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
  7.2 Stato finale del prodotto . . . . . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
      7.2.1 Possibili miglioramenti sul progetto . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
  7.3 Conoscenze acquisite . . . . . . . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   41
  7.4 Valutazione personale . . . . . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   41

Glossario                                                                                                               43

Bibliografia                                                                                                            47
Elenco delle figure

 2.1   Logo zero12 s.r.l. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                     3

 4.1   Logo   AWS . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .    9
 4.2   Logo   AWS Lambda . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
 4.3   Logo   Python . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
 4.4   Logo   AWS Lex . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
 4.5   Logo   AWS Dynamodb . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
 4.6   Logo   AWS API Gateway .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
 4.7   Logo   AWS API Gateway .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
 4.8   Logo   AWS API Gateway .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
 4.9   Logo   AWS API Gateway .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13

 5.1   Visione dell’architettura . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
 5.2   Bozza del funzionamento del chatbot richiesto                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
 5.3   Progettazione del chatbot . . . . . . . . . . .                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
 5.4   Dashboard della Web App . . . . . . . . . . .                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
 5.5   Interfaccia di chat della Web App . . . . . . .                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
 5.6   Pagina di gestione degli utenti . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
 5.7   Pagina di gestione delle utterance . . . . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
 5.8   Pagina di modifica tabella trasferimento sede                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   30

                                                  ix
Elenco delle tabelle

 3.1   Tabella requisiti obbligatori . . . . . . . . . . . . . . . . . . . . . . . .                                7
 3.2   Tabella requisiti desiderabili . . . . . . . . . . . . . . . . . . . . . . . .                               8
 3.3   Tabella requisiti formativi . . . . . . . . . . . . . . . . . . . . . . . . .                                8

 5.1   Classificazione richiesta-argomento . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
 5.2   Tabella dei dati necessari per ogni intent . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
 5.3   Campi tabella massimali hotel e pasti . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   22
 5.4   Campi tabella utenti . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   22
 5.5   Campi tabella voli . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
 5.6   Campi tabella trasferimento sede . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
 5.7   Campi tabella chat . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
 5.8   Campi tabella soglia massima classe e pasti      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24

 7.1   Tabella soddisfacimento dei requisiti . . . . . . . . . . . . . . . . . . .                                  39

                                           x
Capitolo 1

Introduzione

In questo capitolo viene data un’introduzione allo stage e viene descritta la suddivisone dei
capitoli

1.1      Stage
Nella fase conclusiva del ciclo triennale di informatica, ogni studente deve sostenere un
periodo di stage presso un’azienda convenzionata dall’Università di Padova. Lo scopo
principale dello stage è quello di dare allo studente l’opportunità di vivere un’esperienza
lavorativa nel proprio ambito di competenza, portando avanti un progetto concordato
e permettendogli di imparare e sperimentare nuove tecnologie o di rafforzare quelle già
apprese stando a contatto con il personale più esperto dell’azienda.

L’Università di Padova organizza annualmente l’evento StageIt, un’iniziativa che per-
mette di agevolare gli incontri tra imprese e studenti che devono sostenere lo stage
attraverso dei colloqui compresi tra i 15 e 20 minuti, dove l’azienda presenta i progetti
che intende sviluppare mentre lo studente si fa conoscere e chiede ulteriori informazioni.
Prima dell’evento è possibile leggere una lista delle aziende aderenti seguita da una
breve descrizione dei progetti che presenteranno.

Dopo diversi colloqui e proposte da altre aziende, ho deciso di affrontare questo
mio periodo con l’azienda Zero12 s.r.l.
Le motivazioni che mi hanno spinto a sceglierli sono le seguenti:
   • La maggior parte dei progetti proposti hanno attratto la mia curiosità, consen-
     tendo quindi di avere più scelte nel caso in cui uno dei progetti fosse stato già
     preso da un altro studente;
   • I progetti non erano fini all’attività di stage ma progetti che successivamente
     verranno utilizzati da altre persone;
   • Le tecnologie utilizzate dall’azienda, sia per il progetto che durante la loro attività
     lavorativa, rientravano nell’insieme delle tecnologie che avrei voluto conoscere.

1.2      Suddivisione dei capitoli
Il secondo capitolo descrive il contesto aziendale nel quale ho lavorato.

                                             1
2                                                     CAPITOLO 1. INTRODUZIONE

Il terzo capitolo approfondisce il progetto svolto durante il periodo di stage, in
      particolar modo viene descritto il progetto, com’è stato pianificato il lavoro, i
      requisiti e risultati attesi.
Il quarto capitolo approfondisce le tecnologie coinvolte nello sviluppo.
Il quinto capitolo approfondisce la progettazione, dalla prima bozza mostrata fino
     allo stato finale.

Il sesto capitolo approfondisce la codifica, approfondendo i punti più rilevati nella
      realizzazione del chatbot.
Il settimo capitolo riporta le considerazioni finali sullo svolgimento dello stage e del
      progetto.

1.3      Note sul testo
Riguardo la stesura del testo, relativamente al documento sono state adottate le
seguenti convenzioni tipografiche:
    • gli acronimi vengono definiti nel glossario, situato alla fine del presente documento;

    • per la prima occorrenza dei termini riportati nel glossario viene utilizzata la
      seguente nomenclatura: parola (g) ;
    • i termini in lingua straniera sono evidenziati con il carattere corsivo.
Capitolo 2

L’azienda

2.1     L’azienda
Zero12 s.r.l. è una piccola startup informatica fondata nel 2012 con sede operativa
a Carmignano di Brenta. L’azienda è specializzata nella gestione di progetti digitali,
creazione software B2B (g) , B2C (g) e nelle applicazioni mobile, prevalentemente iOS (g) .
È partner con Amazon Web Services e MongoDB, con i quali offre soluzioni scalabili
ed analisi dei Big Data (g) in tempo reale.

                              Figura 2.1: Logo zero12 s.r.l.

L’ambiente piccolo e giovane permette di ambientarsi velocemente al contesto aziendale
e di ricevere un veloce supporto da parte degli altri sviluppatori.

2.1.1     Filosofia dell’azienda
L’azienda costruisce le sue relazioni attraverso sei step:

  1. Onboarding: vengono definiti gli obiettivi, tempi e metodi delle diverse attività
     del progetto insieme al cliente;

  2. Training: basandosi sulle informazioni ottenute dalla precedente fase, viene
     definito un piano formativo per ottimizzare le risorse interne;

  3. Cloud and Data Design: viene realizzata una configurazione ed installazione
     delle infrastrutture cloud attraverso Amazon Web Services e di architetture
     database attraverso MongoDB;

                                            3
4                                                        CAPITOLO 2. L’AZIENDA

    4. Sviluppo software: attività di realizzazione dell’applicativo software o affian-
       camento del team di sviluppo del cliente;

    5. Monitoraggio e tuning: viene monitorata l’esecuzione del progetto per l’otte-
       nimento di feedback sull’esecuzione e per prevenire eventuali problematiche;
    6. Supporto al progetto: il cliente viene affiancato durante le fasi di lancio e
       vengono effettuate verifiche periodiche sul prodotto.

2.1.2     Metodologia di lavoro
L’azienda utilizza una metodologia di lavoro agile (g) . Questa metodologia si basa su
quattro principi:

    • Persone ed iterazioni piuttosto che processi e strumenti;
    • Collaborazione col cliente piuttosto che negoziazione del contratto;
    • Software funzionante piuttosto che avere una documentazione esaustiva;
    • Risposta al cambiamento piuttosto che seguire un piano

Zero12 segue questi quattro punti attraverso i seguenti principi:
    • Stretta collaborazione: il team coinvolge costantemente il cliente attraverso
      meeting online, attività on-site o presso l’azienda. Viene effettuata così una
      collaborazione col cliente, condividendo così eventuali problemi ed effettuando
      una retrospettiva per ottenere risultati migliori;
    • Valorizzare il team: il team deve essere responsabile di ogni azione che compie.
      Per perseguire questo obiettivo il team deve essere coinvolto in ogni fase del
      processo decisionale;
    • Feedback rapidi: attraverso un rilascio periodico di quanto realizzato, vengono
      raccolti feedback costanti e precisi dalle persone;
    • Realizzazione di soluzioni semplici: il prodotto software viene realizzato
      partendo da quello che è necessario per il corretto funzionamento e non da quello
      che potrebbe esserlo.
Capitolo 3

Il progetto

In questo capitolo viene effettuata una descrizione più approfondita del progetto, sui
requisiti e sulle condizioni esso legate.

3.1     Introduzione del progetto
Il progetto consiste nella realizzazione di un chatbot (g) che permetta ai dipendenti di
un’azienda di recuperare le informazioni sui viaggi aziendali e i relativi costi, sui trasfe-
rimenti tra due sedi, sulle destinazioni supportate, sui limiti di spesa ed informazioni
sulle modalità di viaggio.
Devono essere realizzate inoltre delle API RESTful (g) JSON (g) , con la quali il chatbot
dovrà interagire per fornire le risposte agli utenti.
Inoltre, il chatbot deve appoggiarsi ad una piattaforma mobile o ad una Web App (g)
in modo da permetterne l’interazione da parte dell’utente.

Lo scopo del progetto, in concomitanza della realizzazione del chatbot, consiste anche
nella sperimentazione dei servizi offerti da Amazon Web Services, in particolar modo
del servizio AWS Lex, in modo da vedere le potenzialità che possono offrire e come
essi riescono ad interfacciarsi tra di loro.

3.2     Vincoli lavorativi
3.2.1     Ambiente di lavoro
L’azienda permette di lavorare sia presso la sede operativa, sia a casa da remoto. Per
lo stage si è concordato che l’intera attività venisse svolta presso la sede operativa,
permettendo così di:
   • Lavorare a contatto con gli altri programmatori;
   • Adottare la metodologia aziendale per lo sviluppo del software.

3.2.2     Metodologia adottata
L’azienda ha stabilito l’utilizzo della loro metodologia di lavoro agile. Ogni Lunedì si
teneva un meeting con il responsabile, attraverso i quali si discuteva dell’operato svolto

                                             5
6                                                    CAPITOLO 3. IL PROGETTO

la settimana precedente, in modo da rivedere in tempo reale gli obiettivi settimanali
oppure definire nuovi miglioramenti al progetto.

3.2.3     Composizione del team
Il progetto non prevedeva l’affiancamento ad altri programmatori. Nonostante questo
gli altri dipendenti hanno comunque dato la disponibilità ad aiutarmi nel comprendere
concetti o nel darmi consigli sulla codifica.

3.2.4     Orario di lavoro
Da regolamento, le ore totali di stage devono essere comprese tra le 300 e le 320 ore.
Per rispettare tale vincolo si è deciso seguire i seguenti orari:

    • Inizio stage: 2 Settembre;

    • Fine stage: 25 Ottobre;

    • Orario lavorativo: Da lunedì al venerdì, ore 8:30-17:30

Per un totale di 320 ore di stage.

3.3     Svolgimento del progetto
Lo stage si è svolto nel seguente modo:

    • Introduzione del progetto e studio delle tecnologie di Amazon Web
      Services: Il primo giorno, il tutor aziendale mi ha presentato una bozza di
      progettazione del chatbot e della piattaforma d’appoggio, illustrandomi il flusso
      dell’applicazione e i servizi di Amazon Web Services più adatti. Dopo la spiega-
      zione del progetto, le prime due settimane si sono concentrate principalmente
      sullo studio di tali servizi;

    • Progettazione e codifica del chatbot: dopo una migliore comprensione delle
      tecnologie da adottare, è iniziata la fase di progettazione, fornendo una migliore
      descrizione delle funzionalità e di ciò che richiedeva il chatbot. Successivamente
      é iniziata una prima fase di codifica.

    • Studio delle tecnologie per la piattaforma d’appoggio: dopo aver realizza-
      to una versione semi definitiva del chatbot, ho voluto dedicarmi alla piattaforma
      d’appoggio. Attraverso un meeting con il responsabile, si è deciso di adottare
      un template di Angular per creare la piattaforma sulla quale il chatbot si sa-
      rebbe successivamente integrato. I giorni successivi sono dedicati allo studio e
      apprendimento del framework Angular attraverso la sua documentazione;

    • Codifica della Web App: dopo la fase di studio ho iniziato a realizzare
      la Web App. Il primo obiettivo consisteva nel riuscire a collegare il chat-
      bot all’applicazione, successivamente si è pensato alla dashboard ed infine
      all’autenticazione.

    • Miglioramenti Chatbot e WebApp e documentazione: le ultime due
      settimane le ho dedicate a migliorare le risposte e il codice del chatbot e della
      Web App. Infine ho provveduto a documentare il codice e le API.
3.3. SVOLGIMENTO DEL PROGETTO                                                           7

3.3.1     Requisiti fissati
Viene ora definita una lista dei requisiti concordati con l’azienda. Questi requisiti sono
classificati nel seguente modo:
                                   R[Tipo][Numero]

Dove il valore Tipo corrisponde a:
   • O: obbligatorio, un requisito che deve essere necessariamente soddisfatto in
     quanto richiesto dal committente;

   • D: desiderabile, un requisito non vincolante o non strettamente necessario ma
     dal riconoscibile valore aggiunto.
   • F: formativo, un requisito che ha come scopo l’insegnamento o l’apprendimento
     di una nozione.
Mentre il valore Numero corrisponde ad un numero identificativo univoco per ogni
requisito.

3.3.1.1   Requisiti obbligatori

   Requisito     Descrizione
   RO1           Integrazione con il servizio Lex di Amazon Web Services
   RO2           Progettazione di architettura a microservizi Amazon Web Services
                 possibilmente serverless.
   RO3           Creazione di API e back-end (g)          per il caricamento delle
                 informazioni.
   RO4           Realizzazione di una Web App come appoggio per il Chatbot.
                        Tabella 3.1: Tabella requisiti obbligatori
8                                                     CAPITOLO 3. IL PROGETTO

3.3.1.2   Requisiti desiderabili

    Requisito   Descrizione
    RD1         Introduzione di un sistema di analisi semantica del testo come
                AWS Comprehend;
    RD2         Ottimo livello di comprensione dei messaggi inviati dall’utente e
                qualità delle risposte fornite;
                      Tabella 3.2: Tabella requisiti desiderabili

3.3.1.3   Requisiti formativi

    Requisito   Descrizione
    RF1         Avvicinamento allo sviluppo di architetture a microservizi
    RF2         Entrare nel contesto di sviluppo di sistemi di Intelligenza Artificiale
    RF3         Sperimentare tecnologie nuove
    RF4         Lavorare in un contesto operativo dinamico
                       Tabella 3.3: Tabella requisiti formativi
Capitolo 4

Tecnologie utilizzate

In questo capitolo vengono introdotte le tecnologie utilizzate durante lo svolgimento del
progetto, differenziando quelle adottate per il chatbot e quelle per la Web App

4.1       Tecnologie chatbot
4.1.1     Amazon Web Services
Amazon Web Services, conosciuto anche con la sigla AWS, è una piattaforma che
offre centinaia di servizi IT (g) in cloud (g) come servizi di sviluppo, storage, database,
elaborazione serverless, apprendimento automatico e molto altro. Ciò che rende AWS
una buona piattaforma è la facilità nell’accesso a tali servizi attraverso una conso-
le (g) dedicata per ognuno di essi, permettendo così ad uno sviluppatore meno esperto
di creare e gestire al meglio il servizio selezionato.
Oltre alla facilità d’uso è molto usato dalle imprese per il fatto che vengono esonerate
dagli oneri di installazione, gestione e manutenzione hardware e server.

I servizi di AWS non sono completamente gratuiti: ognuno di essi offre un piano
base gratis ma, al superamento di tale soglia, AWS addebiterà il relativo costo ogni 30
giorni.

                                 Figura 4.1: Logo AWS

4.1.1.1    AWS Lambda
AWS Lambda è un servizio che permette di eseguire codice per qualsiasi applicazione
o servizio back-end in modalità serverless.

Viene impiegato principalmente in risposta ad eventi come le chiamate HTTP di
AWS API Gateway oppure per l’invocazione di codice attraverso le API offerte dagli
AWS SDK (g) , permettendo così la gestione ed elaborazione degli altri servizi attraverso
la codifica.

                                            9
10                                      CAPITOLO 4. TECNOLOGIE UTILIZZATE

I linguaggi supportati dal runtime di Lambda sono i seguenti:
     • Node.js nelle versioni 8.X e 10.X;
     • Python nelle versioni 2.7, 3.6 e 3.7;
     • Java 8;
     • Ruby 2.5;
     • C#;
     • Go 1.x.

                             Figura 4.2: Logo AWS Lambda

Durante la lettura, le funzioni create con questo servizio saranno chiamate funzioni
Lambda con la lettera L maiuscola in modo da evitare ambiguità con le funzioni
lambda, anche dette funzioni anonime.

4.1.1.2      Python
Python è un linguaggio di programmazione open source (g) ad alto livello (g) e fortemente
tipizzato che supporta diversi paradigmi di programmazione quali:
     • Orientamento agli oggetti;
     • Imperativo;
     • Funzionale.
Durante il progetto è stata utilizzata la versione 3.6.

                                Figura 4.3: Logo Python

4.1.1.3      AWS Lex
AWS Lex è un servizio che permette la creazione di chatbot attraverso un’interfaccia di
conversazione sia testuale che vocale ed è lo stesso motore di comunicazione utilizzato
per Alexa.

Ogni bot è caratterizzato da uno o più intent, i quali rappresentano un particola-
re contesto di conversazione del bot. Un intent si conclude quando questo viene
dichiarato Fullfilled o Rejected
4.1. TECNOLOGIE CHATBOT                                                               11

Ogni conversazione con un bot di Lex inizia con l’inserimento da parte dell’uten-
te di una utterance, una particolare frase che indica al bot quale comportamento
adottare verso l’utente, le informazioni di cui ha bisogno per soddisfare l’intent e come
rispondergli.

L’utilizzo delle funzioni Lambda permette di rendere dinamico e sicuro il flusso della
conversazione e di adattare le risposte in base ai messaggi ricevuti dall’utente.

                              Figura 4.4: Logo AWS Lex

4.1.1.4   AWS DynamoDB
AWS DynamoDB è un database serverless NoSQL(g) che supporta modelli di dati di
tipo documento e di tipo chiave-valore come i file JSON.

La scelta di utilizzare AWS DynamoDB invece di MongoDB è data dal fatto che,
nonostante la scarsa conoscenza di entrambi, il primo è più facile da implementare con
gli altri servizi di AWS.

                          Figura 4.5: Logo AWS Dynamodb

4.1.1.5   AWS API Gateway
AWS API Gateway è un servizio che permette la creazione, mantenimento, gestione e
protezione di API Rest e WebSocket. In questo progetto il servizio è stato usato per la
creazione di API Rest, caratterizzate da:

   • Utilizzo dei protocolli HTTP;
   • Rispetto dell’architettura REST;
   • Utilizzo di risorse e metodi;
   • Implementazioni metodi standard GET, POST, PUSH e DELETE.
12                                      CAPITOLO 4. TECNOLOGIE UTILIZZATE

All’atto della creazione di un metodo, AWS API Gateway ne richiede l’integrazione a
uno dei seguenti tipi:

     • Funzione Lambda;
     • Metodo HTTP;
     • Mock (g) ;

     • Servizio AWS;
Durante lo svolgimento del progetto, ogni chiamata alle API è stata collegata ad una
funzione Lambda dedicata.

                          Figura 4.6: Logo AWS API Gateway

4.1.1.6     AWS Cognito
AWS Cognito è un servizio che permette la creazione, gestione e manutenzione di un
pool di utenti. Fornisce strumenti di accesso, registrazione e controllo degli accessi per
Web App e mobile.
Cognito è composto da due componenti:
     • Cognito User Pool: directory utente di Cognito che fornisce le operazioni di
       registrazione ed accesso (anche attraverso i social network), un’interfaccia web
       per l’accesso e funzioni di protezione quali l’autenticazione a più fattori oppure
       la verifica dell’email e telefono;

     • Cognito Identity Provvider: directory attraverso la quale l’utente autenticato
       riceve delle credenziali temporanee di AWS per accedere ed utilizzare determinati
       servizi.

                          Figura 4.7: Logo AWS API Gateway
4.2. TECNOLOGIE WEB APP                                                              13

4.2       Tecnologie Web App
4.2.0.1    Typescript
Linguaggio di programmazione open source sviluppato da Microsoft. Estende il
linguaggio di programmazione JavaScript fornendo il supporto della tipizzazione e delle
interfacce durante la fase di codifica.
Durante la fase di compilazione il linguaggio viene prima tradotto e poi compilato
in JavaScript, permettendo così di avere un maggiore controllo e comprensione sulla
codifica.

                         Figura 4.8: Logo AWS API Gateway

4.2.0.2    Angular 8
Framework open source sviluppato da Google ed utilizzato per la creazione di Web
App attraverso l’uso di HTML e TypeScript.

                         Figura 4.9: Logo AWS API Gateway

Un’applicazione Angular di base deve possedere almeno due elementi fondamentali:
   • Modulo: elemento che contiene le funzionalità della Web App quali componenti,
     direttive e servizi. Se sono presenti più moduli, questi vengono combinati insieme,
     permettendo così di creare l’applicazione finale.
   • Componente: elemento che contiene i dati o la logica dell’applicazione. Ad ogni
     componente è collegato un template HTML per permetterne la visualizzazione.
Di default sono presenti un componente, definito AppComponent, e un modulo, definito
AppModule.

Sono presenti ulteriori elementi per migliorare lo sviluppo della Web App quali Guardie
e Servizi.
Capitolo 5

Progettazione

5.1     Visione dell’architettura generale
In questo progetto è stata richiesta l’adozione di un’architettura a microservizi. Questo
tipo di architettura è basata su componenti indipendenti che eseguono ogni processo
come un servizio. Ogni servizio adempie ad un unica funzione e comunicano attraverso
API leggere.
L’adozione di questa architettura è molto vantaggiosa dato che permette una buona
scalabilità vista l’indipendenza di ogni singolo servizio.

                          Figura 5.1: Visione dell’architettura

Nelle prossime sezioni verrà prima approfondita la progettazione riguardante il chatbot
e successivamente quella riguardante la Web App.

                                           15
16                                                CAPITOLO 5. PROGETTAZIONE

5.2      Progettazione del chatbot
5.2.1     Prima presentazione del progetto e studio tecnologie
Il primo giorno di stage mi è stata presentata una bozza di progettazione del chatbot,
spiegandomi il funzionamento che avrebbero dovuto adottare i servizi coinvolti.

                Figura 5.2: Bozza del funzionamento del chatbot richiesto

Non avendo mai avuto esperienze pregresse con la suite di servizi AWS, prima di
iniziare la progettazione mi sono posto le seguenti domande:
     • Come funzionano gli strumenti scelti?
     • Come si integrano tra di loro?

Per poter rispondere a queste domande, ho affrontato un periodo di studio della
documentazione dei servizi richiesti, con relativi esempi d’uso.
Successivamente ho iniziato un piccolo progetto indipendente in cui ho applicato tutto
ciò che ho appreso, realizzando un chatbot di utilità per appuntare su Google Calendar
gli esami universitari al quale l’utente era interessato.
Alla fine di questo periodo sono riuscito a dare una risposta alle domande che mi ero
posto ed ero pronto ad iniziare la progettazione del chatbot commissionato.
5.2. PROGETTAZIONE DEL CHATBOT                                                       17

5.2.2    Comprensione dei servizi adottati
La progettazione del chatbot verte su questi servizi:
   • AWS Lex: creazione del chatbot composto da uno o più intents;
        – Intents: contesto della conversazione del bot. Un singolo intent è caratte-
          rizzato dai seguenti elementi:
            ∗ Slots: rappresentano le informazioni necessarie al bot per adempiere
               all’intent;
            ∗ Sample utterances: frasi con le quali il bot riconosce un intent. Per
               una maggiore precisione nel riconoscimento, devono essercene molte e
               possono contenere uno o più slot.
            ∗ Lambda code hook : funzioni Lambda che vengono aggiunte al bot in
               modo da rendere più dinamico il flusso della conversazione.
   • AWS DynamoDB: definizione delle tabelle richieste per la memorizzazione
     delle informazioni necessarie per le risposte del chatbot;
   • AWS API Gateway: definizione delle API necessarie all’utente per chattare
     con il chatbot;
   • AWS Lambda: definizione delle funzioni necessarie per il corretto funziona-
     mento del bot e per l’integrazione tra i diversi servizi AWS.

                         Figura 5.3: Progettazione del chatbot

La fase di progettazione di questi servizi è molto importante e delicata. Oltre al fatto
di avvantaggiare la parte di codifica bisogna prestare attenzione alle risorse che un
servizio utilizza durante l’esecuzione, in modo da minimizzarne il costo mensile. Ad
esempio AWS Lambda addebita un costo in base al tempo d’esecuzione e la memoria
richiesta mentre AWS DynamoDB addebita un costo in base al numero di letture e
scritture che vengono effettuate sulla tabelle.
18                                                  CAPITOLO 5. PROGETTAZIONE

5.2.3      AWS Lex
5.2.3.1     Definizione degli intents
Il chatbot deve essere in grado di rispondere a diverse richieste dell’utente. Queste
possono essere classificate in base all’argomento trattato.

 Richiesta di un utente                                            Argomento trattato
 Raggiungimento di una determinata sede                            Cambio sede
 Modalità di spostamento in una determinata destinazione           Elenco trasporti
 Vincoli di spesa e classi prenotabili per voli, treni e auto      Massimali
 Costo totale di un viaggio                                        Informazioni viaggio
 Informazioni sulle modalità di richiesta di un viaggio            Informazioni generali
 Informazioni sulle modalità d’uso dei veicoli                     Informazioni veicoli
                      Tabella 5.1: Classificazione richiesta-argomento

Grazie a questa classificazione è possibile determinare il numero di intents necessari al
soddisfacimento delle richieste passate.

5.2.3.2     Approfondimento degli intents
Per ogni intent è necessario capire il tipo di dati di cui necessita, come l’utente può
invocarlo e come dev’essere gestito il flusso della conversazione affinché si riesca a
concluderlo.

Slots (tipo di dati)
Uno slot aiuta a definire i tipi di dati necessari al bot per adempiere all’intent e vengono
impiegati quando un’utterance da sola non riesce ad adempierlo completamente.
Per ognuno di essi si è quindi approfondito quello che è necessario al suo soddisfacimento:

          Intent                  Dati necessari
          Cambio sede             Sedi disponibili, mezzi di trasporto disponibili
          Elenco trasporti        Destinazioni disponibili
          Massimali               Ruoli dell’azienda
          Informazioni viaggio    Destinazioni disponibili
          Informazioni generali   Nessun dato richiesto
          Informazioni veicoli    Mezzi di trasporto disponibili
                   Tabella 5.2: Tabella dei dati necessari per ogni intent
5.2. PROGETTAZIONE DEL CHATBOT                                                            19

Dopo un attenta lettura dei documenti fornitomi dall’azienda committente, i tipi di
slot che sono stati creati per il chatbot sono i seguenti:

   • travelDestination: slot contenente le destinazioni disponibili;
   • officesVal: slot contenente tutte le sedi del cliente;
   • transportType: slot contenente i tipi di trasporto disponibili:

   • carService: slot contenente i servizi disponibili se si utilizza la macchina come
     mezzo di trasporto;
   • clientRole: slot contenente i ruoli assegnabili ai dipendenti dell’azienda.

Sample utterances (Invocazione dell’intent)
Le sample utterances consistono in frasi che aiutano il bot a capire quale intent in-
vocare. In questo modo, quando l’utente invia un determinato messaggio o ne invia
uno simile, il chatbot riconosce il corrispondente intent, rispondendo in base ai dati
ricevuti dall’utente.
Nel caso in cui il messaggio inviato dall’utente non corrisponda a nessuna utterance
disponibile, il chatbot risponderà con una frase di fraintendimento. Se dopo un determi-
nato numero di tentativi, specificati dallo sviluppatore, il bot continuerà a non capire,
chiuderà la sessione di chat con un messaggio di chiusura e fallimento nell’adempimento.

Il numero di utterance disponibili deve quindi essere il più ampio possibile ma, al
contempo, non deve portare a casi di ambiguità nella scelta dell’intent.
In tutti gli intent sono state inserite molteplici utterances, tutte quante classificabili in
queste tre categorie:
   • Utterance base: utterance basata sul nome dell’intento, ad esempio "Informa-
     zioni sui veicoli ";
   • Utterance articolate: utterance basata su una frase completa, ad esempio
     "Quali veicoli sono disponibili ";
   • Utterance composte: utterance articolate con l’inserimento di campi slot
     all’interno. In questo modo, se l’utente è certo di sapere quello che vuole, può
     specificare fin da subito i campi slot senza che sia il bot a richiederli.
     Esempio di utterance composta: "Devo andare a {sede} in {veicolo} " dove i
     valori sede e veicolo sono riempiti con tipi slot validi.
Per questa parte è stato necessario il supporto di più persone, in modo da avere più
varietà nella creazione delle utterances.
20                                               CAPITOLO 5. PROGETTAZIONE

Lambda code hook (Gestione del flusso conversazionale)
Da solo il servizio AWS Lex offre soltanto delle operazioni basilari, con poca persona-
lizzazione delle risposte e non garantisce nessun controllo sui dati passati dall’utente.
Ad esempio, in caso di prenotazione di un appuntamento, non viene controllato se
la data in questione è già occupata, rischiando quindi di dare informazioni sbagliate
all’utente.

Per effettuare questo tipo di controlli, AWS Lex permette di aggiungere una o due
funzioni Lambda per gestire i casi di:
     • Inizializzazione e validazione: la funzione Lambda viene collegata al servizio
       e verrà eseguita ogni volta che il bot avrà compreso l’intent;
     • Adempimento: la funzione Lambda viene richiamata quando l’utente forni-
       sce tutti gli slot richiesti ed esegue le operazioni necessarie all’adempimento
       dell’intent.
Per avere un controllo completo delle conversazioni, per ogni intent è stata creata una
funzione Lambda dedicata che gestita entrambi i casi.

Ogni funzione Lambda è progettata per gestire i seguenti stati di conversazione:

     • Richiesta di un dato slot: il bot interpreta correttamente il messaggio ma
       necessita di uno o più dati prima di poter adempiere all’intent;
     • Richiesta di un intent: il bot non è riuscito a collegare il messaggio ad
       un’intent;

     • Conferma operazione: il bot richiede una conferma o negazione prima di poter
       adempiere all’intent;
     • Chiusura conversazione: il bot invia una risposta di chiusura della sessione.
       La risposta varia in base al successo o meno nell’adempimento dell’intent.

Quando l’utente invia un messaggio, AWS Lex contatta la funzione Lambda collegata
all’intent attraverso il seguente file JSON:
5.2. PROGETTAZIONE DEL CHATBOT                                                       21

1    {
2        " currentIntent " : {
3           " name " : " intent - name " ,
4           " slots " : {
5                            " slot name " : " value " ,
6                            ...
7           },
8           " slotDetails " : {
9                 " slot name " : {
10                           " resolutions " : [
11                                     { " value " : " resolved value " } ,
12                                     { " value " : " resolved value " }
13                           ],
14                           " originalValue " : " original text "
15          },
16                " slot name " : { ... }
17          " confirmationStatus " : " None , Confirmed , or Denied
18       },
19       " bot " : {
20                " name " : " bot name " ,
21                " alias " : " bot alias " ,
22                " version " : " bot version "
23       },
24       " userId " : " User ID "
25       " inputTranscript " : " Text used to process the request " ,
26       " invocationSource " : " FulfillmentCodeHook or DialogCodeHook " ,
27       " outputDialogMode " : " Text " ,
28       " messageVersion " : " Version " ,
29       " sessionAttributes " : {
30            " key " : " value " ,
31            " key " : " value "
32       },
33       " requestAttributes " : {
34            " key " : " value " ,
35            " key " : " value "
36       }
37   }

                        Listing 5.1: input di AWS Lex ad AWS Lambda

     Basandosi sull’utente, sul messaggio inviato e sulle informazioni contenute su currentIntent,
     la funzione Lambda crea la risposta da ritornare ad AWS Lex che a sua volta ritornerà
     all’utente.
22                                                      CAPITOLO 5. PROGETTAZIONE

5.2.4      Progettazione AWS DynamoDB
AWS DynamoDB, per gli scopi del progetto, è stato progettato per contenere le
chat con i relativi messaggi, le informazioni sugli utenti quali ruolo ed informazioni
sull’utilizzatore, ed infine le informazioni utili a garantire una risposta precisa all’utente.
Queste informazioni riguardano:
     • Prezzi dei voli;
     • Massimali hotel e pasti per destinazione;
     • Soglie massime delle classi utilizzabili e di spesa giornaliera per i pasti;
     • Sedi delle aziende con relativi mezzi disponibili;
     • Destinazioni raggiungibili.
Per ogni informazione riportata è stata una creata tabella che sia in grado di contenerle
e che ne permetta un facile accesso. Di seguito viene riportata la struttura delle tabelle:

Tabella massimali hotel e pasti
Questa tabella rappresenta, per ogni ruolo, il costo giornaliero di hotel e pasti in base
alla destinazione. La chiave d’ordinamento è necessaria in quanto la chiave primaria
viene ripetuta più volte.

                       Nome              Tipo                   Valore
                       role              Chiave primaria        String
                       destination       Chiave ordinamento     String
                       hotel             Attributo              Integer
                       meal              Attributo              Integer
                    Tabella 5.3: Campi tabella massimali hotel e pasti

Tabella utenti
In questa tabella vengono rappresentati gli utenti che utilizzano il chatbot. Ad ogni
utente viene associato un ID al quale corrispondono le informazioni personali e il ruolo
in azienda.

                          Nome              Tipo               Valore
                          id_employee       Chiave primaria    String
                          name              Attributo          String
                          role              Attributo          String
                          surname           Attributo          String
                                 Tabella 5.4: Campi tabella utenti
5.2. PROGETTAZIONE DEL CHATBOT                                                     23

Tabella voli
In questa tabella viene rappresentato quanto un’impiegato, classificato per ruolo, può
spendere per il volo in una determinata destinazione. I prezzi sono divisi per classe.

                Nome                     Tipo                     Valore
                role                     Chiave primaria          String
                destination              Chiave ordinamento       String
                business                 Attributo                Integer
                premium_economy          Attributo                Integer
                             Tabella 5.5: Campi tabella voli

Tabella trasferimento sede
In questa tabella viene rappresentata, per ogni sede dell’azienda, la disponibilità
dell’utilizzo di un veicolo e la relativa modalità d’uso.

                Nome                   Tipo                Valore
                office                 Chiave primaria     String
                city                   Attributo           String
                airplane               Attributo           Object JSON
                carPooling             Attributo           Object JSON
                carSharing             Attributo           Object JSON
                companyOwnCar          Attributo           Object JSON
                taxi                   Attributo           Object JSON
                train                  Attributo           Object JSON
                       Tabella 5.6: Campi tabella trasferimento sede

Tabella chat
In questa tabella vengono salvate le chat create dagli utenti.

                    Nome             Tipo                      Valore
                    userId           Chiave primaria           String
                    chatName         Chiave ordinamento        String
                    botmessage       Attributo                 String
                    usermessage      Attributo                 String
                             Tabella 5.7: Campi tabella chat
24                                              CAPITOLO 5. PROGETTAZIONE

Tabella massimali delle classi utilizzabili e la spesa massima per i pasti
In questa tabella viene rappresentato quanto un determinato ruolo può spendere, al
giorno, per i pasti e la massima classe selezionabile per ogni servizio di viaggio.

                 Nome               Tipo                    Valore
                 role               Chiave primaria         String
                 destination        Chiave ordinamento      String
                 rent_car           Attributo               String
                 flight_minus4h     Attributo               String
                 flight_plus4h      Attributo               String
                 italo              Attributo               String
                 trenitalia         Attributo               String
                 breakfast          Attributo               Integer
                 launch             Attributo               Integer
                 dinner             Attributo               Integer
               Tabella 5.8: Campi tabella soglia massima classe e pasti
5.2. PROGETTAZIONE DEL CHATBOT                                                          25

5.2.5      Progettazione AWS API Gateway
Nel contesto del chatbot, è necessaria una singola risorsa ’/chat’ che esponga un metodo
POST per inviare il messaggio al bot e ricevere una sua risposta.
Ogni volta che viene inviato un messaggio, l’API contatta la funzione Lambda ad essa
collegata, questa riceve in input il messaggio dell’utente e poi contatta il bot. Infine, a
risposta pronta, la ritorna all’utente.

Il metodo è configurato con un’integrazione proxy, una modalità d’implementazione
della funzione Lambda e dei metodi HTTP in grado di semplificare la creazione e
gestione del metodo. L’integrazione proxy è stata preferita all’integrazione normale (o
non proxy) perchè:
   • La richiesta d’integrazione, ossia la fase di mappatura dei dati da parte di
     API Gateway prima di essere passati al servizio di back-end, accetta qualsiasi
     input inviato dell’utente. Se fosse stata un’integrazione non proxy si sarebbe
     dovuto creare una mappatura specifica per ogni input.
   • La risposta dell’integrazione, ossia la fase di mappatura del codice di stato,
     intestazione e payload del back-end al formato richiesto dal client, è unica e non
     modificabile, lasciando così una più semplice gestione della risposta della funzione
     Lambda. La risposta è così strutturata:
   1   {
   2        " isBase 6 4 Encoded " : true | false ,
   3        " statusCode " : httpStatusCode ,
   4        " headers " : { " headerName " : " headerValue " , ... } ,
   5        " multiValueHeaders " : { " headerName " : [ " headerValue " , "
                 headerValue 2 " , ... ] , ... } ,
   6        " body " : "..."
   7   }
                   Listing 5.2: struttura risposta AWS Lambda

       Se fosse stata applicata un’integrazione non proxy, la risposta poteva essere
       personalizzata ma a costo di una maggiore difficoltà nel gestirla lato client.

5.2.6      Definizione funzioni Lambda
Le funzioni Lambda sono ciò che uniscono i servizi, passando e manipolando le infor-
mazioni da uno all’altro.

Dopo la progettazione dei precedenti servizi, sono facilmente emerse le funzioni Lambda
necessarie per il corretto funzionamento del chatbot. Queste funzioni sono:
   • Funzioni per gli intents: è stata creata una funzione Lambda per ogni intent
     in modo da rendere la conversazione il più reale possibile. Queste funzioni si
     interfacciano sia con AWS Lex per gestire il messaggio, sia con AWS DynamoDB
     per reperire le informazioni necessarie;
   • Funzione d’instradamento del messaggio: è stata creata una funzione Lamb-
     da per inoltrare il messaggio al chatbot e, una volta elaborata la risposta, ritor-
     narla all’utente.
     Questa funzione inoltre traduce il messaggio in lingua italiana nel caso sia
     richiesta.
26                                                CAPITOLO 5. PROGETTAZIONE

5.3      Progettazione parte utente Web App
5.3.1      Studio tecnologie
Successivamente alla fase di progettazione e prima codifica del chatbot, ho dovuto
affrontare la parte di progettazione della Web App.
Dopo un meeting con il tutor aziendale si è deciso che la Web App dev’essere in grado
di offrire queste tre pagine:
     • Login: Pagina di autenticazione per il dipendente;
     • Dashboard: pagina principale per l’utente nella quale deve essere in grado di
       creare, riprendere ed eliminare chat di conversazione;

     • Chat: pagina nella quale l’utente è in grado di scambiare messaggi con il chatbot.
Per la realizzazione, sempre durante il meeting, il tutor mi ha consigliato l’utilizzo di
ngx-admin, un template per dashboard admin basato su tecnologia Angular 8+.
Non avendo mai avuto occasione di utilizzare ed imparare il framework Angular, la
prima settimana l’ho dedicata alla lettura della documentazione e alla realizzazione
degli esempi presentati.

5.3.2      Definizione risorse AWS API Gateway
Per la parte utente è stata configurata una risorsa API ’/database’ per il salvataggio e
il caricamento delle chat. Nello specifico vengono implementati i seguenti metodi:
     • Metodo GET: ritorna la lista delle chat e lo storico dei messaggi;
     • Metodo POST: crea nel database la nuova chat;
     • Metodo DELETE: elimina la chat dal database.

5.3.3      Pagina login
La pagina di login presenta due campi input per l’inserimento del nome utente e della
password personale.

All’atto dell’autenticazione viene contattato il servizio AWS Cognito che provvede a
validare i dati e successivamente autentica l’utente.
5.3. PROGETTAZIONE PARTE UTENTE WEB APP                                               27

5.3.4    Dashboard
La dashboard presenta due schede nelle quali è possibile creare e riprendere le conver-
sazioni.

                         Figura 5.4: Dashboard della Web App

Questa pagina è l’unico punto d’accesso al chatbot dato che, per avviare una chat, è
necessario fornirle titolo.

5.3.5    Chat
La pagina di chat presenta un’interfaccia conversazionale alla quale è viene collegato il
chatbot.

                     Figura 5.5: Interfaccia di chat della Web App
28                                                 CAPITOLO 5. PROGETTAZIONE

5.4      Progettazione parte admin Web App
Inizialmente non era prevista una parte dedicata all’admin dato che il chatbot viene
utilizzato dai dipendenti dell’azienda per ricercare informazioni velocemente, senza
l’ausilio di controlli admin. Successivamente è stato deciso di implementarla per i
seguenti motivi:

     • Se l’impiegato IT dell’azienda trova un errore, può modificarlo senza dover
       investire del tempo per contattarci ed attendere le modifiche;
     • Si evita la creazione di particolari ruoli IAM (g) per AWS;
     • L’impiegato IT può gestire tutto dalla Web App senza doversi interfacciare con
       la console di AWS;

Un’utente admin è un dipendente della sezione IT dell’azienda utilizzatrice del chatbot.
Questo utente viene riconosciuto durante la fase d’autenticazione da AWS Cognito
grazie alla possibilità di assegnare gli utenti a dei gruppi.

La parte admin della Web App è stata progettata per poter eseguire modifiche alle
informazioni fornite dal chatbot, alle utterances e per gestire gli utenti utilizzatori.

5.4.1      Definizione risorse AWS API Gateway
Per la parte admin è stato necessario configurare delle risorse API per ogni pagina
presente.
La configurazione delle risorse per la parte dedicata all’admin risulta essere la seguente:
   /admin
      /bot
          /utterances
      /flights
      /office-transfer
      /user

Ognuna di queste risorse implementa i metodi GET, POST, PUT e DELETE,
fatta eccezione per le risorse utterance e office-transfer, ritenute non necessarie o
particolarmente onerose in termini d’implementazione dati i tempi ristretti.
5.4. PROGETTAZIONE PARTE ADMIN WEB APP                                                 29

5.4.2    Pagina di gestione utenti
Questa pagina consente la gestione completa degli utenti, dalla creazione alla rimozione.
Dato che l’applicazione verrà utilizzata solo in un contesto aziendale, la creazione degli
utenti non avverrà tramite registrazione ma solo attraverso l’utente admin.
Infine è disponibile una tabella a fine pagina nella quale è possibile vedere gli utenti
già registrati, rendendone più semplice per la gestione.

                       Figura 5.6: Pagina di gestione degli utenti

5.4.3    Pagina di gestione delle utterances
Questa pagina consente una completa gestione delle utterances di ogni intent, fornendo
le stesse operazioni della pagina utente.

                     Figura 5.7: Pagina di gestione delle utterance
30                                                 CAPITOLO 5. PROGETTAZIONE

5.4.4      Pagine di gestione tabelle
Sono state create le pagine adibite alla modifica di due tabelle utilizzate dal chatbot
per fornire le risposte.

                 Figura 5.8: Pagina di modifica tabella trasferimento sede

Le implementazioni di creazione e di rimozione nella pagina dedicata alla gestione
dei dati relativi ai voli sono state inserite solo a scopo sperimentale per studiare il
comportamento del database e non per un uso effettivo. Nel caso si utilizzassero:

     • La creazione non porterebbe a risultati concreti dato che il chatbot non saprebbe
       riconoscere le nuove destinazioni;
     • La rimozione potrebbe causare problemi nella risposta fornita dal chatbot dato
       che verrebbero effettuate query che non porterebbero a risultati.
Come per le precedenti pagine, è presente anche la tabella riassuntiva.
Capitolo 6

Codifica

In questo capitolo vengono descritte le parti di codice ritenute significative per lo svolgimento
del progetto.

6.1      Organizzazione directory
Per tenere separato il codice dei servizi AWS da quello della Web App, sono state
create due directory :

    • Funzioni Lambda: contiene tutte le funzioni Lambda necessarie al corretto
      funzionamento dell’applicazione. Al suo interno sono presenti altre due directory,
      create per separare le funzioni dedicate al chatbot (quali gestione degli intents e
      richiamo del chatbot) da quelle dedicate altri servizi (quali AWS Cognito e AWS
      DynamoDB);

    • Web App: contiene i file necessari per il corretto funzionamento della Web App
      e la documentazione delle relative API, effettuata tramite Swagger. Il codice
      dell’applicazione risiede nella cartella src/app.

.
    Progetto
       Funzioni Lambda
          Bot
          DynamoDB_Cognito_API
       Web App
          Integrazione
             src
                app
                   admin
                   api
                   auth
                      login
                   pages
                      dashboard
                      chatbot

                                               31
32                                                        CAPITOLO 6. CODIFICA

    6.2      Pacchetti utilizzati per la comunicazione con i
             servizi AWS
    Per lo sviluppo del progetto sono stati di fondamentale importanza l’adozione dei
    seguenti SDK:

         • Boto3: SDK rilasciato da AWS che permette di semplificare le integrazioni di
           funzioni e applicazioni Python con i relativi servizi AWS.
           L’installazione avviene da terminale nel seguente modo:
           $pip3 install boto3

         • AWS Amplify: pacchetto per semplificare l’integrazione dei servizi AWS nelle
           Web App e nelle applicazioni mobile. L’installazione avviene da terminale nel
           seguente modo:
           $npm install aws - amplify

    6.3      Codifica del chatbot
    6.3.1      Invio di un messaggio al chatbot
    Quando l’utente invia un messaggio dalla Web App, l’API di riferimento contatta la
    funzione Lambda dedicata alla gestione del messaggio dell’utente.

    Come prima cosa è necessario istanziare il servizio AWS Lex attraverso Boto3. Sola-
    mente dopo è possibile richiamare la funzione post_text, funzione che permette di
    scambiare messaggi con il chatbot.
1   travelBot = boto3 . client ( " lex - runtime " )
2
3   response = travelBot . post_text (
4           botName = " TravelInformation "
5           botAlias = " test "
6           userId = event [ ’ headers ’ ][ ’ username ’]
7           inputText = message
8   )

                             Listing 6.1: invio messaggio ad AWS Lex

    La risposta ritornata da AWS Lex è un JSON contenente diverse informazioni quali:

         • Risposta testuale del chatbot;

         • Intent attuale;

         • Stato della conversazione;

    Dal momento che il formato della risposta ritornata dalla funzione Lambda deve essere
    uguale alla struttura mostrata nella sezione 5.2.5, la risposta del chatbot è contenuta
    nel campo Body.
6.3. CODIFICA DEL CHATBOT                                                          33

6.3.2     Gestione del messaggio con AWS Lex e AWS Lambda
Quando AWS Lex ha ricevuto il messaggio passato dalla funzione post_text, viene
controllato se è possibile associarlo ad un intent.

In caso positivo, viene contattata la funzione Lambda collegata ad esso passandogli il
JSON visto nella sezione 5.2.3.2.
A messaggio ricevuto, la funzione Lambda ne analizza il contenuto e genera la risposta
basandosi su uno dei quattro stati elencati nella sezione 5.2.3.2.

Le possibili risposte tornate sono le seguenti:

   • Richiesta di un dato slot: ritorna un codice ElicitSlot, accompagnato da
     un messaggio e dallo slot richiesto per continuare la conversazione.

   1   def response_elicit_slot ( session_attributes ,
           message_to_return , intent_name , slot , ste ) :
   2            return {
   3                     " sessionAttributes " : session_attributes ,
   4                     " dialogAction " : {
   5                              " type " : " ElicitSlot " ,
   6                              " message " : message_to_return ,
   7                              " intentName " : intent_name ,
   8                              " slots " : slot ,
   9                              " slotToElicit " : ste
  10           }
  11   }

                        Listing 6.2: funzione richiesta slot

   • Conferma operazione: ritorna un codice ConfirmIntent sul campo type,
     accompagnato da un messaggio al quale l’utente è invitato ad esprimere una
     risposta affermativa o negativa.

   • Chiusura del messaggio: ritorna un codice Close sul campo type ed è accom-
     pagnato da un messaggio di chiusura. In questa risposta è presente un campo
     fulfillmentState che è uguale a Fulfilled se l’intent è stato soddisfatto con
     successo, altrimenti è Rejected
34                                                          CAPITOLO 6. CODIFICA

     6.4        Integrazione del Chatbot sulla Web App
     6.4.1       Interfaccia di conversazione
     Viene ora descritta la struttura della directory contenete i file necessari alla corretta
     esecuzione della pagina dedicata all’interfaccia di conversazione:

          • chatbot.module.ts: rappresenta il modulo Angular dedicato.
          • chatbot.service.ts: rappresenta il servizio Angular dedicato. Si occupa di
            gestire la parte logica del chatbot e le comunicazione con gli altri servizi
          • chatbot.component.ts: rappresenta il componente Angular dedicato.                Si
            occupa di gestire la parte visiva della pagina.

          • chatbot.component.html: rappresenta il template HTML. Questo file viene
            importato nel decorator del file chatbot.component.ts per definire il DOM.
          • chatbot.component.scss: rappresenta il foglio di stile utilizzato per persona-
            lizzare l’interfaccia di conversazione.

     6.4.1.1      Invio di un messaggio
     Quando un utente invia un messaggio attraverso l’interfaccia di conversazione, viene
     richiamata la funzione sendMessage. Di base questa funzione crea due messaggi, uno
     che rispecchia il messaggio dell’utente e l’altro una risposta già predefinita dal creatore
     del template.

     Subito dopo i messaggi vengono inseriti nell’array message, contenitore collegato
     al template HTML il quale si aggiorna ad ogni inserimento, mostrando a schermo i
     nuovi messaggi.
 1   async sendMessage ( event : any ) {
 2          this . messages . push ({
 3          text : event . message ,
 4          date : new Date () ,
 5          reply : true ,
 6          type : ’ text ’ ,
 7          user :
 8          {
 9             name : ’ You ’ ,
10             avatar : ’ user - avatar . jpg ’
11          },
12       }) ;
13
14            const botReply = this . chatShowcaseService . reply ( event . message
                  );
15            if ( botReply ) {
16              setTimeout (() = > { this . messages . push ( botReply ) } , 500) ;
17            }
18        }

                      Listing 6.3: funzione sendMessage prima dell’integrazione
6.4. INTEGRAZIONE DEL CHATBOT SULLA WEB APP                                         35

     6.4.2    Integrazione
     Partendo dalla funzione sendMessage, l’integrazione dei messaggi con il chatbot è
     stata effettuata apportando le seguenti modifiche:
        • Rimozione delle risposte predefinite;
        • Creazione funzione di richiamo delle API;
        • Creazione funzione di gestione del messaggio del chatbot;
     La funzione usata per richiamare l’API è la seguente:
1    // chatbot . service . ts
2    handleMessage ( passedMessage , usern : string , selectedLanguage :
          string , token : string ) : Observable < JSON >{
3          const header = {
4            ’ username ’: usern ,
5            ’ language ’: selectedLanguage ,
6            ’ inizialize ’: ’ false ’
7         }
8          const requestOption = {
9            headers : new HttpHeaders ( header )
10        }
11         return this . http . post < JSON >( botAPI , passedMessage ,
                requestOption )
                              Listing 6.4: funzione handleMessage

     La funzione ritorna un Observable, un tipo di dato della libreria Rxjs simile al
     tipo Promise ma con la peculiarità di poter tornare più valori invece di uno solo.
     Al ricevimento della risposta da parte di AWS API Gateway, viene eseguito il codice
     all’interno della funzione subscribe, impostando così la risposta del bot come risposta
     al messaggio di chat inviato dall’utente.
1    // chatbot . component . ts
2    async sendMessage ( event : any ) {
3         this . messages . push ({...}) // Push messaggio utente
4         // Integrazione
5         var mesForBot : messageToTheBot ={
6            message : event . message
7         }
8         this . chatService . handleMessage ( mesForBot , this . user . username ,
               this . selectedLanguage , this . tok ) . subscribe ( lexResp = > {
9              var botReply : messageStructure = {
10                        type : ’ text ’ ,
11                        text : lexResp [ ’ message ’] ,    // messaggio chatbot
12                        date : new Date () ,
13                        reply : false ,
14                        user :{
15                                  name : ’ AziendaBot ’ ,
16                                  avatar : ’ user - avatar . jpg ’
17                       },
18             }
19   }
                       Listing 6.5: funzione sendMessage con l’integrazione
Puoi anche leggere