Các
hệ thống chatbot giao tiếp với con người bằng giọng nói (như Siri) hoặc
bằng văn bản (như các chatbot phát triển trên nền Facebook Messenger).
Dù giao tiếp bằng hình thức nào, chatbot cũng cần phải hiểu văn bản để
có thể đưa ra những câu trả lời phù hợp cho khách hàng. Thành phần đảm
nhiệm công việc này trong hệ thống chatbot được gọi là NLU (Natural
Language Understanding), trong đó có rất nhiều các kĩ thuật xử lý ngôn
ngữ tự nhiên (Natural Language Processing, viết tắt là NLP) được áp
dụng.
Trong bài viết
này, người viết giới thiệu 3 vấn đề NLP cơ bản khi phát triển một hệ
thống chatbot và một số phương pháp giải quyết điển hình. Người viết tập
trung vào các chatbot được sử dụng trong miền ứng dụng đóng (closed
domain) và trả lời theo mô hình truy xuất thông tin (retrieval-based
model). Mô hình truy xuất thông tin là mô hình trong đó, chatbot đưa ra
những phản hồi được chuẩn bị trước hoặc tuân theo những mô thức nhất
định. Mô hình này khác với mô hình tự động sinh câu trả lời
(generative), trong đó câu trả lời của chatbot được tự động sinh ra bằng
việc học từ một tập dữ liệu các đoạn hội thoại (tham khảo tài liệu
[1]). Các hệ thống chatbot được triển khai trong thực tế phần lớn tuân
theo mô hình truy xuất thông tin và được áp dụng trong những miền ứng
dụng nhất định.
Ba vấn đề NLP được
giới thiệu trong bài bao gồm: 1) Xác định/Phân loại ý định người dùng
(intent classification hay intent detection); 2) Trích xuất thông tin
(information extraction); và 3) Quản lý hội thoại (Dialog management).
Cuối cùng, chúng tôi cũng nêu ra những thách thức khi phát triển hệ
thống chatbot và những giới hạn của công nghệ hiện tại.
1. Xác định ý định người dùng
Thông
thường, người dùng thường truy cập hệ thống chatbot với mong muốn hệ
thống sẽ đưa ra những hành động trợ giúp mình về một vấn đề nào đó. Ví
dụ, người dùng của hệ thống chatbot hỗ trợ đặt vé máy bay có thể đưa ra
yêu cầu đặt vé của mình khi bắt đầu cuộc hội thoại. Để đưa ra hỗ trợ
được chính xác, chatbot cần xác định được ý định (intent) đó của người
dùng. Việc xác định ý định của người dùng sẽ quyết định hội thoại tiếp
theo giữa người và chatbot sẽ diễn ra như thế nào. Vì thế, nếu xác định
sai ý định người dùng, chatbot sẽ đưa ra những phản hồi không đúng,
không hợp ngữ cảnh. Khi đó, người dùng có thể thấy chán ghét và không
quay lại sử dụng hệ thống. Bài toán xác định ý định người dùng vì thế
đóng vai trò rất quan trọng trong hệ thống chatbot.
Đối
với miền ứng dụng đóng, chúng ta có thể giới hạn rằng số lượng ý định
của người dùng nằm trong một tập hữu hạn những intent đã được định nghĩa
sẵn, có liên quan đến những nghiệp vụ doanh nghiệp mà chatbot có thể hỗ
trợ. Với giới hạn này, bài toán xác định ý định người dùng có thể quy
về bài toán phân lớp văn bản. Với đầu vào là một câu giao tiếp của người
dùng, hệ thống phân lớp sẽ xác định intent tương ứng với câu đó trong
tập các intent đã được định nghĩa.
Để
xây dựng một mô hình phân lớp intent, chúng ta cần một tập dữ liệu huấn
luyện bao gồm các cách diễn đạt khác nhau cho mỗi intent. Ví dụ, cùng
một mục đích hỏi về thời tiết ở Hà Nội trong ngày hôm nay, người dùng có
thể dùng những cách diễn đạt sau:
- Thời tiết hôm nay ở Hà Nội thế nào ad?
- Hà Nội hôm nay có mưa không vậy?
- Hà Nội hôm nay bao nhiêu độ vậy?
- Cho mình hỏi, ra ngoài đường hôm nay có phải mang áo mưa không?
Có
thể nói, bước tạo dữ liệu huấn luyện cho bài toán phân lớp intent là
một trong những công việc quan trọng nhất khi phát triển hệ thống
chatbot và ảnh hưởng lớn tới chất lượng sản phẩm của hệ thống chatbot về
sau. Công việc này cũng đòi hỏi thời gian, công sức khá lớn của nhà
phát triển chatbot.
Mô hình học máy cho bài toán phân lớp ý định người dùng
Khi
đã có dữ liệu huấn luyện cho bài toán phân lớp intent, chúng ta sẽ mô
hình bài toán thành bài toán phân lớp văn bản. Bài toán phân lớp văn bản
(text categorization) là một bài toán kinh điển trong ngành NLP và khai
phá văn bản (Text Mining). Mô hình phân lớp văn bản cho bài toán phân
lớp intent được phát biểu một cách hình thức như sau:
Chúng ta được cho trước một tập huấn luyện bao gồm các cặp (câu hội thoại, intent), D = {(x(1), y(1)),…, (x(n), y(n))}, trong đó x(i) là các câu hội thoại và y(i) là intent tương ứng cho x(i). Các intent y(i) nằm trong một tập hữu hạn Κ
các intent được định nghĩa trước. Chúng ta cần học từ tập huấn luyện
này một mô hình phân lớp Θ có chức năng phân lớp một câu hội thoại mới
vào một trong các intent thuộc tập K. Kiến trúc của hệ thống phân lớp intent được minh hoạ trong hình 1.
Hệ thống phân lớp intent có một số thành phần cơ bản:
- Tiền xử lý dữ liệu
- Trích xuất đặc trưng
- Huấn luyện mô hình
- Phân lớp
Trong
bước tiền xử lý dữ liệu, chúng ta sẽ thực hiện các thao tác “làm sạch”
dữ liệu như: loại bỏ các thông tin dư thừa, chuẩn hoá dữ liệu như chuyển
các từ viết sai chính tả thành đúng chính tả, chuẩn hoá các từ viết
tắt,… Việc tiền xử lý dữ liệu có vai trò quan trọng trong hệ thống
chatbot do đặc thù của ngôn ngữ chat, nói: viết tắt, sai chính tả, hay
dùng “teencode”.
Sau khi tiền xử lý dữ
liệu và thu được dữ liệu đã được làm sạch, chúng ta sẽ trích xuất những
đặc trưng từ dữ liệu này. Trong học máy, bước này được gọi là trích
xuất đặc trưng (feature extraction hay feature engineering). Trong mô
hình học máy truyền thống (trước khi mô hình học sâu được áp dụng rộng
rãi), bước trích xuất đặc trưng ảnh hưởng lớn đến độ chính xác của mô
hình phân lớp. Để trích xuất được những đặc trưng tốt, chúng ta cần phân
tích dữ liệu khá tỉ mỉ và cần cả những tri thức chuyên gia trong từng
miền ứng dụng cụ thể.
Bước huấn luyện
mô hình nhận đầu vào là các đặc trưng đã được trích xuất và áp dụng các
thuật toán học máy để học ra một mô hình phân lớp. Các mô hình phân lớp
có thể là các luật phân lớp (nếu sử dụng decision tree) hoặc là các
vector trọng số tương ứng với các đặc trưng được trích xuất (như trong
các mô hình logistic regression, SVM, hay mạng Neural).
Sau
khi có một mô hình phân lớp intent, chúng ta có thể sử dụng nó để phân
lớp một câu hội thoại mới. Câu hội thoại này cũng đi qua các bước tiền
xử lý và trích xuất đặc trưng, sau đó mô hình phân lớp sẽ xác định “điểm
số” cho từng intent trong tập các intent và đưa ra intent có điểm cao
nhất.
Mô hình dựa trên đối sánh nội dung
Mô
hình phân lớp intent dựa trên học máy thống kê yêu cầu dữ liệu huấn
luyện bao gồm các cách diễn đạt khác nhau cho mỗi intent. Dữ liệu huấn
luyện này thông thường được chuẩn bị một cách thủ công. Bước chuẩn bị dữ
liệu này tốn khá nhiều thời gian và công sức, đặc biệt là trong các ứng
dụng mà số lượng intent tương đối lớn.
Một
cách tiếp cận có thể giảm công sức chuẩn bị dữ liệu huấn luyện là sử
dụng mô hình đối sánh thông tin (content matching). Trong cách tiếp cận
này, chúng ta vẫn cần chuẩn bị dữ liệu, trong đó mỗi intent có ít nhất
một câu hỏi tương ứng. Với một câu hội thoại cho trước, chúng ta sẽ áp
dụng thuật toán đối sánh thông tin để đối sánh với từng câu hỏi trong
tập dữ liệu. Câu trả lời cho câu hỏi có nội dung gần nhất với câu đầu
vào sẽ được đưa ra. Trong ứng dụng thực tế, chúng ta có thể đưa ra danh
sách (ví dụ top 3) các câu gần nhất để người dùng lựa chọn.
Phương
pháp đối sánh thông tin khá thích hợp cho các hệ thống chatbot phục vụ
cho công việc trả lời các câu hỏi thường gặp (FAQ). Chúng ta có thể tận
dụng dữ liệu FAQ sẵn có để tạo ngay một FAQ chatbot bằng phương pháp
đối sánh nội dung mà không cần tạo dữ liệu huấn luyện như trong mô hình
học máy thống kê.
Một trong những
thách thức của mô hình đối sánh nội dung là việc xử lý những cách diễn
đạt khác nhau cho cùng một câu hỏi yêu cầu những luật phải chuẩn bị bằng
tay. Vì số lượng mẫu cho mỗi intent không nhiều, mô hình đối sánh sẽ
phải sử dụng các luật hoặc tài nguyên ngữ nghĩa để xử lý những biến thể
khác nhau khi diễn đạt một từ, một cụm từ, hay một ý trong câu. Các câu
1) và 2) trong ví dụ dưới đây sử dụng các cách diễn đạt khác nhau cho
cùng một câu hỏi của khách hàng của một công ty viễn thông về tình trạng
mạng chậm.
- Ad ơi, sao mạng nhà em dạo này chậm thế?
- Mạng lag lắm, dùng rất ức chế.
Trong
ví dụ ở trên, nếu dùng mô hình đối sánh thông tin, hệ thống cần nhận ra
từ “chậm” và “lag” (ngôn ngữ được dùng trên mạng) mang cùng ý nghĩa.
Hiện
nay các tài nguyên ngữ nghĩa cho xử lý ngôn ngữ tiếng Việt còn chưa đầy
đủ, nên cách tiếp cận dựa trên mô hình học máy thống kê hoặc mô hình
lai (hybrid model) – kết hợp cả học máy thống kê và đối sánh thông tin
có thể thích hợp hơn cho các chatbot tiếng Việt.
2. Trích xuất thông tin
Bên
cạnh việc xác định intent trong câu hội thoại của người dùng, chúng ta
cần trích xuất các thông tin cần thiết trong đó. Các thông tin cần trích
xuất trong một câu hội thoại thường là các thực thể thuộc về một loại
nào đó. Ví dụ, khi một khách hàng muốn đặt vé máy bay, hệ thống cần biết
địa điểm xuất phát và địa điểm khách muốn đến, ngày giờ khách hàng muốn
bay,…Thành phần NLU của các hệ thống chatbot thường hỗ trợ các loại
thực thể sau (tham khảo tài liệu [2]):
- Vị trí (Location)
- Thời gian (Datetime)
- Số (Number)
- Địa chỉ liên lạc (Contact)
- Khoảng cách (Distance)
- Khoảng thời gian (Duration)
Đầu
vào của một module trích xuất thông tin là một câu hội thoại. Module
trích xuất thông tin cần xác định vị trí của các thực thể trong câu (vị
trí bắt đầu vàvị trí kết thúc của thực thể). Ví dụ sau minh hoạ một câu
hội thoại và các thực thể được trích xuất từ đó.
- Câu hội thoại: Tôi muốn đặt vé máy bay đi Phú Quốc từ sân bay Nội Bài lúc 8 giờ tối ngày mai.
- Câu có các thực thể được xác định: Tôi muốn đặt vé máy bay đi [Phú Quốc]LOCATION từ sân bay [Nội Bài]LOCATION lúc [8 giờ tối ngày mai]TIME.
Trong câu trên có 3 thực thể (nằm trong các dấu [ ]) với các loại thực thể tương ứng (được viết với font chữ nhỏ hơn ở dưới).
Cách
tiếp cận phổ biến cho bài toán trích xuất thông tin là mô hình hoá bài
toán thành bài toán gán nhãn chuỗi (sequence labeling). Đầu vào của bài
toán gán nhãn chuỗi là một dãy các từ, và đầu ra là một dãy các nhãn
tương ứng các các từ trong đầu vào. Chúng ta sẽ sử dụng các mô hình học
máy để học một mô hình gán nhãn từ một tập dữ liệu đầu vào bao gồm các
cặp (x1…xn, y1…yn), trong đó x1…xn là dãy các từ, y1…yn là dãy các nhãn. Độ dài của các dãy từ trong tập dữ liệu có thể khác nhau.
Trong
bài toán trích xuất thông tin, tập nhãn cho các từ trong câu đầu vào
thường được tạo ra theo mô hình BIO, với B là viết tắt của “Beginning”,
I là viết tắt của “Inside”, và O là viết tắt của “Outside”. Khi biết vị
trí từ bắt đầu của một thực thể và các từ nằm trong thực thể đó, chúng
ta có thể xác định vị trí của thực thể trong câu. Trong ví dụ ở trên,
dãy các nhãn tương ứng với dãy của các từ trong câu hội thoại đầu vào
được minh hoạ ở hình 2.
Thuật toán
huấn luyện mô hình gán nhãn chuỗi phổ biến là mô hình Markov ẩn (HMM –
Hidden Markov Models) [3], mô hình CRF (Conditional Random Fields) [4].
Với dữ liệu văn bản, mô hình CRF thường cho kết quả tốt hơn mô hình HMM.
Có khá nhiều các công cụ mã nguồn mở cài đặt mô hình CRF cho bài toán
gán nhãn chuỗi như CRF++ [5], CRF Suite [6], Mallet [7],…
Gần
đây, các mô hình mạng neural hồi quy (Recurrent Neural Networks) được
áp dụng khá nhiều cho bài toán gán nhãn chuỗi. Mô hình mạng neural hồi
quy tỏ ra hiệu quả với dữ liệu dạng chuỗi vì nó mô hình mối quan hệ phụ
thuộc giữa các từ trong câu. Ví dụ, mạng neural hồi quy được áp dụng cho
bài toán gán nhán từ loại (POS Tagging), bài toán xác định thực thể tên
gọi [8].
3. Quản lý hội thoại
Trong
các phiên trao đổi dài (long conversation) giữa người và chatbot,
chatbot sẽ cần ghi nhớ những thông tin về ngữ cảnh (context) hay quản lý
các trạng thái hội thoại (dialog state). Vấn đề quản lý hội thoại
(dialoge management) khi đó là quan trọng để đảm bảo việc trao đổi giữa
người và máy là thông suốt.
Chức năng
của thành phần quản lý hội thoại là nhận đầu vào từ thành phần NLU, quản
lý các trạng thái hội thoại (dialogue state), ngữ cảnh hội thoại
(dialogue context), và truyền đầu ra cho thành phần sinh ngôn ngữ
(Natural Language Generation, viết tắt là NLG). Ví dụ module quản lý
dialogue trong một chatbot phục vụ đặt vé máy bay cần biết khi nào người
dùng đã cung cấp đủ thông tin cho việc đặt vé để tạo một ticket tới hệ
thống hoặc khi nào cần phải xác nhận lại thông tin do người dùng đưa
vào. Hiện nay, các sản phẩm chatbot thường dùng mô hình máy trạng thái
hữu hạn (Finite State Automata – FSA), mô hình Frame-based (Slot
Filling), hoặc kết hợp hai mô hình này.
FSA
là mô hình quản lý hội thoại đơn giản nhất. Ví dụ, hãy tưởng tượng một
hệ thống chăm sóc khách hàng của một công ty viễn thông, phục vụ cho
những khách hàng than phiền về vấn đề mạng chậm. Nhiệm vụ của chatbot là
hỏi tên khách hàng, số điện thoại, tên gói Internet khách hàng đang
dùng, tốc độ Internet thực tế của khách hàng. Hình vẽ 3 minh hoạ một mô
hình quản lý hội thoại cho chatbot chăm sóc khách hàng. Các trạng thái
của FSA tương ứng với các câu hỏi mà dialogue manager hỏi người dùng.
Các cung nối giữa các trạng thái tương ứng với các hành động của chatbot
sẽ thực hiện. Các hành động này phụ thuộc phản hồi của người dùng cho
các câu hỏi. Trong mô hình FSA, chatbot là phía định hướng người sử dụng
trong cuộc hội thoại.
Ưu điểm của mô
hình FSA là đơn giản và chatbot sẽ định trước dạng câu trả lời mong muốn
từ phía người dùng. Tuy nhiên, mô hình FSA không thực sự phù hợp cho
các hệ thống chatbot phức tạp hoặc khi người dùng đưa ra nhiều thông tin
khác nhau trong cùng một câu hội thoại. Trong ví dụ chatbot ở trên, khi
người dùng đồng thời cung cấp cả tên và số điện thoại, nếu chatbot tiếp
tục hỏi số điện thoại, người dùng có thể cảm thấy khó chịu.
Mô
hình Frame-based (hoặc tên khác là Form-based) có thể giải quyết vấn đề
mà mô hình FSA gặp phải. Mô hình Frame-based dựa trên các frame định
sẵn để định hướng cuộc hội thoại. Mỗi frame sẽ bao gồm các thông tin
(slot) cần điền và các câu hỏi tương ứng mà dialogue manager hỏi người
dùng. Mô hình này cho phép người dùng điền thông tin vào nhiều slot khác
nhau trong frame. Hình vẽ 4 là một ví dụ về một frame cho chatbot ở
trên.
Thành
phần quản lý dialogue theo mô hình Frame-based sẽ đưa ra câu hỏi cho
khách hàng, điền thông tin vào các slot dựa trên thông tin khách hàng
cung cấp cho đến khi có đủ thông tin cần thiết. Khi người dùng trả lời
nhiều câu hỏi cùng lúc, hệ thống sẽ phải điền vào các slot tương ứng và
ghi nhớ để không hỏi lại những câu hỏi đã có câu trả lời.
Trong
các miền ứng dụng phức tạp, một cuộc hội thoại có thể có nhiều frame
khác nhau. Vấn đề đặt ra cho người phát triển chatbot khi đó là làm sao
để biết khi nào cần chuyển đổi giữa các frame. Cách tiếp cận thường dùng
để quản lý việc chuyển điều khiển giữa các frame là định nghĩa các luật
(production rule). Các luật này dựa trên một số các thành tố như câu
hội thoại hoặc câu hỏi gần nhất mà người dùng đưa ra.
Những thách thức
Mặc
dù lĩnh vực NLP và Machine Learning đã và đang có rất nhiều bước tiến
mạnh mẽ, trong phát triển chatbot, vẫn còn tồn tại nhiều thách thức mà
các nhà nghiên cứu xử lý ngôn ngữ tự nhiên và học máy cần vượt qua.
Chúng tôi liệt kê hai vấn đề ở dưới đây.
Vấn
đề thứ nhất là vấn đề đồng tham chiếu (coreference). Trong nói và viết,
thông thường chúng ta thường dùng những cách gọi rút gọn cho những đối
tượng mà chúng ta đã đề cập trước đó. Ví dụ trong tiếng Anh, người nói
và viết có thể dùng các đại từ như “it”, “they”, “he”,… Nếu không có
thông tin ngữ cảnh và bộ phân tích đồng tham chiếu, sẽ là rất khó để
chatbot biết các từ này tham chiếu đến đối tượng nào. Việc không xác
định được đúng đối tượng mà từ thay thế tham chiếu đến có thể khiến
chatbot hiểu không chính xác câu hội thoại của người dùng. Thách thức
này là khá rõ ràng trong các đoạn hội thoại dài.
Vấn
đề thứ hai là làm sao để giảm bớt công sức làm dữ liệu khi phát triển
chatbot. Theo những cách tiếp cận ở trên, khi phát triển một ứng dụng
chatbot, nhà phát triển cần gán nhãn dữ liệu huấn luyện cho bộ phân lớp
intent và nhận dạng thực thể tên gọi. Trong những miền ứng dụng phức tạp
(chẳng hạn như y tế), công sức để tạo ra những bộ dữ liệu đó là khá đắt
đỏ. Vì thế, việc phát triển các phương pháp để tận dụng những nguồn dữ
liệu sẵn có trong doanh nghiệp để giảm lượng dữ liệu cần gán nhãn, trong
khi vẫn đảm bảo được độ chính xác của các mô hình xử lý ngôn ngữ tự
nhiên là cần thiết.
Lời kết
Trong
bài viết này, chúng tôi đã giới thiệu ba vấn đề NLP cơ bản trong phát
triển hệ thống chatbot trong miền ứng dụng đóng và theo mô hình truy
xuất thông tin. Trong khuôn khổ của một bài viết, chúng tôi không thể
cung cấp thông tin chi tiết hơn về các mô hình được đề cập và các cách
tiếp cận mới hơn trong phát triển chatbot (chẳng hạn cách tiếp cận sinh
hội thoại theo mô hình mạng neural – sequence to sequence [9]). Bạn đọc
quan tâm có thể đọc thêm các tài liệu trong mục tài liệu tham khảo.
Tài liệu tham khảo
- Stefan Kojouharov. “Ultimate Guide to Leveraging NLP & Machine Learning for your Chatbot”. On Chatbotlife. https://chatbotslife.com/ultimate-guide-to-leveraging-nlp-machine-learning-for-you-chatbot-531ff2dd870c#.rabx346bq
- Pavlo Bashmakov. Advanced Natural Language Processing Tools for Bot Makers – LUIS, Wit.ai, Api.ai and others (UPDATED). https://stanfy.com/blog/advanced-natural-language-processing-tools-for-bot-makers/
- Michael Collins. Hidden Markov models and tagging (sequence labeling) problems. http://www.cs.columbia.edu/~mcollins/hmms-spring2013.pdf
- Michael Collins. Log-Linear Models, MEMMs, and CRFs. http://www.cs.columbia.edu/~mcollins/crf.pdf
- Taku Kudo. CRF++: Yet Another CRF toolkit. https://taku910.github.io/crfpp/
- Naoaki Okazaki. CRFsuite: A fast implementation of Conditional Random Fields (CRFs). http://www.chokkan.org/software/crfsuite/
- Mallet toolkit: http://mallet.cs.umass.edu/
- Zhiheng Huang, Wei Xu, Kai Yu. 2015. Bidirectional LSTM-CRF Models for Sequence Tagging. On arxiv, https://arxiv.org/abs/1508.01991
- Iulian V. Serban, Alessandro Sordoni, Yoshua Bengio, Aaron Courville, Joelle Pineau. Building End-To-End Dialogue Systems Using Generative Hierarchical Neural Network Models. On arxiv, https://arxiv.org/abs/1507.04808
- Jurafsky, D., & Martin, J. H. Speech and Language Processing: An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition. Chapter 24. “Dialogue and Conversational Agents”.
Phạm Quang Nhật Minh – FTRI
No comments:
Post a Comment