Bạn có thể thấy hai câu “cà phê” giống nhau trên màn hình, nhưng phép so sánh chuỗi vẫn trả false. Một bên có thể dùng ký tự dựng sẵn, bên kia dùng chữ cái đi cùng dấu tổ hợp. Nếu chấm câu trả lời AI bằng exact match, đây là một khác biệt biểu diễn cần kiểm tra trước khi kết luận mô hình trả lời sai.
Bài dùng fixture tự tạo và thư viện chuẩn Python, không gọi mô hình hoặc dịch vụ AI. Các ví dụ được kiểm tra bằng Python 3.9.6; tài liệu Unicode, Python và mã metric của Hugging Face được đọc ngày 28/10/2026. Điểm số bên dưới chỉ thuộc fixture, không phải kết quả đánh giá một sản phẩm.
1. Tạo hai chuỗi nhìn giống nhau
import unicodedata
reference = "cà phê"
prediction = "ca\u0300 phê"
print(reference == prediction)
print(len(reference), len(prediction))
print(unicodedata.normalize("NFC", reference) ==
unicodedata.normalize("NFC", prediction))
Kết quả là False, 6 7, rồi True. Trong prediction, a và dấu huyền là hai code point. len ở đây không đo số token của mô hình hoặc số ký tự mà người dùng cảm nhận; nó giúp nhìn thấy khác biệt biểu diễn trong ví dụ này.
NFC là một dạng chuẩn hóa Unicode theo tương đương canonical. Nó không có nghĩa bỏ toàn bộ dấu tiếng Việt. Hai từ khác nhau như “ma” và “má” vẫn phải khác nhau sau bước chuẩn hóa này.
2. Viết rõ chính sách của metric
Giả sử bài toán là trích xuất một nhãn hoặc câu trả lời ngắn cần khớp đáp án tham chiếu. Chúng ta đặt tên chính sách là nfc-only-v1: chuẩn hóa NFC ở cả hai phía, giữ nguyên chữ hoa, khoảng trắng, dấu câu và chữ số.
pairs = [
("ca\u0300 phê", "cà phê"),
("ma", "má"),
("Mã01", "Mã 01"),
("ĐÃ GỬI", "đã gửi"),
("Không", "Không"),
]
def exact_match(rows, normalizer):
if not rows:
raise ValueError("Evaluation set must not be empty")
return sum(normalizer(p) == normalizer(r) for p, r in rows) / len(rows)
raw_score = exact_match(pairs, lambda text: text)
nfc_score = exact_match(pairs, lambda text: unicodedata.normalize("NFC", text))
print(raw_score, nfc_score)
assert unicodedata.normalize("NFC", "ma") != unicodedata.normalize("NFC", "má")
Kết quả là 0.2 0.4: một cặp khớp khi so nguyên chuỗi, hai cặp khớp khi dùng NFC. Số tăng lên vì định nghĩa phép đo đã thay đổi trên cùng năm cặp giả. Mô hình không được huấn luyện hay sửa trong quá trình này, nên đừng trình bày nó như một cải thiện chất lượng AI.
3. Đừng ghép mọi bước “làm sạch” vào nhau
Bỏ khoảng trắng, chuyển chữ thường và xóa dấu câu là các quyết định khác với chuẩn hóa Unicode. Chúng có thể hợp lý với một loại đáp án, nhưng cũng có thể che mất lỗi ở mã định danh hoặc nội dung cần khớp chính xác.
Ví dụ Mã01 và Mã 01 đang khác nhau theo chính sách trên. Nếu nghiệp vụ cho phép chúng tương đương, hãy thêm quy tắc có tên, kiểm tra riêng và tăng phiên bản metric. Đừng sửa âm thầm một hàm normalize rồi đặt điểm mới cạnh điểm cũ như thể hai lần đo dùng cùng tiêu chuẩn.
Mã nguồn exact match của Hugging Face có các lựa chọn bỏ qua chữ hoa, dấu câu hoặc chữ số. Đọc cấu hình thực tế trước khi dùng kết quả của một thư viện; tên “exact match” chưa mô tả hết các biến đổi được bật. Ví dụ trong bài là hàm tự viết có phạm vi hẹp, không sao chép toàn bộ hành vi của thư viện đó.
4. Giữ dữ liệu gốc để điều tra
Lưu đáp án gốc, dự đoán gốc, phiên bản dataset và tên chính sách metric trong bằng chứng đánh giá. Khi một ca đổi từ sai sang đúng, bạn có thể xác nhận nó chỉ khác biểu diễn dấu, thay vì vô tình mất một ký tự có nghĩa.
Không cần ghi câu trả lời chứa dữ liệu riêng tư vào log công khai. Với fixture phát triển, dùng dữ liệu giả như bài này. Khi nghiên cứu lỗi thật, kiểm tra code point hoặc biểu diễn escape trong môi trường có quyền truy cập phù hợp.
Kiểm tra và giới hạn
Thêm ca dấu tổ hợp, chuỗi rỗng, khoảng trắng đầu cuối, chữ hoa và chữ số. Kiểm tra hàm từ chối tập đánh giá rỗng thay vì chia cho 0. Ghi cả điểm nguyên chuỗi và điểm theo chính sách mới khi cần giải thích sự thay đổi.
NFC không chấm ý nghĩa, tính đúng của thông tin hoặc chất lượng dẫn nguồn. Hai câu diễn đạt khác nhau nhưng cùng ý vẫn có thể không exact match. Với câu trả lời mở, cần một cách đánh giá phù hợp hơn thay vì tiếp tục xóa ký tự cho đến khi điểm trông đẹp.
Hãy xem chuẩn hóa là một phần được định nghĩa của phép đo. Chính sách rõ ràng giúp bạn phân biệt lỗi biểu diễn với lỗi nội dung và so sánh các lần đánh giá có cùng điều kiện.


