Temperature, top-p, top-k: LLM chọn từ tiếp theo thế nào
Tóm tắt
Model đưa ra phân phối xác suất, sampling quyết định rút token nào. Temperature thấp cho việc cần nhất quán, mặc định cho việc sáng tạo, chỉ chỉnh temperature hoặc top-p, và nhớ rằng nhất quán không có nghĩa là đúng.
Cùng một prompt, chạy hai lần ra hai câu trả lời khác nhau: với chatbot sáng tạo thì đó là tính năng, với hệ thống trích xuất hoá đơn thì đó là lỗi. Sự khác biệt đến từ bước sampling: ở mỗi bước, model không "chọn" từ tiếp theo mà đưa ra một phân phối xác suất trên toàn bộ từ vựng, và một thuật toán sẽ rút token từ phân phối đó. Temperature, top-p, top-k là các núm điều chỉnh cách rút.
Model sinh chữ như thế nào?
- Model tính điểm (logit) cho mọi token trong từ vựng.
- Softmax biến điểm thành xác suất, ví dụ "Hà" 62%, "Thành" 20%, "Sài" 9%…
- Thuật toán sampling rút một token, nối vào chuỗi, rồi lặp lại.
Ba núm điều chỉnh
| Tham số | Cơ chế | Thấp | Cao |
|---|---|---|---|
| temperature | Chia logit trước softmax: làm phân phối "nhọn" hơn hoặc "phẳng" hơn | Gần như luôn chọn token xác suất cao nhất, ổn định | Token ít khả năng có cơ hội hơn, đa dạng hơn |
| top_p (nucleus) | Chỉ giữ nhóm token nhỏ nhất có tổng xác suất ≥ p, rồi rút trong nhóm | Chỉ vài token "an toàn" | Gần như toàn bộ từ vựng |
| top_k | Chỉ giữ k token xác suất cao nhất | Rất bảo thủ | Ít tác dụng lọc |
Nucleus sampling (top-p) được đề xuất trong bài "The Curious Case of Neural Text Degeneration" (Holtzman và cộng sự, 2019). Bài báo chỉ ra rằng luôn chọn token xác suất cao nhất (greedy, beam search) dễ sinh văn bản lặp và nhạt, còn rút ngẫu nhiên trên toàn bộ phân phối lại dễ lạc đề vì "đuôi dài" token kém chất lượng. Cắt bỏ đuôi đó là cách cân bằng.
Với Claude API
client.messages.create(
model="claude-sonnet-5-5",
max_tokens=512,
temperature=0.2, # trích xuất, phân loại
messages=[{"role": "user", "content": "Trích tên, ngày, tổng tiền từ hoá đơn sau…"}],
)
- Theo tài liệu API,
temperaturecủa Claude nằm trong khoảng 0.0–1.0, mặc định 1.0. - Anthropic khuyên chỉ chỉnh một trong hai: temperature hoặc top_p, không chỉnh cả hai; top_k dành cho trường hợp nâng cao.
- Tài liệu cũng lưu ý: ngay cả temperature 0, kết quả không hoàn toàn tất định.
- Một số chế độ (ví dụ extended thinking) giới hạn việc chỉnh các tham số này; kiểm tra docs của model bạn dùng.
Gợi ý theo loại việc
| Loại việc | Gợi ý |
|---|---|
| Phân loại, trích xuất, gắn nhãn | Temperature thấp (0–0.3) + output có cấu trúc (JSON schema/tool) |
| Viết code, trả lời kỹ thuật | Thấp tới trung bình; để mặc định nếu model đã được tối ưu sẵn |
| Brainstorm, đặt tên, viết quảng cáo | Mặc định 1.0, chạy nhiều lần rồi chọn |
| Đánh giá nhất quán (LLM-as-judge) | Thấp, cộng thêm rubric rõ ràng và chạy lặp để đo độ dao động |
Rủi ro và lưu ý
- Temperature không chữa ảo giác: temperature 0 chỉ làm model nhất quán hơn, kể cả nhất quán khi sai. Muốn đúng cần dữ liệu nguồn và cho phép nói "không biết".
- Đừng dựa vào tính tất định để test: viết test kiểm tra cấu trúc và tiêu chí, không so khớp chuỗi tuyệt đối.
- Tinh chỉnh mù: đổi temperature mà không có bộ eval chỉ là cảm tính. Đo trên 30–50 mẫu thật trước khi chốt.
Áp dụng thế nào?
- Dev: Đặt temperature thấp cho pipeline xử lý dữ liệu; validate output bằng schema thay vì tin vào tính lặp lại.
- Tech Lead: Ghi tham số sampling vào config có version, cùng với prompt, để tái hiện được kết quả khi điều tra lỗi.
- PM: Với tính năng sáng tạo, tận dụng tính ngẫu nhiên: sinh 3 phương án cho người dùng chọn thay vì 1.
Nguồn & tham khảo
- The Curious Case of Neural Text Degeneration — Holtzman et al. (arXiv)
- Messages API reference — Claude Docs