1. Trang chủ
  2. » Luận Văn - Báo Cáo

Công cụ thiết kế và sinh kịch bản cho AI Chatbot

90 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Một đóng góp mang tính thực tiễn của đồ án là áp dụng giải pháp trên vào một hệ thống AI hội thoại cụ thể – SmartDialog. Bằng việc áp dụng các mô hình, kiến trúc, công nghệ tối ưu thì đồ án đã hoàn thiện một công cụ thiết kế luồng hội thoại và sinh kịch bản mới cho SmartDialog và đưa vào triển khai thực tế tại https://bot.smartdialog.vn với người dùng thực tế (ước lượng khoảng hơn 100 người dùng, phục vụ cho các đối tượng khách hàng lớn như Vietcombank, VNPAY, Momo, Mirae Asset…)

Trang 1

Công cụ thiết kế và sinh kịch bảncho AI Chatbot

Trang 2

Trong cuộc cách mạng công nghiệp lần thứ tư (hay thời đại công nghệ 4.0), AI (Artificial Intelligence) hội thoại trở thành một xu hướng trí tuệ nhân tạo tất yếu giúp con người có thể giao tiếp với máy như cách mà con người giao tiếp với nhau Hiện nay, các công nghệ AI hội thoại như Chatbot hay Voicebot hầu hết đều hoạt động hiệu quả với các thuật toán lai, trong đó kết hợp dùng luật theo các kịch bản có sẵn và khả năng học máy dựa trên các kịch bản đó Điều đó dẫn tới nhu cầu thiết yếu của các công cụ thiết kế và sinh kịch bản hội thoại để cung cấp các kịch bản sử dụng trong các thuật toán lai nói trên Hiện nay đã có những công cụ như vậy nhưng hầu hết trong số chúng đều là phần mềm độc quyền, không thể tái sử dụng được Do đó, đồ án hướng tới việc xây dựng một công cụ thiết kế và sinh kịch bản hội thoại mang tính tổng quát và đưa ra một giải pháp có thể tái sử dụng được

Công cụ thiết kế và sinh kịch bản hội thoại này sẽ phải trực quan, dễ sử dụng, có trải nghiệm người dùng tốt, hiệu năng ổn định Để có được hiệu năng và trải nghiệm mượt mà nhất cho người dùng, đồ án sẽ lựa chọn thư một thư viện phát triển giao diện người dùng với hiệu năng gần như là tốt nhất Dựa trên cơ sở đó, đồ án sẽ phát triển một thư viện mới chuyên để thiết kế luồng hội thoại dưới dạng sơ đồ luồng Và để có được kịch bản từ các luồng hội thoại đã được thiết kế, đồ án cũng sẽ phát triển một thuật toán sinh kịch bản hiệu quả sử dụng đệ quy Cuối cùng, toàn bộ hệ thống sẽ được thiết kế theo kiến trúc Microservices để đảm bảo hiệu năng, đặc biệt là trong quá trình sinh kịch bản

Đến cuối cùng, từ việc đưa ra được giải pháp chung cho công cụ thiết kế và sinh kịch bản hội thoại, đồ án đã thành công trong việc xây dựng công cụ thiết kế và sinh kịch bản cho một nền tảng AI hội thoại cụ thể là SmartDialog Công cụ này đã được triển khai trên nền tảng SmartDialog tại https://bot.smartdialog.vn kể từ tháng 08 năm 2021 tới nay với hơn 100 người dùng, phục vụ cho các đối tượng khách hàng lớn như Vietcombank, VNPAY, Momo, Mirae Asset…

Tóm tắt

Trang 3

1.1.2 Các khái niệm cơ bản trong AI hội thoại 2

1.1.3 Kiến trúc của một hệ thống AI hội thoại 3

1.2 Nhu cầu của công cụ thiết kế và sinh kịch bản hội thoại 4

Trang 4

2.3.1 Kiến trúc phần Frontend 9

2.3.2 Các thành phần trên giao diện 10

2.3.3 Quản lý trạng thái của các thành phần giao diện 11

2.3.4 Thuật toán tạo đường kết nối giữa hai nút 14

2.4 Giải pháp phần Backend 19

2.4.1 Kiến trúc phần Backend 19

2.4.2 Thuật toán sinh kịch bản 22

2.4.3 Thiết kế cơ sở dữ liệu 27

Chương 3 Phân tích thiết kế và xây dựng công cụ Workflow trong SmartDialog 30

3.3.1 Các công nghệ sử dụng cho Frontend 40

3.3.2 Các công nghệ sử dụng cho Backend 42

Trang 5

3.5.3 Minh họa các chức năng chính 55

4.1 Chuyển phiên bản Workflow cũ sang phiên bản mới 66

4.1.1 Bản chất của việc chuyển phiên bản 66

4.1.2 Chiến lược chuyển phiên bản một cách an toàn 67

4.1.3 Thuật toán chuyển phiên bản 68

4.1.4 Kết quả thực tế 69

4.2 Cách sinh và lưu kịch bản tối ưu 70

4.3 Sinh các trường hợp kiểm thử 72

Chương 5 Kết luận và hướng phát triển 75

5.1 Kết luận 75

5.2 Hướng phát triển 76

Tài liệu tham khảo 77

Trang 6

Hình 1 Ví dụ về một đoạn hội thoại với Google Assistant 1

Hình 2 Ví dụ về một luồng hội thoại 2

Hình 3 Các thành phần của một hệ thống AI hội thoại điển hình 3

Hình 4 Kiến trúc tổng quan của giải pháp 8

Hình 5 Kiến trúc phần Frontend của giải pháp 9

Hình 6 Các thành phần chính trên giao diện của công cụ thiết kế luồng hội thoại 10

Hình 7 Tương tác giữa các Frontend Components và thành phần quản lý trạng thái của công cụ thiết kế luồng hội thoại 11

Hình 8 Mô hình trạng thái ứng dụng thiết kế luồng hội thoại 12

Hình 9 Minh họa thuật toán tạo đường kết nối gấp khúc vuông góc theo chiều dọc 15

Hình 10 Minh họa thuật toán tạo đường kết nối gấp khúc vuông góc theo chiều ngang 15

Hình 11 Lưu đồ thuật toán tạo đường kết nối 16

Hình 12 Kiến trúc phần Backend của giải pháp 20

Hình 13 Ví dụ một luồng hội thoại đơn giản 22

Hình 14 Lưu đồ mô tả thuật toán sinh kịch bản 23

Hình 15 Ví dụ đơn giản về việc sử dụng luồng hội thoại con 24

Hình 16 Ví dụ sử dụng các luồng hội thoại con nối tiếp nhau 25

Hình 17 Lưu đồ mô tả thuật toán tìm tổ hợp các phần tử của các mảng 27

Hình 18 Biểu đồ thực thể liên kết rút gọn 28

Hình 19 Thiết kế theo hướng Normalization và Aggregation 28

Hình 20 Minh họa thiết kế cho cơ sở dữ liệu lưu kịch bản 29Danh mục hình vẽ

Trang 7

Hình 21 Biểu đồ use case tổng quan 31

Hình 22 Biểu đồ use case phân rã thiết kế luồng hội thoại 32

Hình 23 Kiến trúc tổng quan của công cụ Workflow trong SmartDialog 45

Hình 24 Các thành phần bên trong của một dịch vụ 47

Hình 25 Biểu đồ trình tự quá trình sinh kịch bản 48

Hình 26 Biểu đồ trình tự quá trình sinh kịch bản huấn luyện 49

Hình 27 Thiết kế của cơ sở dữ liệu chính 51

Hình 28 Cấu trúc dữ liệu của thuộc tính mainMessages trong một tài liệu ở bộ sưu tập scripts (kịch bản) 53

Hình 29 Kiến trúc phần Frontend của công cụ Workflow trong SmartDialog 54

Hình 30 Giao diện thiết kế luồng hội thoại 56

Hình 31 Xem nút nào gây ra trạng thái không hợp lệ của luồng hội thoại 57

Hình 32 Xem nút nào gây ra trạng thái không hợp lệ của luồng hội thoại 57

Hình 33 Giao diện tạo vòng lặp trong luồng hội thoại ở nút điều kiện 58

Hình 34 Toán tử AND/OR cho các điều kiện trong một nút điều kiện 58

Hình 35 Các nút điều kiện nối liên tiếp với nhau 59

Hình 36 Ví dụ luồng hội thoại chuẩn bị sinh kịch bản 59

Hình 37 Ví dụ về kịch bản đầu tiên được sinh ra 60

Hình 38 Ví dụ về kịch bản thứ hai được sinh ra 60

Hình 39 Ví dụ về kịch bản thứ ba được sinh ra 60

Hình 40 Chức năng xuất luồng hội thoại dưới dạng ảnh 61

Hình 41 Chức năng xuất tệp kiểm thử 61

Hình 42 Tệp kiểm thử xuất dưới dạng file Excel 62

Hình 43 Bản chất của việc chuyển phiên bản 67

Hình 44 Các bước chuyển phiên bản một cách an toàn 68

Trang 8

Hình 45 Lưu đồ thuật toán chuyển phiên bản 69Hình 46 Kiến trúc ban đầu của công cụ thiết kế và sinh kịch bản hội thoại 70Hình 47 Kiến trúc của giải pháp sinh và lưu kịch bản tối ưu cho SmartDialog 71

Trang 9

Bảng 1 Các loại nút có thể sử dụng trong quá trình thiết kế luồng hội thoại 11

Bảng 2 Các thuộc tính cơ bản trong trạng thái của ứng dụng thiết kế luồng hội thoại 12

Bảng 3 Cấu trúc dữ liệu cơ bản của một nút 13

Bảng 4 Cấu trúc dữ liệu cơ bản của một đường kết nối 14

Bảng 5 Các biến để xác định định hướng kết nối 16

Bảng 6 Xác định định hướng kết nối dựa theo các biến 17

Bảng 7 Xác định các điểm neo dựa theo định hướng kết nối 19

Bảng 8 Mô tả yêu cầu bài toán tìm tất cả tổ hợp các phần tử của các mảng 26

Bảng 9 Đặc tả use case Tạo nút 33

Bảng 10 Các loại nút có thể sử dụng trong quá trình thiết kế luồng hội thoại 34

Bảng 11 Đặc tả use case Tạo cạnh 34

Bảng 12 Điều kiện tạo cạnh (kết nối) giữa các loại nút 35

Bảng 13 Đặc tả use case Sinh kịch bản 36

Bảng 14 Đặc tả use case Xuất luồng hội thoại dưới dạng ảnh 37

Bảng 15 Các tùy chọn khi xuất luồng hội thoại dưới dạng ảnh 37

Bảng 16 Đặc tả use case Xuất tệp kiểm thử 38

Bảng 17 Các tùy chọn khi xuất tệp kiểm thử 39

Bảng 18 Đặc tả use case Nhân bản luồng hội thoại 39

Bảng 19 Ví dụ về tương tác với tài nguyên bằng REST APIs với các động từ HTTP 44

Bảng 20 Thiết kế APIs cho dịch vụ xây dựng bot 49

Bảng 21 Thiết kế APIs cho cổng huấn luyện 50Danh mục bảng

Trang 10

Bảng 22 Thiết kế APIs cho dịch vụ sinh kịch bản huấn luyện 50

Bảng 23 Các thuộc tính của mỗi tài liệu trong bộ sưu tập workflows (luồng hội thoại) 51

Bảng 24 Các thuộc tính của mỗi tài liệu trong bộ sưu tập scripts (kịch bản) 52

Bảng 25 Danh sách thư viện và công cụ sử dụng 55

Bảng 26 Danh sách các trường hợp kiểm thử cho chức năng thiết kế luồng hội thoại 62

Bảng 27 Danh sách các trường hợp kiểm thử cho chức năng sinh kịch bản 64

Bảng 28 Các đường dẫn tới các môi trường sản phẩm khác nhau của SmartDialog 65

Bảng 29 Cấu trúc của thuộc tính workflow ở 2 phiên bản của công cụ 66

Bảng 30 Nội dung các cột trong mỗi Sheet ở tệp kiểm thử 73

Trang 11

UI User Interface

Giao diện người dùng

Trí tuệ nhân tạo

Giao diện lập trình ứng dụng

Giao thức truyền tải siêu văn bản

Định dạng dữ liệu đối tượng JavaScript

Chuyển đổi trạng thái đại diện

Ngôn ngữ đánh dấu mở rộng JavaScript

Giao thức xếp hàng tin nhắn nâng cao

Danh mục các từ viết tắt

Trang 12

Định vị tài nguyên thống nhất

Nhận diện tài nguyên thống nhất

Trang 13

AI hội thoại AI hội thoại

Danh mục thuật ngữ

Trang 14

Chương 1 giới thiệu về AI hội thoại và nêu ra nhu cầu của công cụ thiết kế và sinh kịch bản hội thoại, đồng thời mô tả rõ mục tiêu và phạm vi đề tài, qua đó nêu ra được định hướng giải pháp cho vấn đề, và cuối cùng là trình bày về bố cục đồ án

1.1 Giới thiệu về AI hội thoại

1.1.1 AI hội thoại là gì?

AI hội thoại (Conversational AI) không thực sự có một định nghĩa chuẩn Nhưng về cơ bản, AI hội thoại là các công nghệ mà ở đó máy móc, dưới sự trợ giúp của trí tuệ nhân tạo, có thể giao tiếp một cách tự nhiên với con người, như chatbot hay trợ lý ảo Một số ứng dụng điển hình của AI hội thoại trong thực tế có thể kể đến Google Assistant, Siri, Amazon Alexa… AI hội thoại có thể giao tiếp với con người một cách tự nhiên thông qua việc nhận diện giọng nói và văn bản, từ đó hiểu các ý định của con người và đáp lại giống cách của con người

Hình 1 Ví dụ về một đoạn hội thoại với Google Assistant Chương 1 Đặt vấn đề

Trang 15

AI hội thoại đã bắt đầu được phát triển từ những năm 1960 Vào năm 1966, một trong những phần mềm Chatbot đầu tiên đã được phát triển bởi Joseph Weizenbaum và được đặt tên là Eliza Kể từ đó AI hội thoại đã từng bước nhen nhóm và phát triển mạnh mẽ trong những năm gần đây

1.1.2 Các khái niệm cơ bản trong AI hội thoại

AI hội thoại có hai khái niệm chính là ý định và hành động Ý định có thể hiểu là ý định của người dùng cuối định thực hiện thông qua một câu nói Hành động ở đây là những hành động mà máy sẽ thực hiện để đáp lại một ý định của người dùng (ví dụ như gửi tin nhắn văn

bản, gửi phản hồi dưới dạng âm thanh…) Trong ví dụ ở Hình 1, ý định trong câu đầu tiên

mà người dùng cuối gửi là muốn biết trợ lý ảo Google có cảm xúc hay không Đáp lại ý định đó, trợ lý ảo Google có hành động là gửi lại một đoạn tin nhắn văn bản

Từ việc thiết kế, sắp xếp các ý định và hành động đã được xây dựng sẵn, người phát triển hệ

thống AI hội thoại sẽ tạo ra được một luồng hội thoại Hình 2 là ví dụ về một luồng hội thoại

đơn giản

Hình 2 Ví dụ về một luồng hội thoại

Ngoài ra, một số hệ thống AI hội thoại còn hỗ trợ việc tạo luồng hội thoại con Luồng hội thoại con về bản chất cũng là một luồng hội thoại Mục đích của luồng hội thoại con là để tái sử dụng các luồng hội thoại

Trang 16

1.1.3 Kiến trúc của một hệ thống AI hội thoại

Một hệ thống AI hội thoại sẽ cần có một giao diện để người dùng có thể tương tác với máy tính, có thể thông qua văn bản hoặc giọng nói Trên thực tế, các hệ thống AI hội thoại khác nhau sẽ có kiến trúc khác nhau Tuy nhiên, các thành phần cơ bản của một hệ thống AI hội thoại điển hình có thể được khái quát hóa thành các thành phần như sau: (i) bộ giải mã đầu vào, (ii) khối hiểu ngôn ngữ tự nhiên, (iii) thành phần quản lý hội thoại, (iv) khối sinh thông tin phản hồi, (v) trình kết xuất đầu ra Thứ tự của từng thành phần được mô tả chi tiết trong

Hình 3

Hình 3 Các thành phần của một hệ thống AI hội thoại điển hình

Trước hết, bộ giải mã đầu vào có vai trò chuyển đổi dữ liệu đầu vào thành dạng văn bản Cần phải có bộ giải mã đầu vào vì dữ liệu đầu vào không phải lúc nào cũng là dạng văn bản mà có thể là dạng âm thanh (giọng nói), dạng hình ảnh (nhận diện nét chữ)… Tiếp đó, các dữ liệu đầu vào đã được chuyển đổi thành dạng văn bản sẽ tiếp tục được xử lý ở khối hiểu ngôn ngữ tự nhiên Khối hiểu ngôn ngữ tự nhiên có vai trò phân tích và hiểu được ý định mà người dùng muốn diễn đạt thông qua dữ liệu đầu vào Đầu ra của khối hiểu ngôn ngữ tự nhiên là biểu diễn ngữ nghĩa mà thành phần quản lý hội thoại sẽ sử dụng

Thành phần quản lý hội thoại đóng vai trò vô cùng quan trọng trong toàn kiến trúc Nhiệm vụ chính của thành phần này là tính toán và đưa ra biểu diễn ngữ nghĩa cho phản hồi của hệ thống dựa trên ngữ cảnh của cuộc hội thoại Thông thường thành phần quản lý hội thoại sẽ cần truy cập tới kịch bản hội thoại để quyết định xem sẽ đưa ra phản hồi như thế nào dựa trên ý định của người dùng Trong các hệ thống AI hội thoại sử dụng kịch bản thì kịch bản hội thoại cũng là một trong những thành phần quan trọng nhất Sau khi thành phần quản lý hội thoại đã hoàn thành nhiệm vụ, khối sinh thông tin phản hồi sẽ dựa vào các biểu diễn ngữ

Trang 17

nghĩa đã được đưa ra để xây dựng thông tin phản hồi dưới dạng văn bản Cuối cùng, trình kết xuất đầu ra sẽ chuyển đổi thông tin phản hồi dưới dạng văn bản thành dạng phản hồi phù hợp cho người dùng (ví dụ như là giọng nói tự nhiên)

1.2 Nhu cầu của công cụ thiết kế và sinh kịch bản hội thoại

Hiện nay, như đã trình bày trong kiến trúc của một hệ thống AI hội thoại điển hình, thường các loại công nghệ AI hội thoại sẽ sử dụng kịch bản để hoạt động Các loại công nghệ trí tuệ nhân tạo này sẽ được huấn luyện dựa theo các kịch bản hội thoại để giao tiếp và tương tác với con người Do đó, việc sinh kịch bản đối với các loại AI hội thoại này là tối quan trọng và không thể thiếu

Có nhiều cách để sinh ra các kịch bản hội thoại kể trên (chủ yếu là dưới tác động của con người) Một cách phổ biến và trực quan nhất là sử dụng công cụ thiết kế và sinh kịch bản hội thoại Người dùng sẽ sử dụng công cụ thiết kế và sinh kịch bản hội thoại để tạo ra các kịch bản mà sẽ được chuyển thành dạng biểu diễn mà các công nghệ AI hội thoại như Chatbot hoặc Voicebot có thể hiểu được Các kịch bản này sẽ được sử dụng cho thành phần quản lý hội thoại theo luật, đồng thời cũng có thể làm dữ liệu huấn luyện cho thành phần quản lý hội thoại dùng công nghệ học máy hay học sâu Vì vậy, công cụ thiết kế và sinh kịch bản hội thoại trở thành một nhu cầu thiết yếu khi nhắc tới AI hội thoại Công cụ thiết kế và sinh kịch bản hội thoại sẽ giúp cho người dùng tạo được các luồng hội thoại một cách dễ dàng và trực quan nhất, và từ đó sinh ra các kịch bản hội thoại

Nói chung, công cụ thiết kế và sinh kịch bản hội thoại là yếu tố quyết định một công nghệ AI hội thoại như Chatbot hoặc Voicebot có thể hoạt động một cách thông minh hay không Vì vậy, đồ án tốt nghiệp này sẽ tập trung vào việc xây dựng một công cụ thiết kế và sinh kịch bản cho AI hội thoại

1.3 Mục tiêu và phạm vi đề tài

Mục tiêu của đồ án tốt nghiệp sẽ là xây dựng công cụ thiết kế và sinh kịch bản cho AI hội thoại đảm bảo một số các tiêu chí như có khả năng thiết kế luồng hội thoại một cách trực quan và có trải nghiệm người dùng tốt, đảm bảo hiệu năng của ứng dụng khi số lượng nút hội thoại lớn, đảm bảo tính chính xác trong quá trình sinh kịch bản, đảm bảo hiệu năng của hệ thống khi sinh một số lượng kịch bản lớn…

Về phạm vi đề tài, công cụ thiết kế và sinh kịch bản cho AI hội thoại mà đồ án hướng tới xây dựng sẽ có các tính năng chính như cho phép người dùng có thể thiết kế luồng hội thoại một cách trực quan, và sau khi thiết kế xong luồng hội thoại thì người dùng có thể ra lệnh cho hệ thống sinh ra các kịch bản hội thoại dựa trên luồng hội thoại đã được thiết kế Thêm

Trang 18

vào đó, công cụ sẽ có các tính năng phụ hỗ trợ cho người dùng trong quá trình thiết kế luồng hội thoại và phục vụ các mục đích khác của người dùng

Đầu vào của công cụ thiết kế và sinh kịch bản hội thoại sẽ là các luồng hội thoại dưới dạng sơ đồ luồng được vẽ bởi người dùng Sau khi thiết kế xong, các luồng hội thoại dưới dạng sơ đồ luồng này sẽ được chuyển thành dạng biểu diễn dữ liệu (có thể là JSON, XML…) Các luồng hội thoại này sẽ được lưu trong cơ sở dữ liệu, và từ đó sẽ sinh ra các kịch bản Các kịch bản trong quá trình huấn luyện sẽ được chuyển thành đầu ra là các kịch bản huấn luyện mà Chatbot/Voicebot có thể sử dụng được

1.4 Định hướng giải pháp

Công cụ thiết kế và sinh kịch bản hội thoại sẽ phải trực quan, dễ sử dụng, có trải nghiệm người dùng tốt, chạy mượt mà khi luồng hội thoại lớn Do đó, đối với việc phát triển phần giao diện cho người dùng sử dụng, đồ án cần phải lựa chọn thư một thư viện phát triển giao diện người dùng với hiệu năng gần như là tốt nhất Ngoài ra, để công cụ thiết kế luồng hội thoại có trải nghiệm người dùng tốt nhất, đồ án sẽ phát triển một thư viện mới chuyên để thiết kế luồng hội thoại dưới dạng sơ đồ luồng Lý do mà đồ án không sử dụng một thư viện vẽ sơ đồ đã được phát triển sẵn là vì qua quá trình khảo sát, không có một thư viện có sẵn nào đáp ứng được nhu cầu về trải nghiệm người dùng cũng như nhu cầu về hiệu năng khi luồng hội thoại lớn và phức tạp Sau đó, đồ án cũng sẽ phát triển một thuật toán sinh kịch bản từ các luồng hội thoại đã được thiết kế Cuối cùng, đồ án sẽ thiết kế công cụ theo kiến trúc Microservices để đảm bảo hiệu năng và tính linh hoạt

Sau quá trình thực hiện theo định hướng giải pháp nêu trên, đồ án đã xây dựng được công cụ thiết kế và sinh kịch bản cho AI hội thoại, đáp ứng đầy đủ các yêu cầu về tính trực quan, trải nghiệm người dùng, hiệu năng và tính chính xác khi sinh kịch bản

1.5 Bố cục đồ án

Phần còn lại của báo cáo đồ án tốt nghiệp này được tổ chức như sau

Chương 2 đưa ra một giải pháp chung cho công cụ thiết kế và sinh kịch bản hội thoại Giải pháp này không ép buộc một công nghệ cụ thể nào mà cho phép người sử dụng có thể tự do lựa chọn công nghệ Nó sẽ đóng vai trò như một khung xương để xây dựng công cụ thiết kế và sinh kịch bản hội thoại

Chương 3 sẽ tiến hành phân tích hiện trạng và các yêu cầu liên quan tới công cụ thiết kế và sinh kịch bản hội thoại Tiếp đó, quá trình thiết kế, xây dựng, kiểm thử và triển khai công cụ thiết kế và sinh kịch bản hội thoại cho SmartDialog sẽ được trình bày chi tiết

Trang 19

Tiếp nối Chương 3, Chương 4 trình bày một số đóng góp nổi bật khác trong quá trình phát triển và triển khai công cụ thiết kế và sinh kịch bản hội thoại cho SmartDialog, ví dụ như quá trình chuyển phiên bản, tìm ra cách sinh và lưu luồng hội thoại tối ưu và thực hiện chức năng sinh các trường hợp kiểm thử

Cuối cùng, Chương 5 sẽ nêu ra kết luận về kết quả thực hiện đồ án, những bài học đúc kết được trong quá trình thực hiện đồ án, đồng thời đưa ra hướng phát triển trong tương lai để có thể tiếp tục hoàn thiện sản phẩm của đồ án

Trang 20

Chương 2 đưa ra giải pháp cho công cụ thiết kế và sinh kịch bản hội thoại, từ kiến trúc tổng quan cho đến giải pháp phần Frontend, giải pháp phần Backend và cuối cùng là đề xuất các thuật toán sẽ được sử dụng Giải pháp này sẽ đóng vai trò là nền tảng để xây dựng và phát triển một công cụ thiết kế và sinh kịch bản hội thoại

2.1 Phân tích các công cụ đã có

Hiện nay, có khá nhiều các phần mềm Chatbot/Voicebot (một dạng công nghệ AI hội thoại) hoạt động dựa trên kịch bản Có thể kể đến Chatfuel, ManyChat và đến từ thị trường Việt Nam là FPT.AI Chatbot Tất cả các phần mềm kể trên và bản thân SmartDialog (nền tảng AI hội thoại mà đồ án này đang hướng tới để xây dựng công cụ thiết kế và sinh kịch bản hội thoại) đều đã tự xây dựng riêng cho mình một công cụ để thiết kế luồng hội thoại và sinh kịch bản

Trong khi công cụ thiết kế kịch bản hội thoại của Chatfuel và ManyChat tập trung hỗ trợ và có các thành phần chi tiết dành cho Facebook Messenger thì công cụ này của FPT.AI Chatbot và SmartDialog hiện có mang tính tổng quát, không chỉ tập trung cho một nền tảng là Facebook Messenger Tuy nhiên, công cụ thiết kế và sinh kịch bản hội thoại hiện giờ của SmartDialog (tạm gọi là công cụ version 1 – v1) gặp những lỗi nghiêm trọng về mặt hiển thị, có trải nghiệm người dùng chưa tốt (không dễ sử dụng, không dễ để thiết kế luồng hội thoại), đôi khi sinh kịch bản bị sai, và gặp vấn đề về hiệu năng khi số lượng các nút và đường kết nối trong luồng hội thoại lớn Điều này dẫn tới nhu cầu phát triển một công cụ mới khắc phục được các nhược điểm của công cụ thiết kế và sinh kịch bản hội thoại v1

Các phần tiếp theo trong chương này sẽ tập trung vào việc đưa ra giải pháp cho một công cụ như vậy

2.2 Kiến trúc tổng quan

Hình 4 mô tả kiến trúc tổng quan của giải pháp, thiết kế theo Microservices Về cơ bản, các

thành phần chính trong kiến trúc là ứng dụng Frontend, dịch vụ xây dựng bot, dịch vụ sinh kịch bản và dịch vụ sinh kịch bản huấn luyện Ứng dụng Frontend sẽ chỉ tương tác duy nhất

Chương 2 Giải pháp cho công cụ thiết kế và sinh kịch bản hội thoại

Trang 21

