[Rasa Series #3] Thử làm “đệ tử” RASA chatbot hóng kết quả sổ xố hàng ngày

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:

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.

RASA chatbot action
Nguồn: VTC Mobile

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.

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 qusxhôm này thế nào
- Mày cho anh hi kết qutý
- Có kết quchưaCode 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_lotteryCode 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_byeCode 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 actionsCode 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 đó:

RASA chatbot action

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

Related Post

4 Replies to “[Rasa Series #3] Thử làm “đệ tử” RASA chatbot hóng kết quả sổ xố hàng ngày”

  1. “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?

Leave a Reply

Your email address will not be published. Required fields are marked *