Kódovanie platformy pre tvorbu chatbotov, časť 1: Ako vytvoriť nemého chatbota

Ako som sa priblížil k výzve programového vytvárania „konverzácií“.

„Modrá plastová robotická hračka“ od Rock'n Roll Monkey na Unsplash

Minulý týždeň som sa rozhodol zostaviť aplikáciu na tvorbu botov. Cieľom bolo (a stále je, keďže projekt bude hotový budúci týždeň), vytvoriť aplikáciu, ktorá slúži ako platforma pre používateľov všetkých úrovní na zostavenie jednoduchých chatbotov a ich hostenie na mojich stránkach. V tomto dvojdielnom blogovom príspevku sa zameriam na môj proces a niektoré cenné zdroje na vytvorenie platformy pre robotov - najprv hlúpe, potom funkčné, inteligentnejšie. (Keď píšem hlúpo, nemyslím tým, že sú chromí alebo zlí. Moje čety sú v pohode, ale nie sú ani zďaleka inteligentné)

Čo robí minimálny životaschopný chatbot?

Zjednodušene povedané, nájdenie správnej odpovede na správu prechádza čo najväčším počtom kontrol, než nakoniec ponúknu núdzovú odpoveď: „Nerozumiem“. Rozhodol som sa použiť tento prístup na zostavenie môjho chatbotu. Týmto spôsobom môžem pokračovať v pridávaní ďalších vrstiev „zhoduje sa správa s týmto kusom vecí, ktoré môj robot vie“, s mojím minimálnym primeraným chatbotom. Tu boli moje počiatočné ciele:

  1. Užívatelia môžu skriptovať svoje vlastné dialógy. Užívateľ môže pridať „triggery“, čo znamená slová alebo vety, na ktoré bude odpovedať ich robot. Budú môcť špecifikovať celý rad rôznych odpovedí, toľko, koľko chcú. Ak robot dokáže priradiť prijatú správu k jej spúšťačom, vyberie náhodnú odpoveď. Toto tvorí „skripty“ každého robota.
  2. Boti budú môcť ponúknuť všeobecné skripty (napríklad pozdravy a odpovede na časté otázky) a núdzové odpovede „Nerozumiem“, ak sa ich používateľ rozhodne zahrnúť.
  3. Boti by mali rozumne rozumieť tomu, čo im hovorí, aj keď to nie je presná zhoda so známymi spúšťačmi.

Vďaka týmto vlastnostiam sú moje roboty „založené na vyhľadávaní“, ako to popisuje tento vynikajúci článok. Konverzačné modely založené na získavaní údajov sa ľahšie implementujú, pretože na ich výber používajú úložisko vopred definovaných odpovedí a niektoré pravidlá. Druhou možnosťou by bolo vybudovať chatboty, ktoré dokážu generovať svoje vlastné odpovede, ale tento prístup by bol oveľa časovo náročnejší a náchylnejší k gramatickým chybám. Nebolo by mi jasné, ako ponúknuť používateľom možnosť skriptovať tieto roboty s ich vlastnými vstupmi.

Budovanie staviteľa topánok

Jednoduché ciele sa dobre premietli do skutočných dodatočných technických prvkov. Skriptovacia platforma, ktorú som implementoval s programom React, je v podstate dynamická forma, ktorá rastie a zmenšuje sa podľa výberu používateľa. Počet spustení alebo reakcií, ktoré môžete pridať, nie je nijako obmedzená. Vo fáze skriptovania môžu používatelia vyskúšať svoje roboty a potom ich uložiť, keď budú s ich skriptami spokojní. Budú môcť upravovať robota, chatovať s ním alebo zdieľať odkaz na kohokoľvek, kto sa zhovára s robotom, ako je hostené na mojich stránkach. Každá správa, ktorú robot dostane, sa odošle na môj backend Ruby on Rails, kde sa proces párovania pokúsi nájsť správnu odpoveď a pošle ju klientovi (klientovi).

V tejto fáze som už implementoval niekoľko jednoduchých reťazcov „čistenia“, ako napríklad odstránenie neafabetických znakov a medzier, ale roboti boli nešťastní v porozumení iným ako veľmi presným zhodám. Povedali, že „nerozumiem“ veľa, a toto nebola veľká skúsenosť používateľa. Skutočne zdôraznilo skutočnosť, že je ťažké napodobniť aj jednoduchý ľudský dialóg programovo.

Po výbere základnej logiky, ktorú by mali implementovať všetky moje roboty, som nastavil skriptovanie predvolených spúšťačov a odpovedí. Na frontendovej platforme pre skriptovanie robotov sa používatelia mohli prihlásiť na malé predvolené skripty, ako sú pozdravy, zbohom, ľahké otázky (napr. „Ako sa máš?“) A existenciálne otázky (napríklad „čo si?“). Po tomto jednoduchom prírastku sa roboti o niečo menej hlúpi.

Jednoduché predvolené skripty

Fuzzy reťazec pre víťazstvo

Posledným krokom pre môjho hlúpeho výrobcu botov bolo zavedenie „fuzzy string matching“. Je tu úžasný rubínový klenot a knižnica. Namiesto porovnávania, či string1 == string2, fuzzy string match vypočíta vzdialenosť medzi dvoma reťazcami. Klenot používa algoritmus Jaro-Winklerovej vzdialenosti na vrátenie hodnoty medzi 0 a 1 na vyjadrenie podobnosti medzi reťazcami. 1 znamená, že slová sú rovnaké, 0 znamená, že nie sú vôbec podobné. Nastavil som predvolenú prahovú hodnotu zhody mojich robotov na 0,8, pretože sa zdá, že sa dostali okolo preklepov alebo ďalších výplňových slov, pričom úplne chýbali zmysluplné rozdiely. Inicializácia porovnávacej inštancie bola jednoduchá (fuzzy_match = FuzzyStringMatch :: JaroWinkler.create (: native)), a preto ju používala.

Použitie klenot

Moja posledná metóda „nájsť správnu odpoveď na túto správu“ zahŕňa všetky tieto tri kontroly. Urobil som niekoľko pravidiel na uprednostnenie odpovedí v prípade, že by sa nejaká správa používateľa zhodovala s viac ako jedným spúšťačom. V tomto okamihu sa tieto pravidlá jednoducho prejavujú v poradí podľa mojej metódy porovnávania.

1) zodpovedá používateľským skriptom

2) predvolené zhody skriptov

3) nájsť stopy z predchádzajúcej konverzácie (zatiaľ nie sú implementované)

Tri základné vlastnosti spolu robili robotov na celkom primeranú úroveň. Veľmi ma potešilo, že som sa s robotmi príliš neobťažoval preklepmi, vedel som, že uprednostňujem skripty používateľov, a vedel som, že ponúkam predvolené odpovede na niektoré bežné správy. Experimentoval som so základnými a začiatočnícky priateľskými implementáciami strojového učenia, aby som ešte viac porozumel svojmu výrobcovi robotov, ktorý zdokumentujem pre ďalšiu časť tohto blogového príspevku.