Utvecklingen av TeddyBot
TeddyBot är en enkel chatbot som man kan prata med (muntligen) och få relativt relevanta svar med hjälp av en syntetiserad röst.
Varför TeddyBot?
Under min tid på NordAxon var jag med och utvecklade (framförallt) frontend-delen för en avancerad chatbot (kallad Emely) tränad till att bland annat kunna hålla arbetsintervjuer.
Min son Timo älskade att prata med denna chatbot och efter att jag inte längre hade tillgång till Emely lovade jag att skapa en ny ”robot” åt honom. Jag var också nyfiken på om jag kunde skapa en egen chatbot från scratch, då jag inte varit direkt involverad i utvecklingen av själva intelligensen bakom chatboten, utan främst frontend-delen.
Min ambition var, och är inte, att skapa en kommersiell chatbot utan mer ett proof of concept och en ny chatbot (med fokus på barn) åt min son.
Tekniken bakom
TeddyBot-applikationen bygger på två delar: Användargränssnitt och Chatbot-delen, i ett Microservice-system i miniformat som kommunicerar via ett egenutvecklat API.
Användargränssnitt
Användargränssnittet är byggt med en frontend i stort baserat på JavaScript tillsammans med HTML/CSS + Bootstrap i en enkel ensidesapplikation. Designen är enkel med en teddybjörn i fokus, som barnet talar med.
Backend-delen på användargränssnittet är Node.js (med Express) som lämpar sig väl för en realtidsapplikation som denna.
Användargränssnittet är deployat på Google Cloud via App Engine (Standard).
API:er
Användargränssnittet kretsar kring tre olika API:er:
- Egenutvecklat API mot chatbot-delen
- Webspeech API för taligenkänning
- Webspeech API för talsyntes
Webspeech är ett öppet JavaScript-baserat API från Mozilla Foundation som bygger på Google Cloud:s API:er för taligenkänning och talsyntes. Det smidiga med att använda sig av Webspeech är att det är gratis (!) och kopplingen till Google Cloud sker från Webspeech så man förbrukar inte egna credits eller liknande. Nackdelen är en kraftig begränsning i användningsområde gällande webbläsare, det fungerar i princip enbart för Desktop och Chrome.
Chatbot-delen
Chatbot-delen är den backend mot vilken Användargränssnittet kommunicerar. Chatbot-delen tar emot meddelanden (på svenska), översätter dem till engelska via Google Translate, skapar ett relevant svar på engelska via Huggingface/Blenderbot (mer om detta ned), översätter till svenska och returnerar svaret till Användargränssnittet.
Chatbot-delen är byggd i Python med FastAPI som framework då det bara agerar utåt som API gentemot Användagränssnittet.
Intelligensen/NLP-biten bakom Chatbot-delen bygger på Blenderbot, utvecklat av Facebook, och tillgängliggjort smidigt via Huggingface. Blenderbot är en transformermodell som tränats till att kunna föra en artig, positiv konversation även med inslag av fakta. Man kan tex fråga en Blenderbot-modell ”Vem var Jimi Hendrix?” och få ett kortfattat och korrekt svar.
En Blenderbot-modell går att träna med eget data så att man således kan skapa chatbottar som kommunicerar på ett annat sätt än dess ”Out of the box”-konfiguration. Målet med TeddyBot är att träna den att föra relevanta konversationer med barn, vilket dock inte är något jag gjort än i denna applikation utan konversationerna förs ”Out of the box” från Blenderbot.
Chatbot-delen är deployad på Google Cloud Run (baserat på en Docker-container). Det är den smidigaste/billigaste lösningen även om Kubernetes säkerligen hade varit ett bättre val om det hade varit en kommersiell applikation (vilket ambitionen alltså inte är).
Resultatet
TeddyBot är i nuläget en fullt fungerande, om än mycket begränsad, chatbot som kan ge relevanta svar på frågor och meddelanden från användaren. Det går att prata med den i stort sett utan att agera med datorn.
Det finns dock kraftiga begränsningar i att använda en otränad Blenderbot ”Out of the box” och utan databas i bakgrunden. Svaren man får är rätt enahanda och chatboten har inget minne, det ”fakta” den ger är ibland helt uppåt väggarna.
Men, som ”proof of concept” var det ett kul och relativt snabbt projekt att göra då allt bygger på API:er och relativt enkel kod. Jag hade en fungerande grundversion lokalt på tre dagar från första kodraden! Djävulen ligger dock som bekant i detaljerna och att träna chatbot-delen med eget data samt konfigurera den till att ge mer komplexa och mer relevanta svar är stora och tidskrävande åtgärder för framtiden.
Status / framtid
TeddyBot var ett ”Proof of concept”-projekt jag skapade för min egen (och min sons) del och inte något jag tänkte vidareutveckla längre. Min plan är dock att träna den med eget data när jag dyker djupare in i NLP framöver.
TeddyBot är således ”klar” och finns att testa på teddybot.bjorkwall.com. Notera att uppstarten för första meddelandet är mycket lång (över 20 sek).
TeddyBot går att testa på teddybot.bjorkwall.com.