
Prije godinu dana, naš voljeni HR odjel nam se obratio sa zahtjevom: da napišemo chatbota koji bi pomogao u uvođenju novih zaposlenika u tvrtku.
Pojasnimo da ne razvijamo vlastite proizvode, ali nudimo cijeli niz razvojnih usluga našim klijentima. Ova priča govori o našem internom projektu, za koji klijent nije treća strana, već naš vlastiti HR odjel. Glavni cilj, s obzirom na ograničenu dostupnost ljudi, resursa i vremena, jest dovršiti projekt na vrijeme i objaviti proizvod.
Prvo, opišimo zadatke koje je trebalo riješiti.
Programeri su uglavnom introvertirani i ne vole pričati, pa je puno lakše napisati svoje pitanje u e-mail chatu. S botom ne morate brinuti o tome koga pitati, koga nazvati, kamo ići ili čak gdje tražiti informacije ili jesu li ažurne.
Drugi problem su informacije - ima ih puno, dolaze iz različitih izvora, nisu uvijek dostupne i potrebno ih je stalno dopunjavati i ažurirati.
Tvrtka ima gotovo 500 zaposlenika, smještenih u različitim uredima, vremenskim zonama, gradovima diljem Rusije, pa čak i inozemstva. Obično ima puno pitanja, pa je još jedan izazov smanjenje opterećenja HR osoblja vezanog uz najčešće postavljana pitanja.
Također je bilo potrebno automatizirati sljedeće procese: uvođenje novih zaposlenika u posao, slanje poruka menadžerima i mentorima novih zaposlenika te slanje automatskih podsjetnika o tečajevima i testovima koje novi zaposlenici moraju završiti za uspješnu prilagodbu.
Na temelju poslovnih zahtjeva formirani su tehnički zahtjevi.
Bot bi trebao raditi na Skypeu (povijesno gledano, tvrtka ga jednostavno koristi), pa je odabrana usluga na Azureu.
Kako bismo ograničili pristup, počeli smo koristiti Skypeov mehanizam autorizacije.
Za prepoznavanje teksta korištena je ParlAI biblioteka.
Administrativni web portal je također potreban za konfiguraciju, obuku, otklanjanje pogrešaka, postavljanje mailing liste i ostale zadatke.

Tijekom rada na projektu naišli smo na niz problema i poteškoća.
Na primjer, imali smo tehničkih problema s našim Azure računom. Microsoft je odbio aktivirati našu pretplatu zbog nekih tehničkih poteškoća unutar njihove usluge. Gotovo dva mjeseca nismo mogli ništa učiniti po tom pitanju, a Microsoftova podrška je na kraju digla ruke od toga i uputila nas na svoje partnere, koji su uspješno sve postavili i izdali nam račun.
Najizazovnija faza bila je pokretanje projekta, kada smo morali odabrati što ćemo koristiti, kakva će biti arhitektura, kako i gdje pohranjivati podatke te kako će komponente i moduli sustava međusobno komunicirati.
U našem slučaju, tipične izazove pokretanja bilo kojeg projekta dodatno su komplicirali problemi s osobljem. Priroda našeg poslovanja je takva da, za razliku od komercijalnih projekata, interni projekti često uključuju developere koji nemaju dovoljno znanja u relevantnim područjima - jednostavno su ostavljeni po strani, čekajući sljedeći veliki, uzbudljiv komercijalni projekt. Naravno, motivacija u takvoj situaciji također je bila prilično izazovna. Produktivnost je pala, tim je često bio besposlen i na kraju smo morali uvjeriti (motivirati) ili zamijeniti developera. Prilikom zamjene developera morali smo provesti obuku, prenijeti znanje i u biti ponovno pokrenuti projekt. Svaki novi developer je drugačije vidio arhitekturu i kritizirao prethodne zbog njihovih odluka i koda koji su napisali. Prepisivanje je započelo od nule.
To je trajalo oko šest mjeseci. Samo smo zaustavljali vrijeme, refaktorirali kod i nismo pisali ništa novo.
Interni projekti također obično nemaju dokumentaciju, što otežava razumijevanje što treba učiniti u bilo kojem trenutku i koji su prioriteti. Bilo je potrebno stvoriti stalni tim, pojednostaviti procese te provoditi planiranje i evaluaciju najmanje tri mjeseca. Ali kako se to može postići kada je projekt nekomercijalan, što znači minimalno ulaganje u radne sate, a da se i dalje postignu rezultati koji nisu lošiji od onih za vanjskog klijenta?
Identificirali smo skupinu resursa koji su sudjelovali u razvoju projekta, bili su upoznati s njim i bili su spremni raditi na njemu. Izradili smo raspored opterećenja ljudi za svaki projekt. Procijenili smo i koordinirali rad, a zatim ga integrirali u praznine između glavnih projekata. Četiri mjeseca kasnije imali smo funkcionalan prototip aplikacije.
Sada ćemo detaljnije razgovarati o funkcionalnosti, arhitekturi i tehničkim rješenjima bota.
Jedan od glavnih HR zahtjeva bio je prepoznavanje teksta koji je napisao korisnik kako bi se točno odgovorilo na pitanje. Možete napisati nešto poput "Želim ići na odmor", "Želim ići na odmor" ili "Želio bih ići na odmor", a bot će razumjeti i odgovoriti u skladu s tim. Ili je možda zaposleniku slomljena stolica i želi napisati nešto poput "stolica je slomljena", "Moja stolica je napukla" ili "Naslon stolice je pao". Uz pravilnu obuku, bot će prepoznati takve upite. Kvaliteta prepoznavanja teksta naravno ovisi o obuci bota, o čemu ćemo kasnije raspravljati.
Sljedeći zahtjev i dio funkcionalnosti je sustav dijaloga bota. Razvili smo sustav koji omogućuje botu vođenje dijaloga i razumijevanje konteksta trenutnog pitanja. Može postavljati pojašnjavajuća pitanja kao odgovor na vaše pitanje i nastaviti razgovor ako smo bota obučili za to. Skype podržava jednostavne stavke izbornika koje korisnike upozoravaju na moguće opcije za nastavak razgovora. Također, ako smo u dijalogu, ali iznenada odlučimo postaviti pitanje izvan teme, bot će i to razumjeti.
Bot omogućuje korisnicima slanje raznih artefakata na temelju njihovih osobnih podataka, kao što je njihova lokacija. Na primjer, ako netko želi pronaći toalet, prikazat će mu se karta ureda koja ga upućuje do toaleta. Karta će biti odabrana na temelju trenutne lokacije ureda zaposlenika.
Zaštita osobnih podataka korisnika ključni je prioritet. Ne možemo dopustiti bilo kome pristup osjetljivim podacima koje naš bot obrađuje. Autorizacija je sastavni dio ovog bota. Bot traži od korisnika da se autorizira prije nego što započne bilo kakav razgovor. To se događa prvi put kada zaposlenik komunicira s botom. Autorizacija preusmjerava korisnika na odgovarajuću stranicu, gdje prima token koji zatim lijepi u Skype poruku. Ako je autorizacija uspješna, može započeti komunikaciju s botom.

