Pitäisi tehdä chatbot, mutta olenko tehnyt sen nyt oikein? Tässä blogissa esitetään chatbotin viitearkkitehtuuri, jonka mukaan suurin osa näkemistäni suomalaisista asiakaspalvelu, FAQ tai komentoja vastaanottavista yhden tempun chatboteista on nykyisin rakennettu.
Chatbotin arkkitehtuuri
Ihmisen kaltainen, älykäs, luonnollista tekstiä ymmärtävä ja vastauksia tuottava chatbot tuntuu olevan edelleen harmillisen kaukaista tulevaisuutta. Käytännön syistä nykyiset botit ovat yksinkertaisia yhden tempun botteja: kysymys-vastauspareja tuottavia automaatteja, tai ohjelmia jotka pystyvät yksinkertaisiin tehtäviin kuten “sytytä olohuoneen valot”.
Alla oleva viitearkkitehtuuri yleistää käytännöksi muodostuneen tekotavan, jonka mukaan suurin osa tapaamistani suomenkielisistä chatboteista tuntuu olevan rakennettu. Mallin suosiota selittää myös se, että sen käyttämät komponentit ovat olleet jo tovin olemassa, ja ne ovat osoittautuneet käytännössä sekä toimiviksi että luotettaviksi. Mallin toinen etu on sen yksinkertaisuus – botin rakentamiseen ei tarvita AI-matematiikko-maagikoita, vaan botti voidaan rakentaa mallia hyödyntäen sekä hyväksyttävässä aikataulussa että järkevin kustannuksin. Kääritäänpä hihat:
Kuva: Botin viitearkkitehtuuri
Mallia käytetään yleisesti boteissa, jotka eivät tarkoituksella ymmärrä keskustelun kontekstia. Tämä tarkoittaa sitä, että botti ei muista aikaisemmin käyttäjänsä kanssa käymistä keskusteluista mitään. Lähestymistapa on todella aivoton, mutta se soveltuu hyväksyttävästi tilanteisiin, jossa käyttäjä kysyy, ja botti vastaa. Kontekstin ymmärrys on yksi vaikemmista asioista botin rakentamisessa, ja kontekstin puutteen hyväksyminen yksinkertaistaa botin rakennetta merkittävästi.
Osat ja kokonaisuus
Seuraavissa kappaleissa kuvataan mallin komponentit, sekä miten niiden avulla voidaan rakentaa täysin toimiva, nykymallin mukainen chatbot. Koska työni puolesta tunnen Microsoftin Azure-teknologiaa melko hyvin, lisäsin mukaan linkit miten viitearkkitehtuuri toteutettaisiin Azure-teknologian avulla. Azuren käyttö ei kuitenkaan ole pakollista – voit käyttää mitä tahansa muita vastaavia komponentteja. Tai voit rakentaa koko kielenymmärrysmodulin itse! (Sekin tuli tehtyä Kalle Kotipsykiatria koodatesssani)
Bot Framework
Älä koskaan aloita tyhjästä. Bottien rakentamista varten on olemassa useita hyviä sovelluskehyksiä. Kehyksen tehtävä on hoitaa botin perustoiminnot: Miten botti hoitaa webistä, skypestä, slackista tai muista kanavista tulevat keskustelut yhdellä bottitoteutuksella. Miten keskusteluprotokolla on toteutettu. Miten välitetään “käyttäjä kirjoittaa…” viestit. Miten kuvia välitetään. Keskustelujen REST apit. Näiden toteuttamisessa itse ei vain ole mitään järkeä. Käytä valmista sovelluskehystä.
Azuren palvelu:
Kielenymmärrys-palvelu(t)
Käyttäjän bottiin syöttämä teksti annetaan aluksi viitemallin kielenymmärrys-palvelulle, jonka vastuulla on kaivaa syötteestä käyttäjän aikomus (eng. intent, tiedän – vähän huono suomennos). Esimerkiksi:
- Käyttäjä: “Tilaa mulle taksi.” –> Intent: ORDER_TAXI
- Käyttäjä: “Koska seuraava juna Helsinkiin lähtee?” –> Intent: TRAIN_SCHEDULE_QUERY
- Käyttäjä: “Kuis menee?” –> Intent: GREETING
- Käyttäjä: “Täytyy mennä, moikka!” –> Intent: END_OF_CONVERSATION
Eräät kielenymmärryskomponentit pystyvät viemään tämän vielä hieman pidemmälle: Syötteestä pystytään kaivamaan aikomuksen lisäksi myös osia, jotka ovat tyypillisesti lauserakenteen objekteja (engl. entities, tiedän, taas huono suomennos). Esimerkiksi:
- Käyttäjä: “Koska seuraava juna Helsinkiin lähtee?” –> Intent: TRAIN_SCHEDULE_QUERY, DESTINATION = Helsinki
Tunnistuksen laatua voi parantaa käyttämällä apupalveluita. Muutama esimerkki: Syötä käyttäjän antama teksti ensin oikeinkirjoitus-palvelulle (spell checker), ja vasta sen jälkeen kielenymmärryskomponentille. Syöte, josta typot on korjattu, antaa pääsääntöisesti paremman lopputuloksen. Jos käyttäjäsi ovat monikielisiä, tunnista ensin käyttäjän kieli apupalvelulla, sen jälkeen pyydä konekäännös syötteestä, ja vasta sen jälkeen vie teksti kielentunnistukseen. Joissain tapauksissa voi olla hyödyllistä pyytää syötteestä myös nk. sentiment-analyysi, joka palauttaa tiedon onko käyttäjä tyytyväisen vai tyytymättömän oloinen botin keskusteluun. Jos käyttäjä on ok, hyvä. Jos analyysi antaa tuloksen “turhautunut tai vihainen, keskustelu pitäisi ehkä ohjata oikealle ihmiselle vastattavaksi?
Azuren edellisen toteuttavat palvelut:
- LUIS – kielenymmärryspalvelu
- Bing Spell Check API
- Sentiment & Text analytics API
- Tekstin käännös API
Fallback – käsittelijät (ei pakollisia)
Jos kielenymmärryspalikka ei onnistunut tunnistamaan käyttäjän aikomusta, täytyy tehdä päätös mitä silloin tehdään. Alla tyypillisimmät vaihtoehdot, joita olen nähnyt käytettävän. Yleensä näitä käsittelijöitä on enemmän kuin yksi, mutta mitä enemmän keksit, sitä parempi. Ketjuta!
Älä tee mitään
Kerro käyttäjälle, että botilla ei ollut hajuakaan mitä käyttäjä lausahduksellaan tarkoitti. Ei kovin hienostunutta, mutta tehokasta. Yleensä tämä on viimeinen vaihtoehto fallback-käsittelyssä, kun mikään yritys ei toiminut.
Googlaa vastaus
Useimmat näkemäni botit tekevät haun omaan hakukoneeseensa jos intent-tunnistus ei onnistunut. Lyhyt ohje käytännön toteutukseen: Aloita tekemällä itsellesi oma custom-hakukone, josta voit etsiä vastauksia kun kaikki muu pettää. Organisaatiossasi on intranetit, ekstranetit, keskustelupalstat, sähköpostit ja tiedostojaot pullollaan dokumentteja joita voit käyttää hakujen tietolähteinä. Käytä mitä tahansa näistä hakukoneesi indeksin luomiseen. Kun kielentunnistus ei saa selvitettyä käyttäjän aikomusta, käytä tekstianalyysipalvelua hakemaan ensin avainsanat (keyword extraction) käyttäjän syötteestä. Tämän jälkeen syötä löydetyt avainsanat hakukoneeseesi ja toivo parasta.
Ohjaa keskustelu ihmiselle
Voit myös reitittää keskustelun botin sijaan esim. asiakaspalvelijalle. Uudellenohjauksen voi käynnistää esim. 1) Kun sentiment-analyysi tunnistaa että käyttäjä on turhautunut tai vihainen, 2) Jos kielentunnistus löytää lausahduksen kuten: “Haluan puhua oikealle ihmiselle”, “Nyt haluan kyllä jutella oikean asiakaspalvelun kanssa”, “Pystynkö puhumaan oikean ihmisen kanssa?” tai 3) aina kun kielentunnistus ei löydä käyttäjän aikomusta.
Toteutus Azure-palveluilla:
Vastauksen luominen
Ketjun viimeinen lenkki on vastauksen luominen käyttäjälle. Jos aikomusta ei löytynyt, moduli voi reitittää fallback-käsittelyn kautta saadun vastauksen sellaisenaan läpi. Muutoin käytetään käyttäjän syötteen perusteella saatua aikomusta (intent). Yksinkertaisimmillaan vastausgeneraattori hakee vastausfraasin tietokannasta saadun intent-avaimen perusteella. Tietokanta (tai mikä tahansa valitsemasi muu tallennuspaikka) sisältää siis intent – vastausfraasi – pareja.
Azuressa:
Yhteenveto
Siinäpä se oli. Useimmat Suomalaiset keskustelubotit eivät kokemukseni mukaan ole juurikaan tätä kummallisempia. Variaatiota tuntuu olevan lähinnä miten fallback-käsittelijät on ketjutettu. Jos teet oman bottisi tämän viitemallin mukaan, voit olla melko varma että arkkitehtuuri on ok, ja toteutustapa mahdollistaa kaikkien tavallisimpien käyttötapausten toteutuksen.
Eikun tekemään!
Leave A Comment