Chào tuần mới tất cả anh em thích ăn Mì AI, hôm nay chúng ta sẽ cùng nhau Thử làm “đệ tử” RASA chatbot hóng kết quả sổ xố hàng ngày bằng RASA Chatbot Action nhé.
Trong hai bài trước của series RASA, chúng ta đã học cách xây dựng chatbot đơn giản bằng RASA framework. Các bạn có thể tham khảo lại tại đây nếu chưa đọc:
- [RASA series #1] Ai cũng có thể làm RASA chatbot “siêu ngon khổng lồ”
- [RASA Series #2] Dạy cho RASA chatbot biết chào hỏi khách hàng “ngoan hơn”
Bài hôm nay chúng ta sẽ làm một RASA Chatbot như một đệ tử hàng ngày check kết quả số xố giúp chúng ta. Thay vì phải truy cập web, tìm kiếm, chúng ta chỉ cần chat “Cho anh xem kết quả cái!” hoặc “Cho anh xem giải đặc biệt đê” thì nó tự tìm thông tin và show cho “đại ca” ngay lập tức.
Thôi bắt đầu làm nhé.
Phần 1. Như thường lệ, chuẩn bị nguyên vật liệu
Các bạn tạo thư mục MiAI_Chatbot_3 và thực hiện clone git của mình về bằng lệnh sau:
git clone https://github.com/thangnch/MiAI_Chatbot_3 .
Code language: PHP (php)
Chú ý dấu chấm (.) ở cuối lệnh. Nếu thành công các bạn sẽ thấy ngay RASA Chatbot project như đã làm ở các phần 1 và 2 của series.
Các bạn tiến hành cài đặt các thư viện cần thiết nếu chưa cài nhé:
pip install rasa_core rasa_nlu rasa_core_sdk feedparser spacy sklearn_crfsuite
Đợi các thư viện cài xong, các bạn gõ tiếp lệnh sau để tải về bộ ngôn ngữ nhé:
python -m spacy download en
Rồi bây giờ các bạn chuyển sang phần tiếp theo nhé.
Phần 2. Phân tích bài toán
Với bài toán lần này, chúng ta sẽ có cả phần mới và phần cũ. Phần cũ là việc nhận dạng intent/ý đồ của “đại ca” khi gõ “Cho anh xem kết quả cái!” hoặc “Cho anh xem giải đặc biệt đê” để biết là ông ta cần xem kết quả sổ xố nói chung hoặc xem chi tiết giải đặc biệt (cho trường hợp cụ ấy cần 2 số cuối làm cái việc mà ai cũng biết là việc gì đó =)) ). Chỗ này chúng ta đã quen thuộc và làm như trong 2 bài trước.
Phần mới là: ngay khi nhận được intent của người dúng, chúng ta phải kết nối với server của Sổ Xố Kiến Thiết và lấy dữ liệu về cho đại ca. Phần này chúng ta sẽ làm quen với một khái niệm mới là RASA Chatbot Action.
Như vậy, Utter là các nội dung text mà RASA Chatbot sẽ dùng để trả lời khách hàng thì RASA Chatbot Action là 1 thứ cao cấp hơn, có thể lập trình, if then, quyết định sử dụng Utter nào… khi xử lý một Intent của khách hàng. Do vậy, bài này sẽ phức tạp hơn 2 bài trước 1 chút, các bạn chú ý thật kỹ nhé.
Các bạn nắm tinh thần rồi đúng không? Vậy thì bắt tay vào sửa code nào.
Phần 3. Tiến hành viết code
Bây giờ chúng ta sẽ cùng nhau sửa code chương trình để thực hiện ý đồ trên nhé.
Bước 1: Thêm Intent vào file nlu.md:
Để làm ví dụ mình sẽ chỉ làm intent hỏi full kết quả số xố nhé. Còn cái intent lấy duy nhất kết quả của giải đặc biệt thì dành cho các bạn tự thực hành để nắm được cách làm nhé (nếu bí quá thì mở lại Bài 2 là có cách làm :D). Mình thêm Intent sau đây vào file nlu.md:
## intent:ask_lottery
- Cho anh xem kết quả đê
- Kết quả số xố hôm này thế nào
- Mày cho anh hỏi kết quả tý
- Có kết quả chưa
Code language: CSS (css)
Bước 2. Chúng ta sẽ viết code cho Action xử lý yêu cầu lấy kết quả số xố
Tại bước này, các bạn mở file actions.py và tiến hành viết thêm đoạn code lấy dữ liệu như sau:
# Ham lay ket qua so xo va tra ve. Ten ham la action_get_lottery
class action_get_lottery(Action):
def name(self):
# Doan nay khai bao giong het ten ham ben tren la okie
return 'action_get_lottery'
def run(self, dispatcher, tracker, domain):
# Khai bao dia chi luu tru ket qua so xo. O day lam vi du nen minh lay ket qua SX Mien Bac
url = 'https://xskt.com.vn/rss-feed/mien-bac-xsmb.rss'
# Tien hanh lay thong tin tu URL
feed_cnt = feedparser.parse(url)
# Lay ket qua so xo moi nhat
first_node = feed_cnt['entries']
# Lay thong tin ve ngay va chi tiet cac giai
return_msg = first_node[0]['title'] + "\n" + first_node[0]['description']
# Tra ve cho nguoi dung
dispatcher.utter_message(return_msg)
return []
Các câu lệnh và ý nghĩa của chúng mình đã comment đầy đủ bên trên, các bạn đọc là hiểu vì khá đơn giản.
Bước 3. Bây giờ mình tiến hành sửa file domain.yml
Do mình vừa khai báo thêm 1 intent bên file nlu.md nên mình sẽ phải khai báo vào trong file domain.yml như sau:
intents:
# Ý đồ khách hàng
- greet
- thank
- bye
- ask_func_list
- ask_name
- give_name
- ask_lottery
Code language: PHP (php)
Tiếp theo, chúng ta sẽ khai báo thêm action đã viết (action_get_lottery ở trên) vào phần cuối của file domain.yml. Nếu các bạn để ý thì ở Bài trước khi chúng ta thêm Utter, chúng ta phải khai báo vào file domain.yml thì bây giờ Action cũng vậy, thực hiện tương tự:
actions:
- utter_greet
- utter_greet_with_name
- utter_bye
- utter_unclear
- utter_func_list
- utter_thank
- utter_ask_name
- action_get_lottery
Bước 4. Bây giờ là sửa file stories.md để vẽ ra các câu chuyện giữa “đại ca” và “đệ tử” nào
Các bạn sửa đơn giản như này thôi. Chú ý, đây là sample nên mình chỉ làm 1 câu truyện, các bác cần sáng tác nhiều hơn để bot thông minh hơn và chat mềm dẻo hơn nhé:
## Chào hỏi và hỏi kết quả sổ xố
* greet
- utter_greet
* ask_lottery
- action_get_lottery
* ask_name
- utter_ask_name
* bye
- utter_bye
Code language: PHP (php)
Okie rồi. Bây giờ save tất cả các file lại và sang phần tiếp theo. Phần train cho model.
Phần 4. Train các model NLU và CORE cho RASA Chatbot
Đầu tiên là train cho NLU xem đã nhận đúng ý đồ của “đại ca” chưa nhé. Các bạn sửa 2 câu cuối trong file train_nlu.py và chạy để train:
ask_question("Mày cho anh hỏi kết quả cái")
ask_question("Kết quả thế nào mày")
Code language: JavaScript (javascript)
Và chạy xong thì mình thấy nhận khá ổn (mặc dù có câu mình cố tính viết khác với các câu mình định nghĩa trong intet).
{'intent': {'name': 'ask_lottery', 'confidence': 0.489516467630702}, 'entities': [], 'intent_ranking': [{'name': 'ask_lottery', 'confidence': 0.489516467630702}, {'name': 'greet', 'confidence': 0.20095691137257524}, {'name': 'give_name', 'confidence': 0.17978458626717728}, {'name': 'thank', 'confidence': 0.058187138472502405}, {'name': 'ask_func_list', 'confidence': 0.0317950969785266}, {'name': 'ask_name', 'confidence': 0.02304468096580593}, {'name': 'bye', 'confidence': 0.016715118312710563}], 'text': 'Mày cho anh hỏi kết quả cái'}
{'intent': {'name': 'ask_lottery', 'confidence': 0.45357118156932463}, 'entities': [], 'intent_ranking': [{'name': 'ask_lottery', 'confidence': 0.45357118156932463}, {'name': 'give_name', 'confidence': 0.21753812758656574}, {'name': 'ask_func_list', 'confidence': 0.10581879602353869}, {'name': 'ask_name', 'confidence': 0.08659157584663081}, {'name': 'greet', 'confidence': 0.0776594107839283}, {'name': 'bye', 'confidence': 0.030420252219736404}, {'name': 'thank', 'confidence': 0.02840065597027538}], 'text': 'Kết quả thế nào mày'}
Code language: JavaScript (javascript)
Bây giờ là train CORE nhé. Chạy file train_dialog.py cái nào. Ngon rồi, train 200 epochs ngon ơ:
Epoch 199/200
161/161 [==============================] - 0s 356us/sample - loss: 0.0801 - acc: 0.9876
Epoch 200/200
161/161 [==============================] - 0s 414us/sample - loss: 0.0519 - acc: 0.9876
Bây giờ sang bước tiếp theo về test nhé. Các bạn chú ý kỹ bước tiếp theo vì hơi lằng nhằng 1 chút.
Phần 5. Ghép nối và tận hưởng thành quả.
Đầu tiên, các bạn mở một Terminal hoặc Command Promt mới và chuyển đến thư mục MIAI_Chatbot_3 sau đó chạy lệnh:
python -m rasa_core_sdk.endpoint --actions actions
Code language: CSS (css)
Sau đó dợi một lúc cho đến khi terminal hiện lên câu thông báo có dạng như sau là thành công:
2019-09-16 09:40:38 INFO main - Starting action endpoint server…
2019-09-16 09:40:38 INFO rasa_core_sdk.executor - Registered function for 'action_get_lottery'.
2019-09-16 09:40:38 INFO main - Action endpoint is up and
running. on ('0.0.0.0', 5055)
Code language: JavaScript (javascript)
Xong rồi, bước trên là bạn start webserver cho file action.py đó.
Bây giờ như thường lệ, chúng ta chạy file test_dialog.py để kiểm tra xem “đệ tử” RASA Chatbot của chúng ta chạy như thế nào nào.
Wao! Ngon vãi rồi các bạn, các bạn xem đoạn chat bên dưới nhé, nếu hiển thị như vậy là thành công rồi đó:
Okie, như vậy ở bài này, các bạn đã biết viết 1 RASA Chatbot action để có thể truy xuất dữ liệu bên ngoài. Các bạn thoải mái sáng tạo nhé, ví dụ thay vì lên web lấy dữ liệu thì connect vào MySQL, Oracle để lấy dữ liệu cũng được này. Vậy là sau 3 bài liên tục về RASA Chatbot, các bạn đã có đủ công cụ để xây dựng 1 chatbot cho riêng mình. Mình xin tạm dừng series về Chatbot ở đây vì còn rất nhiều mảng khác nữa đang chờ các anh em Mì AI khám phá.
Chúc các bạn thành công, nếu cần gì trợ giúp, chia sẻ, anh em cứ lên group mì AI post bài nhé. Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup .
Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube
“Phần 5. Ghép nối và tận hưởng thành quả.”
Thời gian để chờ kết nối server 0.0.0.0, port 5055 quá lâu và hầu như không có response thì làm sao anh?
Em thử capture màn hình và post lên group nhé.
Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup