UnderThe Hood
Rasa Core: Dialogue Handling
previous
Action
Thành phần dialogue state được lưu lại và dựa vào tập luật hội thoại (dialogue policy) để quyết định hành động tiếp theo cho câu trả lời của bot trong một kịch bản hội thoại hay hành động (action) chỉ phụ thuộc vào trạng thái dialogue state trước của nó.
Hiện nay, có nhiều nghiên cứu mới áp dụng mô hình RNN vào quản lý hội thoại giúp cho hệ thống bot ngày càng thông minh hơn.
Ứng dụng RNN vào quản lý hội thoại: Thuật toán RNN được áp dụng cho chức năng theo dõi trạng thái hay ngữ cảnh hội thoại dialogue state trong DM.
2.3.1. Mô hình word-based DST
Như đã biết thành phần DM có nhiệm vụ quan trọng nhất đó là quản lý các trạng thái hay ngữ cảnh của hội thoại để quyết định được hành động tiếp theo. Vậy việc quyết định action tiếp theo thì dựa vào đâu? Đó chính là dữ liệu đầu vào của người dùng, dữ liệu các slot được lưu trong bộ nhớ và trạng thái của các action ở trước. Với khả năng lưu được các thông tin trong việc xử lý các bài toán dạng chuỗi thì mạng RNN được ứng dụng trong việc xác định ngữ cảnh và quyết định action tiếp nhờ vào các thông tin lưu được trong bộ nhớ mạng RNN.
Hình 18: Mô hình word- based DST với mạng RNN [4]
User Utterance: là câu dữ liệu đầu vào của người dùng
Hidden: là lớp ẩn được sử dụng trong thành phần NLU để vector hóa ngôn ngữ,
phân loại ý định và trích xuất được các thông tin người dùng
Memory: là bộ nhớ lưu các giá trị vector hóa ngôn ngữ và ngữ cảnh hội thoại bao
gồm cả slot
Slot: thông tin được trích xuất được lưu lại trong các câu nói người dùng
Action State: trạng thái action trước. Nó mang tính ngữ cảnh ở trong đoạn hội thoại
2.3.2. Mô hình Global-Locally Self-Attentive DST (GLAD)
Với các mô hình theo dõi trạng thái hội thoại khác thường xác định intent người dùng trực tiếp trên danh sách các đoạn hội thoại đã trainning cho bot sẽ gặp vấn đề về nhập nhằng xác định 1 intent trong các đoạn hội thoại có sử dụng cùng 1 intent. Tức là với cùng 1 câu nói người dùng xác định được 1 intent thì intent đó có thể được dùng nhiều trong các đoạn hội thoại. Với tư tưởng xác định cả ngữ cảnh
cho từng đoạn hội thoại thì việc xác định intent năm trong đoạn hội thoại nào sẽ tăng thêm độ chính xác.
Hình 19: Mô hình Global-Locally Self-Attentive DST (GLAD) [4]
Các tham số đầu vào cho phần local và global là các giá trị intent người dùng (X), các slot và action state (C)
Hình 20: Global-locally self-attentive encoder modul [4]
Việc dùng các slot trong mô hình cần lưu ý là sau kết thúc mỗi hội thoại thì nên xóa các slot không dùng nữa để tránh nhập nhăng xác định ví trí chính xác intent của người dùng trong danh sách các đoạn hội thoại mà bot được đào tạo.
2.4. Tóm tắt chương 2
Nội dung chương 2 đã đề cập đến 3 bài toán quan trọng khi xây dựng một hệ thống chatbot cũng như một số thuật toán tiêu biểu: thuật toán Bag-of-Words, TD-
IDF, CRFs, mô hình word-based DST vàs mô hình Global-Locally Sefl-Attentive DST. Đây là những thuật toán được ứng dụng khi phân loại văn bản, gãn nhãn cho chuỗi như tách từ, xác định thực thể...
Trong chương tiếp theo, bài khoá luận sẽ hướng tới xây dựng một mô hình giải quyết bài toán và các bước cụ thể.
CHƯƠNG 3: ỨNG DỤNG MÃ NGUỒN MỞ RASA XÂY DỰNG HỆ THỐNG CHATBOT HỖTRỢNGƯỜIDÙNG
3.1. Bài toán
“Hệ thống chatbot hỗ trợ quản lý bán hàng” là một hệ thống được sinh ra giúp cho các doanh nghiệp cải thiện dịch vụ khách hàng, tiếp cận và chăm sóc khách hàng một cách rất hiệu quả, tiết kiệm chi phí và mang lại nguồn lợi nhuận cao. Đó chính là các giải pháp mà doanh nghiệp cần nếu muốn phát triển trong tương lai. Ở Việt Nam hiện nay đã có rất nhiều bot hỗ trợ quản lý bán hàng được xây dựng trên các nền tảng như Chatfuel, Messnow, ManyChat...
Trong những năm trở lại đây, Rasa là một trong những nền tảng được dùng để xây dựng hỗ trợ khách hàng và ngành dịch vụ. Cùng với Dialogflow đây là hai nền tảng đứng đầu trong danh sách ưu tiên hiện nay. Tuy nhiên, Rasa là nền tảng mã nguồn mở, là frameword duy nhất cho phép chatbot đối thoại tinh vi hơn, có tương tác, được huấn luyện dựa trên học có giám sát. Vì vậy nên tôi đã lựa chọn xây dựng bài toán trên nền tảng mã nguồn mở Rasa.
Bài toán “xây dựng hệ thống chatbot hỗ trợ quản lý bán hàng trên ứng dụng mã nguồn mở rasa” có chức năng trả lời những truy vấn của khách hàng về sản phẩm, dịch vụ của doanh nghiệp như:
- Tôi muốn biết giá sản phẩm?
- Thông tin của sản phẩm?
- Chương trình khuyến mại hôm nay là gì?
- Cửa hàng có bao nhiêu cơ sở? Sơ đồ phát triển bài toán:
Hình 21: Sơ đồ phát triển bài toán
Hệ thống Chatbot này hoạt động giúp cho doanh nghiệp cải thiện dịch vụ khách hàng, chăm sóc khách hàng, bán được sản phẩm và tăng lợi nhuận. Bên cạnh đó, hệ thống sẽ giúp cho các doanh nghiệp xây dựng các cuộc hội thoại theo lớp, theo ngữ cảnh và nhiều tương tác qua lại.
Phát biểu bài toán:
- Input: truy vấn của người dùng
- Output: phản hồi của bot Khi đó:
+ Thành phần NLU sẽ đảm nhiệm vai trò vecto hoá ngôn ngữ, xác định intent và trích xuất thông tin của người dùng.
Hình 23: Các bước xử lý trong NLU [5]
Để giải quyết câu hỏi trên, bộ phận NLU sẽ xử lý ngôn ngữ, sử dụng các thuât toán như tách từ Tokenizer, phân tích cú pháp, gán nhãn từ loại, nhận dạnh tên thực thể sau đó đối chiếu với tập dữ liệu đã được gán nhãn trước đó và đưa ra ý định của người dùng intent là “ask_gia_san_pham” và trích xuất thông tin entity với tên sản phẩm là “điện thoại S20” và giathanh là “giá sản phẩm”
+ Thành phần DM sẽ tiếp nhận thông tin về intent và entity ở trên để đưa ra xác định action xử lý cho câu đầu vào trên. Trong ví dụ này DM sẽ đưa ra action là “Action_utter_ask_gia_san_pham”.
# Configuration for Rasq NLU.
# https ://rasa. com/docs/rasa/nlu/components/
language: vi∣
+ Cuối cùng, thành phần NLG sẽ sinh ra câu trả lời dựa vào dữ liệu các mẫu câu template đã được xây dựng trước đó.
3.3. Ứng dụng rasa xây dựng chatbot
3.3.1. Các bước xây dựng Chatbot trên nền tảng ứng dụng Rasa
về cơ bản, Rasa có 2 thành phần chính quan trọng cấu thành là :
- Rasa NLU: có tác dụng xử lý thông tin, xác định intent và trích xuất thông tin của người dùng.
- Rasa Core: dự đoán hành động chatbot cần làm để trả lời người dùng. Ngoài ra, còn có Rasa X. Hiểu một cách đơn giản thì đây chính là giao diện
của toàn Rasa.
Các bước thực hiện khi xây dựng Chatbot trên nền tảng rasa:
Hình 24: Các bước xây dựng Chatbot trên rasa
- Khi tin nhắn của khách hàng được gửi đến, thông điệp được nhận và sẽ chuyển đến một Interpreter. Trong đó, bộ phận NLU sẽ xử lý thông điệp nhận được và chuyển đổi thông điệp đó thành một từ điển bao gồm : văn bản gốc,ý định và các thực thể.
- Tracker là đối tượng theo dõi trạng thái hội thoại. Nó nhận được thông báo rằng một tin nhắn mới đã đến.
- Policy sẽ nhận được trạng thái hiện tại của Tracker và ra quyết định chọn Action tiếp theo.
- Action được chọn sẽ được ghi lại bởi Tracker.
- Một tin nhắn phản hồi sẽ được gửi lại đến khách hàng.
Trên đây là toàn bộ quá trình xử lý của rasa, Rasa NLU sẽ lo phần 1, 2. Còn lại các phần 3, 4, 5, 6 sẽ do Rasa Core đảm nhiệm.
3.3.2. Xây dựng dữ liệu cho chatbot
Rasa đưa ra 2 phương pháp chính xây dựng dữ liệu trainning cho bot:
- Pretrained Embeddings (Intent_classifier_sklearn) : Việc phân loại ý định người dùng sẽ dựa trên các tập dữ liệu được lọc trước, sau đó được sử dụng để thể hiện từng từ trong thông điệp người dùng dưới dạng từ nhúng (word embedding) hay biểu diễn ngôn ngữ dưới dạng vector(word2vec). Các tập dữ liệu này có thể được cung cấp từ Spacy hoặc MITIE ...
- Supervised Embeddings (Intent_classifier_tensorflow_embedding): Nhúng được giám sát. Với phương pháp này thì người dùng sẽ phải tự xây dựng dữ liệu từ đầu do ko có dữ liệu đào tạo sẵn có. Nhưng với các bài toán trong một lĩnh vực nhỏ thì nó sẽ đảm bảo tính chính xác hơn nhiều và tránh dư thừa dữ liệu so với phương pháp ở trên.
Một số cấu hình trong Rasa mà tôi lựa chọn để training cho bot bao gồm từ việc phân tích câu, phân loại ý định(intent) đến trích chọn thông tin người dùng. như sau:
- name: CountVectorsFeaturizer - name: CountVectorsFeaturizer analyzer: "char.wb" min_ngram: 1 max_ngram: 4 - name: DIETClassifier epochs: 100 - name: EntitySynonymMapper - name: ResponseSeLector epochs: 100
# Configuration for Rasa Core. # https://rasa. com/docs/rasa/core/policies/ ^policies: - name: MemoizationPolicy - name: TEDPolicy max_history: 5 epochs: 10θ - name: MappingPolicy
Hình 25: Cấu hình cài đặt cho Rasa NLU
- Ngôn ngữ xử lý: tiếng việt
- Tokenize: WhitespaceTokenize - sử dụng khoảng trắng làm dấu phân cách
- Featurizer:
+ RegexFeaturize - tạo một đại diện vecto của thông điệp người dùng bằng cách sử dụng biểu thức thông thường.
+ CountVectorsFeaturizer - tạo đại diện cho các thông điệp, ý định và phản hồi người dùng
+ LexicalSyntacticFreaturize - tạo các tính năng từ vựng và cú pháp cho thông điệp người dùng để hỗ trợ trích xuất thực thể.
- Entity Extractors: EntitySynonymMapper - dữ liệu huấn luyện chứa các từ đồng nghĩa, các giá trị thực thể được phát hiện sẽ ánh xạ tới cùng một giá
trị.
- Selectors: ResponseSelector - sử dụng để xây dựng mô hình truy xuất phản hồi để dự đoán trực tiếp phản hồi bot từ một bộ phận phản hồi ứng viên.
- Kết hợp trích xuất thực thể và phân loại intent: DIETClassifier - biến thể thực thể kép (DIET: một kiến trúc để phân loại ý định và nhận dạng thực thể) được sử dụng để phân loại ý định và trích xuất thực thể.
Tuy nhiên, có thể thay thế các lựa chọn trên thành các lựa chọn khác trong pipeline nếu thấy nó đạt được hiệu quả hơn.
Hình 26: Cấu hình cài đặt cho Rasa Core
Các chính sách được cài đặt trong rasa core bao gồm:
- MemoizationPolicy: ghi nhớ các cuộc hội thoại được đào tạo rối dự đoán hành động tiếp theo.
- TEDPolicy: chính sách đối thoại máy biến áp (TED) có thể có được các đoạn đối thoại cho các bước tiếp theo.
## intent;ask_d_anh_sgch^cua_hang
^ danh sách nhũng của hàng cùa công ty
^ QPh9 ty có những cừa hàng nào
- cửa hàng của PPng ty ờ nhũng đâu
- sàn phẩm cùa Cpng ty bán tại những đâu
- đâu là nơi bán sàn phẩm của cộng ty
- Hà Nội có nhũng của hàng nào của CPnq ty
- các chỉ nhánh bán hàng cùa QPnq ty ờ ΓHà NoiHựjp.,,,⅛⅞e.ff>)
- các cửa hàng trên địa phân Γ H à n ộ1](dig diem ì
: entities: - dĩa dierr∣ - tên sản phẩm - tên event ÷slots: tên sản phẩm: type: text ten event: type: text > time: type: text , date: type: text y list-product: type: text giasp: type: text -, tensp:
- MappingPolicy: có thể sử dụng để trực tiếp ánh xạ ý định hành động tiếp theo.
Các bước thực hiện sau khi cài khi cài đặt cấu hình cho rasa là
Xây dựng ý định (intent)
_________i____________
Xây dựng entity (slot)
Xây dựng câu trá lời cho bot
____________i_____________
Xây dựng khung kịch bàn
Đào tạo cho bot
Test, phân tích cài tiến
Hình 27: Các bước xây dựng chatbot
a. Xây dựng ý định
Mỗi intent nên xây dựng nhiều cách nói khác nhau vì hệ thống bot sẽ tiếp cận với nhiều đối tượng khách hàng khác nhau. Tuỳ vào độ tuổi, ngành nghề, công việc mà các đối tượng khách hàng sẽ có những suy nghĩ và lời nói khác nhau.
Ví dụ bạn có ý định hỏi về chi nhánh của cửa hàng:
Hình 28: Xây dựng ý định người dùng
b. Xây dựng entity (slot)
Các thông tin được trích xuất từ ý định người dùng được gọi là các entity.
Hình 29: Danh sách các entity
Các thông tin được trích lọc trong các câu nói của người dùng được bot lưu lại trong bộ nhớ để sử dụng trong các action hay người dùng tránh việc hỏi lại thông tin từ phía người dùng được gọi là slot. Slot được sử dụng trong Rasa để giữ giá trị của một thực thể. Tương tự như một biến trong ngôn ngữ kịch bản.
yresponses:
>utter_btean:
P - text: "Rất xin lỗi bạn :(" P utter_greet:
- text: "Xin Chao. Chuc bạn một ngậy tốt Lanh. Tòi có thể giúp, gì cho bạn?"
P utter_ask_name:
- text: "Tôi là ChetbQt rasa"
P utter_bye:
- text: "Tạm bi⅞t bạn. Chuc bạn một ngày làm yir⅛c vui vẻ."
P utter_func_tist:
- text: llNhifein Vụ Chinh của tôi tà giải đáp những thắc mắc của bạn vè CQnq ty"
>utter_thank:
- text: "Khonq có gì. Đây tà n hi fem vụ của tồi"
P utter_ask_work_tỉme:
- text: "Sang bắt đẩu làm Vlfec từ 8h tói llh3θ, ChieU bắt đẩu từ 13h tói 17h3Θ "
>utter_ask_diagram:
- text: "link ảnh" P utter_ask_addres:
- text: "Sổ 1, Pham Văn BaCh, Yên Hòa, cầu Giấy"
>utter_ask_meal_time:
- text: "Từ llh3Θ tới 13h"
P utter_ask_danh_sach_cua_hang:
- text: "Chỉ nhánh 1 sổ 1, Cầu giấy; chí nhánh 2 số 2 Ianq; chi nhánh 3 số 3 .nguyễn Trãi1'
>utter_ask_tỉme:
- text: "Bây giò là {time}"
⅛ utter_ask_day:
- text: "Hôm nay tà {date}"
P utter_ask_danh_sach_san_pham:
Hình 30: Danh sách các slot
c. Xây dựng câu trả lời cho bot
Phải xây dựng cho bot một hệ thống các câu trả lời mẫu (template) cho các câu hỏi của người dùng.
utter.blean:
- text: "Rất xin lỗi bạn :("
utter_greet:
- text: "Xin Chao■ Chuc bạn một ngày tốt Ianh■ Tôi có thể giúp gì cho bạn?"
utter_ask_name:
- text: "Tôi là chatbot rasa"
utter-bye:
- text: "Tạm biêt bạn. Chúc bạn một ngày làm viêc vui vè."
utter_funC-list:
- text: "Nhiêm Vụ chính cùa tôi là qíạị đáp những thác mắc cùa bạn về còng ty"
utter_thank:
- text: "Không có gi. Đây là nhiêm Vụ của tôi"
class ActionGetListProduct(Action):
def name(self) -> Text:
return "action_utter_ask_danh_sach_san_pham" def run(
self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
) -> List[Dict[Text, Any]]:
sql = qet,sql("sanpham". "")
list_product = service.get_list(sql)
return [SLotSet("list_product", get_list(list_product, "tensp,))1
class ActionGetpriceProduct(Action):
def name(self) -> Text:
return "action_utter_ask_qia_san_pham"
def run(
self, dispatcher, tracker: Tracker, domain: Dict[Te×t, Any]
Hình 31:Các mẫu câu trả lời (template) cho bot
Tuy nhiên, ta cũng có thể xây dựng câu trả lời cho bot thông qua action. Hành động là những thứ bot chạy để đáp ứng yêu cầu của người dùng. Đây là thành phần cung cấp thông tin trả lời người dùng dựa vào các intent, entity, slot và các dữ liệu lấy từ hệ thống khác qua API.
Có 3 loại hành động trong rasa core:
- Defaul actions: các hành động như lắng nghe người dùng, restart lại hội thoại hoặc trả lời mặc định khi không phân loại được ý định của người dùng.
utter_default:
Hình 32: Mẫu câu trả lời mặc định khi bot không hiểu intent người dùng
- Utter actions: tập các template mẫu xây dựng cho bot
Hình 33: Mau câu trả lời xây dựng cho bot
- Custom actions: Khi tập các câu trả lời mẫu không đáp ứng được câu hỏi của người dùng cần kết quả từ nguồn dữ liệu khác thì action tuỳ biến được sử dụng, nó sẽ chỉ đến một hàm trong lớp action (python).
## cháo - hói danh sách sán Pham - cháo * greet - utter.greet * ask_danh_sach_san_pham - action_utter_ask_danh_sach_san_pham - utter_ask_danh_sach_san_pham