Chatbot z Pytonem : Trening w czasie rzeczywistym poprzez wzmocnienie

https://szkolazpieklarodem.pl/

W tej sekcji napiszemy więcej kodu, aby wytrenować nasz model okna dialogowego i przeszkolić go ponownie, gdy otrzyma nieprawidłowe wyniki. Tak więc, gdy nasz bot zrobi coś złego, natychmiast wkraczamy i pozwalamy modelowi aby wiedzieć, że jego przewidywania są błędne, mówiąc mu, co jest słuszne. Bez konieczności zatrzymywania model sam się szkoli, a gdy już to zakończymy, interakcja między użytkownikiem a botem zostaje przechwycona w pliku i dodana do naszych istniejących danych szkoleniowych. Działa bardziej jak system informacji zwrotnej na każdym kroku, zamiast czekać na pojedynczą nagrodę na końcu. Następnym krokiem jest utworzenie nowego pliku o nazwie endpoints.yml z poniższą zawartością. Będziemy używać tego pliku w naszym pliku kodu Pythona train_online.py. Dzięki tej konfiguracji możemy udostępnić metodę Rasa jako interfejsy API HTTP.

action_endpoint:

url: http://localhost:5055/webhook

#nlg:

# url: http://localhost:5056/nlg

core_endpoint:

url: http://localhost:5005

Now, let’s create train_online.py for our online/interactive training purposes.

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

from __future__ import unicode_literals

import logging

from rasa_core import utils, train

from rasa_core.training import online

from rasa_core.interpreter import NaturalLanguageInterpreter

logger = logging.getLogger(__name__)

def train_agent(interpreter):

return train.train_dialog_model(domain_file=”horoscope_domain.yml”,

stories_file=”data/stories.md”,

output_path=”models/dialog”,

nlu_model_path=interpreter,

endpoints=”endpoints.yml”,

max_history=2,

kwargs={“batch_size”: 50,

“epochs”: 200,

“max_training_samples”: 300

})

if __name__ == ‘__main__’:

utils.configure_colored_logging(loglevel=”DEBUG”)

nlu_model_path = “./models/nlu/default/horoscopebot”

interpreter = NaturalLanguageInterpreter.create(nlu_model_path)

agent = train_agent(interpreter)

online.serve_agent(agent)

max_history to liczba stanów, które model ma śledzić.

Zanim zaczniemy uruchamiać nasz końcowy skrypt, train_online.py, powinniśmy wiedzieć i przygotować się na coś, co nazywa się rasa-nlu-sdk.

rasa-nlu-sdk

Stos Rasa NLU zawiera rasa-nlu-sdk, który jest pakietem SDK języka Python do tworzenia niestandardowych akcji dla Rasa Core. Jeśli chodzi o nasz przykład chatbota, musimy zdefiniować kilka niestandardowych akcji, jak na przykład wejście do API w celu pobrania dzisiejszego horoskopu, czy może operacja zapisu do bazy danych w celu dodania użytkownika do listy subskrybentów. Dobra wiadomość jest taka, że mają do tego oddzielną bibliotekę, którą możemy zainstalować za pomocą pip. Zainstalujmy to za pomocą następującego polecenia:

pip install rasa-core-sdk==0.11.0

Teraz musimy przejść do innej zakładki naszego terminala lub do świeżej linii poleceń i wykonać następujące polecenie w naszym katalogu projektu (miejscu, w którym znajduje się nasz plik action.py):

python -m rasa_core_sdk.endpoint –actions actions

INFO:__main__:Starting action endpoint server…

INFO:rasa_core_sdk.executor:Registered function for ‘get_todays_horoscope’.

INFO:rasa_core_sdk.executor:Registered function for ‘subscribe_user’.

INFO:__main__:Action endpoint is up and running. on (‘0.0.0.0’, 5055)

To polecenie uruchomi serwer akcji, który będzie nasłuchiwał wszelkich akcji niestandardowych przewidywanych przez model. Gdy tylko jakakolwiek akcja zostanie uruchomiona, wykona ją i udzieli odpowiedzi zgodnie z metodą. Domyślny port punktu końcowego serwera akcji to 5055 na hoście lokalnym. Jeśli chcesz to zmienić, możesz dodać argument pass –port w wierszu poleceń. Nasuwa się szybkie pytanie: dlaczego? Po co mi do tego osobny serwer? Dlaczego nie możemy używać zwykłego Pythona? Tak, możemy używać zwykłego języka Python, ale załóżmy, że wymagane działania chcesz opracować w jakimkolwiek innym języku lub masz już pewne działania ujawnione jako interfejsy API. Teraz wystarczy przejść do pliku endpoints.yml, który już utworzyliśmy, i użyć go, aby wspomnieć, gdzie powinien być używany serwer akcji i gdzie powinien znajdować się serwer core_endpoint. W systemie produkcyjnym oba mogą być różnymi serwerami mającymi zupełnie różne adresy URL.

