
Acum un an, departamentul nostru de HR, pe care îl adorăm, ne-a solicitat să dezvoltăm un chatbot care să ajute la integrarea noilor angajați în companie.
Precizăm că nu dezvoltăm produse proprii, dar oferim clienților o gamă completă de servicii de dezvoltare. Discuția se va axa pe proiectul nostru intern, pentru care clientul este propriul nostru departament de HR. Principalul obiectiv, cu acces limitat la oameni, resurse și timp, este să realizăm proiectul la timp și să lansăm produsul.
Pentru început, vom descrie sarcinile care trebuiau rezolvate.
Dezvoltatorii sunt în mare parte introvertiți și nu le place să comunice; este mult mai simplu să scrie o întrebare într-un chat electronic. Cu botul, nu trebuie să te gândești cui să întrebi, pe cine să suni, unde să mergi și, în general, unde să cauți informații, și dacă aceasta este actuală.
A doua problemă este informația — există multă, în diferite surse, nu întotdeauna disponibilă și are nevoie de completare și actualizare constantă.
Compania are aproape 500 de angajați, care se află în diferite birouri, fusuri orare, orașe din Rusia și chiar în străinătate; de obicei, există foarte multe întrebări, așa că o altă sarcină este să reducem sarcina personalului de HR, legată de cele mai frecvente întrebări adresate de angajați.
A fost necesar, de asemenea, să automatizăm procesele: sosirea noilor angajați în companie, trimiterea de mesaje managerilor și mentorilor noilor angajați, trimiterea de memento-uri automate pentru cursuri și teste care trebuie să fie finalizate de noul angajat pentru o integrare reușită.
Pe baza cerințelor de business, au fost formulate cerințe tehnice.
Botul trebuie să funcționeze pe baza Skype (istoric, acesta este utilizat în companie), din acest motiv a fost ales un serviciu pe Azure.
Pentru restricționarea accesului la acesta, am început să folosim un mecanism de autentificare prin Skype.
Pentru recunoașterea textului, am folosit biblioteca ParlAI.
De asemenea, este necesar un portal web administrativ pentru configurare, instruire, depanare, setarea trimiterilor și alte sarcini.

În timpul lucrului la proiect, ne-am confruntat cu o serie întreagă de probleme și dificultăți.
De exemplu, au fost probleme tehnice legate de contul nostru de Azure. Microsoft nu a vrut în niciun fel să activeze abonamentul nostru din cauza unor dificultăți tehnice interne ale serviciului lor. Timp de aproape două luni nu am putut face nimic în legătură cu aceasta, iar suportul Microsoft, în cele din urmă, a ridicat din umeri și ne-a trimis la partenerii care au reușit să configureze totul cu succes și să ne ofere un cont.
Cea mai complexă etapă a fost începutul proiectului, când a trebuit să alegem ce vom folosi, care va fi arhitectura, cum și unde vom stoca datele și cum vor interacționa între ele componentele și modulele sistemului.
În cazul nostru, problemele obișnuite ale începutului oricărui proiect au fost complicate și de personalul angajat. Specificul afacerii noastre este astfel încât, spre deosebire de proiectele comerciale, pe proiectele interne lucrează adesea dezvoltatori care nu au suficiente cunoștințe în domeniile necesare – ei s-au trezit pur și simplu în așteptarea următorului mare proiect comercial. Este logic că motivația în această situație era de asemenea destul de complicată. Productivitatea scade, echipa este adesea în inactivitate, astfel că trebuie să convingem (să motivăm) sau să schimbăm persoana. La schimbarea dezvoltatorului, trebuie să facem instruire, să transferăm cunoștințe și din nou, în esență, să reluăm proiectul. Fiecare nou dezvoltator vedea arhitectura în felul său și îi critica pe precedenți pentru deciziile luate și codul străin. Așa că începea rescrierea de la zero.
Așa a continuat timp de aproape șase luni. Ne-am tot împotmolit, refactorizând codul și fără a scrie nimic nou.
De asemenea, pe proiectele interne, de regulă, nu există aproape deloc documentație, iar era greu de înțeles ce trebuie să facem în fiecare moment și care sunt prioritățile de actualitate. Era necesar să creăm o echipă permanentă, să stabilim procese, să realizăm planificarea și evaluarea pentru cel puțin trei luni. Dar cum să facem asta, când proiectul nu este comercial, iar asta înseamnă că orele de muncă trebuie investite la minimum și, în același timp, rezultatul să fie la fel de bun ca pentru un client extern?
Am consolidat un grup de resurse care au fost implicate în dezvoltarea proiectului, sunt familiari cu acesta și doresc să lucreze la el. Am întocmit un program de ocupare a persoanelor în proiecte. Am realizat o evaluare și o aprobată a lucrărilor, integrând aceste activități în "golurile" dintre proiectele principale. După 4 luni, am obținut un prototip funcțional al aplicației.
Acum haideți să discutăm în detaliu despre funcționalitatea botului, arhitectura și soluțiile tehnice.
Una dintre cerințele principale ale HR-ului a fost recunoașterea textului scris de utilizator pentru a răspunde corect la întrebări. Utilizatorul poate scrie – vreau să merg în concediu, vreau în concediu sau aș merge în concediu, iar botul va înțelege și va răspunde corespunzător. Sau, dacă un angajat are un scaun stricat și vrea să scrie – "scaunul s-a rupt" sau "Am un scaun crăpat" sau "Spătarul scaunului s-a desprins", cu un antrenament corespunzător botul va recunoaște aceste solicitări. Calitatea recunoașterii textului depinde, desigur, de instruirea botului, despre care vom vorbi mai târziu.
Următoarea cerință și parte a funcționalității este sistemul de dialoguri al botului. A fost dezvoltat un sistem astfel încât botul să poată purta un dialog și să înțeleagă contextul întrebării curente. Acesta poate, ca răspuns la întrebarea dumneavoastră, să pună anumite întrebări suplimentare și să continue conversația, cu condiția să fi fost instruit astfel. Skype suportă opțiuni simple de meniu pentru a-i oferi utilizatorului sugestii despre opțiunile de continuare a dialogului. De asemenea, dacă am purtat un dialog, dar am decis brusc să punem o întrebare nelegată de subiect, botul va înțelege și acest lucru.
Botul oferă posibilitatea de a trimite utilizatorului diverse artefacte, bazându-se pe datele lui personale. De exemplu, pe locația sa. Să presupunem că, dacă o persoană a dorit să găsească toaletă, i se va arăta o hartă a biroului, care îl duce la toaletă. Iar harta va fi selectată în funcție de biroul companiei în care se află angajatul.
Una dintre cele mai importante sarcini este protejarea informațiilor personale ale utilizatorilor. Nu putem permite ca orice persoană să aibă acces la datele confidențiale pe care le gestionează botul nostru. Necesitatea autorizației pentru un astfel de bot este o parte esențială a acestuia. Botul cere utilizatorului să se autorizeze înainte de a putea purta orice dialog. Acest lucru se întâmplă la prima solicitare a angajatului către bot. Autorizația în sine redirecționează utilizatorul către pagina corespunzătoare, unde utilizatorul primește un token, pe care apoi îl introduce în mesajul de Skype. Dacă autorizația trece cu succes, putem începe comunicarea cu botul.

