AI輸出的調節術:了解OpenAI的Temperature與Top P參數

Sean Yeh
Python Everywhere -from Beginner to Advanced
12 min readFeb 21, 2024

--

Vila de Gràcia, Barcelona, Spain, photo by Sean Yeh

先前的討論中,我們已經觸及了OpenAI模型中幾個關鍵的設定選項,包括控制生成回應多樣性的n參數、調整LLM模型回答長度上限的max_tokens,以及設定特定詞彙避免出現的stop參數等。其中,我們也稍微提到temperature參數,它是一種能讓OpenAI回答變得更加引人入勝的工具。本篇文章將深入探討影響OpenAI輸出結果「確定性」與「隨機性」的兩大參數:temperatureTop P,並比較它們的異同。

對於開發者而言,了解並精通temperatureTop P參數的運用,對於精確控制LLM模型輸出的「隨機性」與「創新性」極為關鍵。透過這些參數的適當調整,不僅能夠充實AI應用的內容,並且可以顯著的提升與使用者的互動體驗。

何謂Temperature?

在OpenAI的模型裡頭,有個被稱為「溫度」(temperature)的參數,數值範圍從0到2。這個溫度參數主要是用來調控LLM模型輸出的隨機性,或者你可以說是「創造力」。

預設上,溫度值被設定為1。當溫度設定得較低時,模型輸出的確定性就會提高,意即對於相同的輸入指令,模型較可能一再產生相同的回答。反之,若將溫度值調高,則能增加輸出的隨機性,讓LLM模型有機會產生更多元和具創造性的答案。

那麼,溫度參數是如何達到這樣的效果呢?原來,它是透過調整所謂的對數機率(logits)來實現的。簡單來說,就是調整模型預測下一個單詞出現機率的分佈。當我們提升溫度值時,這個機率分佈會變得更平坦,這樣不同選項被選中的可能性就會增加;而當我們降低溫度值時,機率分佈則會變得更尖銳,也就是說,模型更傾向於選擇那些機率最高的選項。

# 調高溫度

調高溫度

提高溫度值,會使得機率分佈更加平坦,而增加了不同選項被選中的可能性。

# 調低溫度

調低溫度

降低溫度值,則使得機率分佈更尖銳,即更可能選擇機率最高的選項。

實際範例

以下將透過實際的程式碼,示範在不同溫度值的設定下,對於LLM模型的輸出會產生何種影響。

起手程式碼

import openai
from dotenv import dotenv_values
config = dotenv_values(".env")
openai.api_key = config["OPENAI_API_KEY"]

reply=openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "我最喜歡的動物是"}
],
max_tokens=200,
temperature=0
)

print(reply.choices[0].message.content)

以上是我們一開始會使用的程式碼,首先,我們一行一行的來看這段程式碼,如果已經熟悉這段程式碼的話,可以跳過這段,到下面的執行示範:

import openai

這行是在引入我們接下來要用到的 openai 套件。就像是,做菜前,先準備好要用的食材一樣。

from dotenv import dotenv_values

這行從 dotenv套件中,引入 dotenv_values 的功能。dotenv套件可以協助我們管理環境變數。因為我們要替Open AI的金鑰,找個安全處所藏起來。

config = dotenv_values(“.env”)

這行使用了 dotenv_values 的功能。它可以讀取一個叫做 .env 的檔案,然後把裡面的內容存到 config 這個變數裡。.env 檔案通常用來存放一些環境變數的設定值或是敏感資料,透過這樣的方式可以避免直接把金鑰或密碼這類敏感資料直接寫在程式碼中。

openai.api_key = config["OPENAI_API_KEY"]

這行是設定 openai ,讓該套件使用OpenAI的API 金鑰。它從前面的 config 變數中讀取 OPENAI_API_KEY 這個值,並設定給 openai.api_key。如此,當我們使用 openai 套件與 OpenAI 的服務通訊時,就會使用到這個金鑰來認證我們的身份。