Teraz, gdy uruchomimy nasz następny skrypt, w którym wspomnieliśmy o pliku endpoints.yml, Rasa przeczyta plik i pobierze konfigurację naszego serwera akcji, który jest już uruchomiony i działa zgodnie z konfiguracją, którą zrobiliśmy wcześniej.

action_endpoint:

url: http://localhost:5055/webhook

Uruchommy train_online.py w nowym terminalu wiersza poleceń.

$python3 train_online.py

Po udanym wytrenowaniu modelu dialogowego otrzymamy taki komunikat:

2018-08-30 07:09:37 INFO rasa_core.policies.keras_policy – Done

fitting keras policy model

2018-08-30 07:09:37 INFO rasa_core.agent – Model directory models/nlu

exists and contains old model files. All files will be overwritten.

2018-08-30 07:09:37 INFO rasa_core.agent – Persisted model to ‘/Users/

sumit/apress_all/Chapter IV/horoscope_bot/models/nlu’

2018-08-30 07:09:37 INFO rasa_core.training.online – Rasa Core server

is up and running on http://localhost:5005

Bot loaded. Type a message and press enter (use ‘/stop’ to exit).

127.0.0.1 – – [2018-08-30 07:09:37] “GET /domain HTTP/1.1” 200 996 0.001847

Teraz możesz zacząć rozmawiać ze swoim botem, który właśnie się urodził. Odtąd to, jak będziesz go trenować, zależy wyłącznie od Ciebie. Możesz go poprawić, gdy zareaguje na coś złego lub nieoczekiwanego. Zróbmy to i zobaczmy, czy sytuacja się poprawi. Wpisuję „Cześć” jako pierwszą wiadomość, a bot zwraca następujące informacje:

—————————————————————————

Chat history:

bot did: action_listen

user said: hi

whose intent is: {‘confidence’: 0.8472929307505297, ‘name’: ‘greeting’}

we currently have slots: DD: None, MM: None, horoscope_sign: None,

subscribe: None

——

The bot wants to [utter_greet] due to the intent. Is this correct?

  1. Yes
  2. No, intent is right but the action is wrong
  3. The intent is wrong
  4. Export current conversations as stories and quit

—————————————————————————

Teraz bot mówi mi, co zrobił, na podstawie tego, co powiedział użytkownik i jak to zrozumiał. Teraz daje nam również cztery opcje. Porozmawiamy o tym za chwilę. To, co bot_ zrobił tutaj, ma znaczenie action_listen; po prostu czekał, aż użytkownik coś wprowadzi, co jest w porządku. Bot wypowiada intencję {‘confidence’: 0.8472929307505297, ‘name’: ‘greeting’}, co jest poprawne, więc naciskamy 1, co oznacza, co bot rozumie i stara się to zrobić poprawnie.

1

—————————————————————————

Chat history:

bot did: action_listen

user said: hi

whose intent is: {‘confidence’: 0.8472929307505297, ‘name’: ‘greeting’}

bot did: utter_greet

we currently have slots: DD: None, MM: None, horoscope_sign: None,

subscribe: None

——

The bot wants to [action_listen]. Is this correct?

  1. Yes.
  2. No, the action is wrong.
  3. Export current conversations as stories and quit

—————————————————————————

I proszę bardzo, nasz bot przynajmniej przywitał użytkownika poprawnie. Jeśli zobaczysz powyższą odpowiedź, możesz faktycznie sprawdzić, co zrobił nasz bot; śledzi to wszystko, podczas gdy my go szkolimy.

bot did: utter_greet

Teraz bot mówi, że następną rzeczą jest poczekanie i wysłuchanie, co użytkownik powie (tj. oczekiwanie na dane wejściowe użytkownika). Czy to jest poprawne? Tak, zgadza się, więc ponownie naciskamy 1, a bot wyświetla monit użytkownikowi. Wchodzę i pytam: „Jaki jest mój horoskop na dzisiaj?”

—————————————————————————

Chat history:

bot did: action_listen

user said: hi

whose intent is: {‘confidence’: 0.8472929307505297, ‘name’:

‘greeting’}

bot did: utter_greet

bot did: action_listen

user said: what’s my horoscope for today?

whose intent is: {‘confidence’: 0.8902154738608781, ‘name’:

‘get_horoscope’}

we currently have slots: DD: None, MM: None, horoscope_sign: None,

subscribe: None

——

The bot wants to [utter_ask_horoscope_sign] due to the intent. Is this

correct?

  1. Yes
  2. No, intent is right but the action is wrong
  3. The intent is wrong
  4. Export current conversations as stories and quit

—————————————————————————

bot did: utter_greet