với dịch vụ xây dựng bot thông qua giao thức HTTP, còn dịch vụ xây dựng bot sẽ tương tác với các dịch vụ còn lại khi cần thiết thông qua một hàng đợi tin nhắn

Có thể thấy với kiến trúc này thì các thành phần chính trong kiến trúc giao tiếp với nhau thông qua giao thức HTTP hoặc một hàng đợi tin nhắn Do đó có thể thay thế hoàn toàn kiến trúc hoặc công nghệ của một thành phần mà không lầm ảnh hưởng đến các thành phần khác, miễn là tất cả đều tuân thủ theo các APIs đã thống nhất Điều này sẽ làm cho quá trình phát triển và bảo trì hệ thống trở nên dễ dàng hơn Thêm vào đó, các thành phần trong kiến trúc này đều mang tính tổng quát, không phụ thuộc hay gắn chặt vào bất cứ một công nghệ cụ thể nào, do đó nó có thể được áp dụng một cách linh hoạt tùy theo nhu cầu sử dụng

Phần mô tả cụ thể cho từng thành phần chính trong kiến trúc này sẽ nằm trong các mục tiếp theo của chương

Hình 4 Kiến trúc tổng quan của giải pháp

Trang 22

2.3 Giải pháp phần Frontend

2.3.1 Kiến trúc phần Frontend

Hình 5 mô tả kiến trúc phần Frontend của giải pháp Kiến trúc phần Frontend được chia làm

3 thành phần chính: (1) Frontend Components, (2) thành phần quản lý trạng thái luồng hội thoại, (3) các dịch vụ API Vai trò của từng thành phần và tương tác giữa chúng sẽ được mô tả kĩ lưỡng ở dưới đây

Hình 5 Kiến trúc phần Frontend của giải pháp

Đầu tiên, có thể thấy kiến trúc phần Frontend xoay quanh việc xây dựng các Frontend Components độc lập Đây là xu hướng phát triển của hầu hết các ứng dụng (đặc biệt là ứng dụng Web) trong vòng một thập kỷ vừa qua, và hầu hết các công nghệ Frontend hiện nay đều hướng tới việc phát triển các Components, ví dụ như React, Vue, Angular, Svelte… Về cơ bản, các Frontend Components chính là các đại diện cho các thành phần trên giao diện người dùng Khi người dùng tương tác trên giao diện thì bản chất chính là đang tương tác với các Frontend Components này

Tiếp đến, thành phần quản lý trạng thái luồng hội thoại phụ trách việc quản lý trạng thái cho ứng dụng Frontend Mỗi một thao tác của người dùng trên giao diện như kéo thả một nút, tạo thêm đường kết nối, phóng to, thu nhỏ… đều sẽ tạo ra một trạng thái mới, và chính các Frontend Components là các thành phần liên tục cập nhật và làm thay đổi trạng thái này dựa trên các tương tác của người dùng Mặt khác, mỗi khi trạng thái ứng dụng thay đổi thì thành phần quản lý trạng thái này sẽ cập nhật thay đổi cho tất cả các Frontend Components liên quan Điều này đảm bảo rằng thành phần quản lý trạng thái ứng dụng sẽ là nguồn thông tin

Trang 23

duy nhất mà các Frontend Components sẽ dựa vào để hiển thị cho đúng trên giao diện người dùng

Thành phần cuối cùng trong kiến trúc là các dịch vụ API Đây là thành phần phụ trách việc tương tác với phía Backend thông qua việc gửi và nhận các HTTP Requests/HTTP Responses Mỗi khi có một tương tác người dùng đòi hỏi phải có sự can thiệp của phía Backend thì Frontend Component tương ứng sẽ gọi tới các dịch vụ API liên quan Như vậy, các dịch vụ API đóng vai trò trung gian trong việc kết nối giữa các Frontend Components và phía Backend

2.3.2 Các thành phần trên giao diện

Hình 6 Các thành phần chính trên giao diện của công cụ thiết kế luồng hội thoại

Mục đích của phần này là dựa vào các thành phần chính trên giao diện có thể thiết kế ra được các Frontend Components tương ứng

Dựa theo Hình 6, giao diện của công cụ thiết kế luồng hội thoại có tất cả 3 thành phần chính:

(1) thanh bên lề (Sidebar), (2) thanh công cụ (Toolbar), (3) giao diện chính để thiết kế luồng hội thoại Thanh bên lề là nơi để kéo thả các loại nút vào giao diện thiết kế luồng hồi thoại Thanh công cụ là nơi chứa các chức năng phụ như Undo, Redo, phóng to, thu nhỏ… Giao diện chính để thiết kế luồng hội thoại chứa tất cả các nút và đường kết nối giữa các nút đang được thiết kế

Ngoài ra, có tất cả 5 loại nút khác nhau trong công cụ thiết kế luồng hội thoại này Chi tiết

về các loại nút được mô tả ở Bảng 1

Trang 24

Bảng 1 Các loại nút có thể sử dụng trong quá trình thiết kế luồng hội thoại

1 Bắt đầu Điểm bắt đầu của luồng hội thoại

2 Ý định Một ý định hoặc hành động của người dùng 3 Điều kiện Một điều kiện của tham số trong một ý định

5 Luồng hội thoại con Một luồng hội thoại con

6 Kết thúc cục bộ Điểm mà luồng hội thoại hiện tại kết thúc 7 Kết thúc toàn cục Điểm mà tất cả luồng hội thoại kết thúc

2.3.3 Quản lý trạng thái của các thành phần giao diện

Phần này sẽ mô tả chi tiết về việc quản lý trạng thái của các thành phần giao diện trong công cụ thiết kế luồng hội thoại, từ việc tương tác giữa các Frontend Components với thành phần quản lý trạng thái ứng dụng cho đến cụ thể bên trong thành phần quản lý trạng thái ứng dụng có những gì

Hình 7 Tương tác giữa các Frontend Components và thành phần quản lý trạng thái của

công cụ thiết kế luồng hội thoại

Đầu tiên, tương tác giữa các Frontend Components và thành phần quản lý trạng thái luồng

hội thoại được mô tả ở Hình 7 Có 3 nhóm Frontend Components chính sẽ tương tác với

Trang 25

thành phần quản lý trạng thái là: (1) các components nút, (2) các components cạnh, (3) các components khác cần tương tác với thành phần quản lý trạng thái

Các Frontend Components có thể cập nhật trạng thái ứng dụng mỗi khi có tương tác của người dùng (ví dụ như việc di chuyển các nút, các đường kết nối) Khi trạng thái ứng dụng được cập nhật, thành phần quản lý trạng thái sẽ “thông báo” cho tất cả các Frontend Components liên quan để các Components này có thể hiển thị lại cho đúng (ví dụ như khi thay đổi vị trí của một nút thì các đường kết nối đến nút đó cũng phải thay đổi lại vị trí cho chính xác)

Hình 8 Mô hình trạng thái ứng dụng thiết kế luồng hội thoại

Hình 8 là mô hình trạng thái ứng dụng thiết kế luồng hội thoại Cụ thể các thuộc tính cơ bản

trong trạng thái của ứng dụng thiết kế luồng hội thoại được mô tả trong Bảng 2

