AI Fundamentals

Temperature, Top-p và Sampling: Vì Sao Cùng Một Prompt AI Có Thể Trả Lời Khác Nhau?

Cùng một prompt nhưng LLM có thể tạo ra nhiều câu trả lời khác nhau. Bài viết đi từ logits và softmax tới temperature, top-p, top-k để giải thích chính xác randomness xuất hiện ở đâu và cách tuning sampling trong thực tế.

Minh họa cho bài Temperature, Top-p và Sampling: Vì Sao Cùng Một Prompt AI Có Thể Trả Lời Khác Nhau?
Mục lục bài viết

Bạn gọi cùng một API hai lần với cùng prompt:

Text
Explain why database indexes make queries faster.

Lần đầu, model bắt đầu bằng:

“A database index works like a lookup structure...”

Lần thứ hai:

“Without an index, a database may need to scan...”

Cả hai câu trả lời đều đúng. Nhưng chúng không chỉ khác vài từ. Sau vài câu, cấu trúc giải thích, ví dụ và thậm chí thứ tự các ý có thể hoàn toàn khác nhau.

Điều này dễ tạo ra một mental model sai: model dường như đã “suy nghĩ lại” và quyết định chọn một cách trả lời khác.

Thực tế, nguyên nhân nằm sâu hơn ở chính cách một Large Language Model tạo văn bản.

LLM không viết cả câu trả lời rồi mới gửi nó cho chúng ta. Nó tạo từng token một. Ở mỗi bước, model tính một phân phối xác suất trên hàng chục nghìn token có thể xuất hiện tiếp theo. Một decoding strategy sau đó quyết định token nào thực sự được chọn.

Nếu bước thứ năm của hai lần chạy chọn hai token khác nhau, từ bước thứ sáu trở đi hai lần chạy không còn ở cùng trạng thái nữa. Mỗi token vừa sinh trở thành một phần của context cho bước tiếp theo. Hai nhánh nhỏ ban đầu vì thế có thể phát triển thành hai câu trả lời rất khác nhau.

Temperature, top-p và top-k không phải những “nút chỉnh độ sáng tạo” đứng bên ngoài quá trình này. Chúng trực tiếp thay đổi phân phối hoặc tập token mà model được phép lấy mẫu.

Muốn hiểu tại sao cùng một prompt có thể cho nhiều output, chúng ta vì thế phải bắt đầu từ nơi thực sự sinh ra randomness: phân phối xác suất của token tiếp theo.


1. LLM không chọn một câu trả lời — nó liên tục chọn token tiếp theo

Giả sử prompt đã được token hóa và đưa qua Transformer.

Tại bước generation thứ (t), model nhận:

Text
prompt + toàn bộ token đã sinh trước đó

và tạo ra một vector số thực:

z=[z1,z2,…,z|V|]

trong đó (V) là vocabulary của model.

Các giá trị (z_i) được gọi là logits.

Logit chưa phải xác suất. Có thể hiểu chúng như các score thô thể hiện mức độ model ưu tiên từng token tại context hiện tại.

Softmax biến các score này thành một phân phối xác suất:

pi=P(yt=i|y<t,x)=ezi∑j∈Vezj

Sau softmax:

Text
"index"       0.31
"database"    0.19
"a"           0.15
"the"         0.11
"query"       0.07
...

Tổng xác suất của toàn bộ vocabulary bằng 1.

Từ đây inference engine phải quyết định:

Token nào sẽ thực sự được chọn?

Đó chính là nơi decoding và sampling xuất hiện.

Text
Prompt
  │
  ▼
┌──────────────────────────┐
│ Transformer forward pass │
└────────────┬─────────────┘
             │
             ▼
       Logits z₁...zₙ
             │
             ▼
      Logit processors
             │
             ▼
    Temperature scaling
             │
             ▼
          Softmax
             │
             ▼
 Probability distribution
             │
             ▼
   Top-k / Top-p / ...
             │
             ▼
      Sample / Argmax
             │
             ▼
        Next token
             │
             └───────────────┐
                             │
                 token được thêm vào context
                             │
                             ▼
                     vòng lặp tiếp theo

Hugging Face Transformers hiện mô tả temperature, top_k và top_p như các generation controls thao tác lên xác suất/logits trước quá trình lựa chọn token; top_k giữ các token xác suất cao nhất, còn top_p giữ tập nhỏ nhất đạt đủ probability mass yêu cầu.

Điểm quan trọng nhất trong diagram trên là vòng lặp.

