Viimeiset 12kk on ollut pelkkää ChatGPT:tä ja copilotteja. Tällä kertaa tutustutaan Power Platform kontekstissa mielestäni yhteen niiden mielenkiintoisimpaan sovellutukseen. Nimittäin Copilot Studion plugin toimintoihin (actions).

Ne tulevat muuttamaan tavan, jolla chatbotteja rakennetaan. Mutta miten? Entä miten kyvykäs tämä toistaiseksi preview-vaiheessa oleva ominaisuus juuri nyt on?

Otetaan selvää.

Esimerkki – Juna-aikataulujen kysely

Rakensin vuonna 2018 chatbotin, jolta voi kysyä milloin seuraava juna lähtee asemalta A asemalle B. Palvelu hyödynsi digitrafficin tarjoamaa aikatauluhakua. Kuten blogikirjoituksesta voi nähdä, kyseessä ei ollut mikään low-code ratkaisu.

Miten vastaavan palvelun voisi toteuttaa vuonna 2024 hyödyntäen uusinta teknologiaa? Eli Copilot Studiota ja sen uusia ominaisuuksia. Aloitetaan tekemällä

  • Power Automatella flow, joka hakee kuluvan päivän seuraavat junalähdöt asemalta A asemalle B. Rajapinta vaatii asemat asemakoodeina (PKO, HKI, PSL jne)
  • Toinen flow, joka palauttaa annettua paikkaa (Tampere) vastaavan asemakoodin
  • Copilot Studiolla botti, jolle annetaan edelliset flow’t käyttöön (plugin toimintoina)

Lopputuloksena kaikki vain maagisesti toimii!

Vai toimiiko?

Uuden copilotin luominen

Luodaan ensin ratkaisu (solution), jonne kaikki tarvittava kootaan.

Siirrytään Copilot Studioon ja luodaan uusi copilot. Älä hämmästy. Tässä yhteydessä copilot tarkoittaa vanhaa Power Virtual Agenttia, eli perinteistä chatbottia.

Nimetään copilot. Kieleksi jätetään englanti, sillä suomea tämä ei vielä osaa.

Käydään lisäominaisuuksissa (Advanced settings) vaihtamassa käytettäväksi solutioniksi juuri luomamme.

Seuraavaksi tämän harjoituksen osalta se tärkein. Käydään Generative AI -osiossa asettamassa dynaaminen ketjutus (Dynamic chaining with generative actions) päälle.

Nyt kun lisäämme copilottiin plugin toimintoja, esimerkiksi flow’lla toteutettuja, yrittää copilot käyttäjän kanssa keskustellessaan etsiä niiden joukosta sellaisen, jolla käyttäjän ongelma saadaan ratkaistua. Omatoimisesti.

Huomaa että dynaaminen ketjutus on toistaiseksi tarjolla ainoastaan US ympäristöissä.

Vielä tarvitaan copilotin käyttöön ne flow’t.

Flow – Hae asemien lyhytkoodit

Luodaan copilotista käynnistettävä flow, joka saa parameterina paikannimen (location). Flow

  • hakee valmiilla yhdistimellä kaikki junapysäkit lyhytkoodeineen
  • suodattaa niistä halutun
  • palauttaa löydetyn lyhytkoodin. Mikäli koodia ei löydy, palautetaan ”not found”.

Copilot ei voi käyttää loppukäyttäjän yhteyttä. Määritellään flow’n Run only users -asetuksista se käyttämään aina samaa yhteyttä.

Toiminnon lisääminen copilottiin

Miten copilotin saa hyödyntämään tehtyä flow’ta?

Lisäämällä sille uuden plugin toiminnon (Plugin action).

Etsitään flow ja valitaan se. Huomaa että kestää hetki, ennen kuin luotu flow ilmestyy valittavaksi.

Seuraavaksi kerrotaan copilotille, mitä toiminto käytännössä tekee. Tämä tehdään Action details -osiossa.

Kuvauksiin kannattaa panostaa sillä ne määrittelvät, miten hyvin copilot pluginia osaa hyödyntää.

Flown parametrit tulee myös kuvata. Käyttäjän syöttämä paikka (location) välitetään eteenpäin sellaisenaan (Identify as User’s entire response).

Myös flown palauttama arvo kuvataan.

Tälläkertaa copilot saa vapaasti muotoilla vastauksen.

Luodaan toiminto (Finish). Tarkistetaan vielä että dynaaminen ketjutus on sallittuna.

Toimiiko se?

Testataan. Laitetaan jäljitysmooodi (Tracing mode) päälle, jolloin näemme miten copilot toimii taustalla.

Kysytään Parkanon lyhytkoodia ja sieltähän se löytyy!

Vihdoin pääsemme pluginien käytön hienouteen. Voimme kysyä heti perään ”entäpä Kupittaa?”. Copilot tuntee keskustelun kontekstin ja päättelee että kysymme Kupittaan lyhytkoodia.

Flow – Aikatauluhaku

Tehdään toinen flow. Tämä saa parametrina lähtöpaikan (From) sekä määränpään (To) ja hakee seuraavat lähtevät junat. Pidetään ratkaisu yksinkertaisena, eli emme välitä flow’lle päivää, jonka aikatauluista olemme kiinnostuneita. Haetaan toistaiseksi ainoastaan kuluvan päivän aikatauluja.

Lisätään flow copilotille plugin toiminnoksi. Pyritään jälleen kuvaamaan sen toiminta AI:lle mahdollisimman ymmärrettävästi.