Bảng 2 Các thuộc tính cơ bản trong trạng thái của ứng dụng thiết kế luồng hội thoại

Trang 26

TT Thuộc tính Kiểu dữ liệu

Mô tả

3 transform Mảng Mảng gồm 3 phần tử số Phần tử thứ nhất là vị trí hiện tại của giao diện thiết kế luồng hội thoại trên trục hoành; phần tử thứ hai là vị trí hiện tại của giao diện thiết kế luồng hội thoại trên trục tung; phần tử thứ ba là độ phóng to thu nhỏ hiện tại

4 minZoom Số Độ thu nhỏ tối thiểu có thể đạt được 5 maxZoom Số Độ thu nhỏ tối đa có thể đạt được

6 nodes Mảng Mảng chứa tất cả các nút hiện có trên giao diện thiết kế luồng hội thoại Cấu trúc dữ liệu của từng nút (mỗi phần

tử trong mảng) sẽ được mô tả ở trong Bảng 3

7 edges Mảng Mảng chứa tất cả các đường kết nối hiện có trên giao diện thiết kế luồng hội thoại Cấu trúc dữ liệu của từng đường kết nối (mỗi phần tử trong mảng) sẽ được mô tả ở trong

2 position Object Object thể hiện vị trí của nút trên giao diện thiết kế luồng

hội thoại Có 2 thuộc tính: x thể hiện vị trí trên trục hoành, y thể hiện vị trí trên trục tung

5 type Xâu Loại nút Có tất cả 6 loại nút như đã mô tả ở Bảng 1

Trang 27

TT Thuộc tính Kiểu dữ liệu

Mô tả

6 data Object Lưu các thông tin về nghiệp vụ trên nút Ví dụ như đối với nút ý định thì sẽ lưu thông tin về ý định, nút hành động thì sẽ lưu thông tin về hành động…

7 isSelected Boolean Nút có đang được chọn hay không

Bảng 4 Cấu trúc dữ liệu cơ bản của một đường kết nối

dữ liệu

Mô tả

1 id Xâu ID độc nhất để nhận dạng đường kết nối

4 waypoints Mảng Mảng các điểm kết nối của đường kết nối Mỗi phần tử

là một Object { x, y } quyết định vị trí của điểm kết nối

Khi nối các điểm kết nối này lại với nhau ta sẽ được một đường kết nối hoàn chỉnh

5 isSelected Boolean Đường kết nối có đang được chọn hay không

Lưu ý rằng khi triển khai trong thực tế thì tùy vào nhu cầu và đặc điểm của ứng dụng mà có thể hoàn toàn thay đổi các cấu trúc dữ liệu kể trên vì chúng chỉ là các cấu trúc dữ liệu cơ bản nhất

2.3.4 Thuật toán tạo đường kết nối giữa hai nút

Trên giao diện thiết kế luồng hội thoại, giữa các nút với nhau sẽ có đường kết nối Nếu các đường kết nối chỉ đơn giản là đường thẳng nối từ tâm của nút này tới tâm của nút kia thì sẽ không cần tới thuật toán phức tạp nào Tuy nhiên nếu làm như vậy thì các đường kết nối sẽ rất dễ bị rối khi số lượng nút lớn, dẫn tới trải nghiệm người dùng không tốt Cách đem lại trải nghiệm người dùng tốt nhất là làm các đường kết nối gấp khúc vuông góc như trên các

Trang 28

công cụ vẽ phổ biến hiện nay (ví dụ như diagrams.net) Thuật toán để tạo ra những đường kết nối như vậy sẽ được mô tả trong phần này

Đầu tiên, mỗi đường kết nối sẽ bao gồm các Waypoints (điểm tham chiếu) Khi nối các điểm tham chiếu này với nhau ta sẽ được một đường kết nối hoàn chỉnh Bản chất việc kết nối giữa hai nút bất kì chính là kết nối giữa hai điểm: chọn ra một điểm ở nút này và một điểm

ở nút kia và kết nối chúng với nhau Gọi tọa độ của điểm thứ nhất (điểm A) là (xA, yA) và

điểm thứ hai (điểm B) là (xB, yB) thì khi kết nối hai điểm này với nhau xảy ra tất cả 4 trường hợp và cách xử lý của chúng như sau:

• Trường hợp 1: xA = xB: Chỉ việc nối một đường thẳng từ A sang B (2 điểm tham chiếu duy nhất của đường kết nối này chính là A và B)

• Trường hợp 2: yA = yB: Chỉ việc nối một đường thẳng từ A sang B (2 điểm tham chiếu duy nhất của đường kết nối này chính là A và B)

• Trường hợp 3: xA ≠ xB và yA ≠ yB và hướng kết nối là dọc: Chia thành 4 điểm tham

chiếu, trong đó A và B là 2 điểm tham chiếu đầu tiên Điểm tham chiếu thứ ba là C

với tọa độ (xA, yA/2 + yB/2) và điểm tham chiếu cuối cùng là D với tọa độ (xB, yA/2 +

yB/2) Nối các điểm tham chiếu này theo thứ tự A → C → D → B sẽ được đường kết

nối hoàn chỉnh (xem Hình 9)

Hình 9 Minh họa thuật toán tạo đường kết nối gấp khúc vuông góc theo chiều dọc

• Trường hợp 4: xA ≠ xB và yA ≠ yB và hướng kết nối là ngang: Chia thành 4 điểm tham

chiếu, trong đó A và B là 2 điểm tham chiếu đầu tiên Điểm tham chiếu thứ ba là C

với tọa độ (xA/2 + xB/2, yA) và điểm tham chiếu cuối cùng là D với tọa độ (xA/2 + xB/2,

yB) Nối các điểm tham chiếu này theo thứ tự A → C → D → B sẽ được đường kết

nối hoàn chỉnh (xem Hình 10)

Hình 10 Minh họa thuật toán tạo đường kết nối gấp khúc vuông góc theo chiều ngang

Trang 29

Hình 11 Lưu đồ thuật toán tạo đường kết nối

Tiếp đó, khi kết nối hai nút với nhau, cần phải xác định điểm neo A trên nút nguồn và điểm neo B trên nút đích Để xác định được hai điểm neo này thì phải xác định được định hướng

kết nối Bảng 5 bên dưới mô tả các biến dùng để xác định định hướng kết nối

Bảng 5 Các biến để xác định định hướng kết nối

Trang 30

Biến Kiểu dữ liệu

Dưới đây là bảng các giá trị mà các biến trong Bảng 6 có thể nhận được kèm theo đó là định

hướng kết nối được xác định (trong đó coi nút A là nút nguồn còn nút B là nút đích)

Bảng 6 Xác định định hướng kết nối dựa theo các biến

Biến

1 true true true true Hai nút A và B hoàn toàn trùng nhau

Không có

Trang 31

Biến

chiều ngang)

chiều ngang)

chiều ngang)

chiều ngang)

Khi đã xác định được định hướng kết nối thì bước tiếp theo là xác định các điểm neo A và

B trên nút nguồn và nút đích Bảng 7 bên dưới mô tả cách xác định các điểm neo dựa theo định hướng kết nối

