Chatbot on tyypillisesti pikaviestipalvelussa (Facebook Messenger, Skype, Teams, Slack..) toimiva tietokoneohjelma jonka kanssa voi keskustella.

Ai että tsättäilisin jonkun koodinpätkän kanssa? Typerää.

Oikeastaan se ei ole yhtään typerä ajatus. Käytän pikaviestipalveluja päivän aikana enemmän kuin sähköpostia. Miksei tähän paljon käytettyyn kontekstiin toisi mukaan työkaluja ja palveluja?

Mieti vaikka seuraavia:

  • Veroilmoituksen lisätiedot. Haluan lisätä veroilmoitukseeni työmatkavähennyksen. Menen vero.fi sivulle, tunnistaudun ja avaan chatin. Sähköinen verovirkailija kysyy miten voisi auttaa. Kirjoitan haluavani lisätä ilmoitukseeni työmatkatiedot. Chatbot kysyy minulta kaiken tarvittavan mitä työmatkavähennykseen tarvitaan ja olen valmis.
  • Lennon varaaminen. Menen Finnairin sivuille ja kerron chatbotille etsiväni mahdollisiman halpoja lentoja johonkin kaupunkikohteeseen jollekin huhtikuun viikonlopulle. Chatbot ehdottaa muutamia ja voin hoitaa myös varaamisen ja maksaminen suoraan chatissa.
  • Minne syömään? Keskustelen töissä Skype:llä työkavereiden kanssa. Jossain vaiheessa päivää käydään aina perinteinen ”minne syömään?” -keskustelu. Otan mukaan chatbotin ja kysyn mitäs tänään läheisissä lounaspaikoissa on ruokana. Chatbot käy hakemassa tiedot ja vastaa meille.

Chatbotilla voi rakentaa aivan uudenlaisia palveluja tai sen avulla voi toteuttaa uuden käyttöliittymän olemassaolevaan palveluun. Palvelu voi olla laaja (avustuksen hakeminen KELA:lta) tai kapea täsmäpalvelu (kerro mihin AD-ryhmiin minä kuulun).

Kiinnostavuus kasvaa kun tajuaa että chat-pohjaisia palveluja voi jatkossa käyttää suoraan puheella.

Chatbotin toteutusmalli on yksinkertainen. Siinä pyritään tunnistamaan vastapuolen aikomuksia (intent). Chatbottia kiinnostava aikomus voisi olla vaikka ”Tilaa pitsa”. Yksinkertainen chatbot tunnistaa kyseisen aikomuksen vain jos käyttäjä kirjoittaa chattiin ”tilaa pitsa”.

Kun chatbot kytketään tekoälypalveluun joka osaa tulkita kirjoitettua kieltä (esim LUIS), muuttuu tekeminen oikeasti mielenkiintoiseksi. Nyt chatbot ymmärtää että aikomukseni on tilata pitsaa vaikka kirjoittaisin:

  • ”Haluaisin tilata pitsan”
  • ”Tilaisitko pitsan”
  • ”haluan pitsan”
  • ”saisinko pitsan”
  •  jne

Kun aikomus on tunnistettu, voidaan jatkaa ohjattua keskustelua sen ympärillä. Chatbot voi esimerkiksi kysyä mitä täytteitä pitsaan laitetaan. Tai ehdottaa valmiita vaihtoehtoja joista käyttäjä voi valita.

Miten chatbotteja sitten käytännössä tehdään?

Esimerkki – henkilökohtainen assistentti Microsoft Teams:iin

Kuljen töihin pääsääntöisesti autolla. Niinä päivinä kun liikun julkisilla unohdan töistä lähtiessäni katsoa milloin seuraava juna menee. Ja myöhästyn junasta aina.

Mitä jos voisin kysyä seuraavan lähtevän junan chatbotilta? Ehkä muistaisin kysyä siltä samalla kun chattaan työkavereille lähteväni?

Työkaluja chatbotin tekoon on lukuisia. Mikäli ohjelmointi on sinulle vierasta suosittelen kokeilemaan Chatfuel.com:ia. Minä valitsin kokeiluni alustaksi Microsoftin Bot Framework:in jonka kanssa alkuun pääsee nopeasti:

Yksinkertainen toteutus

Tein ensin pätkän node.js-koodia joka hakee kaksi seuraavaa Valimon asemalta Leppävaaraan lähtevää junaa. Tiedot löytyy käyttämällä liikenneviraston rajapintaa. Varaan työpisteeltä asemalle kävelyyn aikaa 4min joten haen lähteviä junia tästä hetkestä + 4min.

Vaihdan pohjaksi ottamastani esimerkistä intentiksi ”next train”.

Näyttökuva 2017-03-10 kello 10.51.33.png

Kyseiseen intentiin päädyttäessä kutsutaan getTimeTables -funktiota joka kirjoittaa chattiin kaksi seuraavaa junan lähtöaikaa. Homma toimii omalla koneella emulaattorissa kuten pitääkin.