Parametreissa kerrotaan flow’n haluavan lähtöpaikan ja määränpään asemien lyhytkoodeina.

Valmista!

Osaako copilot hyödyntää kahta plugin toimintoa?

Testataan miten ratkaisu toimii. Käyttäjän kysyessä aikataulua välille Parkano – Pasila, osaako copilot automaattisesti hyödyntää ensin asemakoodin hakevaa flow’ta ja sen jälkeen tehdä varsinaisen aikatauluhaun saamillaan asemakoodeilla?

Ei.

Vaikka miten viilasin plugin toimintojen ja niiden parametrien kuvauksia, en saanut tätä toimimaan. Copilot lähtee kyllä etsimään aseman lyhytkoodia (yleensä vain kohteen), mutta se ei osaa käyttää saamiaan lyhytkoodeja varsinaisessa aikatauluhaussa. Kaikenlisäksi copilot turhaan kertoo käyttäjälle mitä lyhytkoodeja se on löytänyt.

Myönnetään. Kahden plugin toiminnon omatoiminen yhdistäminen vaikuttaa olevan (vielä) copilotille liian vaikeaa. Helpotetaan tehtävää hieman.

Flow – Aikataulu- ja lyhytkoodihaku samassa työnkulussa

Tehdään flow, joka saa parametrina jälleen lähtöaseman ja määränpään. Flow

  • hakee asemien lyhytkoodit
  • tekee löytyneillä lyhtkoodeilla aikatauluhaun kuluvalle päivälle
  • Palauttaa seuraavat lähtevät junat

Flow näytää seuraavalta.

Lisätään flow plugin toiminnoksi. Vihdoin onnistumme hakemaan paikasta A paikkaan B lähteviä junia.

Edelleen konteksti säilyy ja voimme jatkaa kysymällä junia Tampereelle.

Tarkkasilmäiset huomasivat, että vastauksessa väitetään junien menevän Tampereelta Pasilaan. Oikeasti vastauksessa on Pasilasta Tampereelle lähtevät junat. Ja kellonajat ovat kaikki väärällä aikavyöhykkeellä.

Pieniä puutteita vielä.

Toisaalta copilotilta voi luontevasti kysyä vain muutamia seuraavia junia ja se osaa suodattaa flow’lta saamaansa vastausta.

Mikä parasta, flow osaa omatoimisesti kysellä käyttäjältä haun edellyttämät tiedot. Mikäli käyttäjä ei mininnut lähtöasemaa, flow kysyy sen.

Mahdottomat päivämäärät

Oikeasti haluaisimme kysellä juna-aikatauluja vapaasti eri päiville. Mutta tässä nousee yllättäen seinä vastaan.

Copilotilla on voinut jo pitkään kysyä käyttäjältä päivää valmista Date-tyyppiä (identify) hyödyntäen. Tällöin käyttäjä voi antaa päivän missä tahansa muodossa (tomorrow, next monday, first day of june, 1.1.2024 jne) ja copilot muodostaa siitä aina päivämäärän.

Mutta tämä ei (vielä) toimi plugin toimintojen kanssa. Lisätään aikataulun hakevaan flow’hun parametriksi lähtöpäivä. Yritetään ensin merkkijonona (string).

Määritellään parametrin tyypiksi päivämäärä (Identify as Date).

Lopputulos ei ole kuitenkaan toivottu. Mikäli käyttäjä kertoo matkustavansa ”ensi maanantaina”, saa flow parametrikseen juurikin sen. Eikä vastaavaa päivämäärää, kuten voisi olettaa.

Vaihdetaan flow’n lähtöpäivä-parametrin tyypiksi päivämäärä. Tämän jälkeen ei toimi mikään. Copilot kun yrittää välittää flow’lle päivämäärän merkkijonona.

Lopuksi asetetaan plugin välittämään saatu päivämäärä flow’lle sellaisenaan (User’s entire reponse).

Tämä toimii. Kunhan käyttäjä antaa päivämäärän muodossa yyyy-mm-dd. Muuten flow menee virheeseen.

Ei vielä hirmuisen kätevää tämä.

Yhteenveto

Vastoinkäymisistä huolimatta olen erittäin innoissani tästä tavasta rakentaa chatbotteja. Eli copilotteja. Kunhan teknologia vielä hieman kehittyy, päivämäärät tunnistetaan onnistuneesti ja saadaan mukaan suomen kieli, ovat mahdollisuudet huikeat.

Kunhan pitää mielessä muutaman asian.

Ensinnäkin flow’n suoritus voi olla todella hidasta. Ja flown’n suorituksen jälkeen kielimalli miettii vielä oman aikansa, mitä tuloksen perusteella käyttäjälle vastaisi. Kannattaa siis optimoida tähän tarkoitukseen käytetyt flow’t. Mikäli suortuskyky ei ole riittävä, niin suosiolla kohti muita vaihtoehtoja.

Toisekseen kielimallit tuntuvat välillä puuhavan omiaan. Välillä copilot ryhtyy kyselemään uudelleen tietoja, jotka selvästi ovat jo ensimmäisessä syötteessä. Tai se yllättäen kääntää vastauksessa lähtö- ja kohdeasemat väärin päin. Tai alkaa horisemaan jotain lyhytkoodeista.

Jälkimmäistä ongelmaa voi todennäköisesti korjata parantamalla plugin toimintojen kuvauksia. Samalla tapaa kuin chatGPT:n tuloksia voi parantaa hieromalla käyttämäänsä promptia.