Trang 32

Bảng 7 Xác định các điểm neo dựa theo định hướng kết nối

Định hướng

bên trái nút đích

Điểm neo A nằm ở trung điểm cạnh bên phải nhất của nút nguồn Điểm neo B nằm ở trung điểm cạnh bên trái nhất của nút nguồn

Ngang

bên phải nút đích

Điểm neo A nằm ở trung điểm cạnh bên trái nhất của nút nguồn Điểm neo B nằm ở trung điểm cạnh bên phải nhất của nút nguồn

Ngang

bên trên nút đích

Điểm neo A nằm ở trung điểm cạnh dưới cùng của nút nguồn Điểm neo B nằm ở trung điểm cạnh trên cùng của nút nguồn

Dọc

bên dưới nút đích

Điểm neo A nằm ở trung điểm cạnh trên cùng của nút nguồn Điểm neo B nằm ở trung điểm cạnh dưới cùng của nút nguồn

Hình 12 mô tả kiến trúc phần Backend của giái pháp Có 3 thành phần chính trong kiến trúc

phần Backend: (1) dịch vụ xây dựng bot, (2) dịch vụ sinh kịch bản, (3) dịch vụ sinh kịch bản huấn luyện Dịch vụ xây dựng bot và dịch vụ sinh kịch bản sẽ sử dụng chung một cơ sở dữ liệu xây dựng bot Dịch vị sinh kịch bản huấn luyện sẽ sử dụng riêng một cơ sở dữ liệu lưu kịch bản

Trang 33

Hình 12 Kiến trúc phần Backend của giải pháp 2.4.1.1 Dịch vụ xây dựng bot

Dịch vụ xây dựng bot là nơi tiếp nhận và xử lý toàn bộ các HTTP Requests từ phía Frontend Hầu hết mọi logic nghiệp vụ đều sẽ được xử lý tại đây Khi cần sự can thiệp của một dịch vụ khác thì dịch vụ xây dựng bot cũng là nơi sẽ quyết định gọi tới dịch vụ tương ứng nào để xử lý Điều này đảm bảo rằng phía Frontend chỉ cần biết đến duy nhất sự tồn tại của dịch vụ xây dựng bot mà không cần biết đến sự tồn tại của các dịch vụ khác

Cụ thể trong giải pháp cho công cụ thiết kế và sinh kịch bản hội thoại này, dịch vụ xây dựng bot sẽ đảm nhận các nghiệp vụ như tạo, đọc, cập nhật và xóa các luồng hội thoại Còn riêng việc sinh kịch bản hay sinh kịch bản huấn luyện thì dịch vụ xây dựng bot sẽ phải gọi tới dịch vụ sinh kịch bản hoặc dịch vụ sinh kịch bản huấn luyện để xử lý thông qua hàng đợi tin nhắn

Trang 34

2.4.1.2 Dịch vụ sinh kịch bản

Vai trò chính và cũng là duy nhất của dịch vụ sinh kịch bản là xử lý nghiệp vụ sinh kịch bản Khi phía Frontend gửi HTTP Request yêu cầu sinh kịch bản thì phía dịch vụ xây dựng bot sẽ đẩy thông điệp phù hợp vào hàng đợi tin nhắn Phía dịch vụ sinh kịch bản sẽ tiếp nhận thông điệp này và tiếp tục xử lý Dịch vụ sinh kịch bản sẽ tiến hành sinh kịch bản và lưu kịch bản đã sinh vào cơ sở dữ liệu

Về lý thuyết, có thể không cần tới dịch vụ sinh kịch bản này mà để cho dịch vụ xây dựng bot đảm nhiệm luôn việc sinh kịch bản Tuy nhiên nếu làm như vậy thì sẽ sớm gặp phải các vấn đề về hiệu năng khi số lượng các nút và đường kết nối trong luồng hội thoại là lớn và rất lớn Trên thực tế, thuật toán sinh kịch bản (sẽ được mô tả ở các phần sau) là phức tạp và có thời gian chạy tỉ lệ thuận với số lượng kịch bản sẽ được sinh ra Do đó, khi số lượng kịch bản là lớn và rất lớn thì sẽ chiếm nhiều tài nguyên CPU và RAM của máy chủ xử lý, đồng thời sẽ tốn nhiều thời gian khi phải ghi một số lượng lớn bản ghi vào trong cơ sở dữ liệu Trong khi đó, dịch vụ xây dựng bot là nơi xử lý toàn bộ các HTTP Requests từ phía Frontend, nếu CPU và RAM bị chiếm dụng hết bởi việc sinh kịch bản thì sẽ gần như không thể xử lý được các tác vụ khác nữa, và sẽ dẫn tới việc các HTTP Requests bị treo trong trường hợp xấu nhất Chính vì lý do này mà cần phải có riêng một dịch vụ chỉ phụ trách việc sinh kịch bản Khi đó, dù tài nguyên CPU và RAM của máy chủ chạy dịch vụ này có bị chiếm dụng gần hết thì cũng không ảnh hưởng tới dịch vụ xây dựng bot, và mọi HTTP Requests từ phía Frontend vẫn sẽ được xử lý như bình thường mà không bị tắc nghẽn

2.4.1.3 Dịch vụ sinh kịch bản huấn luyện

Vai trò chung của dịch vụ này là sinh kịch bản huấn luyện mà bot có thể hiểu được từ những kịch bản “thô” ban đầu Khi phía Frontend gửi HTTP Request yêu cầu huấn luyện bot thì phía dịch vụ xây dựng bot sẽ đẩy thông điệp yêu cầu sinh kịch bản huấn luyện vào hàng đợi tin nhắn Phía dịch vụ sinh kịch bản huấn luyện sẽ tiếp nhận thông điệp này và tiến hành sinh kịch bản huấn luyện Các kịch bản huấn luyện sẽ được lưu dưới dạng tập tin và được lưu trữ bởi một hệ thống hay dịch vụ lưu trữ tập tin

Một nhiệm vụ quan trọng của dịch vụ sinh kịch bản huấn luyện là sinh kịch bản hoàn chỉnh Theo thiết kế của giải pháp này, các kịch bản sinh ra bởi dịch vụ sinh kịch bản (khi người dùng bấm nút sinh kịch bản trên giao diện của công cụ) không bao gồm các kịch bản được kết hợp với các luồng hội thoại con Thay vào đó, mỗi luồng hội thoại con sẽ chỉ được coi là một nút hội thoại Vì vậy, những kịch bản này được coi là không hoàn chỉnh Kịch bản hoàn chỉnh sẽ được sinh ra bởi dịch vụ sinh kịch bản huấn luyện khi quá trình huấn luyện bắt đầu Trong các kịch bản hoàn chỉnh, những nút luồng hội thoại con (nếu có) sẽ được kết hợp với luồng hội thoại cha

Trang 35

Cụ thể về vai trò và nhiệm vụ của dịch vụ sinh kịch bản huấn luyện này sẽ được trình bày kỹ hơn trong phần “Cách sinh và lưu kịch bản tối ưu” ở Chương 4

2.4.2 Thuật toán sinh kịch bản

