Chatbot z Pytonem : Testowanie bota

https://szkolazpieklarodem.pl/

Testowanie bota jest częścią naszego interaktywnego procesu uczenia się. Na bieżąco sprawdzamy wszystkie możliwe scenariusze, jakie początkowo przewidywaliśmy dla bota i odpowiednio go szkolimy. Przetestowałem Horoskop Bota pod kątem innych scenariuszy i odpowiednio go przeszkoliłem. Poniżej znajduje się jeden z nich, który różni się nieco od tego, co zrobiliśmy wcześniej .

Przypadek testowy 1

Przeprowadźmy pierwszy test:

Użytkownik: Witam!

HoroskopBot: Witam! Co mogę dla ciebie zrobić?

Użytkownik: Jaki jest dzisiaj horoskop dla Koziorożca?

HoroskopBot: Twój dzisiejszy horoskop:

Podróż od porażki do sukcesu jest napędzana 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.

HoroskopBot: Czy chcesz subskrybować codzienne aktualizacje?

Użytkownik: Proszę, zasubskrybuj mnie.

HoroskopBot: Subskrybujesz pomyślnie.

Jak widać w tej rozmowie między użytkownikiem a chatbotem, sprawdziliśmy, czy bot radzi sobie ze scenariuszem, w którym użytkownik sam podaje horoskop_znak, prosząc o horoskop na dany dzień. Bot radzi sobie w tym przypadku dobrze i kończy

prosząc o subskrypcję i na podstawie odpowiedzi użytkownika podejmuje odpowiednie działania. Powinieneś przeprowadzić test poprawności rozmowy bota, aby ustalić, czy normalny przepływ działa, czy nie. Przetestowałem także historię, o której wspominaliśmy w naszym pliku Stories.md, gdy użytkownik bezpośrednio poprosił o subskrypcję i również zadziałało.

Przypadek testowy 2

Teraz drugi test:

Użytkownik: Cześć

HoroskopBot: Witam! Co mogę dla ciebie zrobić?

Użytkownik: Subskrybuj mnie, aby otrzymywać codzienne aktualizacje.

HoroskopBot: Subskrybujesz pomyślnie.

Dodam jeszcze kilka nowych historii, żeby bot działał bez zarzutu. Ale na razie mamy w pełni działającego bota. W drugiej wersji kodu na githubie znajdziesz także bota, który będzie poprawiał błędy ortograficzne dla znaku horoskopu, pobierał znak horoskopu na podstawie DOB użytkownika, żegnał się itp. Gorąco polecam sprawdzić, jak to działa w kodzie zostało już wykonane i prześlij swoją opinię. Ale wcześniej zastanów się, jak to zostanie zrobione i dokąd pójdą zmiany.  

Per-āa : Zmieniające się role i kształty

https://szkolazpieklarodem.pl/

Podobnie jak ludzie, bóstwa egipskie odgrywają wiele ról i przez całe życie przybierają różne cechy, co oznacza, że tego samego boga można przedstawiać na wiele różnych sposobów. Na przykład bóg słońca Ra jest przedstawiany na cztery różne sposoby, w zależności od pory dnia:

* Khepri to skarabeusz (lub człowiek z głową żuka), który reprezentuje słońce o świcie.

* Aten to słoneczny dysk reprezentujący światło, które świeci ze słońca w południe.

* Re-Horakhti to człowiek z głową sokoła i nakryciem głowy w kształcie tarczy słonecznej, który przedstawia słońce na horyzoncie o świcie i zachodzie słońca.

* Flesh to człowiek z głową barana, który reprezentuje słońce o zachodzie słońca.

Chatbot z Pytonem : Eksportowanie rozmów jako historii

https://szkolazpieklarodem.pl/

Teraz następnym krokiem w interaktywnej części edukacyjnej jest naciśnięcie 0 i wyeksportowanie naszych bieżących rozmów jako opowieści i wyjście. W tym celu naciskamy 0, a bot wyświetla coś takiego:

File to export to (if file exists, this will append the stories) [stories.md]:

Wystarczy wpisać nazwę naszego pliku Stories.md, jeśli zachowałeś inną nazwę, upewnij się, że podałeś poprawną nazwę pliku. Rasa wykonuje za nas całą ciężką pracę i ponownie automatycznie generuje dla nas plik Stories.md w następujący sposób:

## Generated Story 3797421409943253925

* greeting

– utter_greet

* I want to know my horoscope

– utter_ask_horoscope_sign

* get_horoscope

## Generated Story 7304374603374920907

* greeting

– utter_greet

* what is my todays horoscope?

– utter_ask_horoscope_sign

* Cancer

## Generated Story -6877464862083507836

* 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}

Możesz zmienić źródło pliku historii podczas uczenia modelu za pomocą wyżej wymienionego pliku lub możesz skopiować i wkleić nowo wygenerowane historie do naszego oryginalnego pliku Stories.md. Na razie skopiuję i wkleję te historie do naszego oryginalnego pliku Stories.md. Przed przystąpieniem do testowania lub ponownego interaktywnego uczenia się pamiętaj o ponownym uruchomieniu modeli.

Per-āa : Wyjaśniając wszystkie te niezwykłe formy

https://szkolazpieklarodem.pl/

Zarówno religia państwowa, jak i domowa obejmowała bogów o nieco dziwacznej formie – przedstawianych jako ludzie z głowami zwierząt, zwierzętami lub jako ludzie z nieożywionymi przedmiotami zamiast głów. Egipcjanie nie wierzyli jednak, że te dziwne pozory są tym, jak faktycznie wyglądali bogowie. Wierzyli, że bóstwa są bezforemne. Przedstawienia przedstawiają cechy bóstwa i jego rolę w panteonie bogów. Charakter zwierzęcia lub przedmiotu zastępującego głowę boga dostarcza pewnych informacji o bogu. Na przykład:

* Hathor była kobietą z głową krowy, która reprezentuje macierzyńską, opiekuńczą naturę krowy.

* Sekhmet była kobietą z głową lwicy, która reprezentuje

agresywna natura lwicy.

* Selket była kobietą o ciele skorpiona i ludzkiej głowie, co oznacza, że jest obrońcą przed ukąszeniami skorpionów i pająków.

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.