Bạn đổi top-k từ 50 xuống 10 rồi chờ câu trả lời ngắn hơn, nhưng độ dài vẫn gần như cũ. Nguyên nhân là tham số này liên quan tập token có thể được chọn tại một bước sinh. Nó không đặt số token tối đa của toàn bộ câu trả lời.
Bài viết dành cho developer đang đọc cấu hình sinh văn bản. Ví dụ dùng bảng xác suất tự tạo, không tải model và không đo chất lượng câu trả lời. Đối chiếu ngày 31/10/2026 với tài liệu Transformers 4.57.1 để cố định ngữ nghĩa; đây không phải tuyên bố phiên bản mới nhất.
1. Tách bước lọc và bước chọn
Giả sử sau một đoạn văn bản, model đưa ra bốn ứng viên A, B, C, D với xác suất lần lượt 0,45; 0,30; 0,15; 0,10. Các nhãn chỉ là ký hiệu cho token giả định, không phải bốn từ tiếng Việt thật.
Bộ lọc giữ một phần ứng viên. Nếu còn nhiều ứng viên, bước sampling vẫn chọn theo phân phối sau lọc. Giữ hai ứng viên không có nghĩa luôn chọn ứng viên đứng đầu. Khi đã bỏ một ứng viên, việc chuẩn hóa lại xác suất cũng không làm ứng viên đó xuất hiện trở lại.
Trong cấu hình Transformers được dẫn nguồn, do_sample điều khiển có sampling hay không. Đừng chỉ thay top-k/top-p rồi mặc định mọi chiến lược decoding đều dùng chúng theo cùng cách. Khi debug, ghi lại cả cấu hình thực tế của model và chế độ đang chạy.
2. Top-k giới hạn theo số ứng viên
Với bảng trên và k bằng 2, ta giữ A và B. Tổng xác suất còn lại là 0,75. Sau khi chia lại cho tổng này, xác suất là 0,60 và 0,40.
Đây là phép tính trên bảng ví dụ, không phải kết quả inference. Nếu phân phối ở bước tiếp theo thay đổi, hai ứng viên được giữ cũng có thể đổi. Số k cố định không đảm bảo mỗi bước đều loại cùng một lượng xác suất.
3. Top-p giới hạn theo xác suất tích lũy
Với p bằng 0,8, ta đi từ ứng viên có xác suất cao nhất: A đạt 0,45; thêm B đạt 0,75; thêm C đạt 0,90. Phải giữ đến C mới vượt ngưỡng. Phân phối sau chuẩn hóa là 0,50; khoảng 0,3333; khoảng 0,1667.
Với p bằng 0,7, A và B đã đủ. Vì vậy top-p có thể giữ số lượng ứng viên khác nhau khi phân phối thay đổi. Ngưỡng 0,8 không có nghĩa chọn ngẫu nhiên 80% số token trong vocabulary.
4. Tự kiểm tra bằng Python
Chạy đoạn sau bằng Python 3. Nó chỉ minh họa trường hợp xác suất dương, đã chuẩn hóa và không có hòa điểm. Không dùng nó làm bản thay thế đầy đủ cho logits processor của thư viện.
from math import isclose
candidates = [("A", 0.45), ("B", 0.30), ("C", 0.15), ("D", 0.10)]
def normalize(items):
total = sum(prob for _, prob in items)
return [(name, prob / total) for name, prob in items]
def top_k(items, k):
if not 1 <= k <= len(items):
raise ValueError("k ngoài phạm vi minh họa")
return normalize(sorted(items, key=lambda pair: pair[1], reverse=True)[:k])
def top_p(items, p):
if not 0 < p <= 1:
raise ValueError("p phải thuộc (0, 1]")
kept, cumulative = [], 0.0
for item in sorted(items, key=lambda pair: pair[1], reverse=True):
kept.append(item)
cumulative += item[1]
if cumulative >= p:
break
return normalize(kept)
k_result = top_k(candidates, 2)
p_result = top_p(candidates, 0.8)
assert [name for name, _ in k_result] == ["A", "B"]
assert [name for name, _ in p_result] == ["A", "B", "C"]
assert isclose(k_result[0][1], 0.6)
assert isclose(sum(prob for _, prob in p_result), 1.0)
print(k_result)
print(p_result)
Đoạn này đã chạy bằng Python 3.9.6. Assertions kiểm tra tập được giữ và phép chuẩn hóa, không kiểm tra GPU, tokenizer hay model. Đổi p thành 0,7 rồi kiểm tra hai nhãn được giữ là bài tập tiếp theo có thể đối chiếu bằng tay.
Lỗi thường gặp và giới hạn
max_new_tokens mới là một tham số giới hạn số token sinh thêm trong cấu hình đang tham chiếu. EOS và điều kiện dừng vẫn có thể kết thúc sớm. Không dùng top-k để thay giới hạn độ dài.
Nếu bật cả hai bộ lọc, cần đọc thứ tự xử lý của thư viện: bộ lọc sau có thể nhận phân phối đã bị thay đổi. Không lấy hai phép tính độc lập ở trên rồi suy ra mọi tổ hợp đều có kết quả tương tự. Hòa điểm, sai số số thực và số token tối thiểu cần giữ cũng là chi tiết triển khai cần kiểm tra.
Cuối cùng, thay sampling không chứng minh nội dung đúng hoặc có nguồn. Hãy giữ một tập câu hỏi đánh giá cố định, ghi cấu hình và xem lại output thực tế trước khi đổi cấu hình sản phẩm. Bảng bốn ứng viên giúp giải thích cơ chế, chưa phải bằng chứng một giá trị phù hợp với bài toán của bạn.