Teraz bot mówi, że następną rzeczą jest poczekanie i wysłuchanie, co użytkownik powie (tj. oczekiwanie na dane wejściowe użytkownika). Czy to jest poprawne? Tak, zgadza się, więc ponownie naciskamy 1, a bot wyświetla monit użytkownikowi. Wchodzę i pytam: „Jaki jest mój horoskop na dzisiaj?”

—————————————————————————

Chat history:

bot did: action_listen

user said: hi

whose intent is: {‘confidence’: 0.8472929307505297, ‘name’:

‘greeting’}

bot did: utter_greet

bot did: action_listen

user said: what’s my horoscope for today?

whose intent is: {‘confidence’: 0.8902154738608781, ‘name’:

‘get_horoscope’}

we currently have slots: DD: None, MM: None, horoscope_sign: None,

subscribe: None

——

The bot wants to [utter_ask_horoscope_sign] due to the intent. Is this

correct?

  1. Yes
  2. No, intent is right but the action is wrong
  3. The intent is wrong
  4. Export current conversations as stories and quit

—————————————————————————

Teraz bot bardzo poprawnie identyfikuje intencję jako intencję „get_horoskop” z 89-procentową dokładnością, co jest całkiem dobrym wynikiem. Bot mówi również, że chce wypowiedzieć_ zapytaj_horoskop_znak, co znowu jest poprawne, ponieważ użytkownik nie wspomniał jeszcze o żadnym znaku horoskopu, a miejsce nadal ma wartość Brak, jak pokazano. Ponownie wciskamy 1.

—————————————————————————

Chat history:

bot did: action_listen

user said: hi

whose intent is: {‘confidence’: 0.8472929307505297, ‘name’: ‘greeting’}

bot did: utter_greet

bot did: action_listen

user said: what’s my horoscope for today?

whose intent is: {‘confidence’: 0.8902154738608781, ‘name’:

‘get_horoscope’}

bot did: utter_ask_horoscope_sign

we currently have slots: DD: None, MM: None, horoscope_sign: None,

subscribe: None

——

The bot wants to [action_listen]. Is this correct?

  1. Yes.
  2. No, the action is wrong.
  3. Export current conversations as stories and quit

—————————————————————————

Teraz bot pyta, czy czas poczekać na dane wejściowe użytkownika. Tak, użytkownik musi podać znak horoskopu

Ponownie wciskamy 1 i po wyświetleniu monitu wprowadziliśmy „Koziorożec” jako dane wejściowe.

—————————————————————————

Chat history:

bot did: action_listen

user said: hi

whose intent is: {‘confidence’: 0.8472929307505297, ‘name’: ‘greeting’}

bot did: utter_greet

bot did: action_listen

user said: what’s my horoscope for today?

whose intent is: {‘confidence’: 0.8902154738608781, ‘name’:

‘get_horoscope’}

bot did: utter_ask_horoscope_sign

bot did: action_listen

user said: Capricorn

whose intent is: {‘confidence’: 0.8456705103362621, ‘name’:

‘get_horoscope’}

with horoscope_sign: capricorn

we currently have slots: DD: None, MM: None, horoscope_sign: capricorn,

subscribe: None

The bot wants to [get_todays_horoscope] due to the intent. Is this correct?

  1. Yes
  2. No, intent is right but the action is wrong
  3. The intent is wrong
  4. Export current conversations as stories and quit

—————————————————————————

Teraz, jak widzimy, miejsce na znak horoskopu jest automatycznie ustawiane powyżej na „Koziorożec”. Kolejnym krokiem jest nauczenie bota wywoływania get_todays_horoskop i wywoływania akcji get_todays_horoskop. Do tego czasu nasz slot jest już ustawiony na zmienną horoskop_znak, którą zdefiniowaliśmy w horoskop_domain.yml, więc jeśli ta akcja zostanie wywołana ponownie, chatbot powinien zwrócić aktualny horoskop na dany dzień. Spróbujmy. Wpisałem „Koziorożec”. Bot trafia do punktu końcowego serwera akcji i zwraca wynik użytkownikowi zgodnie z definicją w naszej akcji niestandardowej. Twój horoskop na dziś: Podróż od porażki do sukcesu napędzana jest optymizmem. Będziesz dzisiaj bardzo optymistycznie nastawiony do swojej pracy, przyszłości i wszystkiego, co może doprowadzić cię do sukcesu, mówi Ganesha. Będziesz także bardzo ostrożny w codziennej pracy i wykorzystasz każdą okazję, która przybliży Cię o krok do Twoich celów. Aby zrealizować swoje marzenia, wystarczy determinacja i szczęście; będziesz miał dzisiaj oba. Wydaje się to uczciwe, ponieważ brakuje mi terminu na dokończenie tego rozdziału, a teraz jest 6:00 rano, a ja jeszcze nie spałem. Dołóż wszelkich starań, aby Twoje pieniądze były warte wydania tej książki. OK, wróćmy i zobaczmy, co nasz bot próbuje dalej zrobić.

