Codarea unei platforme de constructor chatbot, partea 1: Cum se creează un chatbot mut

Cum am abordat provocarea de a crea programatic „conversații”.

„Jucărie robot albastru din plastic” de Rock'n Roll Monkey pe Unsplash

Săptămâna trecută am decis să creez o aplicație de constructor de bot. Obiectivul a fost (și încă este, deoarece proiectul va fi gata săptămâna viitoare) de a face o aplicație care să servească drept platformă pentru utilizatorii de toate nivelurile pentru a construi chatbots simpli și a-i găzdui pe site-ul meu. În această postare de blog în două părți, voi acoperi procesul meu și câteva surse valoroase pentru construirea unei platforme pentru roboți - mai întâi cele stupide, apoi, caracteristică după caracteristică, mai inteligente. (Când scriu prost, nu vreau să spun șchiop sau rău. Chatboturile mele sunt misto, dar sunt departe de a fi inteligente)

Ce face un chatbot viabil minim?

În orice simplitate, găsirea răspunsului corect la un mesaj parcurge cât mai multe verificări posibile înainte de a oferi în cele din urmă răspunsul fallback: „Nu înțeleg”. Am decis să iau această abordare pentru a-mi construi chat-ul. În acest fel, pot continua să adaug mai multe straturi de „mesajul se potrivește cu aceste piese pe care le știe botul meu” la chatbot-ul meu adecvat. Iată obiectivele mele inițiale:

  1. Utilizatorii își pot scrie propriile dialoguri. Un utilizator poate adăuga „declanșatoare”, adică cuvinte sau propoziții, la care bot-ul său va răspunde. Vor putea specifica o serie de răspunsuri diferite, atât cât vor. Dacă botul este în măsură să corespundă unui mesaj primit la declanșările acestuia, va alege un răspuns aleatoriu. Aceasta formează „scripturile” fiecărui bot.
  2. Bots vor putea oferi scripturi generale (cum ar fi saluturi și răspunsuri la întrebări comune) și răspunsuri „Nu înțeleg” dacă utilizatorul alege să le includă
  3. Bots ar trebui să fie decenți în a înțelege ce le spune utilizatorul, chiar dacă nu este o potrivire exactă cu declanșatorii cunoscuți.

Aceste caracteristici fac ca roboții mei să fie „bazate pe regăsire”, așa cum descrie acest articol excelent. Modelele de conversație bazate pe regăsire sunt mai ușor de implementat, deoarece folosesc un depozit de răspunsuri predefinite și unele reguli pentru a le alege. Cealaltă opțiune ar fi fost crearea de chat-uri care să poată genera propriile răspunsuri, dar această abordare ar fi necesitat mult mai mult timp și predispusă la erori gramaticale. Nu mi-ar fi fost clar cum să le ofer utilizatorilor șansa de a scrie aceste roboți cu ajutorul lor personalizat.

Construirea bot-ului

Obiectivele simple s-au tradus bine în caracteristicile tehnice incrementale reale. Platforma de scripturi, pe care am implementat-o ​​cu React, este practic o formă dinamică care crește și se micșorează alegând utilizatorul. Nu există nicio limită la câți declanșatori sau răspunsuri puteți adăuga. În faza de script, utilizatorii își pot testa bot-urile și apoi le pot salva odată ce sunt mulțumiți de scripturile lor. Vor putea edita bot-ul, vor discuta cu acesta sau vor partaja un link către oricine pentru a discuta cu botul, așa cum este găzduit pe site-ul meu. Fiecare mesaj pe care îl primește botul este trimis la Ruby on Rails backend, unde un proces de potrivire încearcă să găsească răspunsul corect și să îl trimită front-end (utilizator).

În această etapă, deja implementasem câteva „curățări” simple de șiruri, cum ar fi înlăturarea caracterelor non-alfabetice și a spațiului alb, dar roșii au fost mizerabil în a înțelege altceva decât potriviri foarte exacte. Ei au spus „Nu înțeleg” multe, iar aceasta nu a fost o experiență excelentă pentru utilizatori. Acesta a evidențiat cu adevărat cât de dificil este să imitezi chiar și dialogul uman simplu în mod programatic.

După ce am ales logica de bază pe care ar trebui să o pună în aplicare toate roboții mei, m-am setat la declanșarea și răspunsurile implicite pentru scripturi. Pe platforma front-script-scripting, utilizatorii ar putea opta pentru scripturi implicite mici, cum ar fi saluturi, adio, întrebări ușoare (de exemplu, „cum ești?”) Și întrebări existențiale (de exemplu, „ce ești?”). Bots au devenit puțin mai proști după această simplă adăugare.

Scripturi simple implicite

Potrivirea șirului fuzzy pentru câștig

Ultimul pas pentru producătorul meu de bot-uri a fost să pună în aplicare „potrivirea șirurilor fuzzy”. Există o bijuterie uimitoare și o bibliotecă uimitoare pentru asta. În loc să compari dacă string1 == string2, potrivirea cu șiruri fuzzy calculează distanța dintre două șiruri. Gemul folosește algoritmul distanței Jaro-Winkler pentru a returna o valoare între 0 și 1 pentru a reprezenta similitudinea între șiruri. 1 înseamnă că cuvintele sunt aceleași, 0 înseamnă că nu sunt deloc similare. Am setat pragul de potrivire implicit al roboților mei la 0,8, deoarece se părea că trec prin greșeli sau cuvinte de umplere suplimentare, în timp ce nu lipsesc pe deplin diferențe semnificative. Inițializarea unei instanțe de comparație a fost ușoară (fuzzy_match = FuzzyStringMatch :: JaroWinkler.create (: native)) și astfel a fost folosită.

Utilizarea bijuteriei „fuzzy-string-match” după inițializare.

Finalul meu „a găsi răspunsul corect la acest mesaj” - Metodul include toate aceste trei verificări. Am făcut câteva reguli pentru a acorda prioritate răspunsurilor, în cazul în care un mesaj de utilizator ar corespunde mai multor declanșări. În acest moment, aceste reguli se manifestă pur și simplu în ordinea metodei mele de potrivire.

1) se potriveste cu scripturile utilizatorului

2) se potrivesc scriptul implicit

3) găsiți indicii din conversația anterioară (neimplementate încă)

Cele trei caracteristici de bază la un loc au condus la un nivel destul de adecvat. M-am bucurat să văd că botul meu nu era prea deranjat de dactilografii, știam să acorde prioritate scripturilor utilizatorului și știam să ofere răspunsuri implicite la unele mesaje comune. Am experimentat cu aplicații de învățare automată de bază și prietenoase pentru începători, pentru a adăuga o înțelegere suplimentară pentru constructorul meu de bot, pe care îl voi documenta pentru următoarea parte a acestei postări pe blog.