reply=openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "我最喜歡的動物是"}
],
max_tokens=200,
temperature=0
)

接下來這段程式碼是用來呼叫 OpenAI 的ChatCompletion聊天模型 API,建立一個聊天任務。我們指定使用 gpt-3.5-turbo 這個模型,然後給它一個資訊,內容是 `”我最喜歡的動物是”`。而max_tokens=200則表示回答的最大長度不超過 200 個token。temperature溫度的設定,則是這次示範主要的位置,我們先將溫度值設定為0。(temperature=0) ,等一下執行時可以看看每次給出的回答會是否都同樣是那一個?

print(reply.choices[0].message.content)

最後,透過print函式印出回答的結果。我們只從回答中取出需要的內容(reply.choices[0].message.content ),然後用print函式印出來。

執行示範

#Temperature =0

我們可以先執行看看上面這段「起手程式碼」,看看會有何結果?

我們得到下面的一段回答:「狗狗」。

狗狗!它們忠誠、可愛又聰明,是人類最好的朋友。我喜歡和狗狗一起散步、玩耍,
它們總是能給我帶來無限的快樂和溫暖。無論是大型犬還是小型犬,我都愛不釋手!

再執行一次,結果與上面差不多,一樣是:「狗狗」。

狗狗!它們忠誠、可愛、活潑,總是能給人帶來無限的快樂和溫暖。
無論是陪伴散步、玩耍還是安靜地躺在身邊,狗狗總是能讓人感到幸福和愉悅。
它們是人類最好的朋友,我真的很喜歡它們!

#Temperature =2

現在,如果我提高這裡的溫度值。將它調高到最大值,也就是2的話,會是什麼結果?

如上面的結果,它變成了「貓」。而且我們可能會得到一些毫無意義的東西。你甚至可以看到這顯然不是真正的詞語。

貓!它們靈巧、愛撒嬌但又有著獨立挺直斯長 
Blair才GameOver取作鬍liqu_Model.tempFoundediasmunday cum擲
epilepsy Woody_Subió Product_PUSH局clean econ"),
则 ridic_ledagement_NONNULLCarWithError頭

實際上,如果溫度值讓超過1時,你通常會得到非常奇怪的結果。所以接下來讓我們試著減少溫度值。在0與1之間做測試。

#Temperature =0.7

我們將溫度調到0.7後再試一次。結果,「狗狗」又出現了。

狗狗!牠們忠誠、可愛,而且能給人無限的愛和陪伴。我喜歡和狗狗一起散步、玩耍,
彼此之間的互動讓我感到快樂和放鬆。總之,狗狗是我最喜歡的動物,我真的很喜歡牠們!

多試幾次,可能還是回答「狗狗」。但是後面接著的理由會有些改變。

狗狗!它們忠誠、可愛且善解人意,是人類最好的朋友。我喜歡和狗狗一起玩耍、
散步,感受它們無條件的愛和快樂。無論是小型狗還是大型狗,每一隻都有獨特的個性和魅力,
讓我無法抗拒它們的魅力。我真的很喜歡狗狗,它們總能給我帶來快樂和溫暖。

或者結果出現「貓」。

貓。它們有著優雅的外表和親人的性格,讓人感到舒適和放鬆。
我喜歡看著貓自由自在地遊走在家裡,或者蜷曲在我的腿上享受撫摸。
它們獨立而又溫柔,是我最喜歡的動物之一。

小結

由上面的示範我們可以知道,在溫度值為0時,LLM模型輸出高度一致;而將溫度調整到更高值時,輸出變開始得隨機和多樣化。然而,當溫度設置超過1時,LLM模型的輸出可能變得無意義,顯示出過高的溫度值可能導致輸出的品質下降。

透過理解和應用溫度參數,開發者可以更佳地利用AI模型生成符合期望的、創造性或一致性的文字輸出。在此建議開發者根據個別的實際需求調整溫度值。

何謂Top P?