Autorizacija se provodi putem portala Skype usluge autorizacije, korporativne mreže i LDAP-a. Stoga autorizacija ovisi o trenutnim podacima korisnika na korporativnoj mreži.
Tijekom razvoja bota, shvatili smo da nam je potreban sustav integriran u funkcionalnost portala koji bi pomogao HR odjelu da brzo otkloni pogreške u botu. Dodali smo stranicu portala gdje HR može vidjeti pogreške koje su korisnici prijavili tijekom rada s botom i riješiti ih ponovnom obukom ili ih prepustiti programerima da ih riješe.
Mogućnost izravnog treniranja bota na portalu nije bila ugrađena od samog početka. Tijekom razvoja shvatili smo da je treniranje bota najčešći zadatak koji će HR osoblje obavljati prilikom rada s njim, a slanje tekstualnih datoteka programerima za dodatnu obuku bota potpuno je neprihvatljivo. To oduzima previše vremena i stvara previše pogrešaka i problema.

Razvili smo korisničko sučelje za portal za jednostavno korištenje obuke botova. Omogućuje HR odjelu pregled trenutne obuke bota, pružanje dodatne obuke i prilagođavanje postojeće obuke. Obuka je predstavljena kao struktura stabla, u kojoj su čvorovi (ili grane) proširenje dijaloga bota. Možete kreirati jednostavna pitanja i odgovore ili složene dijaloge, ovisno o HR-u i njihovim potrebama.
Nekoliko riječi o arhitekturi rješenja.

Arhitektura rješenja je modularna. Uključuje servise odgovorne za različite zadatke, naime:
• Skype bot servis na Azureu – prima i obrađuje korisničke zahtjeve. Ovo je prilično jednostavan servis koji prvo prima zahtjev i obavlja njegovu početnu obradu.
• Administratorski portal je usluga koja pruža web sučelje za konfiguriranje portala i samog bota. Bot uvijek prvo kontaktira portal, a portal zatim odlučuje što će učiniti sa zahtjevom.
• Usluga autorizacije — pruža mehanizme autentifikacije za bota i administratorski portal. Autorizacija se odvija putem Oauth2 protokola. Ako je autorizacija uspješna, usluga autentificira korisnika na korporativnoj mreži koristeći valjane korisničke podatke, što sustavu omogućuje otkrivanje pogrešaka povezanih s desinkronizacijom podataka.
• Modul za prepoznavanje teksta umjetnom inteligencijom, napisan u Pythonu i koristi ParlAI okvir za prepoznavanje teksta. To je neuronska mreža, barem u svojoj trenutnoj implementaciji. Za razumijevanje pitanja koristimo algoritam tfDiff. Modul pruža API za komunikaciju s njim i učenje.
Zaključno, želio bih reći da je ovo naš prvi pokušaj stvaranja chatbota i pokušali smo sustav učiniti što jednostavnijim, a opet funkcionalnim, uz minimalan napor. Mislim da smo stvorili vrlo zanimljiv proizvod. Ima vlastiti sustav obuke, zapisivanje pogrešaka i obavijesti, a može se integrirati i s bilo kojom drugom aplikacijom za razmjenu poruka.
Izvor: www.habr.com
