Uživatelská příručka pro tvorbu scénářů.
Intent (záměr)
Jednou ze stěžejních částí chatbota je NLP (national language processing). Tato část umělé inteligence převádí textovou zprávu od uživatele na nějaký záměr (anglicky Intent) – tj. snaží se poznat, co uživatel chce, co se snaží danou větou vyjádřit. Současně s tím může ve větě rozpoznat i určité entity (jména osob, názvy měst, částky, vyjádření času atd.) a tím definovat sémantiku dané věty.
Pokud chceme v chatbotovi definovat nový intent, provedeme to nejlépe tak, že dáme umělé inteligenci (NLP) k dispozici co nejvíce různorodých příkladů, jak se může člověk zeptat či vyjádřit, pokud má daný záměr.
Příklad: Kde tady mohu parkovat? / Kde je tady parkoviště? / Je parkování zdarma? / Kde mohu nechat auto? / …
Intent v chatbotovi obecně není kontextový. To znamená, že by měl jít z textu odvodit bez nutné znalosti předchozí komunikace.
Příklad: Pokud v jedné větě sdělím informaci: „Přijel jsem dnes novým autem. “ a až poté se v další větě (u níž se intent vyhodnocuje zase samostatně) zeptám „Kde ho můžu nechat?“ tak k vyhodnocení intentu u druhé věty bude chatbotovi chybět kontext z věty předchozí, tedy vůbec nebude tušit, že mluvím o autě. Jinak to samozřejmě bude, pokud se bude jednat o souvětí, které se vyhodnotí jako celek: „Přijel jsem novým autem, kde ho můžu nechat?“
Scénář
Scénář vznikne tím, že na rozpoznaný intent nějakým způsobem reagujeme – to může být buď sdělením nějaké informace (recepční něco odpoví) nebo třeba telefonickým zavoláním osoby či přivoláním výtahu.
Při tvorbě scénářů je dobré se řídit následujícími doporučeními:
- Věty pro definici intentu by měly obsahovat pouze důležité jádro sdělení. Je dobré z nich odstranit veškerý nadbytečný obsah a balast (jako pozdravy, oslovení apod.), který se opakuje u různých intentů.
- Odpovědi by měly být spíše krátké (do 20 slov), pokud jsou delší, je možné je rozdělit do samostatných vět. Jednak bude rychlejší odezva (převedení dlouhého textu na řeč trvá déle) a jednak lépe udržíte pozornost komunikujícího uživatele.
- Pokud je součástí reakce nějaká další akce, měl by o tom být uživatel informován i slovně, jako např. „Moment, už volám.“
- V případě navazujících scénářů, je třeba stále myslet na to, že mechanismus scénářů není kontextový. Proto doplňující otázku vždy formulovat jako otevřenou, aby se z případné odpovědi dal opět odvodit příslušný intent. Např. při představení firmy se nezeptám: „Chcete vědět více?“ protože případná odpověď ano/ne vyžaduje kontext, ale zeptám se raději: „Mohu vám povědět více o službách nebo projektech, ptejte se, co vás zajímá?“
- Doporučujeme scénáře sdružovat do kategorií podle toho, jaké obecné oblasti se týkají (Firma, Navigace, …) pomůže to k přehlednosti v udržování obsahu.
- Snažte se odpovědi psát konzistentně tak, aby odpovídaly požadované osobnosti recepční a udržovaly si integritu. Typicky není vhodné chvíli mluvit spisovně a chvíli slangem nebo střídat decentní výraz s nejnovějšími slovními novotvary adolescentů.
Tip: I tady platí pravidlo jednoduchosti KISS. Pokud se mi podaří co nejvíce informací sdělit formou, která nevyužívá kontext, bude zadávání i následná správa obsahu jednodušší a rychlejší.
Cvičení: Vytvořte si jednoduchý informační scénář. Uložte ho a otestujte jej nejprve pomocí textového rozhraní chatbota a následně i přímo dotazem na virtuální recepci.
Převod textu na řeč a SSML
Na rozdíl od klasického chatbota, kde jeho odpověď je pouze ve formě psaného textu, virtuální recepční odpovídá v textové i mluvené formě současně. Proto je třeba dobře odladit obě tyto formy. Složitější je samozřejmě ta mluvená.
Text se v chatbot rozhraní zadává ve formátu SSML (Speech Synthesis Markup Language) – věta se v ní rozšíří o speciální značky (tagy), které udávají způsob, jakým se má text vyslovit. Podrobný popis SSML je možné nalézt třeba na tomto odkazu: https://cloud.google.com/text-to-speech/docs/ssml
Nejpraktičtější a nejčastěji používané jsou následující značky, vložení některých z nich nabízí přímo pomocný SSML editor v chatbot rozhraní.
- <break strength="weak"/> mezera či klesnutí hlasem s udáním intenzity – možné hodnoty intenzity jsou od nejnižší k nejvyšší: "x-weak", weak", "medium", "strong", "x-strong"
- <break time="200ms"/> mezera na dobu stanovenou v milisekundách – vhodné třeba pro delší odmlky a dramatické pauzy
- <say-as interpret-as="ordinal">1</say-as> vysloví číslo jako číslovku řadovou: „první“
- <say-as interpret-as="characters">vut</say-as> hláskuje po jednotlivých písmenech. Stejný efekt lze docílit bez značky pouze zápisem velkými písmeny VUT či V.U.T.
- <say-as interpret-as="date" format="dmy">10-9-2021</say-as> vysloví jako datum „desátého září 2021“
- <say-as interpret-as="time" format="hms">14:30:25</say-as> vysloví jako čas tj. „14 hodin 30 minut 25 sekund“
Mluvenou formu je možné samozřejmě otestovat přímo na virtuální recepci, ale rychlejší a praktičtější při testování většího počtu scénářů je využití bezplatné testovací služby TTS např. od Google. Je možné ji nalézt na následujícím odkazu.
htmlhttps://cloud.google.com/text-to-speech
To, že jsou speciální značky součástí textu následně pro jejich zobrazení v textové podobě nevadí, protože virtuální recepce je rozpozná a automaticky skryje.
Cvičení: Vložte do demo TTS svůj text z předchozího scénáře. Zkuste jej nechat vyslovit a následně zkuste doplňovat značky mezer na různá místa v textu a poslechněte si, jak se výslovnost změní.
Cvičení: Zkuste si práci s dalšími značkami – čísla, znaky, datum a čas.
Tip: I přes veškerou snahu se může stát, že nějaká kombinace slov ve větě vede k nepřirozené výslovnosti, třeba díky atypickému spojení slov apod. V takovém případě je nejjednodušším a nejrychlejším řešením větu napsat trošku jiným způsobem za použití jiných slov.
Rozdílné zobrazení a výslovnost
V některých případech potřebujeme, aby se zobrazovaný text lišil od textu vysloveného. Je to například u některých jmen nebo dalších slov, kde automatická výslovnost neodpovídá zvyklosti. Příkladem je třeba název ARTIN, který se automaticky vysloví měkce, ale výslovnost je správně tvrdá, tedy v přepisu „artynn“. Je to obdoba principu, který známe třeba ze zápisu výslovnosti anglických slovíček, kdy se psaná forma liší od té vyslovené.
Pokud chceme, aby se slovo jinak zapsalo v textové formě a jinak vyslovilo, použijeme hranaté závorky a znak svislé čáry (na anglické klávesnici bývá jako třetí klávesa napravo od písmene L). Zápis pak vypadá následovně.
[zobrazený text|výslovnost] např. [ARTIN|artynn]
Tuto konstrukci můžeme použít i pro případ, kdy chceme nějaký text pouze zobrazit bez jeho vyslovení a naopak.
[tento text se pouze zobrazí, ale nic se nevysloví|]
[|tento text se pouze vysloví, ale nic se nezobrazí]
Tato konstrukce není součástí SSML, proto po zadání do demo TTS bude systém zkoušet přečíst vše. Správná funkčnost tohoto označení se tedy dá vyzkoušet pouze přímo na virtuální recepci.
Tip: Větu nejprve odlaďte v demo TTS v podobě s výslovností a až nakonec přidejte rozdílnou psanou formu pomocí hranatých závorek.
Speciální výrazy ve scénářích
Kromě běžného textu lze ve scénáři využít i speciálních výrazů. Typicky se jedná o systémové či uživatelské kontextové proměnné uvozené znakem $. Nejběžnější systémové proměnné jsou následující:
- $sys_date_time = datum a čas v následujícím formátu: 2021-02-02 14:42:22
- $sys_time = pouze čas v následujícím formátu: 14:42:22
- $sys_month = číslo měsíce v následujícím formátu: 2
- $sys_day_of_month = číslo dne v měsíci v následujícím formátu: 2
- $sys_day_of_week = číslo dne v týdnu v následujícím formátu: 2
- $sys_12_hour_period = příznak dopoledne/odpoledne v následujícím formátu: PM
- $sys_hour = aktuální hodina v následujícím formátu: 14
- $sys_minute = aktuální minuta v následujícím formátu: 42
- $sys_last_scenario = název posledního scénáře ve formátu: Úvodní scénář
- $terminal_sn = sériové číslo terminálu, na kterém právě daný scénář běží (pro rozlišení, pokud více terminálů používá stejného chatbota)
Dále je možné použít speciální funkce a klíčová slova uzavřena ve složených závorkách {}, ty lze zadat přímo do textu, který má recepční říkat:
- {decline()} – příklad: decline($name, 4) – skloňování jména do čtvrtého pádu
- {secondsfrom(timestamp)} – příklad: secondsfrom(1555683122.0) – počet vteřin od zadaného okamžiku
- {date(locale, format)} – příklad: date(cs_CZ.utf8, %A %-d. %B) – datum v zadaném formátu
- {time} – aktuální čas ve formátu %H:%M
- {command=<UŽIVATELSKÝ_POŽADAVEK>} – spuštění uživatelského požadavku (viz dále) přímo z přednášeného textu např. {command=EMAIL delivery Pavel Novák}
Výrazy, funkce i klíčová slova se neustále rozšiřují s vývojem produktu ARTIN Chatbot.
Cvičení: Zkuste si vytvořit scénář, který zobrazí a řekne aktuální datum.
Speciální znaky ve scénářích
Při tvorbě scénářů je možné použít speciální obrázkové znaky, také známé jako emotikony. Dají se zapsat v podstatě v libovolném textu, nicméně smysl mají buď v odpovědi nebo třeba v navigačních tlačítkách. Tyto speciální znaky jsou dostupné na adrese:
htmlhttps://emojipedia.org/
Na stránce emojipedia je možné vyhledávat emotikony podle jejich anglických názvů a také snadno zkopírovat do schránky pro jednoduché vložení do cílového textu.
Cvičení: Doplňte si do textu scénáře nějakou příhodnou emotikonu.
Rozšířené funkce scénářů
Kromě prosté textové či hlasové odpovědi scénáře nabízejí ještě celou řadu doplňkových funkcí v rámci reakce. Ne všechny tyto funkce jsou implementovány pro virtuální recepci, ale většina z nich ano. V následujících kapitolkách si je probereme.
Více vět a alternativní odpovědi
Jako odpověď je možné zadat více vět. Následně je pak možné zvolit, jestli mají být proneseny vždy všechny „Najednou“ nebo zda se má pokaždé „Náhodně“ vybrat jen jedna z nich. Náhodný výběr lze použít pro případ, kdy potřebujeme, aby odpověď nebyla pokaždé identická – navozuje to dojem přirozenější konverzace. Varianta pronesení všech vět zase slouží pro delší texty, které je třeba rozdělit do menších celků – mezi větami je pak poměrně významná mezera. Stejného efektu docílíme i tím, pokud v rámci jedné věty oddělíme její části pomocí dvou značek <br /><br />.
Cvičení: Rozdělte scénář na 2 věty nebo jednu větu doplňte. Vyzkoušejte v chatovacím rozhraní chování v případě volby „Najednou“ a volby „Náhodně“.
Tlačítka
Tlačítka slouží jako alternativní rychlá volba často používané možnosti. Je vhodné je též využít pro případ, kdy chceme virtuální recepci navrhnout k používání i pro neslyšící.
Tlačítko se objeví v dolní části dotykového panelu poté, co virtuální recepční řekne text odpovědi scénáře, a funguje tak, že po stisku spustí bez dalšího vyhodnocování konkrétní nový scénář, který je zvolen ve výběru napravo od popisku tlačítka. Tlačítek může být více. Pokud se nevejdou do šířky panelu, je možné je přejetím prstu rolovat do stran.
Volba „Zakázat textovou odpověď“ umožňuje omezit vstupy pouze na tlačítka, tj. není možné, aby uživatel pokračoval dále použitím hlasového/textového vstupu. Tato varianta však obecně není příliš vhodná pro virtuální recepci, používá se spíše v textových aplikacích chatbota.
V textu názvu tlačítka je opět možné použít emotikony stejně, jako v odpovědním textu scénáře.
Cvičení: Vytvořte si ke svému scénáři tlačítko s vhodnou emoji ikonou a přesměrováním na nějaký jiný scénář. Otestujte v chatovacím rozhraní i na virtuální recepci.
Kontext
Oddíl kontext slouží k nastavení tzv. kontextových proměnných – tedy informace, která přetrvává a přenáší se mezi různými scénáři. Lze pak využít například pro přenesení informace o volbě provedené v jednom scénáři do dalšího apod., a to především při tvorbě pokročilejších scénářů.
Při zadávání je třeba zvolit název existující proměnné kontextu (nazývané také „klíč kontextu“) nebo vytvořit novou. Dále je možné vložit do ní hodnotu a určit, jak dlouho (přes kolik zpráv) bude hodnota v proměnné přetrvávat – výchozí hodnota je neomezeně dlouho. Obsah proměnné je také možné smazat, aby od této chvíle nic neobsahovala.
Existují i speciální kontextové proměnné. Například proměnné $fallback_question_1 a $fallback_question_2 slouží k nastavení opakující se otázky v případě, že uživatel nereaguje na původní otázku, stojí a nic neříká. Např. po základním dotazu „Řekněte prosím, koho chcete zavolat.“ mohou být tyto otázky nastaveny třeba na „Koho vám mám zavolat?“ nebo „Koho tedy chcete zavolat?“
Cvičení: Naplňte si v jednom scénáři hodnotu proměnné $name a v jiném scénáři ji následně vypište v textu scénáře – stačí do něj opět vepsat klíč $name.
Přesměrování na jiný scénář
Po dokončení scénáře je možné automaticky přesměrovat na provádění dalšího scénáře nebo dialogu.
Poznámka: Dialogy jsou kontextové „scénáře“ které běžně uživatel nezadává a jsou předpřipraveny pro základní situace již z vývoje.
Mezi dialogy a scénáři je možné se přepínat v prvním volitelném boxu. Vždy tam svítí ta možnost, která právě NENÍ aktivní, tj. na kterou je možné se přepnout, což může být trošku matoucí.
Dále je možné zvolit variantu, kdy před přesměrováním ještě scénář počká na hlasový vstup uživatele a tento se pak stane vstupní větou pro případné vyhodnocení ve scénáři/dialogu na který je přesměrováno.
Cvičení: Vyzkoušejte si přesměrování ze svého scénáře na jiný jak chatovacím rozhraní tak na virtuální recepci.
Uživatelský požadavek
Uživatelský požadavek je hlavním nástrojem pro propojení chatbota / virtuální recepce mezi sebou a také s okolím a jeho ovládání. Typicky slouží pro zadání příkazů ovládajících:
- Výraz v obličeji recepční
- Telefonické služby
- Videoterminál
- Emailové rozhraní
- Další služby a zařízení připojená v rámci integrace aReception u zákazníka
Uživatelský požadavek se typicky zadává jako textový příkaz, který má svůj název a doplňující parametry.
Pro použití v aReception jsou nyní k dispozici následující uživatelské požadavky (některé nemusí být dostupné vzhledem ke konfiguraci, která je u daného zákazníka. Pokud například není v dané konfiguraci VIDEOTEL nebo telefonie, pak dané uživatelské požadavky samozřejmě nejsou funkční).
- VIDEOCONFERENCE– spustí videokonferenci přes VIDEOTEL
- CALL gradually – volá postupně lidem z předem nastaveného seznamu (lze použít jako záložní variantu v případě kdy nezvedal telefon uživatel ani back-office)
- CALL <general | meeting | delivery | interview> <full name> zavolá <full name> za účelem schůzky | pošty | pohovoru, příklad: "CALL meeting Tomáš Ondráček"
- CALL {"type": "gradually | general | meeting | delivery | interview", "name": "value", "people2call": ["value1","value2"], "location": "value"} – JSON notace příkazu CALL umožňující zadat rozšířenou sadu parametrů (např. lokaci či seznam kontaktů pro postupné volání).
- EMAIL delivery <full name>pošle e-mail o poště ve schránce na recepci pro <full name>, příklad: "EMAIL delivery Tomáš Ondráček" – je třeba mít v seznamu kontaktů k dispozici emailové adresy
- GET-CONTACT-INFO { "response-mapping": { "variable_name_without_dollar_prefix_1": "json_path_to_field_in_anwer_1", "variable_name_without_dollar_prefix_2": "json_path_to_field_in_anwer_2"}, “filter”:{"field_name": "filter_value_case_insensitive"}} - vrací příslušný kontakt / kontakty z databáze kontaktů administrované v admin rozhraní Návratové hodnoty: "--GET-CONTACT-INFO-OK--” "--GET-CONTACT-INFO-ERROR--” Příklad: GET-CONTACT-INFO { "response-mapping": { "first_contact": "$.result[0].email", "all_contacts":"$.result"}, “filter”:{"phoneNumber": "778031466"}} Příklad odpovědi v JSON formátu se všemi hodnotami: [{"id": 303, "note": "poznamka", "type": "zamestnanec", "email": "xxx@xxx.com", "office": "K125", "picture": "", "building": "D517", "idNumber": "123-987-AAD", "isActive": true, "language": "", "lastName": "Pavel", "location": "Ostrava", "firstName": "Jaroslav", "employment": "ekonom", "externalId": null, "phoneNumber": "+420111111111", "organizationUnit": "backoffice", "secondPhoneNumber": "+420999999999"}]
- END-CONVERSATION – ukončí konverzaci (na 10s nelze zahájit konverzaci - člověk musí mít čas odejít z kamery)
- SOS – uživateli vyskočí nápověda (stejná, jako když vlevo dole stiskne tlačítko otazník)
- KEYBOARD <keyboard_type> – zobrazí klávesnici pro dotykový vstup uživatele
- KEYBOARD - zobrazí se dotyková klávesnice pro výběr jména ze seznamu aktuálních kontaktů (vybrané jméno je posláno jako zpráva - tzn. skutečně simuluje klávesnici / zastupuje řeč)
- KEYBOARD contacts <text> - přednastaví text do klávesnice pro výběr jména
- KEYBOARD general – zobrazí se obecná klávesnice pro zadání libovolného textu se kterým se dále pracuje stejně, jako by jej uživatel řekl
- SHOW-URL <url>zobrazí okno s webovou stránkou, uživatel je může buď zavřít sám, nebo se automaticky uzavře při ukončení konverzace odchodem uživatele. Při ukončení se vyvolá systémový intent URL-CLOSED. Daná webová stránka musí jít zobrarazit v iframe.
- SHOW-URL {"url": "http://example.org", "sandbox": "..."}
- parametr sendbox je volitelný, pokud není zadán nebo je prázdný, je nejvíce restriktivní
- hodnota allow-all zruší všechy restrikce
- jednotlivé restrikce se ruší hodnotami popsanými na https://www.w3schools.com/tags/att_iframe_sandbox.asp
- pozor na povolení zobrazení odkazu v nové okně, které by překrylo okno s avatarem
- TIP: většina stránek dobře funguje s nastavením "sandbox": "allow-scripts allow-same-origin”
- SHOW-IMAGE <url>zobrazí okno s obrázkem načteným ze zadané internetové adresy, uživatel jej může buď zavřít sám, nebo se automaticky uzavře při ukončení konverzace odchodem uživatele. Při ukončení se vyvolá systémový intent IMAGE-CLOSED.
- READ-QRCODE <variable_name_without_$_sign> zobrazí obraz z pohledu kamery a uživatel může na kameru ukázat QR kód pro načtení. Po přečtení QR kódu se tento uloží do proměnné, jejíž název je předán jako parametr příkazu (bez úvodního znaku $). Návratové hodnoty (do chatbota): --QR-CODE-READ-- úspěšné načtení QR kódu --QR-CODE-CANCELLED-- přerušení načítání uživatelem (křížkem vpravo nahoře) --QR-CODE-NOT-READ-- vypršení časového limitu pro načtení QR kódu
- SWITCH-LANGUAGE <locale> - přepne jazyk, kterým recepční komunikuje (tento jazyk je třeba mít v provozu a mít tedy nastaveného příslušného chatbota v daném jazyce cs-CZ, en-US, …). Příklad: SWITCH-LANGUAGE en-US
- WAIT <nnn> - počká nnn milisekund (např. WAIT 2000 počká 2 selundy).
- WAIT-FOR-SPEECH-END – počká až do doby, kdy recepční dohovoří svůj text, pak vrátí hodnotu —SPEECH-FINISHED—. Použití např. pokud byste chtěli zobrazit webovou stránku (SHOW-URL) až poté, co dohovoří, jinak ji zobrazí už během mluvení.
- ASK-CENTRAL-CHATBOT – zavolá centrálního konverzačního chatbota a položí mu stejnou (poslední řečenou) otázku, nebo vstup zadaný za tímto uživatelským požadavkem. Centrální chatbot pak najde vhodnou obecnou odpověď místo lokálního chatbota a tou odpoví. Centrální konverzační chatbot je průběžně aktualizován o nová témata a konverzační scénáře a umí zodpovídat více obecných otázek než specializované instance chatbota pro konkrétní recepci. Typicky se dotázání centrálního chatbota volá v situaci, kdy lokální chatbot nezná odpověď na otázku (tj. v systémovém scénáři „Nerozpoznaná zpráva“), ale je možné využít i v jiných vhodných situacích. Tím je zajištěno, že jsou upřednostněny lokální konkrétnější odpovědi před těmi obecnými.
- ASK-CHATGPT <question> - předloží dotaz umělé inteligenci Chat GPT a zobrazí její odpověď. Parametr s otázkou je možné získat v konverzaci otázkou na systémovou entitu @sys-input a uložit ji do proměnné, která se pak předá do uživatelského požadavku.
- INVOKE-CHATGPT-API <input> - zavolá ChatGPT API a vrátí odpověď na vstup chatbota. Odpověď lze pak získat v systémové entitě @sys-input. V případě chyby vrátí text --INVOKE-CHATGPT-API-ERROR--. Příklad použití:
jsonINVOKE-CHATGPT-API { "model": "gpt-4o", "messages": [ { "role": "system", "content": [ { "type": "text", "text": "Pokud vstup uživatele obsahuje nějaký cíl cesty, místo či lokaci, vrať tento cíl. Pokud ne, vrať NONE. Cíl cesty vrať v prvním pádě." } ] }, { "role": "user", "content": [ { "type": "text", "text": "$last_user_question" } ] } ], "temperature": 0, "max_tokens": 256, "top_p": 1, "frequency_penalty": 0, "presence_penalty": 0 }
- GET-GPT-INTENT <text> - Lze využít jako alternativu k NLP v chatbotovi. Intenty se definují v administrátorské aplikaci v sekci “GPT intenty”. Rozpoznaný intent je vrácen na vstup chatbota. Následně jej lze získat v systémové entitě @sys-input.
- LOG <text> - při volání uživatelského požadavku LOG neprovede terminál žádnou specifickou akci. Hodnota <text> je vidět v historii konverzace v chatbotovi.
- RECOGNIZE-FACE - uživatelský požadavek provede rozpoznání obličeje osoby stojící před kamerou a vrátí hodnotu:
- --RECOGNIZE-SUCCESS-- pokud byl obličej rozpoznán
- --RECOGNIZE-FAILURE-- pokud se obličej rozpoznat nepodařilo
Jméno rozpoznané osoby včetně hodnoty nejistoty je vráceno v kontextové proměnné $fr_user.
- SET-CHATBOT-INPUT <text> - pošle zadaný <text> na vstup chatbota tak, jako by jej řekl uživatel do terminálu.
- MOOD <expression> <duration> <amplitude> nastaví výraz v obličeji (<expression>) na dobu <duration> sekund, s intenzitou výrazu <amplitude>
- <expression> ClosedSmile, OpenSmile, Sad, Angry, Fear, Disgust, Surprise, Thinking, Blush, LeftWink, RightWink, Blink, Scream
- <duration> čas, celé číslo, v sekundách
- <amplitude>amplituda výrazu - typicky 0-1, ale některé výrazy není problém nadsadit třeba na 1.2 (je třeba vyzkoušet, protože pro různé vyrazy obličeje se hodí jiná amplituda)
- příklad: "MOOD ClosedSmile 3 1.1" - úsměv se zavřenou pusou na 3 sekundy s "mírou" 1.1
Cvičení: Vyzkoušejte si do svého scénáře přidat různé uživatelské požadavky např. MOOD, SOS nebo CALL. Podívejte se, jak se projeví, v chatovacím rozhraní a na virtuální recepci.
Volání HTTP nebo REST rozhraní
Pro volání obecného HTTP rozhraní (tedy i REST) lze využít uživatelský požadavek HTTP-CALL. Tento požadavek umí volat libovolné HTTP rozhraní s daty (payload) v libovolném textovém formátu (JSON, XML, …), návratové hodnoty pak očekává ve formátu JSON a mapuje je na zvolené kontextové proměnné v chatbotu.
Vzhledem k tomu, že volání a možné parametry jsou poněkud rozsáhlejší, uvádíme tento uživatelský požadavek v této samostatné podkapitole. Obecný formát uživatelského požadavku je:
jsonHTTP-CALL <json-specification>
a má následující detailní formát
jsonHTTP-CALL { "method": <"POST"/“GET“/, …> "url": <"service-url">, "headers": { <"header-key-1">: <"header-value-1">, <"header-key-2">: <"header-value-2">, … }, "payload": <“text-payload“>, "request-timeout-seconds": <time-in-seconds>, "return-chatbot-message": <message-to-send-to-chatbot-after-finishing-call>, "response-mapping": { <"context-var-for-resultCode">: "RESULT_CODE", <"context-var-for-resultMessage">: "RESULT_MESSAGE", <"context-var-1">: <"json-path-1">, <"context-var-2">: <"json-path-2">, … } }
Návratová zpráva chatbotovi:
Po ukončení volání HTTP služby dojde k namapování kontextových proměnných v chatbotu a následně se chatbotu pošle návratová zpráva definovaná řetězcem return-chatbot-message. Díky ní je možné řídit další tok scénářů. Pomocí této unikátní zprávy je možné vytvořit návazný scénář, který bude reagovat právě a jen na tuto konkrétní zprávu a zobrazí nebo jinak použije výsledky získané voláním HTTP služby.
Formát této systémové zprávy může být samozřejmě obecně libovolný, ale je dobré dodržovat jednotný formát uvozený a ukončený dvěma pomlčkami, velká písmena, jednotlivá slova oddělena jedinou pomlčkou – tedy např. --CARD-ISSSUE-FINISHED--. Příslušný intent obsluhující tuto zprávu by pak měl mít totožný název, pouze bez uvozujících a ukončujících pomlček, v tomto případě tedy: CARD-ISSUE-FINISHED.
Návratové kódy:
V případě úspěšného volání se ve zvolených kontextových proměnných uloží návratový kód (RESULT_CODE) a návratová zpráva (RESULT_MESSAGE) bude prázdná. Současně se namapují zvolené hodnoty vráceného payloadu ve formátu JSON na příslušné kontextové proměnné (ty jsou pouze řetězcové).
V případě neúspěšného volání nebo dalších problémů se vrací návratový kód 900 a vyšší a result message odpovídající tomuto návratovému kódu:
900 – obecná nespecifikovaná chyba (vypadla výjimka při volání), detailní popis výjimky se uloží v RESULT_MESSAGE
901 – chyba parsování odpovědi, patrně se nejedná o JSON
Příklad:
jsonHTTP-CALL { "method": "POST", "url": "https://8c5dae17-0b31-45f9-be49-c0263cd2b6f6.mock.pstmn.io/testpath?param1=val1¶m2=val2", "headers": { "Content-Type": "application/json", "X-auth": "kjnm45531" }, "payload": { "state": "idle", "data": { "welcome_message": "Dobrý den,", "messages": [ "msg1", "msg2", "msg3" ] } }, "request-timeout-seconds": 10, "return-chatbot-message": "—HTTP-CALL-FINISHED--", "response-mapping": { "resultCode": "**RESULT_CODE**", "resultMessage": "**RESULT_MESSAGE**", "contextParam1": "$.key", "contextParam2": "$.license.test" } }
Nevyužité rozšířené funkce scénářů
Vzhledem k tomu, že Chatbot je obecným produktem používaným i pro jiné aplikace než aReception, ne všechny funkce a možnosti jsou pro virtuální recepci využité či využitelné. Patří mezi ně např. Boost voicebot, Dotazník nebo Formulář. O jejich využití a dalších souvisejících službách a produktech mohou v případě zájmu informovat kolegové z projektů Chatbot a Voicebot.
Závěr
Produkt aReception se neustále vyvíjí a zdokonaluje. Pokud máte nějaké nápady, jak jej můžeme vylepšit, dejte nám vědět.