Näyttökuva 2017-03-10 kello 11.11.14.png

Lisää älyä – LUIS

Assistenttini on vielä aika karu. ”Next train” on käytännössä komento joka minun pitää muistaa. Liitän seuraavaksi mukaan LUIS-palvelun, joka tunnistaa tekstistä aikomuksia.

Kirjaudun https://www.luis.ai/ sivulle ja luon uuden Appsin. Kielenä ei ole valittavissa suomea, joten joudun tyytymään englantiin.

Näyttökuva 2017-03-13 kello 18.20.12.png

Määrittelen aikomukseksi (intent) ”nexttrain”. Seuraavaksi määrittelen ilmaisuja (utterances) joita luulen henkilön kirjoittavan kun häntä kiinnostaa seuraavat kotiinlähtevät junat. Mitä enemmän ilmaisuja keksii, sitä paremmin LUIS toimii (tunnistaa muita ilmaisuja syöttämieni lisäksi).

Näyttökuva 2017-03-13 kello 18.25.07.png

Julkaisen LUIS-soveluksen kun olen syöttänyt riittävän määrä ilmaisuja. Ennen julkaisua mallia pitää vielä harjoittaa (train).

Näyttökuva 2017-03-13 kello 18.32.25.png

Päivitän koodin käyttämään tekemääni NextTrain LUIS Appia (kts malli).  Samalla vaihdan bottini vastaukset englanninkielisiksi.

Näyttökuva 2017-03-13 kello 18.38.02.png

Nyt voin kommunikoida chatbotin kanssa myös ilmaisuilla joita en ole kertonut LUISille.

Näyttökuva 2017-03-13 kello 18.44.31.png

Assistentin liittäminen chat-palveluun

Haluan liittää sähköisen assistenttini Microsoftin Teams:iin. Ensin se pitää luonnollisesti siirtää ajettavaksi jonnekin muualle omalta työasemaltani. Luonteva ajoympäristö on Azure jonne vein sen tämän ohjeen avulla.

azure chatbot.png

Seuraavaksi bot pitää rekisteröidä Microsoftin Bot Framework –sivustolla.

Näyttökuva 2017-03-14 kello 21.09.30.png

Voin antaa botille kuvan ja nimen jotka näkyvät chatissa. Messaging endpoint osoittaa bot-toteutukseen. Vein omani Azureen, joten se on muotoa https://testichatbot.azurewebsites.net/messaging/api.

Rekisteröinnin jälkeen saan botilleni Microsoft App ID:n ja salasanan. Käyn päivittämässä ne koodiini appID ja appPassword kohtiin ja vien päivitetyn koodini Azureen.

Näyttökuva 2017-03-14 kello 21.22.12.png

Rekisteröity bot näyttää Microsoftin Bot Framework -sivulla tältä.

ms bot framework

Lisään botin Add-linkistä Teams-palveluun. Bot löytyy Teams:in haulla ja voin alkaa keskustelemaan sen kanssa.

bot in teams.png

Cool!

Huomioita

Chatbotin tekeminen oli helppoa. Tässä muutamia huomiota matkan varrelta.

  • Ensikokemukseni mukaan ilmaisuja pitää tehdä useampi jotta homma toimii ja LUIS oikeasti oppii niistä jotain. Ennen kuin lisäsin ilmaisuja todella moni höpöhöpö teksti osui LUIS:n mielestä paremmin ”nexttrain” aikomukseen kuin ”None” aikomukseen. Joka johti siihen että bot vastasi melkein kaikkiin kysymyksiin kertomalla seuraavat juna-aikataulut.
  • Edellämainittuun ongelmaan auttanee myös se että botille kuvaa useamman aikomuksen.
  • LUIS pisteyttää (score) skaalalla 0-1 miten hyvin käyttäjän syöttämä teksti osuu aikomukseen. Parhaat pisteet saanut aikomus voittaa, jolloin hyvin pienelläkin pisteillä voi päätyä aikomukseen. En löytänyt tapaa suoraan kertoa että aikomukseen ei päädytä ellei pisteet ole esimerkiksi vähintään 0.6.  Tällä voisi vähentää täysin sattumanvaraisia aikomukseen päätymisiä.
  • Erilaisia tunnuksia leikissä kertyy. Tämä esimerkki vaati seuraavat tunnukset
    • github (Azureen tavara aina githubista)
    • Azure
    • Office 365
  • On kätevää että LUIS ja varsinainen chatbot toteutus ovat erikseen. Voin opettaa LUIS:ta ja lisätä ilmaisuja ilman että chatbot-toteutusta tarvii päivittää.

Aion laajentaa omaa sähköistä avustajaani aina kun keksin missä se voisi minua auttaa.

Tämä kirjoitus on osa laajempaa sarjaa jossa käyn läpi Office 365:n työkaluja. Mistä niissä on kyse ja miten niitä voisi hyödyntää.