[RASA series #1] Ai cũng có thể làm RASA chatbot “siêu ngon khổng lồ”

Vèo cái là hết quốc khánh, sorry các mem vì hôm nay ad mới trở về Hà Nội sau mấy ngày phiêu du khắp nơi (tranh thủ tý). Hôm nay chúng ta cùng chuyển sang một mảng mới là mảng Natural Language Processing – xử lý nguôn ngữ tự nhiên và bài đầu tiên mình xin guide các bạn cách làm RASA chatbot đơn giản mà ai cũng có thể làm được.

Các bạn thấy FPT Chatbot hay Hana Chatbot không, toàn dùng “công nghệ” intent/utter này hết đó. Nên làm xong các bạn có thể tự xây chatbot cho mình, khỏi mua tốn xiền 😛

RASA chatbot
Nguồn: ecommerce-nation.com

Chúng ta sẽ đi qua các phần sau nhé:

  • Phần 1. Chatbot là gì? Có những cách nào để làm chatbot?
  • Phần 2. Chuẩn bị nguyên vật liệu cho bài toán
  • Phần 3. Nhập liệu cho module NLU
  • Phần 4. Kiểm tra module NLU
  • Phần 5. Train module Rasa Core và chat với bot

Phần 1. Chatbot là gì? Có những cách nào để làm chatbot?

Hiểu đơn giản thì chatbot là một phần mềm có thể chat “đối đáp” với con người để: tư vấn thông tin, tâm sự, tán tỉnh…

Vậy có những cách nào để làm chatbot? Cái này mình không chắc lắm, nhưng theo hiểu biết nhỏ bé của mình thì có các cách :

  • Kiểu if then theo câu. Ví dụ: Nếu hỏi câu “Em tên là gì?” thì trả lời là “Em tên là Hoa” hoặc nếu hỏi “Cửa hàng có mở cửa không?” thì trả lời là “Cửa hàng mở cửa từ 7-10h nhé!”. Ưu điểm là: dễ làm, đơn giản. Nhược điểm là: Bot chỉ trả lời nếu như người dùng gõ đúng y hệt câu đầu vào :(. Ví dụ ở trên nếu người dùng gõ “Em cho anh hỏi tý cửa hàng mình còn mở cửa nữa không?” là bot….tịt 😀
  • Kiểu rule base chatbot nhưng có xử lý ngôn ngữ tự nhiên và áp dụng mạng NN để xác định KH muốn gì và tìm câu trả lời phù hợp. Ví dụ, khách hàng có thể nói “Em cho anh hỏi tý cửa hàng mình còn mở cửa nữa không?” thì bot vẫn trả lời được. Với kiểu này chúng ta phải định nghĩa mẫu câu đầu vào (nhắc lại là mẫu thôi nhé, chứ ko phải fix cứng như loại trên) và các câu trả lời.
  • Kiểu generation based chat bot. Quả này thì có nghĩa là sau khi được train liên tục các câu hỏi và trả lời thì bot có khả năng tự sinh ra câu trả lời ứng với nội dung KH chat (ko cần định nghĩa sẵn). Tuy nhiên, lý thuyết thì hay chứ thực tế mình làm thì sinh ra những câu ngô nghê và đôi khi có nội dung nhạy cảm vãi lúa .

Do đó, hiện nay loại số 2 vẫn được dùng nhiều nhất vì cân bằng giữa độ mềm dẻo trong giao tiếp, lại kiểm soát được thông tin. Chúng ta sẽ bắt tay vào làm thử 1 chatbot đơn giản loại 2 nhé.

Chú ý: Hiện có post update chuẩn tại đây nhé anh em. Anh em cài theo cách mới: https://www.miai.vn/2020/03/19/rasa-series-4-cai-dat-rasa-theo-cach-moi-sieu-nhanh-sieu-gon-nhe/

Phần 2. Chuẩn bị nguyên vật liệu

Bây giờ như thường lệ, các bạn hãy tạo một thư mục MiAI_Chatbot trên máy tính của các bạn nhé. Sau đó các bạn đứng trong thư mục đó và gõ lệnh sau để lấy từ github của mình về:

git clone https://github.com/thangnch/AI_VoicebotCode language: PHP (php)

Rồi, bây giờ chúng ta đã có thêm thư mục AI_Voicebot trong thư mục MiAI_Chatbot (sorry mình để nguyên tên AI_Voicebot, đây là project mình mang đi thi AI Hackathon 2019 nên có tên thế, up lên từ lâu rồi). Chúng ta hãy chuyển vào trong thư mục AI_VoiceBot để làm việc (bằng lệnh cd AI_Voicebot nhé).

Hôm nay chúng ta sẽ dùng thư viện mã nguồn mở RASA (khá nổi tiếng) để làm chatbot. RASA có 2 module chính là: RASA NLU – Nature Language Understanding dùng để hiểu và xử lý ngôn ngữ tự nhiên (tóm lại để hiểu xem người dùng muốn gì) và RASA Core để xử lý trả lời khách hàng. Chúng ta sẽ tìm hiểu cụ thể từng module sau.

Bây giờ, để chạy được các bạn cài thêm các thư viện rasa_core, sklearn_crfsuite và spacy bằng lệnh:

pip install rasa_core sklearn_crfsuite spacy rasa_nlu

Sau đó các bạn gõ thêm lệnh sau để tải ngôn ngữ cho spacy nhé:

python -m spacy download en

Các bạn để ý không thấy báo lỗi gì là hoàn thành, còn nếu có báo lỗi thì các bạn post lên group Mì AI để cùng thảo luận nha (Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup ).

Phần 3. Nhập liệu cho module NLU

Rồi, bây giờ mọi thứ đã cài đặt xong, source đã tải về máy, chúng ta sẽ tiến hành train modul NLU để cho máy có thể hiểu được những gì khách hàng chat nhé. Trong modul NLU có khái niệm intent – ý đồ của khách hàng. Ví dụ nếu KH chat “Cho tôi hỏi về lịch bay?” hay “Lịch bay hôm nay như nào?” thì tuy 2 câu khách nhau nhưng cùng 1 ý đồ – intent là “Hỏi_lịch_bay” chẳng hạn.

RASA chatbot

Các bạn mở file nlu.md trong thư mục AI_Voicebot/data sẽ thấy cấu trúc file có dạng như sau:

## intent:greet
- xin chào
- chào bn
- hello
## intent:bye
- tm bit
- chào tm bit
- chào tm bit emCode language: CSS (css)

Trong đó (mình chỉ ví dụ 1 intent, các cái khác tương tự nhé):

  • ## intent: greet là ý đồ của khách hàng là greet (chào hỏi)
  • Các câu bên dưới là các mẫu câu chat chúng ta quy vào intent /ý đồ chào hỏi. Các bạn có thể thêm nhiều câu như :” Chào gái”, “Chào trai”, “Có ai đó không?””

Các bạn hãy định nghĩa lần lượt cho các intent các bạn có, mỗi intent tầm từ 10 câu trở lên để đạt kết quả cao nhất nhé.

RASA chatbot

Phần 4. Train và kiểm tra module NLU

Module NLU cần phải được kiểm tra kỹ trước khi làm các bước tiếp theo bởi vì nếu ta hiểu sai ý đồ/intent của khách hàng thì các bước sau đều sai cả.

Các bạn mở sang file train_nlu.py, nhìn ở dòng cuối có các lệnh gọi hàm ask_question, mục đích là để chúng ta truyền thử các câu hỏi của khách hàng vào xem modul NLU có đoán đúng ý đồ không:

ask_question("xin chào")
ask_question("Cảm ơn")Code language: JavaScript (javascript)

Như trên là mình đang thử 2 câu “Xin chào” và “Cảm ơn” xem modul NLU nhận dạng như nào. Các bạn chạy file train_nlu.py bằng IDE lập trình (Pycharm, VS…) hoặc gõ lệnh python train_nlu.py và nhìn trên màn hình kết quả có dạng như sau:

{'intent': {'name': 'greet', 'confidence': 0.7056386276058646}, 'entities': [], 'intent_ranking': [{'name': 'greet', 'confidence': 0.7056386276058646}, {'name': 'thank', 'confidence': 0.16509810872298686}, {'name': 'ask_name', 'confidence': 0.05608779076688179}, {'name': 'ask_func_list', 'confidence': 0.044564258523291225}, {'name': 'bye', 'confidence': 0.028611214380975854}], 'text': 'xin chào'}
 {'intent': {'name': 'thank', 'confidence': 0.6630342019061172}, 'entities': [], 'intent_ranking': [{'name': 'thank', 'confidence': 0.6630342019061172}, {'name': 'greet', 'confidence': 0.3117787300867454}, {'name': 'bye', 'confidence': 0.011944368579982654}, {'name': 'ask_func_list', 'confidence': 0.010565177974582835}, {'name': 'ask_name', 'confidence': 0.0026775214525717817}], 'text': 'Cảm ơn'}Code language: JavaScript (javascript)

Các bạn để ý phần mình bôi đậm bên trên là okie. Như vậy:

  • Với câu “Xin chào”, máy đã nhận đúng là intent greet và với độ tin tưởng là đến 0.7
  • Với câu “Cảm ơn”, máy cũng đã nhận đúng là intent thank với độ tin tưởng 0.66

Quá tuyệt! Xong phần NLU, bây giờ sang phần tiếp theo nào.

Phần 5. Train modul RASA Chatbot Core

Đến đây, modul NLU đã xong, máy đã có thể hiểu được chúng ta nói gì. Bây giờ đến phần thứ 2, train cho RASA Chatbot phản ứng lại những giờ khách hàng nói nhé.

Ở phần này các bạn làm quen với 02 file domain.yml và stories.md của RASA Chatbot.

Bước 1. Bây giờ đi đến file domain.yml trước.

Nếu như file nlu.md là để lưu các câu nói của khách hàng ứng với ý đồ nào thì các bạn có thể hình dung file domain.yml là định nghĩa các câu phản hồi của bot với các ý đồ của khách hàng (gọi là các utter, ứng với intent ở trên).

File domain.yml sẽ gồm 3 phần chính:

  • Phần 1: Liệt kê lại các intent của khách hàng (kiểu như tóm tắt lại file nlu.md ấy)
  • Phần 2: Phần templates. Là phần quan trọng. Phần này liệt kê các utter phản hồi lại các intent của khách hàng. Mỗi utter bạn có thể định nghĩa nhiều câu text và bot sẽ chọn random các câu text này để phản hồi (cho nó có vẻ tự nhiên tý ấy mà). Như bên dưới là utter_greet (để chào lại khách hàng khi khách chào mình) chỉ có 1 text nhưng utter_bye (để chào tạm biệt khách khi khách tạm biệt mình) thì có 2 câu text. Trong phần này các bạn chú ý có một utter đặc biệt là utter_unclear, utter này sẽ được gọi khi máy không hiểu được ý của người dùng, khi đó máy sẽ nói các câu dạng như “Thưa quý khách, hiện tại tôi chưa hiểu được yêu cầu của Quý khách” thay vì im tịt thì không hay.
templates:
# Bot trả lời
 utter_greet:
  - text: "Kính chào Quý khách, Quý khách vui lòng cho Bank biết quý danh để tiện xưng hô được không ạ?"
 utter_bye:
  - text: "Kính chào tạm biệt và mong sớm gặp lại quý khách!"
  - text: "Kính chào tạm biệt và chúc quý khách một ngày tốt lành!"Code language: PHP (php)
  • Phần 3. Liệt kê lại các utter có trong phần 2 (tóm tắt lại tý)

Ảnh chụp màn hình file domain.yml của mình:

RASA chatbot

Bước 2. Tiếp tục đến file stories.md

File này như một file kể chuyện, để kết nối giữa intent và utter. Nếu như nlu.md định nghĩa intent, domain.yml định nghĩa utter. Nhưng máy đâu có hiểu là intent nào thì dùng utter nào đâu (máy dốt lắm, kể cả bạn đặt tên utter có liên quan đến intent thì nó cũng không tự hiểu như con người đâu). Và đó là lý do phải có thêm file stories.md để ghép nối.

File này có dạng như sau:

## Chào - tên - hỏi chức năng - chào
* greet
  - utter_greet
* ask_name
  - utter_ask_name
* ask_func_list
  - utter_ask_func_list
* bye
  - utter_byeCode language: PHP (php)

Như đoạn trên là định nghĩa 1 đoạn chat giữa người và máy. Người vào chào hỏi, máy chào lại, rồi người hỏi tên, máy trả lời, rồi hỏi tiếp các món máy có thể làm, rồi tạm biệt…

Các bạn cố gắng nghĩ ra càng nhiều đoạn hội thoại càng tốt, thì máy sẽ càng thông minh khi chat và nội dung chat mềm dẻo hơn. Các bạn đọc chi tiết trong file stories.md của github RASA Chatbot của mình để biết chi tiết nhé.

RASA chatbot

Roài, công tác chuẩn bị đã xong. Bây giờ các bạn chạy file train_dialog.py bằng IDE hoặc câu lệnh python train_dialog.py để train modul RASA Core. Máy sẽ chạy 200 epochs:

Epoch 1/200
 75/75 [==============================] - 1s 13ms/sample - loss: 2.6061 - acc: 0.0667
 Epoch 2/200
 75/75 [==============================] - 0s 444us/sample - loss: 2.5442 - acc: 0.2267
 Epoch 3/200
 75/75 [==============================] - 0s 768us/sample - loss: 2.4800 - acc: 0.2933

Ngồi đợi chút cho nó train xong thì các bạn chạy tiếp file test_dialog.py . nhé, nó sẽ hiện ra một cửa sổ chat và các bạn có thể chat với bot để test, nếu bot có trả lời là thành công rồi.

RASA chatbot

Well, bài này là bài số 1 trong series về RASA chatbot, trong các bài tiếp theo mình sẽ guide các bạn cách làm cho bot thông mình hơn, làm dược nhiều việc hơn nữa nhé. Mình có để clip hướng dẫn chi tiết tại đây:

Chúc các bạn thành công! Nếu trong quá trình làm có lỗi gì các bạn cứ post lên group để cùng chia sẻ 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

17 Replies to “[RASA series #1] Ai cũng có thể làm RASA chatbot “siêu ngon khổng lồ””

  1. Chào anh. Em đang thực hiện phần cài ‘python -m spacy download en’ thì mắc phải 1 vấn đề là timeout. Xin hỏi cách khắc phục ạ.

      1. Em chào anh.
        Anh cho em hỏi xíu ạ. Nếu em tạo được 1 chatbot từ hướng dẫn bài của anh rồi thì làm sao để em tích hợp noa vào website của em vậy anh?
        Em không phải dân công nghệ nhưng có mong muốn tìm hiểu nên mong anh có thể giải đáp giúp em ạ. Em cảm ơn anh nhiều ạ.

  2. Chào anh, em muốn hỏi trong trươngf hợp có 1 itent hỏi về tỷ giá ngoại tệ chẳng hạn, biết rằng tỷ giá này thay đổi theo thời gian nên không thẻ fix cứng câu trả lời được, trong trường hợp này chúng ta nên xử lý như thế nào aj?

  3. Em chào anh.
    Anh cho em hỏi xíu ạ. Nếu em tạo được 1 chatbot từ hướng dẫn bài của anh rồi thì làm sao để em tích hợp noa vào website của em vậy anh?
    Em không phải dân công nghệ nhưng có mong muốn tìm hiểu nên mong anh có thể giải đáp giúp em ạ. Em cảm ơn anh nhiều ạ.

    1. anh ơi em làm đến đoạn python -m spacy download en thì nó báo No module named spacy là lỗi gì vậy ạ?

Leave a Reply

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