——

The bot wants to [action_listen]. Is this correct?

  1. Yes.
  2. No, the action is wrong.
  3. Export current conversations as stories and quit

Może nie chcemy, żeby nasz bot słuchał teraz, po tym jak wypowiedział horoskop na dzisiaj. Chcemy, aby nasz bot prosił użytkownika o zasubskrybowanie aktualizacji zgodnie z naszym skryptem konwersacji, a także zgodnie z utworzonymi przez nas historiami. Więc naciskam 2 i pojawia się komunikat

——

what is the next action for the bot?

0 action_listen 1.00

1 action_restart 0.00

2 action_default_fallback 0.00

utter_greet 0.00

4 utter_ask_horoscope_sign 0.00

5 utter_ask_dob 0.00

6 utter_subscribe 0.00

7 get_todays_horoscope 0.00

8 subscribe_user 0.00

Ponieważ chcemy, aby nasz użytkownik subskrybował, należy nacisnąć 6, aby bot zapytał użytkownika, czy chce zapisać się na codzienne aktualizacje. Bot odpowiada: „Czy chcesz subskrybować codzienne aktualizacje?” Teraz bot mówi:

—————————————————————————

The bot wants to [get_todays_horoscope]. Is this correct?

  1. Yes.
  2. No, the action is wrong.
  3. Export current conversations as stories and quit

Akcja tutaj nie jest poprawna, więc wciskamy 2 i uczymy bota, aby słuchał tutaj akcji użytkownika.

—————————————————————————

what is the next action for the bot?

0 action_listen 0.21

1 action_restart 0.01

2 action_default_fallback 0.01

3 utter_greet 0.21

4 utter_ask_horoscope_sign 0.51

5 utter_ask_dob 0.01

6 utter_subscribe 0.02

7 get_todays_horoscope 0.78

8 subscribe_user 0.22

—————————————————————————

Wciskamy 0, gdy bot czeka na poznanie prawidłowego kolejnego kroku. Bot będzie teraz czekać na dane wejściowe użytkownika w naszym interaktywnym procesie uczenia się

Użytkownik mówi tutaj: „Proszę mnie zasubskrybować”, a nasz bot z 80% pewnością rozpoznaje, że jest to zamiar subskrypcji, a także, w oparciu o nasze dane szkoleniowe w data.json, dość łatwo rozumie, że użytkownik prosi o subskrypcję i nie wypisywać się. Innymi słowy, ustawia przedział subskrypcji na True, jak widać tutaj:

—————————————————————————

user said: Please subscribe me

whose intent is: {‘confidence’: 0.795172441763619, ‘name’:

‘subscription’}

with subscribe: True

we currently have slots: DD: None, MM: None, horoscope_sign: capricorn,

subscribe: True

—————————————————————————

Teraz, gdy nasz bot zrozumiał intencję, a także przeanalizował zawarte w niej encje, nadszedł czas, aby odpowiedzieć użytkownikowi, mówiąc: „Zasubskrybowano go pomyślnie” i bingo — otrzymujemy wiadomość od bota: Subskrypcja została pomyślnie zapisana. ty idź! Możesz z powodzeniem samodzielnie zbudować własnego chatbota. W ramach ćwiczenia polecam dodać wszystkie omówione przez nas przypadki użycia HoroskopBota i sprawdzić, czy to działa. Spróbuj dodać więcej przypadków użycia i więcej funkcjonalności, gdy wszystko, co zrobiliśmy do tej pory, działa dobrze. Możesz tutaj dodać więcej komunikatów, aby bot powiedział „Do widzenia, miłego dnia” po zakończeniu rozmowy. Jestem głęboko przekonany, że powinieneś mieć taką możliwość. Upewnij się, że to zrobiłeś i daj nam znać, jak poszło. Teraz ostatnia część polega na oddaniu całej tej wiedzy użytkownikowi, abyśmy nie musieli ponownie uczyć tych samych historii, a bot będzie próbował uczyć się na podstawie istniejących historii i jeszcze więcej.

Per-āa : Pomiary Panteonu Bogów Egipskich

https://szkolazpieklarodem.pl/

Egipcjanie byli bardzo zorganizowanym narodem, zarówno pod względem religii, jak i prawie wszystkiego innego. Historycy mogą podzielić egipskie praktyki religijne na dwie formy:

* Religia państwowa była ściśle związana z królem i jego bóstwem. Ta praktyka religijna była praktycznie niedostępna dla większości ludzi. Bogom państwowym czczono w wielkich świątyniach rozsianych po Egipcie, takich jak Karnak, Luksor, Abu Simbel i Abydos. Świątynie te były zamknięte dla publiczności; tylko król i kapłani mogli wejść i oddać cześć.

* Religia gospodarstwa domowego rozwinęła się jako odpowiedź na wyłączną religię państwową. Religia domowa obejmowała inny zestaw bogów. Lud (bez kapłanów) czcił tych bogów w swoim domu (a nie w świątyniach).

