Sunday, August 13, 2017

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


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ình 1. Kiến trúc của hệ thống phân lớp intent
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.
  1. Ad ơi, sao mạng nhà em dạo này chậm thế?
  2. 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)
Hình 2: Gán nhãn từ theo mô hình B-I-O trong trích xuất thông tin
Đầ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.
Hình 3: Minh hoạ quản lý hội thoại theo mô hình máy trạng thái hữu hạn FSA
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.
Hình 4: Frame cho chatbot hỏi thông tin khách hàng cho tình huống mạng chậm
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
  1. 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
  2. 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/
  3. Michael Collins. Hidden Markov models and tagging (sequence labeling) problems. http://www.cs.columbia.edu/~mcollins/hmms-spring2013.pdf
  4. Michael Collins. Log-Linear Models, MEMMs, and CRFs. http://www.cs.columbia.edu/~mcollins/crf.pdf
  5. Taku Kudo. CRF++: Yet Another CRF toolkit. https://taku910.github.io/crfpp/
  6. Naoaki Okazaki. CRFsuite: A fast implementation of Conditional Random Fields (CRFs). http://www.chokkan.org/software/crfsuite/
  7. Mallet toolkit: http://mallet.cs.umass.edu/
  8. Zhiheng Huang, Wei Xu, Kai Yu. 2015. Bidirectional LSTM-CRF Models for Sequence Tagging. On arxiv, https://arxiv.org/abs/1508.01991
  9. 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
  10. 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