Token vừa sinh không phải output độc lập. Nó quay lại trở thành input.

Một khác biệt nhỏ có thể tạo ra hai tương lai khác nhau

Giả sử model đang sinh:

Text
Database indexes improve query...

Tại token tiếp theo, phân phối có thể là:

Text
performance     0.42
speed           0.27
latency         0.09
execution       0.06
...

Một lần chạy chọn:

Text
performance

Lần khác chọn:

Text
speed

Có vẻ chỉ là hai từ gần nghĩa.

Nhưng bước tiếp theo bây giờ là:

P(yt+1|"query performance")

so với:

P(yt+1|"query speed")

Hai phân phối đó không nhất thiết giống nhau.

Nhánh thứ nhất có thể tiếp tục:

Text
Database indexes improve query performance by reducing...

nhánh thứ hai:

Text
Database indexes improve query speed because the engine...

Sau đó mỗi token mới lại tiếp tục thay đổi context.

Vì vậy sự khác biệt tích lũy theo cây, chứ không phải một lượng noise nhỏ được cộng vào câu trả lời sau khi model đã viết xong.

Text
                        Prompt
                          │
                 "Database indexes..."
                          │
              ┌───────────┴───────────┐
              │                       │
        performance                 speed
              │                       │
       ┌──────┴──────┐          ┌─────┴─────┐
       │             │          │           │
    reduce        improve    because       by
       │             │          │           │
      ...           ...        ...         ...

Đây là lý do một thay đổi rất nhỏ ở đầu sequence có thể tạo ra khác biệt rất lớn ở cuối sequence.

Về xác suất, cả output dài được phân rã thành:

P(y1:n|x)=∏t=1nP(yt|y<t,x)

Đây cũng là nền tảng để hiểu một điều nghe có vẻ nghịch lý:

Model có thể có cùng weights, cùng prompt, cùng kiến thức — nhưng vẫn tạo ra nhiều chuỗi hợp lệ khác nhau.

Sampling không thay đổi model. Nó thay đổi đường đi mà chúng ta chọn qua distribution của model.


2. Temperature thực sự làm gì?

Temperature thường được mô tả bằng những câu như:

Text
temperature thấp = chính xác
temperature cao = sáng tạo

Cách nói này hữu ích như shorthand, nhưng dễ tạo mental model sai.

Temperature không biết thế nào là “sáng tạo”, “đúng” hay “sai”.

Nó chỉ thực hiện một phép biến đổi toán học rất cụ thể:

qi(T)=exp⁡(zi/T)∑jexp⁡(zj/T)

Tức là trước softmax, mỗi logit được chia cho temperature (T).

Nếu biết phân phối ban đầu (p_i), ta cũng có thể viết:

qi(T)=pi1/T∑jpj1/T

Công thức thứ hai đặc biệt hữu ích vì nó cho thấy temperature đang thay đổi khoảng cách tương đối giữa các xác suất.

Khi (T < 1): model trở nên “tự tin” hơn

Giả sử:

Text
Token A    0.50
Token B    0.25
Token C    0.15
Token D    0.10

Nếu giảm temperature, token A vốn đã mạnh sẽ chiếm thêm probability mass.

Token B, C và D vẫn có thể tồn tại, nhưng xác suất tương đối của chúng giảm.

Distribution trở nên nhọn hơn:

Text
Probability
│
│        █
│        █
│        █
│        █
│        █
│        █    ██
│        █    ██   █
└──────────────────────
         A    B    C D

Điều này làm những lần sampling khác nhau có xu hướng chọn cùng các token top đầu thường xuyên hơn.

Output vì thế thường ổn định hơn.

Nhưng cần phân biệt:

Ổn định hơn không đồng nghĩa với đúng hơn.

Nếu token dẫn tới một claim sai đang nằm ở mode có xác suất cao nhất, temperature thấp có thể khiến model lặp lại claim sai đó ổn định hơn.

Một nghiên cứu của Renze và Guven trên nhiều LLM, prompt strategy và bài toán MCQA không tìm thấy khác biệt accuracy có ý nghĩa thống kê khi temperature thay đổi trong vùng 0 đến 1. Kết quả này không chứng minh temperature không bao giờ ảnh hưởng correctness, nhưng nó cho thấy không thể xem “giảm temperature = tăng accuracy” như một định luật chung.

Khi (T > 1): khoảng cách giữa các token bị nén lại

Khi temperature tăng, các token phía sau nhận probability mass tương đối lớn hơn.

Distribution phẳng hơn:

Text
Probability
│
│       █
│       █
│       █    █
│       █    █    █
│       █    █    █    █
└──────────────────────────
        A    B    C    D

Token A vẫn có thể là token có xác suất cao nhất, nhưng lợi thế của nó trước B, C hay D giảm đi.

Sampling vì thế có nhiều khả năng khám phá những continuation ít hiển nhiên hơn.

Đó là nguồn gốc của quan sát:

Text
temperature cao → output đa dạng hơn

chứ không phải vì model có một module “creative mode” được kích hoạt.


Một simulation nhỏ cho thấy temperature có thể thay đổi distribution mạnh đến mức nào

Với một vector logits cố định:

Text
[3.0, 2.2, 1.5, 0.7, 0, -0.5, -1, -1.5]

simulation trong research data cho kết quả:

Temperature Xác suất token đứng đầu Entropy Trực giác
(T\to0) 1.0000 0.000 bit Greedy limit
0.2 0.9815 0.137 bit Gần như chỉ còn một lựa chọn
0.7 0.6671 1.412 bit Một vài token cạnh tranh
1.0 0.5313 1.911 bit Distribution cơ sở
1.5 0.3965 2.389 bit Probability mass trải rộng hơn

Các con số này không phải logits thật của một GPT cụ thể; chúng chỉ minh họa trực tiếp phép biến đổi temperature.

Điểm đáng chú ý không nằm ở con số 0.7 hay 1.5.

Điểm quan trọng là:

Cùng một model, cùng một context và cùng một ranking token, chỉ cần thay temperature cũng có thể làm probability landscape khác đi đáng kể.


🔬 Deep Dive — Tại sao temperature làm khoảng cách xác suất thay đổi?

Xét hai token (i) và (j).

Sau temperature scaling:

qiqj=exp⁡(zi−zjT)

Giả sử token A có logit cao hơn token B một lượng:

zA−zB=2

Nếu:

T=1

thì:

qAqB=e2≈7.39

Nhưng nếu:

T=0.5

thì:

qAqB=e4≈54.6

A không chỉ “hơi được ưu tiên hơn”. Khoảng cách giữa hai token đã bị phóng đại rất mạnh.

Ngược lại với:

T=2

ta có:

qAqB=e1≈2.72

Hai token trở nên cạnh tranh hơn nhiều.

Đây là cách chính xác hơn để hiểu temperature:

Temperature điều chỉnh độ tương phản của distribution.


temperature = 0 không thực sự được đưa vào công thức

Công thức:

zi/T

không xác định tại:

T=0

Do đó khi API cho phép temperature=0, không nên hình dung engine đang thực hiện phép chia cho 0.

Về mặt lý thuyết:

T→0+

làm probability mass tập trung vào token có logit lớn nhất, tiến gần hành vi greedy nếu argmax duy nhất.

Vì vậy temperature=0 thường được hiểu như một trường hợp đặc biệt gần deterministic decoding, chứ không phải một temperature vật lý bằng 0 được đưa trực tiếp vào softmax.


3. Top-p không làm distribution “lạnh” hơn — nó cắt bỏ phần đuôi

Temperature và top-p thường xuất hiện cạnh nhau trong API nên rất dễ bị xem như hai phiên bản của cùng một control.

Chúng không giống nhau.

Temperature thay đổi hình dạng của toàn bộ distribution.

Top-p thay đổi support — tức tập token được phép còn xác suất khác 0.

Giả sử sau softmax chúng ta có:

Token Probability Cumulative
A 0.50 0.50
B 0.25 0.75
C 0.12 0.87
D 0.06 0.93
E 0.04 0.97
F 0.03 1.00

Nếu:

Text
top_p = 0.9

algorithm đi từ token xác suất cao nhất xuống cho đến khi cumulative probability đạt ít nhất 0.9.

Ta phải giữ:

Text
A + B + C + D
= 0.93

E và F bị loại.

Sau đó A–D được chuẩn hóa lại để tổng xác suất trở về 1.

Holtzman và cộng sự gọi tập động này là nucleus, từ đó có tên nucleus sampling. Paper gốc giới thiệu phương pháp này nhằm loại phần probability tail kém đáng tin cậy mà vẫn giữ đủ diversity cho open-ended generation.

Top-p không có nghĩa “giữ p phần trăm token”

Đây là misconception rất phổ biến.

Text
top_p = 0.9

không có nghĩa:

Text
giữ 90% vocabulary

Nó có nghĩa:

Text
giữ tập token nhỏ nhất
có tổng probability mass >= 90%

Nếu model rất chắc chắn:

Text
A = 0.94
B = 0.03
C = 0.01
...

thì với:

Text
top_p = 0.9

nucleus chỉ cần:

Text
{A}

Ngược lại, nếu distribution phẳng:

Text
A = 0.07
B = 0.06
C = 0.055
D = 0.05
...

có thể phải giữ hàng chục token mới đạt probability mass 0.9.

Đây chính là ưu điểm quan trọng của nucleus sampling:

Số candidate tự thích nghi với mức độ uncertainty tại context hiện tại.


4. Top-k: đơn giản hơn, nhưng không thích nghi với uncertainty

Top-k sử dụng một quy tắc dễ hiểu hơn:

Text
chỉ giữ k token có xác suất cao nhất

Ví dụ:

Text
top_k = 5

thì bất kể distribution đang sắc hay phẳng, chỉ năm token đứng đầu được phép tham gia sampling.

Hugging Face Transformers hiện định nghĩa top_k theo đúng cách này, trong khi top_p giữ tập nhỏ nhất đạt probability mass đặt trước.

Vấn đề là (k) cố định không biết context đang dễ hay khó.

Context rất chắc chắn

Text
A  0.91
B  0.03
C  0.02
D  0.015
E  0.01
...

Nếu giữ top_k=50, ta vẫn cho nhiều token tail tồn tại dù model gần như chắc chắn A là continuation hợp lý.

Context rất mơ hồ

Text
A  0.04
B  0.038
C  0.036
D  0.034
...

Nếu top_k=5, ta có thể loại rất nhiều continuation hoàn toàn hợp lý chỉ vì chúng đứng sau vị trí thứ năm.

Holtzman et al. chỉ ra chính hạn chế của fixed cutoff này khi lập luận cho nucleus sampling.

Có thể tóm tắt ba control:

Control Nó thay đổi gì? Cutoff động? Trực giác tốt nhất
Temperature Hình dạng distribution Không áp cutoff Điều chỉnh độ tương phản
Top-p Support theo probability mass Có Giữ nucleus đủ đáng tin
Top-k Support theo số lượng token Không Chỉ cho top (k) candidate

Đây là distinction quan trọng nhất để tránh xem chúng như ba slider độc lập cùng làm một việc.


5. Temperature và top-p tương tác với nhau như thế nào?

Hãy quay lại simulation temperature ở trên.

Khi temperature thay đổi distribution, top-p được áp dụng lên một distribution đã có hình dạng khác.

Vì vậy cùng:

Text
top_p = 0.95

không có nghĩa cùng số candidate.

Simulation trong research cho thấy:

Temperature top-p = 0.6 top-p = 0.9 top-p = 0.95
0.2 1 token 1 token 1 token
0.7 1 3 3
1.0 2 4 5
1.5 2 5 6

Tại:

Text
temperature = 0.2

token top đầu chiếm khoảng 98% probability mass.

Do đó dù đặt:

Text
top_p = 0.6
top_p = 0.9
top_p = 0.95

nucleus vẫn chỉ cần một token.

Top-p gần như không còn gì để điều khiển.

Ngược lại, ở:

Text
temperature = 1.5

distribution phẳng hơn nhiều. Để thu được 95% probability mass phải giữ tới sáu trong tám token của simulation.

Đó là lý do việc thay đồng thời temperature và top-p dễ khiến experimentation trở nên khó diễn giải.

OpenAI hiện cũng mô tả top_p như một phương án nucleus sampling thay thế cho temperature và khuyến nghị nói chung nên thay đổi một trong hai thay vì cả hai cùng lúc.

Điều đó không có nghĩa kết hợp chúng luôn sai.

Nó có nghĩa nếu bạn đổi:

Text
temperature: 0.7 → 1.2
top_p:       0.9 → 0.7

và output thay đổi, rất khó biết nguyên nhân đến từ:

  • distribution bị flatten bởi temperature;
  • support bị thu hẹp bởi top-p;
  • hay interaction giữa cả hai.

Trong evaluation nghiêm túc, thường tốt hơn khi sweep từng dimension độc lập trước.


⚠️ top_k = 1 gần như vô hiệu hóa temperature

Đây là một edge case giúp thấy rõ các parameter không độc lập.

Giả sử sau mọi biến đổi distribution là:

Text
A  0.40
B  0.30
C  0.20
D  0.10

Nếu:

Text
top_k = 1

ta chỉ giữ:

Text
A

Sau renormalization:

Text
A = 1.0

Không còn B, C hay D để sampling.

Dù temperature trước đó bằng 0.5 hay 1.5, nếu pipeline cuối cùng chỉ cho phép một token thì lựa chọn vẫn là A.

Vì vậy:

Temperature chỉ có thể tạo diversity khi nhiều candidate thực sự còn sống tới bước sampling.


6. Vì sao greedy decoding đôi khi lại cho output tệ dù luôn chọn token “tốt nhất”?

Một trực giác rất hấp dẫn là:

Nếu mỗi bước đều chọn token có xác suất cao nhất thì cuối cùng phải thu được câu tốt nhất.

Đây chính là nơi token-level probability và sequence-level quality bắt đầu tách nhau.

Greedy decoding chọn:

yt=arg⁡maxi⁡P(yt=i|y<t,x)

ở từng bước riêng lẻ.

Nhưng quyết định tốt nhất tại bước hiện tại không bảo đảm dẫn tới sequence tốt nhất về:

  • coherence;
  • information content;
  • diversity;
  • repetition;
  • usefulness.

Trong paper The Curious Case of Neural Text Degeneration, Holtzman et al. quan sát rằng likelihood-maximizing decoding có thể tạo text nhạt và lặp bất thường, dù language model bên dưới vẫn có chất lượng tốt. Họ đề xuất nucleus sampling như một cách tránh cả hai cực: quá deterministic và sampling quá sâu vào unreliable tail.

Đây là một kết quả quan trọng vì nó phá vỡ suy luận:

Text
token probability cao
        ↓
token tốt
        ↓
luôn chọn token cao nhất
        ↓
sequence tốt nhất

Chuỗi reasoning đó không đúng trong open-ended generation.

Tại sao repetition có thể tự củng cố?

Giả sử model đã vô tình bắt đầu một cấu trúc lặp.

Phần lặp vừa sinh trở thành context.

Context mới có thể tiếp tục làm continuation lặp lại trở nên có xác suất cao.

Greedy lại chọn continuation đó.

Context trở nên lặp hơn.

Text
small repetition
      │
      ▼
context chứa repetition
      │
      ▼
repetition probability tăng
      │
      ▼
greedy lại chọn repetition
      │
      └──────────────┐
                     ▼
              feedback loop

Các nghiên cứu về neural text degeneration sau đó tiếp tục phân tích cơ chế tự củng cố này.

Vì thế đôi khi một lượng stochasticity vừa phải thực sự giúp generation thoát khỏi mode cục bộ kém chất lượng.


7. Sampling rộng hơn cũng không phải lúc nào tốt hơn

Nếu greedy có thể quá hẹp, tại sao không sampling từ toàn bộ vocabulary?

Vì phần tail của distribution rất lớn.

Giả sử vocabulary có 100.000 token.

Một lượng probability rất nhỏ phân bố trên hàng chục nghìn token tail có vẻ không đáng kể khi nhìn từng token.

Nhưng nếu ta cho phép sampling từ toàn bộ distribution ở hàng trăm generation steps, xác suất cuối cùng chọn phải một continuation kỳ quặc không còn nhỏ như trực giác ban đầu.

Đó là vấn đề mà truncation methods muốn giải quyết:

Text
Full distribution
│
├── high-probability region
│
├── plausible alternatives
│
├── uncertain alternatives
│
└── enormous low-probability tail
             ▲
             │
       truncation loại vùng này

Nucleus sampling cắt theo cumulative mass.

Top-k cắt theo rank.

Các phương pháp mới hơn tiếp tục tìm cutoff thích nghi tốt hơn. Ví dụ, eta sampling nhìn truncation như một bài toán “desmoothing” và sử dụng threshold phụ thuộc entropy thay vì một nucleus threshold cố định.

Locally Typical Sampling lại tiếp cận từ information theory, ưu tiên token có information content gần conditional entropy của distribution và đã được đánh giá cạnh tranh với nucleus/top-k trong summarization và story generation, đồng thời giảm một số dạng repetition thoái hóa.

Nhưng đối với developer sử dụng API thông thường, điều quan trọng không phải học thuộc mọi decoding algorithm.

Mental model cần giữ lại là:

Generation luôn phải cân bằng giữa việc quá tập trung vào mode cao nhất và mở support quá rộng vào probability tail.

Temperature, top-p và top-k là ba cách khác nhau để dịch chuyển điểm cân bằng đó.


8. temperature = 0 vẫn không đồng nghĩa reproducibility tuyệt đối

Giả sử bạn đang viết regression test:

Python
response = call_llm(
    prompt=prompt,
    temperature=0,
)

Bạn chạy test hôm nay:

Text
output A

Ngày mai:

Text
output B

Phản ứng tự nhiên là:

“Temperature đã bằng 0 rồi. Tại sao vẫn khác?”

Vấn đề là sampling randomness và system determinism không phải cùng một thứ.

Temperature chỉ xử lý một phần của pipeline.

Hosted LLM serving còn có thể liên quan tới:

  • model snapshot;
  • backend implementation;
  • floating-point behavior;
  • batching;
  • hardware execution;
  • inference configuration;
  • infrastructure changes;
  • các processor khác trong generation pipeline.

OpenAI từng minh họa điều này trong Cookbook về reproducible outputs: cùng seed và các parameter cố định làm output ổn định hơn đáng kể, nhưng cơ chế chỉ được mô tả là best effort, không phải bảo đảm determinism tuyệt đối. Cookbook cũng sử dụng system_fingerprint để theo dõi thay đổi backend trong thí nghiệm đó.

Vì vậy nên tách hai khái niệm:

Stability

Nhiều lần chạy có xu hướng cho output giống nhau.

Reproducibility

Có thể tái tạo cùng output một cách đáng tin cậy dưới những điều kiện xác định.

Temperature thấp thường tăng stability.

Nó không tự động cung cấp reproducibility end-to-end.


🏗️ Production Note — Regression test LLM không nên assert toàn bộ string

Một test như:

Python
assert response == expected_response

rất dễ brittle.

Với LLM application, thường hữu ích hơn khi kiểm tra những invariant thực sự quan trọng:

Python
assert output_matches_schema(response)
assert contains_required_fields(response)
assert no_unsupported_claims(response)
assert score_correctness(response) >= threshold

Nếu exact reproducibility thực sự cần thiết, bạn còn phải pin nhiều thứ hơn:

Text
model/version
prompt
system instructions
generation parameters
tool definitions
retrieved context
seed nếu runtime hỗ trợ
evaluation environment

Sampling config chỉ là một phần của reproducibility story.


9. Temperature không phải factuality knob

Một trong những cách dùng temperature nguy hiểm nhất về mặt engineering là:

Text
Tôi cần factual answer
→ temperature = 0
→ output sẽ factual

Không có bước nào trong temperature scaling kiểm tra database, source hay sự thật ngoài thế giới.

Temperature chỉ biến đổi:

P(token|context)

Nếu model có distribution:

Text
claim sai       0.55
claim đúng      0.35
claim khác      0.10

giảm temperature có thể khiến:

Text
claim sai

trở nên áp đảo hơn.

Nó không đảo ranking dựa trên factuality.

Vì vậy factual system nên giải quyết factuality bằng controls đúng layer:

Text
User question
     │
     ▼
Grounding / retrieval
     │
     ▼
Relevant evidence
     │
     ▼
LLM generation
     │
     ▼
Claim validation
     │
     ▼
Answer

Temperature có thể giúp generation ít biến thiên hơn.

Nhưng grounding mới cung cấp evidence.

Schema có thể ràng buộc structure.

Verifier có thể kiểm tra output.

Citation checking có thể phát hiện claim không được source hỗ trợ.

Đây là những mechanism hoàn toàn khác nhau.

Một ví dụ thú vị là SelfCheckGPT: thay vì giả định một output duy nhất là đáng tin, phương pháp này tạo nhiều mẫu và sử dụng sự bất nhất giữa các generation để phát hiện những claim có nguy cơ hallucination. Điều này khai thác chính stochastic nature của LLM thay vì cố loại bỏ nó hoàn toàn.


10. Vậy nên chọn temperature và top-p bao nhiêu?

Câu trả lời tốt nhất không phải một bảng preset universal.

Lý do là cùng:

Text
temperature = 0.7

trên hai model khác nhau không nhất thiết tạo ra cùng mức entropy, cùng quality hay cùng behavior.

Distribution ban đầu do model quyết định.

Prompt cũng thay đổi distribution.

Context cũng thay đổi distribution.

Fine-tuning cũng thay đổi distribution.

Các logits processor khác cũng có thể thay đổi distribution.

Do đó parameter chỉ nên được xem là hyperparameter của application, không phải một hằng số mang ý nghĩa tuyệt đối.

Tuy nhiên ta vẫn có thể dùng một số vùng làm điểm khởi đầu cho experimentation.

Use case Temperature khởi đầu Mục tiêu chính
Structured extraction 0 hoặc rất thấp Stability
Factual summarization 0–0.2 Bám source, ít variation
Technical Q&A 0–0.3 Consistency/correctness
General conversation khoảng 0.5–0.8 Naturalness + variation
Brainstorming khoảng 0.8–1.0 Diversity
Creative exploration khoảng 0.8–1.2+ Nhiều candidate khác nhau

Đây là starting points, không phải best practice bất biến.

Và thay vì cùng lúc tuning:

Text
temperature
top_p
top_k
presence_penalty
frequency_penalty

hãy bắt đầu bằng một baseline rõ ràng.

Ví dụ:

Text
temperature = 1
top_p = 1

sau đó sweep:

Text
temperature ∈ {0, 0.2, 0.5, 0.8, 1.0}

trong khi giữ các parameter khác cố định.

Sau khi hiểu temperature ảnh hưởng application thế nào, mới quyết định có cần nucleus truncation hay không.

OpenAI hiện cũng khuyến nghị nói chung nên điều chỉnh temperature hoặc top-p thay vì thay cả hai đồng thời.


11. Đừng đánh giá sampling bằng một prompt và một lần chạy

Một configuration có stochasticity nhưng bạn chỉ chạy một lần:

Text
temperature = 0.7
run #1

thì bạn gần như chưa đo được variance.

Muốn so sánh:

Text
temperature = 0.2

với:

Text
temperature = 0.8

cần chạy nhiều samples trên nhiều prompt đại diện.

Một evaluation đơn giản có thể có cấu trúc:

Text
Eval Dataset
    │
    ├── factual prompts
    ├── summarization prompts
    ├── coding prompts
    └── conversational prompts
             │
             ▼
     Generation configs
             │
      ┌──────┴───────┐
      │              │
   config A        config B
      │              │
   10 runs          10 runs
      │              │
      └──────┬───────┘
             ▼
          Metrics

Metric cũng phải phù hợp với mục tiêu.

Factual tasks

Đo:

  • correctness;
  • unsupported claims;
  • source attribution;
  • consistency.

Structured extraction

Đo:

  • schema validity;
  • exact field accuracy;
  • missing fields;
  • invalid values.

Creative generation

Đo:

  • diversity;
  • repetition;
  • coherence;
  • human preference.

Open-ended conversation

Đo:

  • helpfulness;
  • relevance;
  • style consistency;
  • safety;
  • variance giữa nhiều runs.

Một lỗi phổ biến là chỉ đo perplexity hoặc likelihood rồi kết luận output tốt hơn.

Paper nucleus sampling nổi tiếng chính vì cho thấy sequence có likelihood rất cao vẫn có thể bị degeneration và repetition.


12. Sampling cho ta một mental model tốt hơn về việc “AI trả lời”

Sau khi hiểu logits, softmax và sampling, câu:

“AI đã chọn câu trả lời này.”

trở nên hơi thiếu chính xác.

Mental model tốt hơn là:

Model định nghĩa một distribution của những continuation có thể xảy ra, còn decoding strategy quyết định chúng ta đi qua distribution đó theo cách nào.

Có thể hình dung:

Text
                    MODEL
                      │
                      ▼
            Probability landscape
                      │
        ┌─────────────┼─────────────┐
        │             │             │
    Greedy       Narrow sample    Wide sample
        │             │             │
        ▼             ▼             ▼
     Path A          Path B        Path C

Weights của model quyết định landscape.

Prompt quyết định vị trí hiện tại trên landscape.

Temperature thay đổi độ sắc/phẳng của landscape.

Top-p và top-k giới hạn khu vực được phép khám phá.

Sampling chọn một bước cụ thể.

Token vừa chọn lại thay đổi context và tạo một landscape mới.

Rồi quá trình lặp lại.

Đó là lý do cùng một prompt có thể tạo ra nhiều output mà không cần giả định model “đổi ý”.


13. Những hiểu nhầm quan trọng cần tránh

“Temperature càng cao thì model càng thông minh”

Không.

Temperature không bổ sung reasoning capability hay knowledge. Nó chỉ thay đổi probability distribution trước sampling.

Một model yếu ở (T=1.2) không tự trở thành model mạnh hơn.