Chatbot z Pytonem : Interaktywna nauka

https://szkolazpieklarodem.pl/

Do tej pory mówiliśmy o interaktywnym nauczaniu w kawałkach, ale nadszedł czas, aby napisać jakiś kod i to zrobić. Interaktywne uczenie się to jedna z najfajniejszych funkcji Rasy, dzięki której nauka uczenia maszynowego staje się przyjemna i łatwa. Są dwie części: w pierwszej uczymy model, podając nasz początkowy zbiór danych przy użyciu różnych polityk, a w drugiej części testujemy model, poprawiamy go i ponownie szkolimy w sposób interaktywny.

Trenowanie modelu agenta Chatbota

Utwórzmy nowy plik o nazwie train_initialize.py w naszym głównym katalogu projektu. Zawartość train_initialize.py wygląda następująco:

from __future__ import absolute_import

from __future__ import division

from __future__ import print_function

from __future__ import unicode_literals

from rasa_core import utils

from rasa_core.agent import Agent

from rasa_core.policies.keras_policy import KerasPolicy

from rasa_core.policies.memoization import MemoizationPolicy

from rasa_core.policies.sklearn_policy import SklearnPolicy

if __name__ == ‘__main__’:

utils.configure_colored_logging(loglevel=”DEBUG”)

training_data_file = ‘./data/stories.md’

model_path = ‘./models/dialogue’

agent = Agent(“horoscope_domain.yml”,

policies=[MemoizationPolicy(), KerasPolicy()])

training_data = agent.load_data(training_data_file)

agent.train(

training_data,

augmentation_factor=50,

epochs=500,

batch_size=10,

validation_split=0.2

)

agent.persist(model_path)

To jest kod, który zapisujemy w pliku train_initialize.py. Teraz, zanim przejdziemy do następnego pliku kodu, spróbujmy najpierw zrozumieć zawarte w nim ważne punkty.

  1. Najpierw importujemy kilka metod z modułu __future__. Przyszłe instrukcje w Pythonie mają specjalne zastosowanie, zmieniają sposób analizowania modułu Pythona i zmieniają sposób, w jaki zachowuje się istniejąca metoda.

Curious personality ? Try the below code in your python

interpreter

from __future__ import braces

  1. Zaimportuj metodę utils z modułów rasa_core, aby skonfigurować rejestrowanie.
  2. Zaimportuj klasę agenta z modułu agenta, aby utworzyć obiekt agenta.
  3. KerasPolicy, MemorizationPolicy zostaną przekazane jako parametry polityk do klasy agenta.

5.configure_colored_logging: Metoda narzędziowa zdefiniowana w utils.py do kolorowego rejestrowania przy użyciu pakietu colorlogs Pythona.

  1. Agent: Klasa zdefiniowana przez Rasa, która zapewnia interfejs umożliwiający wykorzystanie najważniejszych funkcjonalności Rasa Core, takich jak szkolenie, obsługa komunikatów, ładowanie modelu okna dialogowego, uzyskiwanie następnej akcji i obsługa kanału.
  2. loading_data: ładuje dane treningowe z podanej ścieżki.
  3. pociąg: szkoli daną politykę/zespół polityk korzystając z danych z udostępnionego pliku.
  4. Training_data: obiekt zwrócony metodą Load_data. Lista DialogueStateTracker. To nic innego jak nasz plik danych treningowych.
  5. augmentation_factor: informuje Rasę, ile fikcyjnych historii należy utworzyć, biorąc pod uwagę nasz początkowy zestaw historii. Współczynnik 10x to heurystyka rund wzmacniających dla generatora danych szkoleniowych.
  6. Epoki: 1 epoka to pełny cykl szkoleniowy na całym zbiorze danych uczących. Całkowita liczba przejść danych szkoleniowych do przodu i do tyłu.
  7. rozmiar_wsadu: informuje o ilości próbki szkoleniowej do wykorzystania w każdym przebiegu. 100 przykładów o wielkości partii wynoszącej 10 zajmie 10 epok, aby przejrzeć cały zbiór danych.
  8. validation_split: procent danych służący do sprawdzenia bezstronnej dokładności modelu.
  9. utrwalanie: ta metoda służy do utrwalania obiektu agenta w danym katalogu w celu ponownego użycia.

W tym momencie powinno być już całkiem jasne, co robi każda metoda i co dzieje się w kodzie. Zanim przejdziemy do uruchomienia skryptu, upewnij się, że masz zainstalowaną bibliotekę rasa_core przed wykonaniem tego skryptu. Możesz zainstalować rasa_core za pomocą następującego polecenia:

pip zainstaluj rasa_core==0.11.1

Jeśli podążasz za przykładem chatbota z tej książki, upewnij się, że zainstalowałeś tylko wyżej wymienioną wersję, ponieważ Rasa może nie być kompatybilna wstecz. Szybko opracowują nowsze i bardziej zoptymalizowane metody.

NAJNOWSZY RASA_CORE

Możesz także zainstalować najnowszą wersję rasa_core z repozytorium Github. Wystarczy wykonać następujący zestaw poleceń, który pobierze najnowszy kod z githuba bezpośrednio przed instalacją.

git clone https://github.com/RasaHQ/rasa_core.git

cd rasa_core

pip install -r requirements.txt

pip install -e

Spróbujmy uruchomić ten plik kodu, aby wytrenować nasz model zgodnie z podanymi parametrami.

$python train_initialize.py

Możesz także uruchomić ten skrypt z samego Notatnika Jupyter za pomocą magicznego polecenia Jupytera, jak pokazano tutaj:

!python train_initialize.py #Use python3 if you have installed rasa for python3

Wytrenowanie modelu na tak małym zbiorze danych jak nasz powinno zająć około 25–30 sekund. Dodałem SklearnPolicy do listy polityk wraz z MemorizationPolicy i KerasPolicy, aby wytrenować mój model. Różne polityki mają swoje zalety. Przeczytaj więcej na ich temat, aby dowiedzieć się, które z nich mogą działać lepiej w Twoim przypadku; dla mojego zbioru danych wydaje się, że czasami SklearnPolicy działa lepiej niż KerasPolicy. Po zakończeniu wykonywania skryptu powinieneś zobaczyć kilka pomyślnych komunikatów, takich jak te:

2018-08-30 04:24:31 INFO rasa_core.policies.keras_policy – Done fitting

keras policy model

2018-08-30 04:24:31 INFO rasa_core.featurizers – Creating states and

action examples from collected trackers (by MaxHistoryTrackerFeaturizer)…

Processed trackers: 100%|████████| 96/96 [00:00<00:00,

898.31it/s, # actions=75]

2018-08-30 04:24:31 INFO rasa_core.featurizers – Created 75 action

examples.

2018-08-30 04:24:31 INFO rasa_core.policies.sklearn_policy – Done

fitting sklearn policy model

2018-08-30 04:24:31 INFO rasa_core.agent – Model directory models/nlu

exists and contains old model files. All files will be overwritten.

2018-08-30 04:24:31 INFO rasa_core.agent – Persisted model to

‘/Users/sumit/apress_all/Chapter IV/horoscope_bot/models/nlu’

You will also find a couple of folders created as per their model name. Make sure

you have them in the model_path you gave in the script. Below are the folders/files I see

inside my model_path folder.

policy_0_MemoizationPolicy

policy_1_KerasPolicy

policy_2_SklearnPolicy

domain.json

domain.yml

Policy_metadata.json

Jeśli sprawdziłeś, że Twój model pomyślnie zakończył wykonanie i utrwalił go w systemie lokalnym, możemy przejść do kolejnego etapu interaktywnego szkolenia.

Per-āa : Oddawanie czci jak Egipcjanin: Religia

https://szkolazpieklarodem.pl/

Patrząc na religię egipską, samo poznanie, od czego zacząć, może być trudne. Z ponad 700 różnymi znanymi bogami, ludność starożytnego Egiptu może wydawać się bardzo pobożna. Jednak każdy bóg reprezentuje inną koncepcję, rolę lub miejsce, w którym był czczony. I nie każdy starożytny Egipcjanin czcił wszystkich bogów, cały czas. Wybierali i wybierali bóstwo odpowiadające konkretnym potrzebom. Tu analizujemy wielu bogów, których czcili król i kapłani, a także zwykli Egipcjanie. Badam niektóre z najbardziej godnych uwagi rytuałów i praktyk, w tym popularną praktykę czczenia zmarłych ludzi.

Chatbot z Pytonem : Tworzenie danych historii

https://szkolazpieklarodem.pl/

Jak wiemy, dane fabularne to po prostu sposób rozmowy między użytkownikiem a chatbotem na temat tego, w jaki sposób doprowadzi to do logicznego zakończenia. Ogólnie rzecz biorąc, wszystkie chatboty mają na celu pomóc użytkownikom w zakresie zestawu predefiniowanych rzeczy; Historie po prostu przedstawiają sposób, w jaki się je robi. Postaramy się przygotować kilka prostych okien dialogowych w formacie, jakiego oczekuje Rasa. Te okna dialogowe będą bezstanowe — to znaczy nie zależą od poprzednich okien dialogowych. Będziemy wykorzystywać nasze ręcznie robione historie o bezpaństwowcach do interaktywnego uczenia się. Poświęcimy kilka minut, aby ręcznie wybrać kilka znanych nam historii, abyśmy mogli zaznajomić się ze sposobem tworzenia danych historii. Najpierw utwórzmy plik o nazwie Stories.md w naszym folderze danych.

## story_001

* greeting

– utter_greet

* get_horoscope

– utter_ask_horoscope_sign

* get_horoscope{“horoscope_sign”: “Capricorn”}

– slot{“horoscope_sign”: “Aries”}

– get_todays_horoscope

– utter_subscribe

## story_002

* greeting

– utter_greet

* get_horoscope{“horoscope_sign”: “Capricorn”}

– slot{“horoscope_sign”: “Cancer”}

– get_todays_horoscope

– utter_subscribe

* subscription

– slot{“subscribe”: “True”}

– subscribe_user

## Horoscope query with horoscope_sign

* greeting

– utter_greet

* get_horoscope

– utter_ask_horoscope_sign

* get_horoscope{“horoscope_sign”: “capricorn”}

– slot{“horoscope_sign”: “capricorn”}

– get_todays_horoscope

– slot{“horoscope_sign”: “capricorn”}

– utter_subscribe

* subscription{“subscribe”: “True”}

– slot{“subscribe”: “True”}

– subscribe_user

– slot{“subscribe”: true}

## Horoscope with sign provided

* greeting

– utter_greet

* get_horoscope{“horoscope_sign”: “leo”}

– slot{“horoscope_sign”: “leo”}

– get_todays_horoscope

– slot{“horoscope_sign”: “leo”}

– utter_subscribe

* subscription{“subscribe”: “True”}

– slot{“subscribe”: “True”}

– subscribe_user

– slot{“subscribe”: true}

## When user directly asks for subscription

* greeting

– utter_greet

* subscription{“subscribe”: “True”}

– slot{“subscribe”: “True”}

– subscribe_user

– slot{“subscribe”: true}

Jeśli będziesz wpatrywał się w te historie przez kilka minut, wyznają ci, co mają na myśli; Nie powinno być trudno zrozumieć, co się dzieje. Główna różnica między dwoma pierwszymi historiami polega na tym, że w pierwszej historii użytkownik nie wspomina o swoim znaku horoskopu, a bot ma zadać znak horoskopu, a następnie kontynuować historię.

W drugiej historii użytkownik sam opowiada znak horoskopu, a następnie kończy historię oknem dialogowym subskrypcji. Dodaliśmy jeszcze kilka historii obejmujących więcej przypadków użycia. Możesz dodawać własne historie w tym samym pliku. Zasadniczo historie to pliki przecen, w których możemy zapisać tyle historii, ile potrzeba, w pokazanym wcześniej formacie przecen. Wykonanie tego ręcznie wydaje się dość trudnym zadaniem. Spróbujemy więc nauczyć się korzystać z interaktywnego narzędzia edukacyjnego Rasy, aby wygenerować więcej takich historii. Zacznijmy.

Per-āa : Biorąc pod uwagę zdrowie kobiet

https://szkolazpieklarodem.pl/

Niektóre papirusy medyczne skupiają się przede wszystkim na zdrowiu kobiet – szczególnie na płodności, porodzie i zdrowiu podczas ciąży. Wiele zabiegów opiera się na idei, z której łączy się kobieta z pochwy do głowy za pomocą szeregu rurek. Jeśli te rurki są czyste, może zajść w ciążę, a jeśli są zablokowane, nie może. Większość zabiegów obejmuje leki doustne, aplikacje dopochwowe lub fumigację. Konkretne tematy dotyczące zdrowia kobiet obejmowały:

* Antykoncepcja: odchody krokodyla drobno rozproszone w kwaśnym mleku lub miodzie, a natron stosowano, aby uniknąć ciąży. Obie mikstury były używane jako tampony i wprowadzane do pochwy. I jestem pewien, że powstały zapach zachęcał do abstynencji – niezawodnej formy antykoncepcji.

* Płodność: kobiecie zalecono usiąść nad mieszanką słodkiego piwa i puree z daktyli. Jeśli zwymiotuje, z pewnością urodzi w przyszłości; liczba wymiotów równała się liczbie dzieci, które miała. Jeśli nie zwymiotuje, nie ma dzieci.

* Test ciążowy: Kobieta miała oddać mocz na jęczmień i płaskurka. Jeśli oba nasiona wyrosną, urodzi. Jeśli jęczmień wyrośnie pierwszy, urodzi chłopca; gdyby płaskurka wyrosła pierwsza, urodziłaby dziewczynkę. Jeśli żadne z nich nie rosło, nie była w ciąży. (Kiedy ta metoda była ostatnio testowana, nie określała płci, ale jeśli kobieta jest w ciąży, ziarno rośnie w krótkim czasie. Kiedy używano męskiego moczu, nic się nie działo.)

* Brak miesiączki: Jest to przedwczesne zatrzymanie cyklu miesiączkowego i zostało „wyleczone” poprzez podawanie kobiecie substancji do picia przez cztery dni, która wywoływała wymioty. Gdyby kobiety zwymiotowały krwią, jej cykl menstruacyjny zacząłby się od nowa.

Chatbot z Pytonem : Przygotowanie danych do szkolenia bota

https://szkolazpieklarodem.pl/

Zawsze ważne jest, aby mieć dane dobrej jakości przed wykonaniem jakiegokolwiek uczenia maszynowego. Do szkolenia naszego chatbota potrzebujemy również danych; rozmowa pomiędzy użytkownikiem a chatbotem to dane, na podstawie których musimy trenować nasze modele. Czasami trudno jest znaleźć w Internecie zbiór danych odpowiadający naszym potrzebom. Powinniśmy poświęcić potrzebny czas na zebranie danych. Możemy poprosić naszych przyjaciół i rodzinę o dostarczenie nam przykładowego tekstu rozmowy na temat interakcji z rodzajem bota, który budujesz. Niektórzy ludzie tworzą przykładowe aplikacje do tego samego celu i pozyskują dane w ramach crowdsourcingu. Zatem lepsze dane, lepszy model i lepsze reakcje chatbota. Jeśli chodzi o przygotowanie danych, Rasa nie pozostawia kamienia bez kamienia i jest wyposażona w fajną funkcję zwaną interaktywną nauką. Pomaga w łatwym generowaniu danych historii, a także uczy modelu zarządzania dialogami w miarę dodawania danych historii. Można to nazwać szkoleniem ML w czasie rzeczywistym. Tak więc, w miarę dodawania danych z historii, dowiadujemy się, czy nasz model generuje prawidłowe dane wyjściowe, czy nie. Co najważniejsze, po dodaniu nowych historii możemy zobaczyć, czy model poprawia się, czy pogarsza. W większości przypadków będzie lepiej, ponieważ będziemy w pewnym sensie uczyć się przez wzmacnianie, mówiąc modelowi uczenia się, aby się oduczał i uczył na nowo – prawie tak samo robią ludzie.

Per-āa : W poszukiwaniu świeżego oddechu

https://szkolazpieklarodem.pl/

Z ustami pełnymi ropni oddech starożytnych Egipcjan byłby, delikatnie mówiąc, nieco dojrzały. Egipcjanie jednak starali się czyścić zęby postrzępionym końcem gałązki. Ta technika zaowocowała bardzo wypolerowanym wyglądem zębów wielu starożytnych egipskich mumii. W dokumentacji medycznej znajdują się liczne recepty na odświeżanie oddechu, w tym żucie cynamonu, kadzidła, mirry i pachnących roślin zmieszanych z miodem.

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.

Per-āa : Na wyczerpaniu

https://szkolazpieklarodem.pl/

Najczęstszym problemem wszystkich Egipcjan, bez względu na status czy pozycję społeczną, było zużycie gryzących powierzchni zębów. Ten stan spowodowany był przede wszystkim kwarcem, szarogłazem, amfibolem, miką i piaskiem w ziarnie, które następnie mielono na mąkę. Wszystkie te substancje były obecne w starożytnym chlebie i powodowały tarcie o gryzącą powierzchnię zęba podczas żucia. To, czy te substancje zostały dodane przez wiatr, czy celowo, jest dyskusyjne – tak czy inaczej, zużycie zębów było znaczne. Zęby były zużyte do tego stopnia, że ​​szkliwo całkowicie zniknęło, odsłaniając wrażliwą miazgę wewnętrzną. Odsłonięta miazga zębowa została następnie zainfekowana, powodując ropnie, obrzęk i ogromny ból. W wielu przypadkach ropnie były w zaawansowanym stadium i zjadały kość szczęki, powodując utratę zębów. Niewiele można było zrobić, aby wyleczyć te ropnie, poza osuszeniem rany. Lekarz lub dentysta użył krzemiennego noża, aby naciąć infekcję i włożył wydrążoną trzcinę, aby ułatwić wypływ ropy z ropnia. Starożytni lekarze wiedzieli, że jeśli zostawią ropę w ropniu, to się powtórzy i będą musieli ponownie przejść przez cały proces. Wydaje się, że starożytni Egipcjanie uważali, że ból zęba jest normalny, ponieważ zapisy dotyczące nieobecności z Deir el Medina, które zawierają wymówki za dni wolne od pracy, pokazują, że nikt nie wziął urlopu z powodu bólu zęba. (Wiem na pewno, że gdybym miał płaczące ropnie, wziąłbym przynajmniej kilka dni wolnego!) Mówiąc bardziej pozytywnie, starożytni Egipcjanie nie cierpieli na próchnicę (próchnicę) z powodu bardzo ograniczonego cukru w ​​ich dieta. Elita słodziła jedzenie miodem, ale był to luksus poza zasięgiem większości ludzi. Tylko garstka mumii wykazuje początek próchnicy, ale prawie każda dorosła mumia ma ślady na gryzącej powierzchni zębów.