Chatbot z Pytonem : Pisanie niestandardowych akcji Chatbota

https://szkolazpieklarodem.pl/

Jak wiemy, za każdym razem, gdy zostanie wywołana UtterAction, nasz bot odpowie pełnym tekstem zdefiniowanym w szablonie dla tej Akcji. Ale co się stanie, gdy zostanie uruchomiona jakaś niestandardowa akcja? W tej sekcji napiszemy kod w Pythonie, aby utworzyć niestandardowe akcje, których możemy użyć do wykonywania wywołań API i praktycznie wszystkich innych rzeczy, które można zrobić w Pythonie. Stwórzmy nowy plik o nazwie action.py w katalogu naszego projektu (czyli w naszym przypadku w folderze horoskop_bot).

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

from __future__ import unicode_literals

import requests

from rasa_core_sdk import Action

from rasa_core_sdk.events import SlotSet

class GetTodaysHoroscope(Action):

def name(self):

return “get_todays_horoscope”

def run(self, dispatcher, tracker, domain):

# type: (Dispatcher, DialogueStateTracker, Domain) -> List[Event]

user_horoscope_sign = tracker.get_slot(‘horoscope_sign’)

base_url = http://horoscope-api.herokuapp.com/horoscope/{day}/{sign}

url = base_url.format(**{‘day’: “today”, ‘sign’: user_horoscope_

sign})

#http://horoscope-api.herokuapp.com/horoscope/today/capricorn

res = requests.get(url)

todays_horoscope = res.json()[‘horoscope’]

response = “Your today’s horoscope:\n{}”.format(todays_horoscope)

dispatcher.utter_message(response)

return [SlotSet(“horoscope_sign”, user_horoscope_sign)]

Jak widzimy, w naszej akcji występują dwie metody zwane GetTodaysHoroskop. Pierwsza nazwa metody zwraca po prostu nazwę akcji. Druga metoda jest uruchamiana i, jak omówiono wcześniej, jest metodą, która faktycznie wykonuje zadanie, wykonując napisaną przez nas logikę biznesową. W naszej metodzie korzystamy z API typu open source, którego kod znajduje się na githubie [https://github.com/tapasweni-pathak/Horoskop-API] Adres URL API wygląda następująco:

http://horoskop-api.herokuapp.com/horoskop/today/capricorn

który zwraca dane w formacie JSON:

{

“date”: “2018-08-29”,

“horoscope”: “You will be overpowered with nostalgia and may long to get

in touch with old pals. And as Ganesha says, chances are that you may

take a liking to your ex-lover, while simultaneously strengthening your

social standing. All in all, the day will be a productive one.”,

“sunsign”: “capricorn”

}

Jak widać w metodzie run, konwertujemy odpowiedź z API na obiekt JSON Pythona, a następnie uzyskujemy dostęp do klucza „horoskop” z JSON, aby uzyskać rzeczywisty horoskop. Po pobraniu aktualnego horoskopu z JSON-a formułujemy odpowiedź i wysyłamy ją z powrotem do użytkownika za pomocą obiektu dyspozytora i jego metody utter_message. Na koniec ustawiamy slot metodą SlotSet. SlotSet przypomina zapisywanie zmiennych, które odkryłeś na podstawie odpowiedzi użytkowników, aby móc ich używać w dowolnym momencie w kodzie podczas toku konwersacji.

Uwaga: Korzystając z powyższego API, możemy uzyskać dzisiejszy horoskop, podając znak horoskopu. Możesz swobodnie korzystać z własnego API lub bazy danych. Wystarczy zastąpić wywołanie API innym źródłem, którego chcesz użyć.

Podobnie jak dodaliśmy akcję GetTodaysHoroskop w pliku action.py, dodamy także akcję SubscribeUser. Nie będziemy używać żadnej bazy danych do przechowywania preferencji subskrypcji użytkownika, ale kiedy budujesz chatbota dla prawdziwych użytkowników, być może będziesz musiał mieć user_ids, które możesz powiązać z ich subskrypcjami w bazie danych

Poniżej przedstawiono działanie akcji SubskrybujUżytkownika:

class SubscribeUser(Action):

def name(self):

return “subscribe_user”

def run(self, dispatcher, tracker, domain):

# type: (Dispatcher, DialogueStateTracker, Domain) -> List[Event]

subscribe = tracker.get_slot(‘subscribe’)

if subscribe == “True”:

response = “You’re successfully subscribed”

if subscribe == “False”:

response = “You’re successfully unsubscribed”

dispatcher.utter_message(response)

return [SlotSet(“subscribe”, subscribe)]

W ten sposób możemy napisać tyle akcji niestandardowych, ile potrzeba. Następnym krokiem są dane. Model zarządzania dialogami Rasa jest szkolony na podstawie rzeczywistych rozmów prowadzonych przez użytkowników i chatbota. Ważną kwestią jest to, że te rozmowy muszą zostać przekształcone w format opowieści. Historia to nic innego jak faktyczna rozmowa między użytkownikiem a chatbotem, podczas której dane wejściowe użytkownika są przekształcane w intencje i byty, a odpowiedzi zwracane przez chatbota są traktowane jako działania, które chatbot ma wywołać, gdy zajdzie taka potrzeba.

Jeden z przykładów tego, jak może wyglądać prawdziwa rozmowa pomiędzy użytkownikiem a chatbotem w formie opowieści, przedstawia poniższa tabela.

Scenariusz I

Użytkownik HoroskopBot

Witam! ” całkowite_powitanie

Chcę poznać mój horoskop na dziś { utter_ask_horoskop_sign

Mój znak to Koziorożec: działania.GetTodaysHoroskop

Czy możesz subskrybować mnie, aby otrzymywać aktualizacje: action.SubscribeUser

Scenariusz II

Użytkownik: HoroskopBot

Witam! : całkowite_powitanie

Chcę poznać mój horoskop na dziś: utter_ask_horoskop_sign

Nie znam mojego znaku: utter_ask_dob

12-12: działania.GetTodaysHoroskop

Nie omówiliśmy jeszcze scenariusza w kodzie, w którym użytkownik nie zna swojego znaku horoskopu, ale zna swój DOB. W tym przypadku nasz kod wymaga pewnych modyfikacji, aby uzyskać jednostki DATA i MIESIĄC, gdy nie znaleziono wartości horoskop_sign. Moglibyśmy użyć wartości DD-MM, aby sprawdzić znak horoskopu, a następnie jawnie wywołać metodę GetTodaysHoroskop lub wytrenować model w ten sposób.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *