LLM & NLP

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?

  1. Model tính điểm (logit) cho mọi token trong từ vựng.
  2. Softmax biến điểm thành xác suất, ví dụ "Hà" 62%, "Thành" 20%, "Sài" 9%…
  3. 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ấpCao
temperatureChia logit trước softmax: làm phân phối "nhọn" hơn hoặc "phẳng" hơnGần như luôn chọn token xác suất cao nhất, ổn địnhToken í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ómChỉ vài token "an toàn"Gần như toàn bộ từ vựng
top_kChỉ giữ k token xác suất cao nhấtRấ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, temperature củ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ệcGợi ý
Phân loại, trích xuất, gắn nhãnTemperature thấp (0–0.3) + output có cấu trúc (JSON schema/tool)
Viết code, trả lời kỹ thuậtThấ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áoMặ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

  1. The Curious Case of Neural Text Degeneration — Holtzman et al. (arXiv)
  2. Messages API reference — Claude Docs