Một ticket có thể vừa liên quan đăng nhập, vừa liên quan thanh toán. Nếu bạn chọn nhãn bằng score của một pipeline zero-shot, cần hiểu pipeline đang buộc các nhãn cạnh tranh hay đánh giá từng nhãn riêng. Cùng tên trường scores chưa có nghĩa các con số có thể so trực tiếp.
Bài này đọc hành vi của ZeroShotClassificationPipeline trong Transformers 4.57.1, đối chiếu ngày 29/10/2026. Đây là phiên bản được ghim để giải thích công thức, không phải tuyên bố bản mới nhất. Ví dụ tính toán dùng Python tiêu chuẩn, không tải model, không đo chất lượng phân loại tiếng Việt.
Hai câu hỏi nghiệp vụ khác nhau
Nếu mỗi ticket bắt buộc vào đúng một hàng đợi, câu hỏi là: trong danh sách này, nhãn nào phù hợp nhất? Chế độ multi_label=False với từ hai nhãn trở lên chuẩn hóa các logit entailment qua toàn bộ nhãn ứng viên. Tổng score bằng một, nên các nhãn cạnh tranh với nhau.
Nếu ticket được gắn nhiều tag, câu hỏi lại là: từng nhãn có phù hợp với văn bản hay không? Với multi_label=True, pipeline so entailment với contradiction riêng cho mỗi nhãn. Tổng score giữa các nhãn có thể lớn hơn một. Tham số này thay đổi cách tính score, không chỉ đổi số nhãn được trả về. Tài liệu pipeline theo phiên bản mô tả rõ hai chế độ.
Trong cách làm NLI, văn bản là premise và mỗi nhãn được đưa vào một câu giả thuyết. Model đánh giá quan hệ giữa hai câu. Tên nhãn và mẫu câu vì thế cũng là một phần của cấu hình cần lưu khi đánh giá.
Tự tính với logit giả lập
Để nhìn rõ mẫu số, dùng hai nhãn A và B với logit entailment lần lượt là 2 và 1. Logit contradiction của cả hai bằng 0. Đây là dữ liệu toán học tự tạo, không phải output từ model hay ticket thật.
from math import exp
def softmax(values):
peak = max(values)
weights = [exp(value - peak) for value in values]
total = sum(weights)
return [weight / total for weight in weights]
entailment = [2.0, 1.0]
contradiction = [0.0, 0.0]
single = softmax(entailment)
multi = [
softmax([negative, positive])[1]
for negative, positive in zip(contradiction, entailment)
]
print([round(value, 4) for value in single])
print([round(value, 4) for value in multi])
print(round(sum(single), 4), round(sum(multi), 4))
Trên Python 3.9.6, đoạn này in [0.7311, 0.2689], [0.8808, 0.7311] và 1.0 1.6119. Hàm trừ giá trị lớn nhất trước khi lấy mũ để phép tính minh họa ổn định hơn với số lớn. Đây là kiểm tra công thức, chưa chứng minh pipeline thực tế cho đúng những logit ấy.
Giả sử bạn dùng ngưỡng 0.7: bộ score đầu chỉ giữ A, bộ thứ hai giữ cả A và B. Đổi chế độ nhưng giữ nguyên ngưỡng cũ có thể thay đổi quyết định dù model và văn bản chưa đổi.
Thêm nhãn cũng làm thay đổi phép so sánh
Thêm nhãn C có logit entailment 2 vào chế độ cạnh tranh:
print([round(value, 4) for value in softmax([2.0, 1.0, 2.0])])
Kết quả minh họa là [0.4223, 0.1554, 0.4223]. A giảm score dù logit giả định của A giữ nguyên, vì mẫu số đã có thêm C. Đừng giải thích mức giảm này thành việc model vừa kém tự tin hơn trên cùng một hợp đồng nhãn.
Với một nhãn ứng viên duy nhất, mã nguồn phiên bản này dùng nhánh so entailment/contradiction kể cả khi multi_label=False. Vì vậy kiểm thử với một nhãn không đại diện cho chế độ cạnh tranh nhiều nhãn. Có thể đối chiếu điều kiện này trong mã nguồn zero-shot v4.57.1.
Cách đưa vào một lượt đánh giá thật
Lưu cùng kết quả: model và revision, phiên bản thư viện, danh sách nhãn, hypothesis_template, multi_label, quy tắc chọn nhãn và bộ dữ liệu đánh giá. Khi so hai lượt, kiểm tra những trường này trước khi so score.
Nếu sản phẩm có trường hợp không thuộc nhãn nào, cần thiết kế cách từ chối và đánh giá riêng các ca đó. Chế độ cạnh tranh vẫn phân phối score trong danh sách bạn cung cấp. Một nhãn đứng đầu không tự chứng minh nó đúng với nghiệp vụ.
Với nội dung tiếng Việt, chọn model có phạm vi ngôn ngữ phù hợp và kiểm tra trên dữ liệu đã gán nhãn. Model card BART MNLI giúp hiểu cách chuyển NLI thành phân loại; bài này không dùng nó làm bằng chứng chất lượng tiếng Việt. Score cũng chưa phải xác suất đã hiệu chuẩn cho dữ liệu của bạn.
Lỗi thường gặp và giới hạn
- Chỉ lấy phần tử đầu mà quên
labelsvàscoresđã được sắp theo score. Luôn ghép nhãn với đúng score tương ứng. - Đổi danh sách nhãn hoặc mẫu câu nhưng coi hai lượt là cùng cấu hình.
- Bật multi-label rồi mặc định mọi nhãn trên 0.5 đều đáng tin. Ngưỡng cần được chọn và kiểm tra bằng dữ liệu nghiệp vụ.
- Báo kết quả tính tay là benchmark model. Hai việc này kiểm tra hai lớp khác nhau.
Hãy chốt câu hỏi một nhãn hay nhiều nhãn trước, rồi mới chọn ngưỡng và metric. Khi hợp đồng nhãn được giữ ổn định, kết quả đánh giá sẽ dễ giải thích và tái kiểm tra hơn.

