
Un anno fa, il nostro amato dipartimento HR ci ha contattato con una richiesta: scrivere un chatbot che aiuti nell'inserimento dei nuovi dipendenti in azienda.
Facciamo una precisazione: non sviluppiamo prodotti proprietari, ma offriamo ai clienti un'ampia gamma di servizi di sviluppo. Questo racconto riguarda un nostro progetto interno, il cui committente non è una società esterna, ma il nostro stesso HR. La principale sfida, date le limitate disponibilità di persone, risorse e tempo, era completare il progetto in tempo e rilasciare un prodotto finito.
Iniziamo descrivendo le sfide che dovevamo affrontare.
Gli sviluppatori sono spesso persone introverse e non amano parlare, è molto più semplice scrivere una domanda in una chat elettronica. Con un bot, non c'è bisogno di pensare a chi chiedere, a chi chiamare, dove andare e, in generale, dove cercare informazioni, e se queste siano aggiornate.
Il secondo problema è proprio l'informazione: ce n'è tantissima, proviene da fonti diverse, non sempre è disponibile e necessita di continuo aggiornamento.
In azienda ci sono quasi 500 dipendenti, sparsi in diversi uffici, fusi orari e città della Russia e all'estero; ci sono di solito molte domande, quindi un'altra sfida era ridurre il carico di lavoro del personale HR, relativo alle domande più frequenti poste dai dipendenti.
Era anche necessario automatizzare i processi: l'arrivo dei nuovi dipendenti in azienda, l'invio di messaggi ai manager e ai tutor dei neofiti, l'invio di promemoria automatici riguardo ai corsi e ai test che i nuovi devono sostenere per un'integrazione efficace.
Sulla base dei requisiti di business, sono state formulate le specifiche tecniche.
Il bot deve funzionare su Skype (storicamente, questo è il sistema utilizzato in azienda), quindi è stato scelto il servizio su Azure.
Per le limitazioni di accesso, abbiamo iniziato a utilizzare un meccanismo di autorizzazione tramite Skype.
Per il riconoscimento del testo abbiamo utilizzato la libreria ParlAI.
Era anche necessario un portale web amministrativo per configurazioni, addestramento, debugging, impostazione delle comunicazioni e altre attività.

Durante il lavoro al progetto ci siamo trovati ad affrontare una serie di problemi e difficoltà.
Ad esempio, ci sono stati problemi di natura tecnica – con l'account Azure. Microsoft non voleva attivare la nostra sottoscrizione a causa di alcune complessità tecniche interne al loro servizio. Per quasi due mesi non siamo riusciti a risolvere nulla, il supporto Microsoft alla fine si è arreso e ci ha indirizzati a partner che hanno configurato tutto con successo e ci hanno fornito l'account.
La fase più complicata è stata l'avvio del progetto, quando è stato necessario decidere cosa utilizzare, quale sarà l'architettura, come e dove conservare i dati e come i componenti e i moduli del sistema interagiranno tra loro.
Nel nostro caso, i comuni problemi di avvio di qualsiasi progetto erano complicati anche dal personale. La specificità del nostro business è tale per cui, a differenza dei progetti commerciali, sui progetti interni lavorano spesso sviluppatori che non hanno le conoscenze necessarie nei campi richiesti – semplicemente per caso si trovano ad aspettare il prossimo grande e interessante progetto commerciale. È ovvio che in una situazione del genere la motivazione è un problema. La produttività decresce, ci sono spesso pause nel team, e alla fine è necessario convincere (motivare) o sostituire qualcuno. Quando si cambia sviluppatore è necessario effettuare un training, trasferire conoscenze e, di fatto, ricominciare il progetto. Ogni nuovo sviluppatore ha una propria visione dell'architettura e critica le decisioni prese dai precedenti e il codice altrui. Inizia così una riscrittura da zero.
Questo è andato avanti per circa sei mesi. Abbiamo semplicemente stagnato, rifattorizzando il codice e non scrivendo nulla di nuovo.
Inoltre, nei progetti interni, di solito non c'è quasi alcuna documentazione, e risultava difficile comprendere cosa fare in ogni momento e quali fossero le priorità attuali. Era necessario creare un team fisso, stabilire processi, e pianificare e valutare almeno per tre mesi. Ma come fare questo, quando il progetto non è commerciale, e significa che bisogna investire il minimo possibile di ore uomo, e nel contempo ottenere un risultato non inferiore a quello per un committente esterno?
Abbiamo identificato un gruppo di risorse che partecipavano allo sviluppo del progetto, che lo conoscevano e desideravano lavorarci. Abbiamo redatto un calendario di impegni delle persone sui progetti. Abbiamo realizzato una valutazione e un accordo sulle attività, e inserito questi lavori tra i principali progetti. Dopo 4 mesi abbiamo ottenuto un prototipo funzionante dell'applicazione.
Ora parliamo più in dettaglio della funzionalità del bot, dell'architettura e delle soluzioni tecniche.
Uno dei requisiti principali per le risorse umane era il riconoscimento del testo inserito dall'utente per fornire risposte corrette alle domande. Può scrivere - voglio andare in vacanza, voglio andare in vacanza o andrei in vacanza, e lui lo capirà e risponderà di conseguenza. Oppure, se un dipendente ha un problema con la sedia e vuole scrivere - "la sedia è rotta" oppure "ho una crepa nella sedia" o "lo schienale della sedia si è staccato", con un corretto addestramento il bot riconoscerà tali richieste. La qualità del riconoscimento del testo dipende naturalmente dall'addestramento del bot, di cui parleremo successivamente.
Il requisito successivo e parte della funzionalità è il sistema di dialogo del bot. È stato sviluppato un sistema che consente al bot di avere conversazioni e comprendere il contesto della domanda corrente. Può porre domande di chiarimento in risposta alla tua domanda e portare avanti la conversazione, se abbiamo addestrato il bot a farlo. Skype supporta semplici punti di menu che aiutano gli utenti a conoscere le opzioni disponibili per continuare i dialoghi. Inoltre, se stiamo conversando, ma poi decidiamo di porre una domanda non pertinente, il bot lo capirà comunque.
Il bot consente di inviare diversi artefatti all'utente, in base ai suoi dati personali. Ad esempio, alla sua posizione. Supponiamo che una persona voglia trovare un bagno; in tal caso, gli verrà mostrata una mappa dell’ufficio che lo guida verso il bagno. E la mappa sarà selezionata in base a quale ufficio della società si trova il dipendente.
Una delle compiti più importanti è la protezione delle informazioni personali degli utenti. Non possiamo permettere a chiunque di accedere ai dati riservati con cui opera il nostro bot. La necessità di autorizzazione per un bot del genere è una parte imprescindibile. Il bot richiede all'utente di eseguire l'autenticazione prima di poter intraprendere qualsiasi conversazione con lui. Questo avviene al primo contatto del dipendente con il bot. L'autenticazione reindirizza l'utente alla pagina appropriata, dove riceve un token che poi inserisce nel messaggio di Skype. Se l'autenticazione ha successo, si può iniziare a interagire con il bot.

