Chào anh em, chúng ta lại trở lại với series RASA Chatbot nhé. Hôm nay chúng ta sẽ dạy cho chatbot biết chào hỏi, nhớ được tên của khách hàng.
Trong bài số 1 tại đây https://miai.vn/2019/09/03/rasa-series-1-ai-cung-co-the-lam-chatbot-sieu-ngon-khong-lo/ chúng ta đã học cách cơ bản để có thể xây dựng được một RASA chatbot đơn giản, biết phán đoán intent của người dùng và phản hồi lại. Các bạn nên đọc và làm theo bài 1 trước khi tiếp tục làm theo nội dung của bài này nhé.
Nhìn vào ví dụ trong bài 1 chúng ta sẽ thấy là chatbot chỉ phản hồi các nội dung tĩnh (cố định), chào hỏi chung chung. Trong bài này chúng ta sẽ dạy cho chatbot biết chào hỏi, nhớ được tên của khách hàng.
Ví dụ nếu khách hàng nói: “Anh tên là Thắng” thì chat bot sẽ phản hồi “Vâng, em chào anh Thắng” còn nếu một người nói “Chị là Hằng” thì bot sẽ phản hồi “Em chào chị Hằng”. Rất thân thiện với khách hàng phải không các bạn!
Chúng ta cùng băt tay vào làm nhé!
Phần 1. Tìm hiểu thêm về Entity và Slot của
Như bài trước chúng ta đã tìm hiểu được 02 khái niệm của RASA Chatbot là Intent – ý đố người dùng và Utter – phản hồi của máy. Thì hôm nay chung ta sẽ học thêm 2 khái niệm mới là (xin phép định nghĩa theo kiểu Mì ăn liền, các bậc cao nhân bỏ quá):
- Entity : Là các thực thể mà người dùng cung cấp và chúng ta cần lấy. Chú ý là trong 1 câu nói sẽ có nhiều thực thể, nhưng ở đây chúng ta chỉ xét với các thực thể chúng ta cần lấy để xử lý thôi nhé. Ví dụ nhé “Tôi muốn đặt vé máy bay” thì ý đồ là “Đặt vé” còn thực thể là “Vé máy bay”; hoặc như “Tôi muốn ăn cơm gà” thì ý đồ là “Đặt cơm” còn thực thể là “cơm gà”.
- Slot: Nghe tên là biết, nó là các ô lưu trữ của chatbot, nó thích lưu gì thì lưu. Ví dụ bot có 1 slot là “Tên khách” để lưu tên khách hàng, 1 slot khác là “Cust_sex” để lưu giới tính khách hàng… Tùy vào ông bot! Đùa chút tùy vào anh em lập trình.
Rồi, lý thuyết thế đủ rồi, nhiều quá anh em lại bảo là không phải Mì ăn liền thì chết. Sang phần thực hành nào.
Phần 2. Ý đồ của bài toán này.
Bài toán này kịch bản sẽ là:
- Người dùng : Alo
- Chatbot: Vâng xin chào quý khách, quý khách cho biết tên để tiện xưng hô ah?
- Người dùng: Anh là Thắng/Chị là Hằng/Em là Trang….
- Chatbot: <Sẽ tùy vào người dùng là nam/nữ, anh/chị sẽ chào khác nhau>.
Mục đích là để các bạn nắm được cách dùng Entity và Slot, còn sau đó các bạn tùy ý sáng tạo cho bài toán của mình nhé!
Để định nghĩa 1 Entity trong 1 câu nói của khách hàng, chúng ta dùng cú pháp sau. Ví dụ trích xuất 2 Entity Cust_sex và Cust_name trong câu “Anh là Thắng”, ta sẽ viết như sau trong file nlu.md (file này các bạn xem lại Bài số 1 để hiểu cụ thể nhé):
#intent: give_name
- [Anh](cust_sex) là [Thắng](cust_name)
Code language: CSS (css)
Các bạn có thể làm với mọi câu của khách, trích xuất bất kì Entity nào các bạn cần nhé.
Phần 3. Tiến hành sửa chương trình
Rồi, bây giờ các bạn lại tạo thư mục MiAI_Chatbot_2, để lưu bài này nhé. Mình xin phép tạo thư mục mới để các bạn chưa đọc bài 1 cũng có thể thực hiện được từ đầu đến cuối. Sau khi tạo xong, các bạn chuyển vào trong thư mục MiAI_Chatbot_2 bằng lệnh cd nhé. Tiếp đến gõ lệnh:
git clone https://github.com/thangnch/MiAI_Chatbot_2 .
Code language: PHP (php)
Chú ý có dấu chấm (.) ở cuối lệnh nhé. Sau khi tạo xong, các bạn sẽ thấy các file của chương trình trong thư mục hiện tại. Bây giờ các bạn cần tìm hiểu các file sau của RASA chatbot:
File nlu.md: Các bạn sẽ thấy thêm 1 intent mới là give_name ( nghĩa là cung cấp tên) với các câu nói đang được trích xuất cust_sex và cust_name như bên dưới.
## intent:give_name
- [Anh](cust_sex) là [Thắng](cust_name)
- [Chị](cust_sex) là [Hằng](cust_name)
- [Em](cust_sex) là [Trang](cust_name)
- [Cô](cust_sex) [Vân](cust_name)
- [Chú](cust_sex) [Hùng](cust_name)
Code language: CSS (css)
File domain.yml: Các bạn sẽ thấy các chỉnh sửa sau:
Thứ nhất, là thêm intent give_name vào danh sách intent ở đầu file (cách làm giống bài 1):
intents:
# Ý đồ khách hàng
- greet
- thank
- bye
- ask_func_list
- ask_name
- give_name
Code language: PHP (php)
Thứ hai, thêm đoạn khai báo Entity và Slot như bên dưới. Các bạn để autofill là True để các Entity tự nhảy sang các slot cho tiện nhé. Nhớ nhé, entity là của người dùng nhập vào, slot là của bot dùng, bot không được sờ vào Entity nên bot cần đồng bộ từ Entity sang slot 😀
slots:
cust_sex:
auto_fill: true
type: text
cust_name:
auto_fill: true
type: text
Code language: JavaScript (javascript)
Thứ 3, sửa lại vài utter bên dưới để có phần hỏi tên, phần chào hỏi khi đã biết tên và giới tính của khách hàng. Tạm đặt là utter_greet_with_name nhé.
templates:
# Bot trả lời
utter_greet:
- text: "Kính chào Quý khách! Quý khách vui lòng cho biết tên để tiện xưng hô được không ah?"
utter_greet_with_name:
- text: "Kính chào {cust_sex} {cust_name}. ABC Shop có thể giúp gì được {cust_sex} {cust_name} ạ?"
Code language: PHP (php)
Và cuối cùng như thường lệ, thêm utter nào thì phải liệt kê vào phần cuối của file domain.yml như sau:
actions:
- utter_greet
- utter_greet_with_name
File stories.md: Với file này, chúng ta thêm các câu chuyện liên quan đến hỏi tên khách, chào khách bằng tên và giới tính. Để ví dụ, mình định nghia 2 câu chuyện thôi, các bạn có thể định nghĩa càng nhiều càng tốt nhé:
## Chào hỏi đưa tên
* greet
- utter_greet
* give_name
- utter_greet_with_name
* ask_name
- utter_ask_name
* bye
- utter_bye
## Đưa tên luôn
* give_name
- utter_greet_with_name
Code language: PHP (php)
Xong rồi đấy, cấu hình xong, chỉnh sửa xong bây giờ sang bước Train và Test
Phần 4. Train và kiểm thử chatbot
Như thường lệ trong bài #1, chúng ta sẽ train modul NLU và kiểm tra trước xem máy có nhận đúng ý đồ người dùng không đã.
Chúng ta sẽ thay 2 câu cuối cùng trong file train_nlu.py bằng 2 câu sau và chạy file này:
ask_question("Anh là Thắng")
ask_question("Cô Vân")
Code language: JavaScript (javascript)
Như chúng ta thấy, bot đã có thể nhận rất chuẩn intent give_name như trong log in ra màn hình bên dưới. Ngoài ra các bạn để ý kỹ cũng thấy có 2 entities được lấy ra rất chuẩn là cust_sex và cust_name.
{'intent': {'name': 'give_name', 'confidence': 0.7580506736334629}, 'entities': [{'start': 0, 'end': 3, 'value': 'anh', 'entity': 'cust_sex', 'confidence': 0.7440822340917279, 'extractor': 'CRFEntityExtractor'}, {'start': 7, 'end': 12, 'value': 'thắng', 'entity': 'cust_name', 'confidence': 0.8276384060323037, 'extractor': 'CRFEntityExtractor'}], 'intent_ranking': [{'name': 'give_name', 'confidence': 0.7580506736334629},
{'intent': {'name': 'give_name', 'confidence': 0.6940550524645719}, 'entities': [{'start': 0, 'end': 2, 'value': 'cô', 'entity': 'cust_sex', 'confidence': 0.7842356156257427, 'extractor': 'CRFEntityExtractor'}, {'start': 3, 'end': 6, 'value': 'vân', 'entity': 'cust_name', 'confidence': 0.7754029433347628, 'extractor': 'CRFEntityExtractor'}], 'intent_ranking': [{'name': 'give_name', 'confidence': 0.6940550524645719},
Code language: JavaScript (javascript)
Như vậy là NLU đã ngon. Tiến hành train tiếp rasa_core. Bây giờ chạy file train_dialog.py nhé. Chạy xong thấy xong 200 epoch như này là okie:
Epoch 200/200
141/141 [==============================] - 0s 296us/sample - loss: 0.0701 - acc: 0.9858
Còn bây giờ, test thôi :D. Chạy file test_dialog.py nào!
Bingo! Ngon lành như hình là xin chúc mừng các bạn nhé! Như vậy chúng ta đã biết cách dùng Entity và Slot để thỏa thích cá nhân hóa các nội dung trả lời của bot. Trong bài sau, mình sẽ viết về cách các bạn tương tác giữa bot với bên ngoài ví dụ: đọc tin tức, đọc báo….
Chúc các bạn vui vẻ! Và đừng quên join cộng đồng Mì AI nhé!
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
Anh Thắng nhiều bài hay quá !
Cảm ơn bạn động viên nha. Gia nhập cùng nhà Mì AI nha:
#MìAI
Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup
Blog: http://miai.vn
Youtube: http://bit.ly/miaiyoutube
Tâm huyết quá anh ơiiiiii….Show some respect <3
Cảm ơn em. Cần thêm gì cứ lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup nhé!