Autorizația se efectuează prin Skype - portalul de servicii de autorizație, rețeaua corporativă și LDAP. Astfel, autorizația depinde de datele curente ale utilizatorului în rețeaua corporativă.
În timpul dezvoltării botului, am realizat că este nevoie de un sistem integrat în funcționalitatea portalului, care să ajute HR-ii să efectueze rapid debugging-ul botului. Am adăugat o astfel de pagină pe portal, unde HR-ii pot vedea erorile raportate de utilizatori în utilizarea botului și le pot soluționa prin reînvățare sau le pot lăsa pentru dezvoltatori.
Posibilitatea de a învăța botul direct pe portal nu a fost prevăzută de la început. Pe parcursul dezvoltării, am înțeles că învățarea botului este cea mai frecventă sarcină pe care angajații din departamentul HR o vor îndeplini, iar trimiterea fișierelor cu text dezvoltatorilor pentru o învățare suplimentară a botului este complet inacceptabilă. Aceasta consumă prea mult timp și generează prea multe erori și probleme.

Am dezvoltat o interfață utilizator pe portal pentru o învățare prietenoasă a botului. Aceasta permite HR-ului să vadă învățarea curentă a botului, să îl reînvățe și să facă ajustări la învățarea actuală. Învățarea este reprezentată într-o structură arborescentă, în care nodurile, adică ramurile, constituie continuarea dialogului cu botul. Se pot crea întrebări-răspunsuri simple sau dialoguri elaborate, totul depinde de HR și de nevoile lor.
Câteva cuvinte despre arhitectura soluției.

Arhitectura soluției este modulară. Aceasta include servicii care răspund la sarcini diferite, și anume:
• Serviciul de bot Skype pe Azure — primește și procesează cererile utilizatorilor. Este un serviciu destul de simplu, care primește cererea inițială și o procesează.
• Portalul de administrare — serviciul care oferă o interfață web pentru configurarea portalului și a botului. Botul se adresează întotdeauna mai întâi portalului, iar portalul decide ce să facă mai departe cu cererea.
• Serviciul de autorizare — oferă mecanisme de autentificare pentru bot și pentru portalul de administrare. Autorizarea se face prin protocolul Oauth2. După o autorizare reușită, serviciul face autorizarea în rețeaua corporativă conform datelor valide ale utilizatorului, astfel încât sistemul poate controla erorile asociate cu desincronizarea datelor.
• Modul AI de recunoaștere a textului, scris în Python și utilizând framework-ul ParlAI pentru recunoașterea textului. Este o rețea neuronală, cel puțin în implementarea actuală. Folosim algoritmul tfDiff pentru a înțelege întrebările. Modulul oferă un API pentru comunicarea cu el și pentru antrenament.
În concluzie, vreau să spun că acesta este primul nostru experiment în crearea unui chatbot și am încercat să facem sistemul cât mai simplu, dar în același timp funcțional, cu un minim de eforturi asupra lui. Cred că am reușit să realizăm un produs destul de interesant. Cu propriul sistem de învățare, înregistrare a erorilor, trimitere de notificări, de asemenea, poate fi integrat cu orice alt messenger.
Sursa: habr.com