“Temperature = 0 nghĩa là câu trả lời chắc chắn đúng”

Không.

Nó chỉ làm generation gần deterministic hơn ở layer sampling.

Sai lầm có xác suất cao vẫn có thể được chọn cực kỳ ổn định.


“Top-p = 0.9 nghĩa là giữ 90% số token”

Không.

Nó giữ tập token nhỏ nhất có cumulative probability đạt ít nhất 0.9.

Số token trong nucleus có thể thay đổi ở mỗi generation step.


“Temperature và top-p là hai tên khác nhau cho cùng một control”

Không.

Temperature rescale probability.

Top-p truncate support.

Sự khác nhau này cũng khiến chúng tương tác với nhau.


“Greedy luôn tốt nhất vì luôn chọn token xác suất cao nhất”

Không với open-ended generation.

Local argmax không bảo đảm global sequence quality, và quá deterministic decoding có thể góp phần vào degeneration hoặc repetition.


“Chỉ cần tìm một temperature tối ưu rồi dùng cho mọi prompt”

Không.

Sampling behavior phụ thuộc model, prompt, task và distribution tại từng decoding step.

Preset chỉ nên là điểm khởi đầu trước khi benchmark trên eval set của chính application.


Kết luận

Quay lại câu hỏi ban đầu:

Tại sao cùng một prompt AI có thể trả lời khác nhau?

Không phải vì model đã âm thầm thay đổi knowledge giữa hai request.

Nguyên nhân cốt lõi nằm ở cách generation hoạt động.

LLM là một autoregressive probabilistic generator. Ở mỗi bước, model tạo logits cho toàn bộ vocabulary, biến chúng thành distribution và chọn token tiếp theo. Token đó trở thành một phần của context, làm thay đổi distribution của bước kế tiếp.

Một lựa chọn nhỏ ở bước đầu vì thế có thể tạo ra một nhánh generation hoàn toàn mới.

Temperature, top-p và top-k can thiệp vào quá trình này theo ba cách khác nhau:

Text
Temperature
→ thay đổi hình dạng distribution

Top-p
→ giữ một nucleus động theo probability mass

Top-k
→ giữ cố định k token đứng đầu

Temperature thấp thường làm output ổn định hơn, nhưng không bảo đảm factuality. Temperature cao mở rộng khả năng exploration, nhưng cũng tăng exposure với những continuation yếu hơn.

Truncation quá mạnh có thể làm generation gần greedy và mất diversity. Truncation quá rộng có thể cho phép sampling sâu vào unreliable tail.

Không có một configuration tối ưu cho mọi application.

Điều developer thực sự cần tối ưu không phải:

Text
temperature = ?

mà là:

Application Utility=f(correctness,stability,diversity,coherence)

Với extraction hay factual summarization, stability và validation thường quan trọng hơn novelty. Với brainstorming và creative generation, diversity lại trở thành một phần của utility.

Và nếu cần nhiều ý tưởng tốt, một chiến lược thường mạnh hơn việc đơn giản đẩy temperature lên cực cao là:

Text
Moderate sampling
        │
        ▼
Generate multiple candidates
        │
        ▼
Verifier / evaluator / ranker
        │
        ▼
Choose best candidate

Sampling cung cấp diversity và recall.

Evaluation cung cấp selection và precision.

Khi nhìn generation theo mental model này, temperature không còn là một “thanh trượt sáng tạo” bí ẩn. Nó trở thành thứ đúng với bản chất của nó: một phần của decoding policy quyết định chúng ta khám phá probability distribution của model như thế nào.

Nguồn tham khảo

  • Ari Holtzman, Jan Buys, Li Du, Maxwell Forbes, Yejin Choi — The Curious Case of Neural Text Degeneration.
  • Hugging Face Transformers — Generation / GenerationConfig.
  • OpenAI API Reference — sampling controls temperature và top_p.
  • OpenAI Cookbook — How to make your completions outputs consistent with the seed parameter.
  • Matthew Renze, Erhan Guven — The Effect of Sampling Temperature on Problem Solving in Large Language Models.
  • John Hewitt, Christopher D. Manning, Percy Liang — Truncation Sampling as Language Model Desmoothing.
  • Clara Meister, Tiago Pimentel, Gian Wiher, Ryan Cotterell — Locally Typical Sampling.
  • Potsawee Manakul, Adian Liusie, Mark J. F. Gales — SelfCheckGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models.
Chia sẻXLinkedIn