Learning Objectives
- 用 logprobs 取得真實的候選機率,並轉換成機率
- 說明 temperature 的常見定義,用 numpy 重新加權機率
- 說明 top_p 怎麼截斷候選
- 依應用需求選擇參數,並說明為什麼設定 temperature=0 不等於每次相同
同一個請求為什麼每次回答不同
第 1 課看過:同一個輸入呼叫五次,寫法可能不同。模型產生回答時,是一個 token 接一個 token 往下走:每一步對所有 token 算出機率,再從中抽一個。抽樣這一步就是回答會變動的來源之一。
做應用時你要決定這一步的行為:要分類、要擷取資料,回答越穩定越好;要發想標語,可以分散一點。API 提供 temperature 與 top_p 兩個參數來調整。
這一課用 logprobs=True 把真實的候選機率拿出來看。範例一樣是預錄的真實回應(2026-11-03,gpt-5.6-luna)。
逐步看:真實的候選機率
問題是「週末最適合做什麼?只回答一個詞」,分別用三種 temperature、各呼叫兩次,看第一個 token 的候選。請注意兩件事:候選有幾個,還有機率會不會隨 temperature 改變。
從錄音看到的幾件事
logprob 是機率的自然對數,用 math.exp() 或 np.exp() 轉回機率;越接近 0 機率越高。從上面的真實輸出可以看到:
- 候選數可能比要求的少。 API 文件寫明回傳的項目可能較少,這裡就只有 2 個。
- 上限依模型而定。 文件寫
top_logprobs可以到 20,但我們實測這個模型送 20 會回 400 錯誤:must be less than or equal to 5。 - 同一個請求,機率每次略有不同。 例如兩次 temperature=0.2,放分別是 0.706 和 0.596。所以這些數字要當成估計,不要太計較小數。
- 機率沒有隨溫度改變。 temperature=0.2 時,放仍然只有六、七成;如果機率已經依這個溫度調整過(公式在下一段),應該會接近 0.99。文件沒有明說,但這次實測看起來,
logprob報告的是調整前的機率。溫度影響的是抽樣,temperature=1.5 的第一次就選中了機率較低的「休」。 - 看不到全部。 我們只知道前幾名;其他 token 只能看到合計的剩餘機率。
有時候候選會顯示成 \xe9\x99 這樣的文字。那是第 2 課看過的情況:一個字被切成多個 token,這個 token 只是位元組的前半段。
Temperature 的定義
官方文件只這樣描述 temperature:範圍 0 到 2,數值高(例如 0.8)輸出較隨機,數值低(例如 0.2)較集中、較具決定性。文件沒有寫出公式,所以我們無法確認這個模型內部實際怎麼算。
文獻上常見的定義是把 softmax 的分數先除以 T(例如 Hinton 等人 2015 的式 1),和第 3 課的「分數差距放大縮小」相同。換成已經算好的機率 p,等於:
q ∝ p ^ (1 / T) 每個機率取 1/T 次方,再除以總和
- T = 1: 不變。
- T 小於 1: 差距放大,高機率的更高。
- T 大於 1: 差距縮小,低機率的也有機會。
- T = 0: 公式會除以零,一般解讀成總是選最高的。實際行為要看下面的實測。
下面用這個公式對真實機率做一次計算,幫助你理解趨勢。
逐步看:用 numpy 依溫度重新加權
問題換成「幫咖啡店取英文店名」,候選比較分散。這裡的數字是用上面的公式算的,不是模型回報的;最後兩行要看「其餘合計」的問題。
Top_p:只從累加到 p 的候選裡抽
top_p 又稱 nucleus sampling(Holtzman 等人):把候選由高到低排,取累加機率達到 p 的最小集合,其他的不考慮,留下的機率再重新調整成總和 1。
和 temperature 的差別是:temperature 改變每個候選的比例,top_p 直接把尾端切掉。留下幾個候選取決於這一步的分布:很有把握時可能只留一個,分散時會留很多個。
官方文件建議調 temperature 或 top_p 其中一個,不要兩個都調。
逐步看:top_p 留下哪些候選
用同一組真實機率,算不同 top_p 留下的候選。注意最後一個為什麼算不出來。
逐步看:不同參數各呼叫五次
同一個提示詞:幫大學圖書館寫標語。四種設定各呼叫五次,這次是模型真的依參數抽樣的結果。先猜猜看 temperature=0 五次會不會完全相同。
參數怎麼選
從上面的錄音可以看到:
| 設定 | 五次裡的不同回答 |
|---|---|
temperature=0 |
2 種 |
temperature=1 |
5 種 |
temperature=1.8 |
5 種 |
top_p=0.1 |
3 種 |
每種只有五次,數字不足以比較細微的差別,但足以看出一件事:temperature=0 不保證每次相同。 文件的用詞也只是「較具決定性」;另一個參數 seed 同樣寫明只是盡力而為、不保證。要求結果一致的應用,不能只靠這些參數,要靠第 1 課說的:用程式驗證與正規化輸出。
實務上的起點:
- 分類、擷取、判分: 調低 temperature,讓結果比較穩定,並做好驗證。
- 一般問答: 先用預設值。
- 發想、改寫: 預設值或調高一點,多產生幾個候選再選。
這些是起點,不是定律。不同模型支援的參數也不同,要查文件並實際測試,再用第 20 課的方法比較結果。
實作:依溫度重新加權
logprobs 是上面範例錄到的前五名候選。完成兩個函數:
to_probs(logprobs):把對數機率轉回機率。reweight(p, T):依q ∝ p^(1/T)重新加權,回傳加起來等於 1 的陣列。
這題不呼叫模型,也只算前五名,沒有放「其餘合計」。
小測驗:候選機率與參數
這段程式會印出什麼?
依 q ∝ p^(1/T),這段程式會印出什麼?
四個候選的機率是 0.5、0.3、0.1、0.1,top_p=0.7 時留下幾個?
範例裡 temperature=0 呼叫五次得到 2 種回答。下面哪個結論最恰當?
同樣的請求,temperature=0.2 回報的第一個候選是 0.706,temperature=1.0 是 0.778。最合理的解讀是?
重點整理
- 模型每一步對 token 算出機率再抽一個,這是回答每次不同的來源之一。
logprobs=True可以取得選中 token 與前幾名候選的 logprob,用exp轉回機率;項目可能比要求的少,而且只看得到前幾名。q ∝ p^(1/T)是文獻常見的溫度定義;官方文件沒有寫公式,所以用它理解趨勢,不要當成模型內部的保證。top_p只保留累加達到 p 的候選。官方建議只調 temperature 或 top_p 其中一個。temperature=0不保證每次相同;要求一致的應用要用程式驗證輸出。
下一課: 參數能調整的有限,影響回答最大的還是你寫的內容。下一課開始學提示詞的結構。