Thuật toán sinh kịch bản được chia làm 2 phần: (i) thuật toán sinh kịch bản cơ bản, (ii) thuật toán sinh kịch bản kết hợp luồng hội thoại con

Thuật toán sinh kịch bản cơ bản là thuật toán được dùng để sinh ra các kịch bản mà trong đó luồng hội thoại con sẽ được coi là một nút hội thoại Vì các luồng hội thoại con chỉ được coi là một nút hội thoại nên các kịch bản được sinh ra sẽ không hoàn chỉnh Thuật toán này sẽ được sử dụng bởi dịch vụ sinh kịch bản

Thuật toán sinh kịch bản kết hợp luồng hội thoại con được dùng để sinh ra các kịch bản hoàn chỉnh, trong đó những nút luồng hội thoại con (nếu có) sẽ được kết hợp với luồng hội thoại cha Thuật toán này sẽ được sử dụng bởi dịch vụ sinh kịch bản huấn luyện

2.4.2.1 Thuật toán sinh kịch bản cơ bản

Từ luồng hội thoại đã được thiết kế, các kịch bản tương ứng sẽ được sinh ra để từ đó trải qua huấn luyện trở thành các kịch bản huấn luyện mà Chatbot/Voicebot có thể hiểu được Thuật toán để sinh ra các kịch bản sẽ được mô tả chi tiết dưới đây

Giả sử có một luồng hội thoại như trong Hình 13

Trang 36

Thuật toán sinh kịch bản về bản chất là thuật toán đệ quy duyệt tuần tự tất cả các đường kết nối có trong luồng hội thoại từ nút bắt đầu đến nút kết thúc và ghi nhớ các nút đã đi qua

trong quá trình duyệt Thuật toán này được mô tả trong lưu đồ ở Hình 14

Hình 14 Lưu đồ mô tả thuật toán sinh kịch bản

Trang 37

2.4.2.2 Thuật toán sinh kịch bản kết hợp luồng hội thoại con

Một trong các chức năng quan trọng của công cụ thiết kế và sinh kịch bản hội thoại đó là

cho phép sự xuất hiện của các luồng hội thoại con Hình 15 là một ví dụ về việc sử luồng

hội thoại con trong luồng hội thoại cha

Hình 15 Ví dụ đơn giản về việc sử dụng luồng hội thoại con

Dễ thấy trong ví dụ trên có tất cả 3 kịch bản sẽ được sinh ra là: [1, 2, 1a, 2a, 3a, 3], [1, 2, 1a, 2a, 4a, 3], [1, 2, 1a, 2a, 5a, 3] Thuật toán ở đây chỉ đơn thuần là ghép ba phần kịch bản theo thứ tự như sau: các kịch bản sinh ra từ luồng hội thoại cha trước khi gặp luồng hội thoại con, các kịch bản sinh ra từ luồng hội thoại con, các kịch bản sinh ra từ luồng hội thoại cha sau khi gặp luồng hội thoại con

Tuy nhiên bài toán sẽ trở nên phức tạp hơn khi có các luồng hội thoại con nối tiếp nhau như

ví dụ ở Hình 16

Trang 38

Hình 16 Ví dụ sử dụng các luồng hội thoại con nối tiếp nhau

Dễ thấy trong ví dụ trên có tất cả 6 kịch bản được sinh ra Về cơ bản thì cách sinh các kịch bản vẫn là ghép các phần kịch bản theo thứ tự như sau: các kịch bản sinh ra từ luồng hội thoại cha trước khi gặp các luồng hội thoại con, các kịch bản sinh ra từ các luồng hội thoại con nối tiếp nhau, các kịch bản sinh ra từ luồng hội thoại cha sau khi gặp các luồng hội thoại con

Phần quan trọng ở đây là tìm được các kịch bản sinh ra từ các luồng hội thoại con nối tiếp nhau Có thể dễ dàng có được các kịch bản sinh ra từ luồng hội thoại con 1 là [1a, 2a, 3a], [1a, 2a, 4a], [1a, 2a, 5a], còn các kịch bản sinh ra từ luồng hội thoại con 2 là [1b, 3b], [2b, 4b] Coi các nút trong từng kịch bản là một “hộp đen” thì có thể viết gọn các kịch bản sinh

Trang 39

ra từ luồng hội thoại con 1 là [A, B, C], còn khi viết gọn các kịch bản sinh ra từ luồng hội thoại con 2 thì được [D, E]

Lúc này, bài toán quy về việc tìm tất cả tổ hợp có thể có từ việc ghép các phần tử của hai mảng trên theo thứ tự tuần tự Bài toán này có thể tổng quát hóa lên thành tìm tất cả tổ hợp

của các phần tử của n mảng khác nhau theo thứ tự tuần tự (tương đương với việc có n luồng

hội thoại con nối tiếp nhau) Bảng 8 mô tả ngắn gọn lại yêu cầu của bài toán này

Bảng 8 Mô tả yêu cầu bài toán tìm tất cả tổ hợp các phần tử của các mảng

Đầu vào [A, B, C], [D, E], [F, G, H]

[B, D, F], [B, D, G], [B, D, H], [B, E, F], [B, E, G], [B, E, H],

[C, D, F], [C, D, G], [C, D, H], [C, E, F], [C, E, G], [C, E, H]

Thuật toán để thực hiện việc này được mô tả theo ngôn ngữ tự nhiên như sau:

• Bước 1: Thêm tổ hợp hiện tại vào trong danh sách tổ hợp sẽ được tạo ra Khi mới chạy thuật toán thì tổ hợp đầu tiên chính là tổ hợp của mỗi phần tử đầu tiên của các mảng đầu vào

• Bước 2: Từ bên phải các mảng đầu vào, lùi tới mảng vẫn còn sót lại phần tử chưa được xét đến Nếu không có mảng nào như vậy thì kết thúc thuật toán

• Bước 3: Chuyển tới phần tử tiếp theo của mảng vừa lùi về

• Bước 4: Tất cả những mảng nằm sau mảng vừa lùi về sẽ xét lại về phần tử đầu tiên Sau đó lặp lại Bước 1

Chi tiết thuật toán được mô tả cụ thể hơn ở lưu đồ luồng trong Hình 17 Sau khi tìm được

tổ hợp của tất cả phần tử của các mảng chứa các kịch bản sinh ra từ các luồng hội thoại con thì đó chính là các kịch bản được sinh ra khi nối tiếp các luồng hội thoại con với nhau Ví dụ như nếu tìm được tổ hợp [A, D], trong đó A = [1a, 2a, 3a], D = [1b, 3b] thì [A, D] = [1a, 2a, 3a, 1b, 3b]

Trang 40

Hình 17 Lưu đồ mô tả thuật toán tìm tổ hợp các phần tử của các mảng

2.4.3 Thiết kế cơ sở dữ liệu

2.4.3.1 Thiết kế cho cơ sở dữ liệu xây dựng bot

Có tổng cộng 2 thực thể chính liên quan đến công cụ thiết kế và sinh kịch bản hội thoại này đó là: (1) Workflow (luồng hội thoại), (2) Script (kịch bản) Quan hệ giữa chúng là một

Ngày đăng: 25/06/2024, 17:38

Xem thêm:

w