RedBot: sviluppare chatbot con Node-RED

Guido Bellomo
ConvComp.it
Published in
5 min readNov 12, 2018

--

Esempio di chatbot sviluppato con RedBot/Node-RED

RedBot è una piattaforma open source per creare chatbot per Telegram, Slack, Viber, Twilio e Facebook.

Come spesso capita con i progetti open source, RedBot è nato per soddisfare un’esigenze personale: mi ero messo in testa di controllare tutti i device di casa (termostato, valvole dei caloriferi, security cam, etc) da un’unico punto tramite le rispettive API. Non volevo creare un’altra app mobile, mi serviva qualcosa con un interfaccia minimale. Un chatbot era il candidato ideale: la maggior parte delle piattaforme di chat infatti supporta elementi grafici quali bottoni, immagini, link, etc.

Dopo un pò di test vari mi ero fatto un’idea piuttosto precisa sui requisiti della piattaforma di cui avevo bisogno:

  • open-source: un chatbot che non comunica con l’esterno (CRM, IoT, etc) e’ un chatbot inutile, per cui la capacità di interfacciarsi con l’esterno è una delle caratteristiche più importanti.
    Molte piattaforme permettono di interfacciarsi con l’esterno tramite chiamate http, non sempre però è possibile parametrizzarle (ad esempio inserendo dati presi dalla conversazione corrente). Nessuna piattaforma permette di ricevere chiamate con la conseguente impossibilità di iniziare una conversazione partendo da uno stimolo esterno.
    Un sistema chiuso impone restrizioni sull’implementazione della bussiness logic del chatbot che prima o poi pesano su qualunque progetto.
  • visuale: un chatbot complesso presenta flussi di conversazione di cui non è facile avere una panoramica guardando il solo codice. Inoltre lo sviluppo di un chatbot spesso procede per numerosi piccoli aggiustamenti che è sicuramente più facile eseguire su interfacce semplici piuttosto che sul puro codice. Non da ultimo, è probabile che sul chatbot debbano lavorare prefessionalità diverse da un programmatore, che non possono o non vogliono mettere le mani al codice (si pensi ad un traduttore, un copywriter, etc).
  • multi-platform: la stessa implementazione deve poter funzionare su piattaforme diverse (almeno Telegram, Facebook e Slack e assistenti vocali quali Alexa e Google Assistant).

La frustrazione di non riucire a trovare qualcosa che fosse sufficientemente aperto e allo stesso tempo visuale mi ha spinto a creare qualcosa di nuovo.

Fortunatamente non sono dovuto partire da zero, esisteva già Node-RED: un tool open source di programmazione flow-based con cui si possono creare programmi semplicemente connettendo più blocchi funzionali, il tutto in maniera visuale.

I blocchi di base sono molti: da quelli logici e per il controllo di flusso (if, switch, etc) ad altri più operativi (manipolazione di files, ricevere e rispondere a chiamate http, etc) ed ovviamente è possibile creare nuovi nodi in JavaScript: sono più di 1000 nodi custom disponibili.

Poichè la conversazione con un chatbot è facilmente assimilabile ad un flusso di eventi, ho iniziato a creare nodi con cui estendere Node-RED: da quelli specifici per inviare e ricevere messaggi per le piattaforme supportate a quelli per costruire i veri e propri blocchi della conversazione con il chatbot.

Ad esempio, il flusso del più semplice dei chatbot (“Hello world!”)

Hello World chatbot

Ogni messaggio ricevuto dal chatbot viene replicato sull’uscita del nodo receiver. Per rispondere alla conversazione è sufficiente inserire un blocco text e inviarlo al nodo sender.
Ogni nodo è configurabile tramite tramite l’interfaccia di Node-RED, in questo modo la maggior parte delle operazioni sul chatbot avvengono senza toccare il codice:

Sono disponibili diversi blocchi di conversazione: per inviare immagini, file, video, codici QR, messaggi vocali, etc. quasi tutti cross-platform: il medesimo flusso sarà riutilizzabile, piazzando gli opportuni senders/receivers, per tutte le altre piattaforme supportate.

In particolare, nel caso di Telegram, il set-up è particolarmente semplice, per cui bastano pochi click per mettere in piedi un chatbot funzionante.

Vi sono inoltre una serie di nodi per eseguire l’analisi del testo (Natural Language Processing) dai più semplici basati su librerie di terze parti come RiveScript e Compromise a quelli più complessi che si appoggiano a servizi esterni come Dialogflow:

Controllo di flusso sull’intent rilevato da Dialogflow

A completamento del tutto vi sono alcuni nodi per controllare di flusso in modo da instradare la conversazione verso un particolare sotto-flusso in base a parametri come la lingua, l’intent rilevato, il valore di una variabile, etc. i quali, in accoppiata con il nodo function di Node-RED (in cui è possibile eseguire direttamente codice JavaScript), permettono di districarsi in qualunque bussiness logic ci si ritrovi a dover implementare.

RedBot permette inoltre di semplificare operazioni molto comuni quando si sviluppano chatbot, come ad esempio proseguire la conversazione (follow-up) con l’utente e salvare dati in uno spazio di memoria (chat-context): ad esempio un semplice flusso per chiedere l’indirizzo email dell’utente:

Follow-up di una conversazione

Il primo messaggio testuale pone la domanda all’utente (“Qual è il tuo indirizzo email?”), l’eventuale risposta dell’utente arriverà direttamente sull’uscita del primo sender e fatta passare attraverso il nodo parser che cercherà di estrarre una mail valida, in caso positivo il flusso proseguirà sulla prima uscita e il valore trovato verrà salvato nello spazio di memoria relativo all’utente corrente (che può essere quindi utilizzato per salvare lo stato della discussione in atto).
I valori salvati nel chat-context possono essere utilizzati nei nodi function (JavaScript), sia più semplicemente nei messaggi con semplici placeholders: “Grazie per la tua email: {{email}}”.

GitHub: RedBot/Node-RED.

--

--