CHƯƠNG 3: Xây dựng hệ thống trình bày
3.2. Chuẩn bị dữ liệu
3.2.1. Làm sạch dữ liệu
Để chuẩn bị dữ liệu văn bản của Sổ Tay Sinh Viên 2023 ta sẽ tiến hành tiền xử lý, khác với dữ liệu có cấu trúc ở dạng bảng thì dữ liệu văn bản (text) không có cấu trúc do đó ta cần xử lý một cách thủ công như sau:
Bước 1: Tiền xử lý bằng cách chuyển đổi tệp gốc ở định dạng .pdf thành dạng text ở định
dạng .docx.
Bước 2: Loại bỏ những phần không cần thiết như mục lục, hình ảnh, các mục hướng dẫn
dựa trên hình ảnh, ký tự đặc biệt.
Bước 3: Loại bỏ hầu hết các bảng vì mô hình ngôn ngữ vẫn chưa thể xử lý được dữ liệu
dạng bảng biểu. Những bảng quan trọng như điểm xếp loại học bổng hoặc xếp loại điểm rèn luyện sẽ được viết lại thủ công với diễn giải bằng ngôn từ. Sau đó lưu lại dữ liệu đã làm sạch dưới dạng txt.
Bước 4: Tiến hành cắt văn bản trong txt này thành các phần nhỏ (chunk) với mỗi phần là
800 ký tự (chunk_size) và số lượng ký tự trùng lặp với phần trước đó là 400 ký tự (chunk_overlap). Tức là mỗi đoạn 800 chữ cái được cắt ra sẽ dính 400 chữ cái với đoạn đã cắt trước đó nhằm hạn chế việc cắt bị thiếu thông tin. Từ việc đưa 1000 ký tự vào làm ngữ cảnh thì phần còn lại cũng sẽ đủ dư để chứa câu hỏi và đoạn hướng dẫn (instruction) cho đầu vào mô hình. Tổng cộng sẽ có 184 mẫu nhỏ như vậy.
37
Bước 5: Cuối cùng, ta sẽ tiến hành encode các phần nhỏ này thành vector embedding để
lưu trữ trên vector database. Ta sẽ sử dụng mô hình Sentence Similarity để thực hiện encode, sau khi thử nghiệm nhiều loại mô hình encode thì mô hình sentence- transformers/paraphrase-multilingual-mpnet-base-v2 là lựa chọn tối ưu khi có hỗ trợ
Tiếng Việt và đạt độ chính xác tương đối cao trên mặt bằng chung là 53.7% trên 14 dataset
đa lĩnh vực theo [12]. Sau khi đã thực hiện encode ta sẽ lưu nó trên vector database, quá trình lưu trữ database này sẽ được trình bày ở phần xây dựng back-end phía dưới.
Hình 3.3: Ví dụ về một mẩu dữ liệu trong database Tiếp theo sẽ chuẩn bị dữ liệu gồm 100+ câu hỏi thường gặp kèm câu trả lời của sinh viên,
để có được dữ liệu này không phải là khó nhưng sẽ cần một chút kiên trì. Cụ thể những câu hỏi này phải đáp ứng yêu cầu là nó phải có đáp án nằm trong dữ liệu trong cơ sở dữ liệu
mà chúng ta đã chuẩn bị phía bên trên. Việc đánh nhãn thủ công là không thể tránh khỏi tuy nhiên có một hướng tiếp cận tối ưu hơn đang nổi lên gần đây là ta sẽ tận dụng sức mạnh của ChatGPT để làm điều đó, tăng cường dữ liệu (data augmentation). Cụ thể ta sẽ cắt từng mục trong sổ tay sinh viên để đưa vào ChatGPT giúp ta sinh ra câu hỏi kèm câu trả lời mà
ta cần.
38 Hình 3.4: Sử dụng ChatGPT để tăng cường dữ liệu (Câu hỏi)
Hình 3.5: Sử dụng ChatGPT để tăng cường dữ liệu (Trả lời) Nhờ công cụ này việc chỉnh sửa thủ công trên dữ liệu trở nên nhẹ nhàng hơn, nhưng dữ liệu mà ChatGPT sinh ra cũng sẽ có những khuyết điểm như đôi lúc sẽ có những câu hỏi mặc dù có tồn tại trong ngữ cảnh văn bản nhưng lại không có nhiều ý nghĩa cho sinh viên nên ta cũng sẽ loại bỏ bớt đi hoặc những câu hỏi không đúng trọng tâm của văn bản mà ta phải nhập thủ công thêm vào.
39 Hình 3.6: Mô tả cấu trúc dữ liệu 146 câu hỏi đáp sinh viên
Tổng cộng ta sẽ có 146 câu hỏi tất cả. Việc đánh nhãn dữ liệu tốn gần như phần lớn thời gian nhưng cũng là một trải nghiệm thú vị giúp ta hiểu hơn về quá trình này. Đối với dữ liệu Wikipedia sẽ có một lớp Wikipedia Retriever trong Langchain giúp ta thực hiện việc truy xuất dữ liệu tự động cho nên việc tích hợp lớp này song song với dữ liệu NTTU vô cũng dễ dàng.
Bộ dữ liệu vilm/OpenOrca-Viet là một bộ bao gồm hơn 100.000 câu hỏi đáp kèm ngữ cảnh
đã được làm sạch từ tước, do đó ta chỉ cần thực hiện gộp nội dung, cắt giới hạn và vector hoá mà thôi. Bộ dữ liệu có cấu trúc như sau:
Hình 3.7: Mô tả dữ liệu vilm/OpenOrca-Viet
40 Trong bộ này ta sẽ chỉ cắt ra 10.000 mẫu để sử dụng, bởi vì ở đây ta chỉ thực hiện tinh chỉnh, chi tiết sẽ được giải thích ở phần lựa chọn mô hình phía dưới. Từng mẫu của dữ liệu
sẽ được gộp lại thành một cấu trúc hỏi đáp như sau:
Hình 3.8: Mô tả việc gộp dữ liệu thành cấu trúc hỏi đáp
Do đầu vào khi huấn luyện mô hình là một đoạn văn bản, đối với mô hình ngôn ngữ cho trả lời câu hỏi, việc định cấu trúc hỏi đáp đầu vào là bắt buộc, điều này sẽ giúp mô hình có thể hiểu được đâu là ngữ cảnh, đâu là câu hỏi và câu trả lời sẽ được bố trí như thế nào. Giúp đầu ra chặt chẽ đồng thời sẽ dễ xử lý khi trích xuất câu trả lời về sau. Sau khi đã tái cấu trúc ta sẽ tiến hành dùng tokenizer để vector hoá các đoạn văn bản này sang số. Ta sẽ dùng tokenizer đi kèm với mô hình ta sử dụng để chuyển đổi, chi tiết mô hình sẽ được trình bày
ở phần sau. Ta cũng sẽ thực hiện cắt dữ liệu cho việc kiểm tra đánh giá trong quá trình training, dữ liệu sẽ được chia theo tỉ lệ 99/1 với 99% dùng để training và 1% dùng để test,
sở dĩ ta chia như vậy vì khác với mô hình học máy khác, mô hình ngôn ngữ có đặc thù là cần dữ liệu huấn luyện lớn nên thường sẽ được chia ở tập test khoảng 10%, 1% hoặc 0.1%, với lại từ 100 mẫu trở nên là quá đủ cho việc đánh giá mô hình. Vậy là dữ liệu đã sẵn sàng, tiếp theo ta sẽ tiến hành khám phá một số thông tin về dữ liệu trước khi lựa chọn và huấn luyện mô hình.