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.