Top P參數在OpenAI模型中扮演著另一個核心角色,它是用來調整與控制AI模型輸出的隨機性。雖然乍看之下,Top P參數似乎與溫度參數有著類似的功能,但它們背後的運作機制其實大相逕庭。

首先,Top P的數值,是一個從0到1的值,它的特點在於不直接修改原始的機率值,而是採用一種稱為nucleus抽樣的方法來決定下一個可能出現的標記(或者說是單詞)。

設定Top P值實際上是在設定一個範圍,限制LLM模型在選擇候選標記時的選項,而非改變這些標記初始的機率值。

透過對Top P值的調節,我們可以更細緻的方式控制LLM模型產生的輸出結果,讓結果更為隨機或是更加確定。

Top P值設定較低時

當Top P值設得較低時,模型輸出結果會更加的確定,因為這時模型可以選擇的範圍被嚴格限制在高機率的選項內;反之,將Top P值設定得較高時,就可以擴大模型的可選擇範圍,而產生更多樣性與隨機性的輸出結果。這個機制使得模型能夠在設定的閾值範圍內進行標記的選擇,而不是僅僅基於標記的絕對機率進行選擇。

將Top P值設定較高時

實際範例

以下將透過實際的示範顯示在不同top P值的設定下,LLM模型的輸出,用以顯示top P參數如何影響模型的隨機性與決定性。

起手程式碼

import openai
from dotenv import dotenv_values
config = dotenv_values(".env")
openai.api_key = config["OPENAI_API_KEY"]
reply=openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "我最喜歡的動物是"}
],
max_tokens=200,
top_p=0
)
print(reply.choices[0].message.content)

以上是我們一開始會使用的程式碼,與前面示範溫度參數時大致相同,不再贅述。二者的差別在於,我們不使用temperature值(temperature=0),而改用top_p 值。我們先從0開始。

# top_p = 0

答案是「狗」。

top_p = 0

# top_p = 0.5

答案是「狗」。但是後面的說明文字與前面的不大一樣了。

top_p = 0.5

# top_p = 1

當top_p值設定為最大時,答案已經從狗變成「貓」了。

top_p = 1

小結

以上範例說明了調整top P值,會如何影響模型的選擇範圍和輸出的多樣性。即使在top P設為1時,模型也能從所有可能的標記中自由選擇,因而增加了隨機性和創造性的輸出。這與溫度參數相比,top P不直接改變標記的機率,而是透過設定一個選擇窗口來影響輸出的多樣性。

如何使用Temperature與Top P ?

Top P和溫度參數都是調整模型輸出隨機性的重要工具,雖然它們的底層採用了不同的實作方式。若我們能深入了解Temperature與Top P之後,就能夠根據不同的需求,靈活地調整並應用這些參數,以達到最佳的輸出效果。

這兩個參數不僅可以單獨使用,也可以結合起來使用,藉此可以更細膩的調節輸出結果,讓結果在創新性和相關性之間達到一個平衡,使最終的輸出內容既豐富又準確無誤。

然而,也有專家建議在實際應用中擇一使用Temperature或Top P中的一個,避免同時調整兩者,以免難以識別具體效果的來源。

一般情況下,我會選擇專注於Temperature或Top P其中的一項來進行調整。例如先從溫度參數著手,逐步調整參數,看看是否能讓輸出的結果更加有趣;如果對於溫度調整後的結果不太滿意,那麼我會轉而嘗試調整Top P,看看是否能帶來更好的效果。

結論

OpenAI的Temperature和Top P參數都是控制模型輸出多樣性和創造性的強大工具。掌握Temperature和Top P的使用對於AI應用開發者來說極為重要。透過適當地調整這些參數,可以幫助開發者大幅提升AI應用的品質,建立出更自然、更具吸引力的AI對話體驗,提高使用者滿意度。

隨著對這些參數的深入理解和應用,我們期待看到更多創新和個性化的AI應用出現,為使用者帶來更豐富、更互動的體驗。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。