Phạm vi đề tài: trong hệ thống, tiếng Anh sử dụng làm ngôn ngữ trao đổi giữa người dùng và chatbot. Dựa vào chức năng phân loại ý định để biết nhu cầu cơ bản của người dùng. Phân tích ngữ nghĩa để trích xuất nội dung cần tìm kiếm liên quan đến nhà hàng như tên, địa chỉ, món ăn, rating (min, max, trung bình) hay số lượng nhà hàng, ..
GIỚI THIỆU CHUNG
Đặt vấn đề
Trong thời đại hiện nay, thương mại điện tử ngày càng nắm giữ vai trò quan trọng, là xu hướng tất yếu trong đời sống xã hội của con người
Với sự cạnh tranh gay gắt như hiện nay, các doanh nghiệp luôn muốn tìm ra giải pháp mới để tự động hóa công việc cũng như giảm tải nhân sự để có thể tiết kiệm chi phí mà vẫn mang lại hiệu quả tối đa Chatbot ra đời như một giải pháp đột phá thay thế những công việc đơn giản nhưng phải lặp đi lặp lại, nhờ vào tính hiệu quả ưu việt, chatbot được đón nhận rộng rãi và đang trở thành yếu tố chủ chốt trong nhiều mô hình kinh doanh
Mặc dù còn mới mẻ, nhưng cùng với những bước đột phá trong lĩnh vực xử lý ngôn ngữ tự nhiên gần đây, thì tốc độ nghiên cứu và phát triển chatbot vẫn đang là khá nhanh và cũng đã đạt được một số thành tựu nhất định.
Mục đích và phạm vi đề tài
Mục đích chính của đồ án này là tìm hiểu về xử lý ngôn ngữ tự nhiên Áp dụng, xây dựng hệ thống chatbot để trả lời cho những câu hỏi tìm kiếm thông tin đơn giản về nhà hàng
Phạm vi đề tài: trong hệ thống, tiếng Anh sử dụng làm ngôn ngữ trao đổi giữa người dùng và chatbot Dựa vào chức năng phân loại ý định để biết nhu cầu cơ bản của người dùng Phân tích ngữ nghĩa để trích xuất nội dung cần tìm kiếm liên quan đến nhà hàng như tên, địa chỉ, món ăn, rating (min, max, trung bình) hay số lượng nhà hàng,
Bố cục đồ án
Nội dung đồ án gồm 5 chương:
Chương mở đầu đặt ra vấn đề, xác định mục tiêu và phạm vi của đề tài.
CƠ SỞ LÝ THUYẾT
Một số khái niệm liên quan
Contextual (Ngữ cảnh): là ngữ cảnh của từ Một từ được định nghĩa bởi một cách phát âm nhưng khi được đặt trong những câu khác nhau thì có thể mang ngữ nghĩa khác nhau Ngữ cảnh có thể coi là môi trường xung quanh từ để góp phần định nghĩa từ
Câu 1: Con ngựa đá con bò
Câu 2: Hòn đá này rất nặng
Thì từ “đá” trong câu A (động từ) và B (danh từ) có ý nghĩa khác nhau Chúng ta biết điều này vì dựa vào ngữ cảnh của từ
Downstream task (Nhiệm vụ hạ lưu): là những tác vụ supervised-learning được cải thiện dựa trên những pretrained model
Ví dụ: Sử dụng lại các biểu diễn của từ học được từ những pre-trained model trên bộ văn bản lớn vào một tác vụ phân tích ý định của người dùng, huấn luyện trên bộ văn bản có kích thước nhỏ hơn Áp dụng pretrain-embedding đã giúp cải thiện mô hình Như vậy tác vụ sử dụng pre train-embedding được gọi là downstream task
Hyperparameter (Siêu tham số): trong học máy, siêu tham số là một tham số có giá trị được sử dụng để kiểm soát quá trình học Ngược lại, các giá trị của các tham số khác có được thông qua đào tạo
Token (Từ tố): là một dãy các ký tự mang ý nghĩa cụ thể, biểu thị cho một đơn vị ngữ nghĩa trong xử lý ngôn ngữ Nhiều khi token được hiểu là một từ mặc dù cách hiểu này không hoàn toàn chính xác Ví dụ: trong tiếng Anh các từ thường được phân tách bằng dấu cách, tuy nhiên từ New York vẫn chỉ được coi là một từ mặc dù nó có dấu cách ở giữa
Tokenization: là quá trình chuyển một dãy các ký tự thành một dãy các token Trong Xử lý ngôn ngữ tự nhiên, Tokenization là bước cơ bản và là bước đầu tiên cần thực hiện trước khi có thể tiến hành việc phân tích sâu hơn Kết quả của quá trình Tokenization chính là đầu vào cho các quá trình xử lý tiếp theo như xác định Part of Speech, Lemma, Named Entity Recognition, …
SOTA (State of the Art): là những phương pháp, kỹ thuật tốt nhất, hiện đại nhất mang lại hiệu quả cao nhất của một công nghệ, một lĩnh vực khoa học, hoặc một thiết kế nào đó đạt được từ trước đến thời điểm được công bố
Task: nhiệm vụ, tác vụ
Pre-training: đào tạo máy móc, trước khi chúng bắt đầu thực hiện một nhiệm vụ cụ thể
Pre-train model: là mô hình đã được đào tạo trước Thay vì xây dựng mô hình từ đầu để giải quyết vấn đề tương tự, bạn sử dụng mô hình được đào tạo về vấn đề khác làm điểm khởi đầu
Fine-tuning: nghĩa là sử dụng một mô hình đã được đào tạo tốt để tiếp tục thực hiện một nhiệm vụ tương tự bằng cách điều chỉnh nó một chút
MLM (Masked Language Model): là mô hình mà bối cảnh của từ được học từ cả 2 phía bên trái và bên phải cùng một lúc từ những bộ dữ liệu unsupervised text Dữ liệu input sẽ được masked (tức thay bằng một token MASK) một cách ngẫu nhiên với tỷ lệ thấp Huấn luyện mô hình dự báo từ được masked dựa trên bối cảnh xung quanh là những từ không được masked nhằm tìm ra biểu diễn của từ
WordPiece: là kỹ thuật phân đoạn các từ thành cấp độ từ phụ (subword) trong nhiệm vụ NLP Nó được sử dụng trong các mô hình như BERT, mặc dù về nguyên tắc có thể được sử dụng cho nhiều mô hình NLP Nó tạo ra một bộ từ vựng có kích thước cố định do người dùng chỉ định cho các tác vụ NLP kết hợp cả từ và từ phụ
Ví dụ: running → run + ##ing
Embedding: nhúng là một kỹ thuật biểu diễn biến rời rạc từ một không gian phức tạp nhiều chiều sang dạng các vector có giá trị thực trong không gian có số chiều thấp hơn
NLP (Natural language processing): xử lý ngôn ngữ tự nhiên là một nhánh của trí tuệ nhân tạo giúp máy tính hiểu, giải thích và vận dụng ngôn ngữ của con người
NLU (Natural Language Understanding): là phương pháp giúp các hệ thống máy tính như chatbot hiểu được các mệnh lệnh của người dùng mà không dựa trên bất kỳ ngôn ngữ, cấu trúc nào được định nghĩa sẵn trong hệ thống
NLG (Natural Language Generation): là một quá trình phần mềm biến đổi dữ liệu có cấu trúc thành ngôn ngữ tự nhiên
NER (Named Entity Recognition): còn được gọi là nhận dạng thực thể, phân đoạn thực thể hoặc trích xuất thực thể, là tác vụ cơ bản trong lĩnh vực Xử lý ngôn ngữ tự nhiên Vai trò chính của tác vụ này là nhận dạng các cụm từ trong văn bản và phân loại chúng vào trong các nhóm đã được định trước như tên người, tổ chức, địa điểm, thời gian, loại sản phẩm, nhãn hiệu,
GLUE score benchmark (Điểm khái quát đánh giá mức độ hiểu ngôn ngữ): GLUE score benchmark là một tập hợp các chỉ số được xây dựng để đánh
5 giá, phân tích khái quát mức độ hiểu ngôn ngữ của các model NLP Các đánh giá được thực hiện trên các bộ dữ liệu tiêu chuẩn được quy định tại các quy ước về phát triển và thúc đẩy NLP Mỗi bộ dữ liệu tương ứng với một loại tác vụ NLP như: Phân tích cảm xúc (Sentiment Analysis), hỏi và đáp (Question and Answering), dự đoán câu tiếp theo (NSP - Next Sentence Prediction), nhận diện thực thể trong câu (NER - Named Entity Recognition), suy luận ngôn ngữ tự nhiên (NLI - Natural Language Inference)
RNN (Recurrent neural network): Mạng hồi quy
LSTM (Long short-term memory): Mạng bộ nhớ dài-ngắn là một dạng đặc biệt của RNN, nó có khả năng học được các phụ thuộc xa.
Chatbot và phương hướng tiếp cận
Chatbot là một ứng dụng phần mềm, chương trình máy tính dùng để tương tác trực tiếp với người dùng thông qua ngôn ngữ tự nhiên dưới dạng văn bản hoặc âm thanh
Sự ra đời của chatbot là một cách mạng hóa tương tác giữa khách hàng và người cung cấp dịch vụ Với khả năng bắt chước các cuộc hội thoại và cung cấp kết nối kỹ thuật số ngay lập tức, giúp tiết kiệm thời gian, chi phí, tăng sự hài lòng của khách hàng Không khó để các doanh nghiệp có thể nhận ra sự tích cực mà chatbot đem lại Trên thực tế, Gartner dự đoán rằng vào năm 2021, hơn 50% doanh nghiệp sẽ chi nhiều hơn cho việc tạo bot và chatbot hàng năm so với phát triển ứng dụng di động truyền thống
Bên cạnh đó, AI và Machine learning trở thành một trong những công nghệ được đầu tư mạnh nhất trong vài năm trở lại đây giúp cho việc xử lý ngôn ngữ tự nhiên trở nên đơn giản và chính xác hơn rất nhiều
Các doanh nghiệp, không phân biệt ngành nghề đang tận dụng tối đa sự hỗ trợ từ việc sử dụng chatbot Ngoài việc chatbot hoạt động như một đại lý dịch vụ cho một doanh nghiệp để tương tác với khách hàng 24x7, nó còn có thể giúp đỡ doanh nghiệp bằng cách cung cấp các dữ liệu để phục vụ việc phân tích, dự đoán hành vi của người dùng Do đó, một chương trình, công nghệ và loại chatbot phụ thuộc rất nhiều vào nhu cầu của doanh nghiệp và cơ sở khách hàng mà nó sẽ phục vụ
+ Chatbot tương tác với người dùng thông qua một cơ sở hữu hạn các lựa chọn, kịch bản Các kịch bản này đã được soạn sẵn, nó chính là các trường hợp có thể xảy ra khi khách hàng trò chuyện với chatbot
+ Người dùng chỉ được lựa chọn những câu trả lời cho sẵn Sẽ không xảy ra việc bot không hiểu ý người dùng
+ Chatbot kiểu này chỉ phù hợp với các yêu cầu cố định, quy mô trường hợp nhỏ như là khảo sát, hỗ trợ bán hàng, …
+ Việc xây dựng kịch bản chatbot không hề đơn giản Xây dựng một kịch bản chatbot hoàn chỉnh đòi hỏi người làm phải đầu tư nhiều về thời gian lẫn công sức Với trường hợp quy mô lớn thì khó có thể xây dựng chatbot có thể đáp ứng được hết các kịch bản có thể xảy ra Nội dung là kịch bản nên sẽ cứng nhắc khó có khả năng giao tiếp rộng hơn
+ Sở hữu một kịch bản chatbot với nội dung tốt sẽ giúp nâng cao trải nghiệm mua sắm của khách hàng, từ đó kích thích được việc mua hàng cũng như tạo được mối quan hệ tích cực giữa khách hàng với thương hiệu
Hình 2.1 Chatbot theo kịch bản
- Chatbot dựa trên từ khóa, mẫu trùng khớp:
+ Xây dựng bộ dữ liệu về từ khóa, mẫu câu
+ Tìm kiếm trong câu hỏi xem có khớp với các từ khóa, mẫu câu trong hệ thống, để ánh xạ thành ý định tương ứng
+ Yêu cầu xây dựng một bộ mẫu cực kì lớn và tốn kém
+ Có nhiều câu hỏi mà người dùng đặt cho bot không rõ ràng về ngữ pháp, ngữ nghĩa, bot đọc từ khóa không chính xác dẫn đến phương án trả lời không đúng
+ Về cơ bản, nó sử dụng công nghệ AI - Xử lý ngôn ngữ tự nhiên (NLP) để ánh xạ đầu vào của người dùng (văn bản hoặc giọng nói) theo ý định Sau đó phân tích ngôn ngữ để có được câu trả lời
+ Người dùng có thể đặt bất kỳ câu hỏi nào, kể cả những câu hỏi không có liên quan đến sản phẩm, doanh nghiệp Sự tự do trong đầu vào cũng khiến thân thiện với người dùng hơn
+ Sự linh hoạt khi phân tích ngôn ngữ tự nhiên giúp chatbot dễ nắm bắt nhiều loại người dùng khác nhau, thu thập dữ liệu cần thiết và cung cấp hỗ trợ
+ Tuy nhiên, mức độ thấu hiểu hội thoại thực tế chỉ khoảng 60- 70% tùy thuộc vào dữ liệu, mô hình đào tạo bot
+ Có nhiều câu hỏi mà người dùng đặt cho bot không rõ ràng về ngữ nghĩa, bot đọc từ khóa không chính xác dẫn đến phương án trả lời không đúng
Trong giới hạn của đề tài này, em sẽ sử dụng chatbot áp dụng công nghệ xử lý ngôn ngữ tự nhiên và tập trung trình bày về nó
Các phương hướng tiếp cận
Chatbot có thể trông giống một ứng dụng bình thường, cũng có giao thức tầng ứng dụng (application layer), giao diện lập trình ứng dụng API (Application Programming Interface) và cơ sở dữ liệu (database) Giao diện người dùng UI (User Interface) của chatbot là giao diện trò chuyện Mặc dù, chatbot cung cấp các tính năng dễ dàng cho người dùng có thể sử dụng nhưng lại phức tạp, tinh vi trong quá trình xây dựng, phát triển, quản lý
Khi xây dựng chatbot, bất cứ ai cũng phải giải quyết các vấn đề cơ bản: người dung đang thực sự muốn gì, hệ thống phải phản hồi ra sao, …
Chính vì vậy, thông thường chatbot đơn giản sẽ được xây dựng dựa trên 4 bài toán:
- Xác định, phân loại ý định người dùng (intent classification hay intent detection)
- Trích xuất thông tin (information extraction)
- Quản lý hội thoại (Dialog management)
- Sinh hội thoại cho chatbot
Phân loại ý đị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 đó
Một vài nét về mô hình Transformer
Kiến trúc tổng quan của mô hình transformer bao gồm 2 phần lớn là encoder và decoder Encoder (bộ mã hóa) dùng để học vector biểu của câu với mong muốn rằng vector này mang thông tin của câu đó Decoder (bộ giải mã) thực hiện chức năng chuyển vector biểu diễn kia thành ngôn ngữ đích
Ví dụ: Encoder của mô hình transformer nhận một câu tiếng anh “little sun”, và encode thành một vector biểu diễn ngữ nghĩa của câu đó Sau đó mô hình decoder nhận vector biểu diễn này, và dịch nó thành câu tiếng việt “mặt trời bé nhỏ”
Hình 2.4 Kiến trúc tổng quan của mô hình transformer
Transformer bao gồm sáu bộ mã hóa và sáu bộ giải mã
+ Bao gồm 6 layer liên tiếp, có kiến trúc giống nhau
+ Mỗi bộ mã hóa bao gồm hai lớp: Self-attention và Feed Forward Neural Network
+ Bộ mã hóa đầu đi qua Self-attention Nó giúp bộ mã hóa xem xét các từ khác trong câu đầu vào khi nó mã hóa một từ cụ thể
+ Kết thúc quá trình encoder ta thu được một vector embedding output cho mỗi từ
+ Kiến trúc cũng bao gồm 6 layer liên tiếp, có kiến trúc giống nhau
+ Bộ giải mã cũng có 2 layer giống bộ mã hóa, nhưng giữa chúng là một lớp chú ý giúp bộ giải mã tập trung vào các phần có liên quan của câu đầu vào
Hình 2.6 Transformer Encoder và Decoder
Hãy bắt đầu xem xét các vector/tensor khác nhau và cách chúng di chuyển giữa các thành phần này để biến đầu vào của một mô hình được đào tạo thành đầu ra Như trường hợp trong các ứng dụng NLP nói chung, chúng ta bắt đầu bằng cách biến mỗi từ đầu vào thành một vector bằng thuật toán nhúng
Hình 2.7 Minh họa vector của word embedding
Mỗi từ được nhúng vào một vector có kích thước 512 Chúng ta sẽ biểu diễn cho các vector đó bằng các hộp đơn giản như hình minh họa bên trên
Việc nhúng chỉ xảy ra trong bộ mã hóa dưới cùng Tất cả các bộ mã hóa sẽ nhận được một danh sách các vector mỗi kích thước 512
Sau khi nhúng các từ trong chuỗi đầu vào, mỗi từ sẽ chảy qua từng lớp trong hai lớp của bộ mã hóa
Hình 2.8 Word embedding và encoder
Trước tiên, hãy xem xét cách tính toán self-attention bằng cách sử dụng vector, sau đó tiến hành xem cách thức mà nó thực sự thực hiện - sử dụng ma trận
Hình 2.9 Mối liên giữa các từ trong câu
Bước đầu tiên tạo ra ba vector từ mỗi vector đầu vào của bộ mã hóa (trong trường hợp này là nhúng từng từ) Vì vậy, với mỗi từ, chúng ta tạo một Query vector (vector truy vấn), Key vector (vector khóa) và Value vector (vector giá trị) Các vector này được tạo ra bằng cách nhân embedding với ba ma trận mà chúng ta đã huấn luyện trong quá trình đào tạo
- Query vector: vector dùng để chứa thông tin của từ được tìm kiếm, so sánh Giống như là câu query của google search
- Key vector: vector dùng để biểu diễn thông tin các từ được so sánh với từ cần tìm kiếm ở trên Ví dụ: các trang web mà google sẽ so sánh với từ khóa mà bạn tìm kiếm
- Value vector: vector biểu diễn nội dung, ý nghĩa của các từ Nó giống như là nội dung trang web được hiển thị cho người dùng sau khi tìm kiếm
Lưu ý: các vector mới này có kích thước nhỏ hơn embedding vector Kích thước của chúng là 64, trong khi các vector đầu vào / đầu ra của bộ mã hóa và embedding có kích thước là 512 Đây là một lựa chọn kiến trúc để làm cho tính toán của multiheaded attention (hầu hết) không đổi
Hình 2.10 Minh họa Query vector, Key vector và Value vector
Nhân X1 với ma trận trọng số W Q sẽ tạo ra q1, Query vector được liên kết với từ đó, … Cuối cùng, nó sẽ tạo ra Query vector, Key vector và Value vector của mỗi từ trong câu đầu vào
Bước thứ hai trong việc tính toán self-attention là tính điểm Giả sử, chúng ta tính toán self-attention cho từ đầu tiên trong ví dụ này, "Thinking" Chúng ta cần chấm điểm từng từ của câu đầu vào so với từ này Điểm số xác định mức độ tập trung vào các phần khác của câu đầu vào khi chúng ta mã hóa một từ tại một vị trí nhất định Điểm số được tính bằng cách lấy dựa vào query vector với key vector của từ tương ứng mà chúng ta chấm điểm Vì vậy, nếu chúng ta xử lý việc self-attention cho từ ở vị trí số 1, điểm số đầu tiên sẽ dựa vào q1 và k1 Điểm thứ hai sẽ dựa vào q1 và k2
Hình 2.11 Minh họa tính điểm trong self-attention
Bước thứ ba và thứ ba là chia điểm số cho 8 (căn bậc hai kích thước của các key vector được sử dụng - 64 Điều này dẫn đến việc có độ dốc ổn định hơn Có thể có các giá trị khác, nhưng đây là mặc định), sau đó chuyển kết quả thông qua softmax Softmax chuẩn hóa điểm số để nó có thể dương và và tổng cộng bằng 1
Hình 2.12 Minh họa bước 3 và 4 trong tính toán self-attention Điểm số softmax này xác định mức độ, khả năng mỗi từ sẽ được thể hiện ở vị trí này Rõ ràng từ ở vị trí này sẽ có điểm softmax cao nhất, nhưng đôi khi nó rất hữu ích khi tham gia vào một từ khác có liên quan đến từ hiện tại
Bước thứ năm là nhân mỗi value vector với điểm số softmax (để chuẩn bị tính tổng chúng) Giữ nguyên vẹn các giá trị của (các) từ mà chúng ta muốn tập trung vào, và gần như không để ý vào các từ không liên quan (Ví dụ: nhân chúng với các số nhỏ như 0,001)
Bước thứ sáu là tổng hợp các trọng số value vector Điều này tạo ra đầu ra của lớp self-attention ở vị trí này (đối với từ đầu tiên)
Hình 2.13 Minh họa bước 5 và 6 trong tính toán self-attention
Vector kết quả là một Vector chúng ta có thể gửi cùng với mạng thần kinh feed-forward
Transformers về cơ bản hoạt động như vậy Có một vài chi tiết khác làm cho chúng hoạt động tốt hơn
Một vài nét về mô hình BERT
Sự thiếu hụt dữ liệu đào tạo đã được các chuyên gia nghiên cứu khẳng định là một trong những thách thức lớn nhất trong lĩnh vực xử lý ngôn ngữ tự nhiên Mặc dù đây là một lĩnh vực rộng lớn và đa dạng với nhiều nhiệm vụ riêng biệt, hầu hết các tập dữ liệu đều chỉ phục vụ đặc thù cho từng nhiệm vụ Để thực hiện được tốt những nhiệm vụ này ta cần những bộ dữ liệu lớn chứa hàng triệu, hàng tỷ mẫu ví dụ Tuy nhiên, trong thực tế hầu hết các tập dữ liệu hiện giờ chỉ chứa vài nghìn hoặc vài trăm nghìn mẫu được đánh nhãn bằng tay bởi các chuyên gia ngôn ngữ học Sự thiếu hụt dữ liệu có nhãn chất lượng cao để đào tạo mô hình gây cản trở lớn cho sự phát triển của NLP nói chung Để giải quyết thách thức này, các nhà nghiên cứu đã phát triển các kỹ thuật khác nhau để đào tạo ra các mô hình tìm ra đại diện chung của ngôn ngữ sử dụng một số lượng lớn các văn bản chưa được gán nhãn lấy từ các trang web (điều này
17 được gọi là đào tạo trước) Ví dụ: một số mô hình đã được nghiên cứu trước đây để thực hiện nhiệm vụ này như Word2vec, Glove hay FastText
Các pre-trained model cho mục đích chung này sau đó có thể được tinh chỉnh trên các bộ dữ liệu cụ thể cho nhiệm vụ nhỏ hơn Ví dụ: phân tích cảm xúc (Sentiment Analysis), trả lời câu hỏi (Question Answering), Cách tiếp cận này mang lại sự cải thiện độ chính xác tuyệt vời hơn so với đào tạo trên các bộ dữ liệu cụ thể về nhiệm vụ nhỏ hơn từ đầu
Tuy nhiên, các mô hình kể trên có những điểm hạn chế riêng của nó, đặc biệt là không thể hiện được sự đại diện theo ngữ cảnh cụ thể của từ trong từng lĩnh vực hay văn cảnh cụ thể
Tiếp nối sự thành công nhất định của các mô hình trước đó, Google đã công bố thêm 1 kỹ thuật mới được gọi là Bidirectional Encoder Representations from Transformers (BERT), có nghĩa là mô hình biểu diễn từ theo ngữ cảnh 2 chiều ứng dụng kỹ thuật Transformer Khi nó xuất hiện có thể coi là 1 bước đột phá mới trong lĩnh vực xử lý ngôn ngữ tự nhiên
Cơ chế attention của Transformer sẽ truyền toàn bộ các từ trong câu văn đồng thời vào mô hình một lúc mà không cần quan tâm đến chiều của câu Do đó Transformer được xem như là huấn luyện hai chiều (bidirectional) Đặc điểm này cho phép mô hình học được bối cảnh của từ dựa trên toàn bộ các từ xung quanh nó bao gồm cả từ bên trái và từ bên phải Ở dạng cơ bản, Transformer bao gồm hai cơ chế riêng biệt: bộ mã hóa mã hóa đầu vào văn bản và bộ giải mã tạo dự đoán cho tác vụ Vì mục tiêu của BERT là tạo ra một mô hình biểu diễn ngôn ngữ, nên chỉ cần cơ chế mã hóa
Vào thời điểm đó (2018), các kỹ sư thuộc Google AI đã so sánh BERT với các mô hình tốt nhất về NLP trước đây trong các nhiệm vụ nhất định để đánh giá hiệu quả mà nó đem lại Điều quan trọng là chúng ta chỉ việc sử dụng BERT thay cho các pre-trained model trước đây mà không cần thực hiện bất kỳ thay đổi nào trong kiến trúc mạng neural sâu
Một số thành tựu tiêu biểu trong lúc đó:
- Tăng GLUE score (General Language Understanding Evaluation score) lên 80.5% (cải thiện thêm 7,7%)
- Tăng accuracy trên bộ dữ liệu MultiNLI đánh giá tác vụ quan hệ văn bản (text entailment) cải thiện thêm 4.6% lên 86.7%
- Trên bộ dữ liệu SQUAD v1.1 (tác vụ question and answering), BERT đạt được kết quả F1_score = 93.2%, vượt kết quả tốt nhất trước đó là 91.6% và hiệu năng mà con người đạt được là 91.2%
- Trên SQuAD v2.0 F1_score tăng thêm 5.1% lên thành 83.1%
Hình 2.15 BERT và bộ dữ liệu SQuAD v1.1
Hình 2.16 BERT trong một số tác vụ suy luận
Sau đây là phần triển khai chi tiết của BERT:
Sử dụng BERT có hai giai đoạn: đào tạo trước (pre-training) và tinh chỉnh (fine-tuning)
- Trong quá trình pre-training, mô hình được đào tạo về dữ liệu chưa được gắn nhãn trên các nhiệm vụ pre-training khác nhau
- Để fine-tuning, mô hình BERT trong lần đầu tiên được khởi tạo với các tham số được đào tạo trước và tất cả các tham số được tinh chỉnh bằng cách sử dụng dữ liệu được dán nhãn từ các tác vụ downstream Mỗi tác vụ downstream có các mô hình tinh chỉnh riêng biệt, mặc dù chúng được khởi tạo với cùng các tham số được đào tạo trước
Kiến trúc mô hình (Model Architecture):
Kiến trúc của mô hình BERT là một kiến trúc đa tầng gồm nhiều lớp Bidirectional Transformer encoder Để giống bài báo gốc, chúng ta sẽ gọi:
- L là số lớp Transformer được sử dụng
- H là số kích thước của các lớp ẩn (hidden size)
- A là số đầu ở lớp attention (attention heads)
Kích thước của bộ lọc luôn được đặt bằng 4H trong mọi trường hợp Ví dụ:
- Khi H = 768 thì kích thước của bộ lọc = 3072
- Khi H = 1024 thì kích thước của bộ lọc = 4096
Hai mô hình chủ yếu:
- BERT base (L, Hv8, A, Tổng tham số khoảng 110 Triệu)
- BERT large (L$, H24, A, Tổng tham số khoảng 340 Triệu)
BERT base có một kích thước mô hình khá giống mô hinh OpenAI GPT để nhằm mục đích cho tiện so sánh giữa 2 mô hình này Để nói một cách đơn giản:
- BERT sử dụng Transformer 2 chiều
- OpenAI GPT sử dụng kiến trúc Transformer trái sang phải (left-to- right) Các token chỉ phụ thuộc vào các token trước đó
- ELMo sử dụng kết hợp các LSTM từ trái sang phải và phải sang trái được đào tạo độc lập để tạo ra các đặc trưng cho các tác vụ tiếp theo
Hình 2.17 Cấu trúc BERT base, OpenAI và ELMo
Biểu diễn đầu vào cho BERT (Input Representations): Ở đây, đầu vào của chúng ta có thể là biểu diễn của một câu văn bản đơn hoặc một cặp câu văn bản
Hình 2.18 Trực quan hóa đại diện đầu vào của BERT
Thông tin input được trước khi đưa vào mô hình huấn luyện bao gồm:
- Ngữ nghĩa của từ (token embeddings): Thông qua các embedding vector cho từng từ Các vector được khởi tạo từ pretrain model
- Loại câu (segment embeddings): Gồm hai vector là EA nếu từ thuộc câu thứ nhất và EB nếu từ thuộc câu thứ hai
- Vị trí của từ trong câu (position embedding): là các vector E0, …, E10 Tương tự như positional embedding trong transformer
- Sử dụng WordPiece embeddings (Wu et al., 2016) với một từ điển khoảng hơn 30.000 từ và sử dụng ## làm dấu phân tách thành các từ phụ
Ví dụ: từ “playing” được tách thành “play” + “##ing”
- Độ dài câu tối đa ứng với Positional embeddings là 512
- Token đầu tiên cho mỗi chuỗi được mặc định là một token đặc biệt có giá trị là [CLS] Đầu ra của Transformer (hidden state cuối cùng) tương ứng với token này sẽ được sử dụng để đại diện cho cả câu trong các tác vụ phân loại (Vector này được bỏ qua nếu không trong các tác vụ phân loại)
Hình 2.19 Đại diện câu của BERT
- Trong trường hợp các cặp câu được gộp lại với nhau thành một chuỗi duy nhất, chúng ta phân biệt các câu theo 2 cách Đầu tiên, chúng ta tách chúng bởi một token đặc biệt [SEP] Thứ hai, chúng ta thêm một segment embedding cho câu A và một segment embedding khác cho câu B như hình vẽ 2.7
- Khi chỉ có 1 câu đơn duy nhất, segment embedding của chúng ta chỉ có cho câu A
- Input embeddings = token embeddings + segmentation embeddings + position embeddings
BERT được đào tạo bằng cách sử dụng 2 nhiệm vụ dự đoán không giám sát được gọi là Masked LM (MLM) và Next Sentence Prediction(NSP)
Trực quan mà thấy, một mô hình học sâu được học dựa trên ngữ cảnh 2 chiều là tự nhiên và mạnh mẽ hơn nhiều so với một mô hình chỉ dùng ngữ cảnh từ trái qua phải (hoặc ngược lại)
Giới thiệu qua về phân tích ngữ nghĩa
Phân tích ngữ nghĩa (Semantic parsing) là các nhiệm vụ dịch ngôn ngữ tự nhiên sang dạng logic (logical form) mà trên đó một máy có thể hiểu và hành động Đó có thể là một ngôn ngữ thực thi như SQL hoặc các biểu diễn trừu tượng hơn như Biểu diễn nghĩa trừu tượng (AMR - Abstract Meaning Representation) và Chú thích nhận thức khái niệm phổ quát (UCCA - Universal Conceptual Cognitive Annotation)
+ Ngữ liệu AMR bao gồm một tập hợp các câu tiếng Anh được chú giải nghĩa theo biểu diễn AMR, được xây dựng thủ công từ năm 2012
+ AMR là một mở rộng của PropBank, bao hàm các quan hệ đối vị từ, và các vai nghĩa của PropBank Bên cạnh đó, nó còn áp dụng cho nhiều loại vị từ khác nhau (động từ, danh từ, tính từ), bổ nghĩa, đồng sở chỉ, thực thể có tên và các biểu thức thời gian
+ UCCA là một cách tiếp cận ngữ nghĩa để biểu diễn ngữ pháp Nó được phát triển trong Phòng thí nghiệm Computational Linguistics của Đại học Hebrew bởi Omri Abend và Ari Rappoport
+ Đại diện cho ngữ nghĩa của ngôn ngữ bằng các đồ thị có hướng không có chu trình (DAG)
+ Viết tắt của Structured Query Language có nghĩa là ngôn ngữ truy vấn có cấu trúc
+ Là một ngôn ngữ máy tính để lưu trữ, thao tác và truy xuất dữ liệu được lưu trữ trong một cơ sở dữ liệu quan hệ
Trong phạm vi đề tài này, em sẽ tìm hiểu dạng phân tích ngữ nghĩa nông: chuyển câu văn thành câu truy vấn SQL để tìm kiếm thông tin theo yêu cầu của người dùng
THIẾT KẾ KIẾN TRÚC
Phân tích
Chatbot được xây dựng dựa trên ngôn ngữ lập trình Python và những lý thuyết về xử lý ngôn ngữ tự nhiên
Hệ thống được xây dựng để có thể trả lời được những luồng hỏi đáp cơ bản (chào hỏi, tạm biệt, …) và tìm kiếm thông tin về nhà hàng bằng tiếng Anh
Thông tin nhà hàng có thể được tìm kiếm: tên, địa điểm, món ăn nổi tiếng nhất của nhà hàng, điểm đánh giá chất lượng nhà hàng (rating), địa chỉ, …
- “Help me find restaurant have pizza food”
- “Find me place where to eat pizza with rating great than 3”
Hình 3.1 Sơ đồ tổng quan hệ thống
+ Đại diện cho giao diện, nơi giao tiếp, trò chuyện giữa người dùng với hệ thống (chatbot, nhân viên, …)
+ Giao diện giao tiếp có thể là facebook message, web, + Trong hệ thống này sẽ xây dựng giao diện bằng web để
+ Đại diện cho nơi xử lý logic chính của hệ thống
+ Preprocess: tiền xử lý dữ liệu
+ Intent classify: phân loại ý định dựa trên mô hình BERT Điều khiển hành động sao cho phù hợp với ý định (intent) của người dùng, ngữ cảnh
+ Semantic parse: phân tích ngữ nghĩa nông chuyển từ câu văn sang dạng SQL
+ NLG: sinh dữ liệu phản hồi phù hợp với yêu cầu của người dùng
+ Đại diện cho nơi lưu trữ, trích xuất cơ sở dữ liệu
+ Sử dụng SQLite thông qua thư viện records của Python
+ Dựa vào thông tin từ bộ phân tích ngữ nghĩa (logical form) mà sẽ trích xuất được thông tin phù hợp
Luồng thông tin cơ bản:
- 1: Tin nhắn từ người dùng ở Presentation Layer sẽ được chuyển qua Logic Layer để xử lý logic
- 2: Tin nhắn đó sẽ được thông qua bước tiền xử lý (chuẩn hóa từ, kiểm tra ngôn ngữ, kiểm tra chính tả, …), qua đó hệ thống có khả năng phân tích được chính xác hơn
- 3: Hệ thống sẽ tiến hành phân tích ý định từ tin nhắn của người dùng
Hệ thống có nhiều loại ý định khác nhau (greet, bye, …), nhưng chỉ có 2 luồng xử lý logic chính dành cho: ý định tìm kiếm thông tin nhà hàng (get info intent) và các ý định khác (other intent)
- 4: Nếu người dùng có ý định tìm kiếm thông tin nhà hàng (get info intent), thì hệ thống sẽ tiến hành phân tích ngữ nghĩa, phân tích thông tin thành điều kiện truy vấn SQL (semantic parsing) Lưu tin nhắn khách hàng vào trong hệ thống (tùy chọn) Nhật ký dữ liệu này để phục vụ cho người phát triển sẽ tận dụng để nhìn lại, cố gắng phân
27 tích khách hàng (đang có ý định gì, tại sao không hài lòng, …) và cũng để huấn luyện cho hệ thống tốt hơn trong tương lai
- 5: Đối với các ý định khác (other intent) thì không cần phải phân tích ngữ nghĩa, do nó không có chứa các thông tin cần thiết phục vụ việc tìm kiếm liên quan đến nội dung hệ thống (thông tin của nhà hàng)
- 6: Sau khi phân tích ngữ nghĩa sẽ trả về dữ liệu dưới dạng câu truy vấn SQL Nó sẽ tương tác trực tiếp với Knowledge Layer để trích xuất dữ liệu
- 7: Thông tin trích xuất từ Knowledge Layer sẽ chuyển qua NLG
- 8: Dữ liệu được lấy ra từ 5 và 7 đi qua lớp NLG sinh ra tin nhắn phản hồi cho người dùng theo các quy tắc tương ứng.
Cơ sở dữ liệu
- Ngôn ngữ giao tiếp bằng tiếng Anh nên dữ liệu trong bảng cũng là không dấu
- Xây dựng bảng lưu thông tin cơ bản về các nhà hàng: tên, địa điểm, món ăn đặc trưng, điểm đánh giá chất lượng của nhà hàng đó
+ restaurant: tên nhà hàng, quán ăn
+ food: món ăn trong nhà hàng (Giả sử mỗi nhà hàng chỉ phục vụ 1 món đặc biệt, nổi tiếng nhất)
+ rating: điểm đánh giá chất lượng của nhà hàng (Có giá trị trong khoảng từ 0 đến 5)
+ place: địa chỉ của nhà hàng
Bảng 3.1 Bảng thông tin nhà hàng
STT Tên Trường Kiểu dữ liệu Ý nghĩa
2 restaurant text Tên nhà hàng
3 food text Tên món ăn
4 rating real Rating nhà hàng
5 place text Địa điểm nhà hàng
- Xây dựng bảng lưu thông tin cơ bản về người dùng:
+ name: tên của tài khoản người dùng
+ password: mật khẩu tài khoản
+ address: địa chỉ của người dùng
+ note: thông tin đặc biệt, ghi chú về người dùng (chức năng phát triển hệ thống trong tương lai)
Bảng 3.2 Bảng thông tin người dùng
STT Tên Trường Kiểu dữ liệu Nullable Ý nghĩa
2 name text Tên người dùng
4 address text Yes Địa chỉ người dùng
5 note text Yes Thông tin đặc biệt về người dùng sau khi được phân tích (có thể dùng NER)
- Xây dựng bảng lưu thông tin cơ bản về cuộc hội thoại giữa người dùng và hệ thống:
+ user_id: id của người đối thoại
+ message: nội dung tin nhắn
+ intent: ý định của tin nhắn
+ logical_form: dữ liệu sau khi được phân tích ngữ nghĩa (chỉ có intent tìm kiếm thông tin nhà hàng mới yêu cầu trường này)
Bảng 3.3 Bảng thông tin lịch sử hội thoại
STT Tên Trường Kiểu dữ liệu Nullable Ý nghĩa
1 user_id integer ID của người dùng
2 message text Tin nhắn của người dùng
3 intent text Ý định của người dùng mà hệ thống đang phân tích
4 logical_form text Yes Logical form sau khi phân tích ngữ nghĩa (có thể có tùy từng intent)
Ví dụ về dữ liệu trong bảng nhà hàng:
STT restaurant food rating place
1 Baker King banh my 4 Hue
2 Bun Cha Obama bun cha 3.6 Ha Noi
3 Mon Hue bun 2 Ha Noi
5 Lotteria chicken 1.5 Ho Chi Minh
XÂY DỰNG ỨNG DỤNG
Phân loại ý định (Intent Classification)
Các loại ý định trong nhiệm vụ phân loại lần này:
+ Ví dụ: “Bye bye bot”
+ Câu khẳng định, mang ý nghĩa tích cực
+ Ví dụ: “Yes, i want that”
+ Câu mang ý nghĩa tiêu cực
+ Ví dụ: “that's not right”
+ Khi muốn tìm kiếm thông tin đến nhà hàng
+ Ví dụ: “help me find restaurant in Ha Noi”
Ngoài ra, chắc chắn không phải lúc nào ý định của người dùng cũng thuộc các intent trong phạm vi đề tài Để xác định, một intent có nằm trong đề tài không thì có 3 cách:
+ Nếu intent được dự đoán có tỉ lệ chính xác nhỏ hơn ngưỡng thì intent của người dùng sẽ nằm ngoài phạm vi đề tài
+ Kết quả chính xác không đáng tin cậy hơn so với cách khác
- Chia tập dữ liệu thành 2 intent chính:
+ In-scope để chỉ những intent thuộc phạm vi đề tài, out-of-scope (oos) chỉ những intent không thuộc phạm vi đề tài
+ Đưa bài toán về dạng phân loại intent trong hoặc ngoài phạm vi
+ Nếu intent trong phạm vi thì tiến hành bài toán phân loại thêm
1 lần nữa với nhóm các intent bên trên
+ Kết quả cho cũng ổn định
+ Phức tạp vì có nhiều model để xử lý
+ Dữ liệu cần phải lớn, đa dạng để học được một phần sự tổng quát của intent oos
- Ngoài các intent cơ bản, thêm 1 intent out-of-scope (oos) chỉ những intent không thuộc phạm vi đề tài
+ Kết quả cho cũng ổn định
+ Chỉ cần 1 model để xử lý
+ Dữ liệu cần phải lớn, đa dạng để học được một phần sự tổng quát của intent oos
- Trong hệ thống này em sử dụng cách thứ 3
Vậy, hệ thống sẽ chỉ gồm 6 loại intent cơ bản: Greet, Bye, Affirmative, Negative, GetInfo, OOS
Tự chuẩn bị dữ liệu
Em sử dụng Chatito Đây là công cụ hỗ trợ mạnh mẽ được thiết kế để đơn giản hóa quá trình tạo, mở rộng và duy trì bộ dữ liệu để đào tạo và xác thực các mô hình xử lý ngôn ngữ tự nhiên (NLP) như phân loại văn bản, nhận dạng thực thể, điền vào vị trí hoặc các tác vụ tương đương
Sau đây là một ví dụ:
+ Tạo 1 file “greet.chatito” để tạo dữ liệu cho intent greet với nội dung như bức ảnh bên dưới
+ Mã bên dưới này có thể tạo tối đa 18 ví dụ
+ Thực tế, nó sẽ tạo ra hai ví dụ đào tạo (training = 2) cho mục đích chào hỏi (“greet”) với định dạng như sau: [{"type":"Text","value":"hi how is it going"}],
[{"type":"Text","value":"hey"}, {"type":"Slot","value":"Bob","slot":"name"}]
Hình 4.1 Tạo dữ liệu dùng Chatito
Mỗi file chatito, là một tài liệu có chứa các định nghĩa ngữ pháp Dưới đây là các yêu cầu định dạng và một số thuật ngữ:
- Ký tự hợp lệ: Cho phép các ký tự ngôn ngữ quốc tế
- Khoảng trắng: cho phép ký tự khoảng trắng, không phải tab
- Thụt lề: nên sử dụng ký tự 4 dấu cách để xác định phạm vi của các thực thể
- Thực thể: Từ khóa đặc biệt có hành vi đặc biệt được sử dụng để khai báo các kết hợp trong câu
- Câu: thụt lề vào 4 dấu cách sau khi định nghĩa một thực thể
- Thứ tự định nghĩa: Không quan trọng nếu một thực thể được xác định sau khi nó được tham chiếu
- Comment: Dòng văn bản bắt đầu bằng '//' hoặc '#' (không có khoảng trắng trước)
- Import: bắt đầu bằng từ khóa “import”, theo sau là một đường dẫn tương đối
- Đối số thực thể: Các giá trị khóa tùy chọn có thể được khai báo tại các định nghĩa và định nghĩa vị trí
- Toán tử xác suất: một từ khóa tùy chọn được khai báo ở đầu câu để kiểm soát tỷ lệ
Có 3 loại thực thể trong chatito: intent, slot và alias
+ Được xác định bởi kí hiệu “%[“ + tên thực thể + “]”
+ Tên ý định phải dài ít nhất 1 ký tự và có thể chứa bất kỳ ký tự nào ngoại trừ “]”, kết thúc dòng và “?”
Ví dụ: %[intentName], %[intent_name] hoặc %[intent name]
+ Không được phép lặp tên
+ Được xác định bởi kí hiệu “@[“ + tên slot + “]”
+ Tên slot phải dài ít nhất 1 ký tự và có thể chứa bất kỳ ký tự nào ngoại trừ “]”, kết thúc dòng, “?” và “#”
Ví dụ: @[slotName], @[slot_name], @[slot name] + Không được phép lặp tên
+ Mục đích là sinh các từ liên quan trong câu được khởi tạo
+ Các thực thể slot tham chiếu trong câu, có thể có “?” ở cuối tên tham chiếu (ví dụ: @ [tên?]) Trong bối cảnh đó, “?” có nghĩa là sự kết hợp vị trí là tùy chọn và có thể được bỏ qua khi tạo
+ Ví dụ: Câu được sinh ra: “hi Bob”, “hey” (name có thể được bỏ qua vì dấu “?”)
Hình 4.2 Ví dụ khi tạo slot name
+ Được xác định bởi kí hiệu “~[“ + tên alias + “]”
+ Bí danh chỉ là biến thể của một từ và không tạo ra bất kỳ thẻ nào
+ Theo mặc định nếu một bí danh được tham chiếu nhưng không được định nghĩa (như trong ví dụ tiếp theo, nó sẽ sử dụng tên bí danh, điều này hữu ích để tạo một từ tùy chọn nhưng không phải thêm các dòng mã xác định mới bí danh)
Ví dụ: Bí danh “how are you” chưa được định nghĩa nên nó sẽ là bí danh mặc định Vì có “?” nên nó thể xuất hiện hoặc không khi sinh câu Khi xuất hiện thì nó sẽ có giá trị chính là “how are you”
Hình 4.3 Ví dụ khi tạo alias “how are you”
Ví dụ: sinh dữ liệu cho intent bye:
- Đề không phải cài đặt phức tạp, ta sẽ vào trang https://rodrigopivi.github.io/Chatito/
- Tạo file tên là “bye.chatito”
- Xây dựng cấu trúc mẫu vào trong file
- Khi ở dưới xuất hiện "Correct syntax!” nghĩa là cú pháp trong của bạn đã đúng
- Sau đó chọn button “Generate Dataset”
- Ở đây em chọn dataset format là RASA NLU, Default distribution là Even để phân phối dữ liệu được tạo đều theo toàn bộ mẫu bên trên mà không bị lệch về một mẫu
- Ấn nút để khởi tạo nó sẽ trả về 2 file json train và test có định dạng dữ liệu như hình bên dưới
Hình 4.5 Định dạng dữ liệu khởi tạo
- Chi tiết về “Common_example” sẽ có dạng:
Hình 4.6 Chi tiết trường common_example trong dữ liệu khởi tạo
Mô hình phân loại ý định
Trong nhiệm vụ phân loại này chúng ta sẽ áp dụng mô hình BERT-Base: + 12 lớp
+ max_seq_length (Độ dài câu tối đa): 128
Tiền xử lý văn bản:
+ Bản thân BERT gần như không nhất thiết phải tiền xử lý dữ liệu khi đào tạo
+ Kiểm tra lỗi chính tả (tùy chọn)
+ Chuẩn hóa dữ liệu (tùy chọn)
Mô hình phân loại sẽ dựa vào BERT-Base và thêm 1 lớp phân loại softmax ở cuối đầu ra, với số units bằng số intent cần dự đoán (7)
Hình 4.7 Phân loại intent áp dụng BERT
Từ mỗi cặp (câu đầu, ý định) sẽ được ánh xạ làm đặc trưng đầu vào của BERT theo định dạng:
+ input_ids: là một mảng các token đã được mã hóa theo id của bộ từ điển, độ dài = max_seq_length
+ input_mask: là một mảng được mã hóa (1 cho vị trí có token, 0 cho phần đệm) có độ dài = max_seq_length
+ segment_ids: là một mảng được mã hóa (0 cho câu đầu tiên hoặc phần đệm, 1 câu thứ 2) có độ dài = max_seq_length
+ label_id: nhãn của ý định
Ví dụ: BERT với max_seq_length = 5, tập các intent là [“Greet”, “Bye”] Yêu cầu mã hóa “hello” có intent là Greet Đầu tiên, tách từ theo chuẩn BERT: “hello” => thành 3 token gồm:
=> input_ids: = [101, 7592, 102, 0, 0], input_mask: [1, 1, 1, 0, 0] segment_ids = [0, 0, 0, 0, 0] (vì chỉ có một câu), label = “Greet”.
Phân tích ngữ nghĩa (Semantic Parsing)
WikiSQL, một bộ dữ liệu gồm 80654 ví dụ về các câu hỏi và truy vấn SQL được chú thích bằng tay, phân phối trên 24241 bảng từ Wikipedia tiếng Anh
Nội dung bộ dữ liệu WikiSQL là cực kì đa dạng, rộng khắp trên nhiều lĩnh vực: thể thao, phim, …
WikiSQL lớn hơn rất nhiều so với các bộ dữ liệu phân tích ngữ nghĩa trước đây, cung cấp các logical form cùng với các câu hỏi tương ứng Các bảng được sử dụng trong WikiSQL được phát hành dưới định dạng JSON cũng như dưới dạng cơ sở dữ liệu thô SQL
Bộ dữ liệu cung cấp:
- Toán tử tổng hợp: max, min, average, count, sum
Cấu trúc bộ dữ liệu
Những file có định dạng kiểu “*.jsonl”, dữ liệu trên từng dòng được định dạng như sau:
Hình 4.8 Định dạng dữ liệu trong file kiểu “*.jsonl”
● phase: giai đoạn trong đó tập dữ liệu được thu thập WikiSQL được thu thập trong hai giai đoạn
● question: câu hỏi ngôn ngữ tự nhiên được viết bởi những người tạo ra dataset này
● table_id: ID của bảng mà câu hỏi này được giải quyết
● sql: truy vấn SQL tương ứng với câu hỏi
○ sel: index của cột trong bảng đang được chọn
○ agg: index của toán tử tổng hợp đang được sử dụng
○ conds: một danh sách các bộ ba (column_index, operator_index, condition) trong đó:
■ column_index: index của cột điều kiện đang được sử dụng
■ operator_index: index của điều kiện đang được sử dụng
■ condition: giá trị so sánh cho điều kiện, theo kiểu chuỗi hoặc kiểu float
Những file có định dạng "*.tables.jsonl", có định dạng dữ liệu kiểu sau:
Hình 4.9 Định dạng dữ liệu trong file kiểu "*.tables.jsonl"
● header: danh sách tên các cột trong bảng
● rows: một danh sách các hàng Mỗi hàng ứng với 1 bản ghi trong cơ sở dữ liệu
Các bảng cũng được chứa trong một file “* db” tương ứng Đây là một cơ sở dữ liệu SQL có cùng thông tin
Lưu ý: do định dạng linh hoạt của các bảng HTML, tên cột của các bảng trong cơ sở dữ liệu đã được ký hiệu Ví dụ: đối với một bảng có các cột ['foo', 'bar'], các cột trong cơ sở dữ liệu thực sự là col0 và col1
Mô hình phân tích ngữ nghĩa (Text2SQL)
Trong những năm gần đây, mô hình học sâu và dựa trên BERT đã cho thấy sự cải thiện đáng kể trong nhiệm vụ này Tuy nhiên, các phương thức trước đây không mã hóa nội dung bảng làm đầu vào của mô hình học sâu Khi mã hóa kết quả cho thấy mô hình đạt hiệu quả cao hơn Để giải quyết vấn đề nội dung bảng không được sử dụng cho mô hình, chúng ta sẽ:
1 Sử dụng thông tin trùng khớp của tất cả các ô của bảng và chuỗi câu hỏi để đánh dấu câu hỏi và tạo ra một vector đặc trưng có cùng độ dài cho câu hỏi
2 Sử dụng kết quả trùng khớp của tất cả tên cột và chuỗi câu hỏi để đánh dấu cột và tạo ra một vector đặc trưng có cùng độ dài với tiêu đề bảng
3 Toàn bộ mô hình dựa trên BERT và lấy hai vector đặc trưng ở trên làm đầu vào bên ngoài
Mục đích của mô hình phân tích ngữ nghĩa (Text2Sql) sẽ là dựa trên bộ dữ liệu tổng quát trên khắp các lĩnh vực WikiSql mà học cách ánh xạ tổng quát thông tin (từ ngữ) trong câu hỏi đến các trường trong cơ sở dữ liệu
Mã hóa vector đặc trưng bên ngoài (External Feature Vector Encoding):
Các phương thức mã hóa dựa trên kết hợp từ trong câu hỏi phù hợp với nội dung bảng và tiêu đề bảng Các thuật toán đầy đủ được hiển thị trong Thuật toán 1 và Thuật toán 2 (bên dưới)
Vector đánh dấu câu hỏi cuối cùng được đặt tên là QV và vector đánh dấu tiêu đề bảng cuối cùng được đặt tên là HV
Thuật toán 1: Xây dựng vector đánh dấu câu hỏi (question mark vector) vector = [0] * question_length for cell in table do if contains(question, cell) then
41 start_index = get_index(question, cell) vector[start_index] = 1 vector[start_index + 1 : start_index + len(cell)] = 2 vector[start_index + len(cell)] = 3 break end if end for for one in header do if contains(question, one) then index = get_index(question, one) vector[index] = 4 end if end for
+ Vector có độ dài = tổng số token trong câu hỏi (question_length)
+ Nếu tên cột (header) hoặc cell (trong table) xuất hiện trong câu hỏi thì vector sẽ có các giá trị tương ứng
+ Giá trị 1 là đại diện cho thẻ 'START'
+ Giá trị 2 là đại diện cho thẻ 'MIDDLE'
+ Giá trị 3 là đại diện cho thẻ 'END'
Thuật toán 2: Xây dựng vector đánh dấu tiêu đề (cột) bảng (header mark vector) vector = [0] * header_length index = 0 for one in header do if contains(question, one) then vector[index] = 1 end if index = index + 1 end for for cell in table do if contains(question, cell) then
42 vector[get_column_index(table, cell)] = 2 end if end for
+ Vector có độ dài = tổng số cột trong bảng (header_length)
+ Nếu tên cột(header) hoặc cell(trong table) xuất hiện trong câu hỏi thì vector sẽ có các giá trị tương ứng
+ Mục đích là cột chứa cell phù hợp sẽ được đánh dấu
- Tên tất cả cột của bảng: Header Table = ["State/territory",
"Text/background colour", "Format", "Current slogan", "Current series",
- Câu hỏi: Question = "Tell me what the notes are for South Australia"
- Dữ liệu trong Database: rows = [
["Australian Capital Territory", "blue/white", "Yaaãnna", "ACT ã CELEBRATION OF A CENTURY 2013", "YILã00A", "Slogan screenprinted on plate"],
["New South Wales", "black/yellow", "aaãnnãaa", "NEW SOUTH WALES", "BX::20Ỗ20::HI", "No slogan on current series"],
["New South Wales", "black/white", "aaaãnna", "NSW",
"CPXã12A", "Optional white slimline series"],
["Northern Territory", "ochre/white", "Caãnnãaa", "NT ã OUTBACK AUSTRALIA", "CBã06ãZZ", "New series began in June 2011"],
["Queensland", "maroon/white", "nnnãaaa", "QUEENSLAND ã SUNSHINE STATE", "999ãTLG", "Slogan embossed on plate"],
["South Australia", "black/white", "Snnnãaaa", "SOUTH
AUSTRALIA", "S000ãAZD", "No slogan on current series"],
["Victoria", "blue/white", "aaaãnnn", "VICTORIA - THE PLACE
TO BE", "ZZZã562", "Current series will be exhausted this year"]
+ Câu hỏi sau khi tách từ: Question_Token = ["Tell", "me", "what",
"the", "notes", "are", "for", "South", "Australia"]
+ Question vector gọi tắt là QV, Header vector gọi tắt là HV
+ Câu hỏi có 9 token => QV có độ dài = 9, ban đầu QV = [0, 0, 0, 0,
+ Header có 6 cột => HV có độ dài = 6, ban đầu HV = [0, 0, 0, 0, 0, 0]
+ “notes” ở vị trí index = 4 trong Question_Token => QV[4] = 4
+ “South Australia” ở vị trí index = 7 và 8 trong Question_Token =>
+ “notes” có trong header (header index = 5) => HV[5] = 1
+ “South Australia” trong database có 2 cell phù hợp (row index = 5, col index = 0 và 3) => HV[0] = HV[3] = 2
- Tên tất cả cột của bảng: Header Table = ["restaurant", "food",
- Câu hỏi: Question = "Tell me what restaurant has Pizza"
- Dữ liệu trong Database: rows = [
[“Pizza World”, “pizza”, 3, “Ha noi”], [“Mon Hue”, “bun”, 2.5, “Nam dinh”]
+ Câu hỏi sau khi tách từ: Question_Token = ["Tell", "me",
+ Question vector gọi tắt là QV, Header vector gọi tắt là HV
+ Câu hỏi có 6 token => QV có độ dài = 6, ban đầu QV = [0, 0,
+ Header có 4 cột => HV có độ dài = 6, ban đầu HV = [0, 0, 0, 0]
+ “restaurant” ở vị trí index = 3 trong Question_Token => QV[3] = 4
+ “Pizza” ở vị trí index = 5 trong Question_Token => QV[5] 1 (START)
+ “restaurant” có trong header (header index = 0) => HV[0] 1
+ “Pizza” trong database có 1 cell phù hợp (row index = 0, col index = 1) => HV[1] = 2
Sử dụng BERT làm lớp đại diện Ghép câu hỏi và tiêu đề bảng và đưa vào BERT, để tiêu đề câu hỏi và bảng có thông tin tương tác, chú ý lẫn nhau
Biểu thị đầu ra BERT của câu hỏi và tiêu đề bảng tạm gọi là Q và H
Hình 4.10 Mã hóa câu hỏi và tiêu đề bảng
Mã hóa chi tiết có dạng dưới đây:
+ [CLS], w1, w2, , wn, [SEP], h1, [SEP], h2, [SEP], , hn, [SEP] + w1, w2, , wn là các token trong câu hỏi
+ h1, h2, , hn lần lượt là tiêu đề bảng
Dựa trên bộ dữ liệu WikiSql, mô hình có 3 mục tiêu chính:
+ Dự đoán toán tử tổng hợp Aggregate
+ Dự đoán phần mệnh đề điều kiện Where
Hình 4.11 Minh hoạ mô hình dự đoán
Mô hình gồm 6 mô đun nhỏ gồm: select-column, select-aggregation, where- number, where-column, where-operator, và where-value Mỗi mô đun sẽ ứng với một nhiệm vụ khác nhau
+ Dự đoán tên cột trong tiêu đề bảng Cột được dự đoán sẽ tương ứng với cột sẽ được select trong câu truy vấn SQL
+ Dự đoán toán tử tổng hợp cho cột chọn đã cho
+ Gồm: none (không có toán tử), max, min, count, average, sum Where number:
+ Dự đoán số lượng điều kiện tìm kiếm (where condition) trong các truy vấn SQL
+ Dự đoán cột được tạo trong từng mệnh đề where
+ Dự đoán toán tử so sánh được tạo trong từng mệnh đề where
+ Gồm các toán tử: >, < và =
+ Dự đoán giá trị tương ứng trong từng mệnh đề where
Hình 4.12 Minh họa mô hình phân tích ngữ nghĩa
Các mô đun gồm 2 mô hình đào tạo LSTM: dùng để mã hóa thông tin câu hỏi (kết hợp Q và QV) và tiêu đề (kết hợp H và HV) Tùy vào từng mô đun mà thông tin được mã hóa như trên có kết hợp với thông tin từ các mô đun khác và đi qua các lớp Linear, Tanh, Softmax để tính toán thành vector đầu ra Dựa vào vector đầu ra đó sẽ đoán được kết quả tương ứng với mục đích của từng mô đun
- Tin nhắn “What restaurant has pizza”
- Logical form sau khi được phân tích ngữ nghĩa: {'agg': 0, 'sel': 0, 'conds': [[1, 0, 'pizza']]}
- Tương ứng với 6 mô đun:
+ Select Column (‘sel’: 0): tương ứng cột có index = 0 (cột
`restaurant`) trong database => Select `restaurant`
+ Select Aggregation (‘agg’: 0): => Không có toán tử tổng hợp
+ Where number ('conds': [[1, 0, 'pizza']]): chỉ chứa có 1 mệnh đề Where
+ Where column = 1: tương ứng cột có index = 1 (cột `food`) trong database => Select `pizza`
+ Where operator = 0: tương ứng toán tử có index = 0 => Toán tử “=”
+ Where value = ‘pizza’: => Giá trị “pizza”
+ Số lượng các lớp BERT cuối cùng được sử dụng: 2 + Kích thước của hidden dimension: 100
+ Kích thước LSTM encoding layer: 2 + Epoch (mặc định): 200
Web
:domain/classify POST message -Tin nhắn (message) được truyền vào body
-Áp dụng module Intent Classify
-Giá trị trả về là tên của Intent -VD:
+ Đầu vào message “Hello” + Trả về intent “greet”
:domain/sematic POST message -Tin nhắn (message) được truyền vào body
-Áp dụng module Semantic Parsing
-Giá trị trả về là dữ liệu sau khi được phân tích và truy xuất vào database
+ Đầu vào message “Help me find restaurant have pizza food”
+ Trả về tên các cửa hàng
“Hamburger King, Mon Hue, Italy Food”
Giao diện này được xây dựng dựa trên nền tảng web áp dụng VueJS
Tên thư mục / file Ý nghĩa dist/images Chứa các file ảnh của giao diện src/components Chứa các component của VueJS src/plugin Chứa các plugin main.js Khởi tạo app
Cài đặt các package cần thiết như:
+ axios: thực hiện gọi API
+ vuex: quản lý các state trong VueJS
Hình 4.13 mô hình tương tác của Vuex
Giao diện trò chuyện (hình bên dưới) gồm 3 phần chính:
+ Hiển thị danh sách người trò chuyện (người dùng hiện tại, bot và admin)
+ Input: có hỗ trợ lọc theo người dùng
- Lịch sử trò chuyện (trên bên phải):
+ Hiển thị lịch sử cuộc trò chuyện
+ Hiển thị thời gian ứng với các tin nhắn
+ Tin nhắn bên trái là phản hồi của bot
+ Tin nhắn bên phải là của người dùng
- Khung chat (dưới bên phải):
+ Để nhập tin nhắn + Nhấn tổ hợp phím Ctrl + Enter để gọi API gửi tin nhắn đến Server và tiến hành phân tích để nhận phản hồi
Nội dung lịch sử cuộc trò chuyện sẽ được lưu cả trong local storage
Khởi động client dùng lệnh: yarn run dev
Chức năng khác
Truy vấn cơ sở dữ liệu
Kết quả đầu ra của quá trình phân tích ngữ nghĩa sẽ là cơ sở để hình thành câu truy vấn tới cơ sở dữ liệu
Xây dựng truy vấn đơn giản có các phần:
- Cột thực hiện toán tử select:
+ Sẽ ánh xạ từ kết quả của mô đun Select Column (trả về index của cột trong bảng)
+ Có tùy chọn truy vấn distinct, like
- Toán tử tổng hợp là phần tử trong mảng ['', 'MAX', 'MIN', 'COUNT', 'SUM', 'AVG'] có index bằng kết quả của mô đun Select Aggregation
- Where number: tương ứng với số mệnh đề Where Clause trong SQL
- Trong mỗi một mệnh đề Where Clause:
+ Được tạo thành từ kết quả của 3 mô đun: Where column, Where operator, Where value
Ví dụ: Where `place` = “Ha Noi”
+ Sẽ nối với các mệnh đề Where Clause khác bằng toán tử AND
+ Nếu cột được chọn có kiểu là real thì sẽ chuyển giá trị so sánh từ chữ về số
Ví dụ: “five” => 5 + Giá trị so sánh được tiền xử lý (VD: bỏ dấu “Hà Nội” => “Ha Noi”)
+ Giá trị so sánh nếu có từ phủ định ở đằng trước thì sẽ thay đổi toán tử so sánh
Ví dụ: Where `place` = “not Ha Noi” => Where `place` != “Ha Noi”
Dựa vào từng trường hợp mà NLG sẽ sinh ra cách phản hồi khác nhau
- Khi Intent là getInfo và có dữ liệu tương ứng với điều kiện tìm kiếm: sẽ được phản hồi bằng cách chọn ngẫu nhiên một mẫu câu (template) trong tập dữ liệu được định sẵn
Ví dụ: “find rating of ABC restaurant”
=> Kết quả truy vấn là 3
=> phản hồi “Restaurant has 3 rating”
- Các trường hợp còn lại (getInfo không tìm thấy dữ liệu, các intent khác, trường hợp ngôn ngữ người dùng không phải tiếng anh): + NLG xây dựng sẵn tập các câu trả lời tương ứng
+ Khi phản hồi người dùng thì sẽ chọn ngẫu nhiên 1 câu trả lời trong đó
Ví dụ: tập câu trả lời đã được xây dựng của intent Bye là [“Good bye”, “Have a nice day”] NLG sẽ chọn ngẫu nhiên 1 trong 2 câu này để phản hồi khi xác định người dùng có intent là Bye.