Hình trên7 thể hiện điểm khác biệt trong việc huấn luyện hai mơ hình Bi-Encoder và Cross-Encoder. Ở Cross-encoder, hai câu văn được đưa vào mơ hình BERT cùng lúc rồi đưa qua một bộ classifier (có thể là hàm sigmoid) để cho ra giá trị từ 0 đến 1. Các tác giả ở [21] cho rằng Cross-Encoder có chất lượng tốt hơn Bi-Encoder, nhưng vì khơng sản sinh ra sentence embedding nên khơng thể dùng vào mục đích index vào cơ sở dữ liệu. Rõ ràng nếu ta sử dụng Cross-Encoder để tìm kiếm thì hiệu năng sẽ cực kì chậm vì mơ hình phải tính tốn O(n) lần embedding trung gian. Ngược lại, nếu dùng Bi-encoder, ta có thể tính embedding của tồn bộ kho văn trước, lúc truy vấn ta chỉ cần tính tốn embedding cho câu truy vấn và tính cosine similarity giữa nó với các câu văn cịn lại. Vì cosine similarity là một hàm số khá hiệu quả về mặt tính tốn, hiệu năng được đảm bảo.
Tuy vậy, Cross-Encoder vẫn có thể được sử dụng để bổ trợ Bi-Encoder trong việc sắp xếp lại các kết quả tìm kiếm của Bi-Encoder. Hình dưới đây minh họa một phương pháp sử dụng cả hai mơ hình để tiến hành tìm kiếm theo tương đồng ngữ nghĩa (trích từ [19]):
Hình 8: Mơ tả q trình tìm kiếm dựa vào tiến trình Retrieve-Rerank.
Ta cho Bi-Encoder lọc ra một số lượng các kết quả tìm kiếm tiềm năng nhất và đưa vào Cross-Encoder để nó sắp xếp lại kết quả cho phù hợp rồi lọc ra K kết quả phù hợp nhất. Vì Cross-encoder được đánh giá là có chất lượng tiên đốn tốt hơn Bi-Encoder, ta mong muốn
các kết quả trả ra sẽ phù hợp với câu truy vấn nhất và có thứ tự đúng đắn nhất. Thứ tự của kết quả trả ra cũng đặc biệt quan trọng trong các dạng bài tốn Truy vấn thơng tin như này. Rõ ràng nếu kết quả trả ra của hệ thống có phù hợp với người dùng đến mấy nhưng nếu người dùng phải lướt qua nhiều trang mới thấy được kết quả thì cũng vô giá trị.
Các chỉ số thường được sử dụng để đánh giá kết quả tìm kiếm được áp dụng trong bài toán này (và cũng thường được áp dụng ở bài toán Giới thiệu) là MRR, MAP, NDCG và Recall at K. Tóm tắt các chỉ số này như sau:
Mean Reciprocal Rank: với Q là tập hợp các truy vấn đến cơng cụ tìm kiếm, ranki là vị
trí của kết quả phù hợp đầu tiên từ câu truy vấn i.
MRR= 1 |Q|∑ i=1 |Q| 1 ranki
Có thể thấy cơng thức này chỉ tập trung nhiều vào thứ hạng của kết quả tìm kiếm phù hợp đầu tiên (trong bài toán là kết quả đầu tiên tương đồng với câu truy vấn ban đầu). Mean Average Position: được tính bằng cách lấy trung bình các Average Position của
từng câu truy vấn trong tập truy vấn, với Average Position được định nghĩa dựa trên tổng của tích Precision tại từng chập k phần tử đầu tiên của kết quả trả về (k chạy từ 1 đến n là số lượng phần tử trả về) và chỉ số biểu thị cho sự phù hợp của kết quả trả ra tại (0 nếu không phù hợp, 1 nếu phù hợp), chia cho số lượng các kết quả phù hợp:
AP= ∑ k=1 n P(k)rel(k) ∑ k=1 n rel(k)
Hệ số này hoạt động khá tốt trong trường hợp việc đánh giá sự phù hợp giữa câu truy vấn và kết quả chỉ có giá trị 0 hoặc 1.
Trong trường hợp mức đồ phù hợp có thể nhận một dãy số, hệ số thường được sử dụng sẽ là Normalized Discounted Cumulative Gain. Biểu diễn hệ số này dưới dạng công thức khá phức tạp nên sẽ không được thực hiện trong bài luận văn này. NDCG khá tương đồng với MAP. Cả hai cùng cho giá trị lớn đối với những câu truy vấn có kết quả mà ở đó các item phù hợp được sắp xếp lên đầu. NDCG có khả năng tiếp nhận được sự khác nhau về mức độ phù hợp giữa các kết quả trong câu truy vấn (kết quả này phù hợp hơn kết quả kia).
2.2 Công nghệ sử dụng2.2.1 Front-end: VueJS 2.2.1 Front-end: VueJS
VueJS là một trong những framework (cùng với ReactJS, Angular, EmberJS,...) nổi tiếng
dùng để phát triển Front-end cho nền tảng web sử dụng ngôn ngữ JavaSciprt.
VueJS vốn được phát triển chỉ từ một người duy nhất là Evan You, nhưng nó đã khơng
rộng rãi nhất trong cộng đồng với một số lượng người phát triển cốt lõi đông đảo và chất lượng.
Hệ thống sử dụng VueJS vì khả năng dễ tiếp cận của nó, đồng thời sức mạnh nó mang lại là rất lớn (đặc biệt là sự ra đời của phiên bản 3 - cũng là phiên bản mà nhóm làm đề tài sử dụng để phát triển). Một số đặc điểm cơ bản của VueJS có thể kể đến như sau:
Sử dụng tồn bộ tính năng, sức mạnh của HTML, CSS thuần chủng (khác với ReactJS sử dụng kiểu ngôn ngữ lai giữa HTML và JavaScript là JSX).
Có khả năng scale cực kì lớn vì là một bộ framework hồn chỉnh bao gồm những tính năng, thư viện,... hỗ trợ đầy đủ mọi nhu cầu từ dễ tới khó của một trang web.
Hiệu suất rất cao nhờ sử dụng Virtual DOM để hiện thực các bài toán liên quan tới hiệu suất khi phải giao tiếp giữa 3 ngôn ngữ khác nhau (HTML, CSS, JavaScript) như:
change detection, reactivity, asynchronous mechanism, smart rendering,...
Phù hợp với mọi cấp độ phát triển web, từ mini-project tới enterprise level.
Có cộng đồng sử dụng và phát triển đông đảo nhất hiện nay dù ra đời muộn hơn những framework “gạo cội” như: ReactJS, Angular.
Quản lý dữ liệu tập trung với Pinia
Việc sử dụng VueJS để hiện thực hệ thống này địi hỏi phải có rất nhiều component (thành phần), page (trang),… được người lập trình viết ra. Với VueJS thì Việc trao đổi dữ liệu giữa các component là theo từng nhánh, nghĩa là component cha có thể truyền dữ liệu xuống cho component con, component con có thể kích hoạt một sự kiện để component cha lắng nghe. Việc truyền dữ liệu từ các component kế cận nhau (cùng component cha) là rất phức tạp khi phải đi qua rất nhiều con đường. Do đó cần có một cơ chế để quản lý dữ liệu một cách tập trung.
Pinia là một project open-source dùng để tạo một cơ sở dữ liệu tập trung dành cho các
ứng dụng web viết bằng VueJS phiên bản 3. Với sự cải tiến về hiệu suất cũng như tích hợp tính năng mới của VueJS 3, Pinia dần trở thành một thư viện dữ liệu tập trung thay thế cho
Vuex vốn đã khá cũ vì chưa cập nhật những tính năng ưu việt mới của VueJS 3.
Pinia có thực thể chính là store - nơi chứa toàn bộ các dữ liệu, hàm sử dụng cho một mục
đích nào đó. Mỗi store bao gồm có 3 thành phần chính: State: là trung tâm chứa toàn bộ dữ liệu của store.
Getters: là một danh sách các hàm tính tốn suy ra từ State.
Actions: là một danh sách các hàm có thể tác động lên bất cứ dữ liệu nào bên trong State.
Hình 9: Một đoạn code định nghĩa store cho các tác vụ liên quan tới Xác thực người dùng.Việc sử dụng store này là rất đơn giản, chỉ việc dùng hàm useStoreAuth() ở bất cứ đâu là Việc sử dụng store này là rất đơn giản, chỉ việc dùng hàm useStoreAuth() ở bất cứ đâu là có thể truy cập được tất cả các State, Getters, Actions đã được định nghĩa như trên.
Đa ngôn ngữ với Vue I18n
Vì hệ thống là có sự kết hợp với cả Mạng xã hội nên việc hỗ trợ đa ngôn ngữ là khá cần thiết. Cụ thể hệ thống cần hỗ trợ 2 ngôn ngữ:
Tiếng Anh. Tiếng Việt.
Vue I18n là một thư viện hỗ trợ hồn hảo cho cơng việc định nghĩa các đoạn chữ hiển thị
theo các ngôn ngữ khác nhau thông qua key. Vue I18n cung cấp một mơi trường tích hợp đầy đủ các tính năng và tận dụng sự ưu việt của VueJS 3.
Công việc nhiều nhất khi sử dụng thư viện này đó là định nghĩa 2 file en.yaml và vi.yaml tương ứng với ngôn ngữ tiếng Anh và ngơn ngữ tiếng Việt:
Hình 11: Tập tin vi.yaml định nghĩa các key cho ngôn ngữ tiếng Việt.
Đặc biệt, hệ thống cũng thiết lập Vue I18n sử dụng lazy-loading tương ứng với ngôn ngữ hiện tại người dùng đã chọn. Điều này có nghĩa là khi mới vào sử dụng hệ thống, người dùng sẽ chỉ tải về một tập tin duy nhất ứng với ngôn ngữ mà người dùng đã sử dụng trước đó. Trong q trình sử dụng, chỉ khi người dùng đổi sang ngơn ngữ khác thì hệ thống mới cho phép người dùng tải về tập tin cịn lại, và trong suốt q trình sử dụng sau đó, hệ thống sẽ tự động cache lại trong trình duyệt, người dùng sẽ khơng cần phải tải lại nữa.
Đây là một yếu tố quan trọng giúp tăng hiệu suất của hệ thống bởi khi hệ thống càng lớn, các tập tin định nghĩa ngơn ngữ sẽ rất nặng, có thể lên tới hơn 1.000 dịng, do đó sử dụng lazy-loading là điều rất thiết yếu.
2.2.2 Back-end: NestJS
NestJS: Một framework được xây dựng dựa trên nền tảng framework Express của
NodeJS. Đây là một framework mới mẻ và linh hoạt, kết hợp các đặc điểm cứng rắn, nhất
quán và bảo thủ (opinionated) của Spring Java, kiến trúc mơ-đun hóa tinh gọn và dễ mở rộng của Angular với NodeJS – một platform xây dựng ứng dụng Web đã quá nổi tiếng nhờ vào hiệu năng khá tốt. Ngồi ra, NestJS sử dụng ngơn ngữ lập trình Typescript đã khắc phục được các nhược điểm về kiểu của Javascript mà vẫn giữ được sự uyển chuyển của Javascript trong quá trình hiện thực. Một điểm mạnh nữa của NestJS là sự hỗ trợ gần như toàn diện các use-
case của một hệ thống web điển hình, ví dụ như: Validation, Serialization, Caching, Database (SQL, No-SQL), Logging, Websocket, Server-sent event, Job Queue, v.v..
Việc lựa chọn NestJS cho phép nhóm làm đề tài thống nhất về mặt ngơn ngữ giữa phần front-end và back-end, giảm bớt q trình tìm hiểu và học hỏi các ngơn ngữ lập trình khác nhau. NestJS được xây dựng dựa trên nền tảng là NodeJS cũng là một điểm mạnh nữa cần nhắc đến, bởi NodeJS có một cộng đồng open-source đơng đảo cung cấp phong phú nhiều loại thư viện phục vụ hầu hết các use-case của một back-end truyền thống.
2.2.3 Database: PostgreSQL
PostgreSQL là một hệ thống quản trị cơ sở dữ liệu mã nguồn mở trung hòa hai yếu tố: đảm bảo tuân thủ tiêu chuẩn ANSI SQL, đồng thời vẫn ln đi đầu trong các tính năng mới mẻ để phục vụ nhu cầu use case ngày càng phong phú. Các tính năng độc đáo mà PostgreSQL hỗ trợ có thể kể đến như:
Full-text Search phục vụ mục đích tìm kiếm nâng cao.
Materialized View phục vụ truy vấn các dữ liệu tổng hợp hiệu quả Regular Expression.
Khả năng mơ hình quan hệ kế thừa trong EERD bằng từ khóa INHERITANCE. Cung cấp các kiểu dữ liệu mới như range, array,…
Cung cấp kiểu dữ liệu json và jsonb để phục vụ nhu cầu sử dụng các mơ hình phi quan hệ.
Hệ thống sử dụng PostgreSQL làm hệ thống quản trị cơ sở dữ liệu khơng chỉ vì tính năng động như đã trình bày ở trên mà cịn bởi hiệu suất mạnh mẽ và có phần nhỉnh hơn so với các hệ cơ sở dữ liệu đương thời. Khả năng hỗ trợ nhiều cách lưu trữ dữ liệu cũng là một điểm nổi bật để quan tâm, bởi lẽ các hệ thống lớn ln có nhu cầu chuyển các bảng quan hệ có tính độc lập cao thành dữ liệu JSON để tăng hiệu suất.
2.2.4 ActionML
ActionML là một tập hợp các giải pháp Machine Learning giúp giải quyết nhiều bài toán khác nhau, trong đó Hệ thống giới thiệu là cốt lõi. Hệ thống giới thiệu The Universal Recommender với cốt lõi là thuật toán Correlated Cross-Occurrence đã được giới thiệu ở phần Cơ sở lý thuyết giúp cho việc giới thiệu linh hoạt hơn bằng cách tiếp nhận nhiều sự kiện chuyển đổi khác nhau trong hệ thống.
Ngoài ra ActionML cung cấp một máy chủ có tên là Harness dùng để triển khai các mơ hình Machine Learning. Điểm mạnh của máy chủ này đó là các API cung cấp đa dạng và dễ dàng sử dụng. Một người lập trình khơng cần nhiều hiểu biết về thuật tốn cũng có thể hiện thực cho mình một hệ thống giới thiệu sử dụng các công cụ này.
ElasticSearch là một cơ sở dữ liệu phục vụ mục đích tìm kiếm. Điểm đặc biệt của ElasticSearch là ở chỗ nó khơng chỉ hỗ trợ tìm kiếm full-text, mà cịn đa dạng các nhu cầu tìm kiếm khác như tìm kiếm một phần, search-as-you-type, fuzzy search (nhập sai chính tả), tìm kiếm vector (được nhóm làm đề tài sử dụng để hiện thực chức năng tìm kiếm tương đồng ngữ nghĩa), v.v..
NestJS được tích hợp khá tốt với ElasticSearch khi nó cung cấp một thư viện để giúp người lập trình có thể dễ dàng viết các câu lệnh tìm kiếm và cập nhật dữ liệu thay vì gọi trực tiếp thông qua gửi API.
2.2.6 FastAPI
Đây là framework hiện thực API của Python sử dụng cơ chế lập trình async – await thay vì synchronous như các framework Python truyền thống. Hệ thống sử dụng công nghệ này để hiện thực API bao quanh mơ hình tìm kiếm tương đồng về ngữ nghĩa cũng viết bằng ngôn ngữ Python. Điểm mạnh của FastAPI dẫn đến quyết định sử dụng trên đó là sự đơn giản và dễ dàng trong việc hiện thực nhanh các API mà khơng tốn q nhiều thời gian cấu hình.
3 Yêu cầu hệ thống
Bởi vì bản chất hệ thống là sự kết hợp giữa Hệ quản trị đào tạo và Mạng xã hội nên dẫn tới hệ quả là không có một luồng hoạt động tổng quát nào có thể miêu tả các yêu cầu, tính năng của tồn bộ hệ thống. Do đó, nhóm làm đề tài sẽ khơng đề xuất ra luồng hoạt động nào mà thay vào đó sẽ liệt kê chi tiết các yêu cầu, tính năng mà hệ thống cung cấp. Qua đó khi kết hợp các yêu cầu, tính năng này với nhau có thể ra bất kỳ một luồng hoạt động nào và chúng đều có độ quan trọng là gần tương đương nhau.
3.1 Functional requirements
Dưới đây là sơ đồ các use-case của tồn bộ hệ thống:
3.2 Non-functional requirements
Hệ thống đảm bảo các chính sách riêng tư của người dùng.
Hệ thống đảm bảo máy chủ khơng gặp sự cố khi có 2,000 người truy xuất trong cùng một thời điểm.
Dung lượng truyền tải của toàn bộ phần front-end không quá 8 MB (sử dụng gzip). Máy chủ phân tán của từng dịch vụ không bị sập quá 60 giờ/tháng.
Bảo trì và cập nhật hệ thống không quá 3 ngày (nguyên nhân chủ quan) và không quá 1 tuần (nguyên nhân khách quan). Nếu vượt quá sẽ ln có đền bù xứng đáng.
Hệ thống dễ dàng sử dụng, chỉ cần dưới 30 phút để người dùng hiểu hết các tính năng.
4 Đặc tả chi tiết các use-case
4.1 Chỉnh sửa thông tin cá nhân4.1.1 Kịch bản 4.1.1 Kịch bản
Người dùng thơng thường có thể chỉnh sửa thông tin cá nhân của bản thân bao gồm:
Tên.
Ngành nghề. Nơi làm việc. Giới thiệu bản thân.
4.1.2 Đặc tả chi tiết
Use-case name Chỉnh sửa thông tin cá nhân
Created by Trần Lê Anh Quân Last updated by Vương Chí Cường
Created at 16/11/2020 Last updated at 21/07/2021
Actor Người dùng thông thường.
Description Actor thực hiện việc chỉnh sửa thông tin cá nhân bao gồm: Tên.
Ngành nghề. Nơi làm việc. Giới thiệu bản thân.
Pre-condition Actor phải ở trang “Cài đặt tài khoản” và đang chọn tab “Thông tin cá nhân”.
Normal Flow 1. Actor nhập các thông tin muốn chỉnh sửa.
2. Actor nhấn vào nút “Lưu”.
3. Hệ thống lưu các thông tin mới được chỉnh sửa.
4. Màn hình hiện thơng báo “Chỉnh sửa thông tin cá nhân thành