L'autenticazione avviene tramite Skype - il servizio di autorizzazione, la rete aziendale e LDAP. Così, l'autenticazione dipende dai dati attuali dell'utente nella rete aziendale.
Durante lo sviluppo del bot, abbiamo capito che era necessaria una sorta di sistema integrato nella funzionalità del portale, che potesse aiutare le risorse umane a fare debug rapidamente del bot. Abbiamo aggiunto una pagina del portale in cui gli HR possono vedere gli errori segnalati dagli utenti mentre lavorano con il bot e risolverli tramite ulteriore addestramento o lasciarli per gli sviluppatori.
La possibilità di addestrare il bot direttamente sul portale non era prevista sin dall'inizio. Durante lo sviluppo abbiamo capito che l'addestramento del bot sarebbe stato il compito più frequente che gli addetti delle risorse umane avrebbero eseguito, e inviare file di testo agli sviluppatori per un ulteriore addestramento del bot è assolutamente inaccettabile. Questo consuma troppo tempo e genera troppi errori e problemi.

Abbiamo scritto un'interfaccia utente sul portale per un addestramento del bot user-friendly. Questo consente agli HR di vedere l'attuale addestramento del bot, perfezionarlo e apportare modifiche all'attuale iterazione di apprendimento. L'addestramento è presentato in una struttura ad albero, in cui le nodi, cioè i rami, sono continuazioni del dialogo con il bot. È possibile creare semplici domande e risposte, ma anche dialoghi complessi, a seconda delle esigenze degli HR.
Qualche parola sull'architettura della soluzione.

L'architettura della soluzione è modulare. Comprende servizi responsabili di varie attività, ovvero:
• Servizio bot di Skype su Azure - riceve e gestisce le richieste degli utenti. È un servizio piuttosto semplice, che riceve per primo la richiesta e ne esegue il trattamento iniziale.
• Portale amministrativo - servizio che fornisce un'interfaccia web per la configurazione del portale e del bot stesso. Il bot si rivolge sempre prima al portale, che poi decide come gestire ulteriormente la richiesta.
• Servizio di autorizzazione - fornisce i meccanismi di autenticazione per il bot e per il portale amministrativo. L'autenticazione avviene secondo il protocollo Oauth2. Durante un'autenticazione positiva, il servizio svolge l'autenticazione nella rete aziendale secondo i dati validi dell'utente, in modo che il sistema possa controllare gli errori legati alla desincronizzazione dei dati.
• Modulo AI per il riconoscimento del testo, scritto in Python e basato sul framework ParlAI per il riconoscimento del testo stesso. È una rete neurale, almeno nella sua attuale implementazione. Utilizziamo l'algoritmo tfDiff per comprendere le domande. Il modulo fornisce un'API per interagire con esso e per l'addestramento.
In conclusione, vorrei dire che questa è la nostra prima esperienza nella creazione di un chatbot, e abbiamo cercato di rendere il sistema il più semplice possibile, mantenendo però la funzionalità, con il minimo sforzo. Credo che abbiamo realizzato un prodotto piuttosto interessante. Con il nostro sistema di formazione, registrazione degli errori, invio di notifiche, può anche essere integrato con qualsiasi altro messaggero.
Fonte: habr.com
