從新手邁向專家:全面解析LLM中的Frequency與Presence Penalty

Sean Yeh
Python Everywhere -from Beginner to Advanced
11 min readMar 4, 2024

--

Puerta del Sol, Madrid, Spain, photo by Sean Yeh

在這個AI技術迅速發展的時代,那些能夠聊天、寫作甚至創作詩歌的大型語言模型(比如說GPT系列)正以它們驚人的能力搶佔頭條新聞。它們不僅僅是在文字生成、理解語言,還在創意寫作領域大放異彩。但要想讓這些智能巨頭發揮出最大的魅力,我們得先搞懂它們背後的一些關鍵參數。

在這篇文章中,我們將來聊聊OpenAI LLM大型語言模型中的兩個超級重要的設置:頻率懲罰(Frequency Penalty)和存在懲罰(Presence Penalty)。這兩個參數的主要任務就是在我們的文件創造的過程中,控制那些重複出現的詞彙,讓作品更加新鮮獨特。想象一下,這就像是給AI模型加上了一副讓它不停尋找新詞的眼鏡。我們將帶你從一個對這些參數設定一無所知的新手,一步步邁向成長為真正的大師的道路,全面掌握它們在AI創作中的妙用。讓我們開啟這段探索之旅,全面解析這些參數的作用及其在AI生成任務中的應用。

何謂 Frequency Penalty 參數?

想像一下,你正在和一個超級聰明的朋友對話,希望他幫你寫出一篇獨特的文章。但有時候,這個朋友有點像那種一根筋的人,常常喜歡反覆說同一件事。這時候,我們需要給朋友的一個小提醒,並告訴他:「嘿,這剛剛說過了。來試點不一樣的吧!」

在使用大型語言LLM時也會碰到像上面一樣的狀況,有時候AI它就像前面提到的那個一根筋的朋友一樣,常常喜歡反覆說同一件事。這時候,Frequency Penalty就像是我們給朋友的一個小提醒一樣的給AI一個提醒,確保AI不會一直重復同樣的詞,讓我們的文章內容保持新鮮感和創意。

如何使用?

來吧,讓我們深入ㄧ點,看看如何在實際中調教我們的AI,使它能夠在文章內容生成時避免陷入重復同樣詞彙的漩渦中。

以下是一個利用Python撰寫的小範例。範例顯示如何在使用OpenAI GPT這樣的大型語言模型時調整Frequency Penalty:

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": "寫一篇文章,題目是「來點創新的未來科技概念」,不要超過200字"
}
],
max_tokens=200,
frequency_penalty=0 # 給重複詞彙一點壓力
)
print(reply.choices[0].message.content)

首先,我們可以將frequency_penalty的設定分別調整為負2到正2(包括 -2、-1、0、1、2等值)間的數字,看看結果有何變化?

# frequency_penalty = -2 是極端值中的一端。基本上,負2的頻率懲罰鼓勵了token的重複使用。一個token出現的次數越多,它繼續出現的可能性就越大,這是一種加成效應。你可以看到下面的文字,到後來一直出現「的」字。

frequency_penalty = -2

# frequency_penalty = -1 你可以看到負1的結果也類似。到後來也開始頻繁的出現「擓」字。因此,frequency_penalty設定為負值,意味著我們鼓勵它重複。

frequency_penalty = -1

# frequency_penalty = 0

這是設定為0的情況。對於已經生成的token實際上沒有懲罰(即允許重複)。

frequency_penalty = 0

參數的值範圍通常是從0到2,更高的值則意味著更強的懲罰效果,從而減少單詞的重複出現,使文本更加多樣化。

# frequency_penalty = 1 超過0的值即意味著具備懲罰效果。

frequency_penalty = 1

# frequency_penalty = 2 為最高的懲罰效果。

frequency_penalty = 2

# frequency_penalty = 0.5

在這個範例中,frequency_penalty=0.5 表示我們對重複單詞的出現施加了中等程度的懲罰。

使用時,可以透過實驗不斷的調整調整參數值,讓您更能夠掌握 Frequency Penalty 對文件內容生成的影響,並根據具體的需求來優化生成結果。

調整Frequency Penalty時,重要的是找到適合特定寫作需求的平衡點,以確保文本既豐富多彩又具有連貫性。大致上來說,如果只是想一般減少重複的輸出,可以嘗試將參數值調整在從0.1到1的範圍,從小數字開始漸漸增加,但不推薦超過1。

小結

一般來說,對於創意寫作或需要高度原創性的任務,可以嘗試提高Frequency Penalty的值。在實際操作中,這可以透過調整LLM語言模型的參數設置來實現,例如在使用GPT或其他LLM進行API調用時明確的指定Frequency Penalty的值。

如果適當的調整與使用Frequency Penalty,就可以顯著提高文件生成的多樣性和創新性。但也需要注意,應根據具體的應用場景謹慎調整,以避免過度創新導致的內容離題或缺乏連貫性。

何謂 Presence Penalty參數?

讓我們再談談這個被稱為「存在懲罰」(Presence Penalty)的參數設定。也許您會覺得它和之前提到的「頻率懲罰」(Frequency Penalty)相似,但實際上它們使用不同的遊戲規則和運作方式。

想像一下,之前提到的「頻率懲罰」就像是遊戲中根據您使用某個動作的頻率逐漸增加難度,讓同一招式不斷重複變得沒那麼有效。而這裡提到的「存在懲罰」則更像是一旦您使用某個招式,立即讓該招式在接下來的遊戲中效果減半,無論您使用一次還是十次,打擊都是一樣的。

「頻率懲罰」會隨著使用次數的增加而變得更加強烈,就像是告訴你:“夠了,換點新的吧。”而「存在懲罰」則是一次性的,它更像是,“嘿,你已經試過這個了,讓我們看看還有什麼比較新鮮的。”

這意味著「存在懲罰」不會隨著使用次數的增加而變得更加強烈,而是一次性地阻止重複使用。所以,當我們想要鼓勵嘗試新事物時,可以將「存在懲罰」調高,讓人們不斷尋找新的選擇。

如何使用?

我們可以把它看作一個開關,「0」代表「不在意」,「1」則代表「停止重複」。如果將「存在懲罰」設置為正數,AI會避免再次選擇那些已經出現過的詞彙;相反地,如果設定為負數,則是向AI發出「再來一遍」的信號。

下面讓我們用一段Python程式碼來示範如何靈活運用Presence Penalty:

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": "寫一篇文章,題目是「一個全新的未來城市概念」,不要超過200字"
}
],
max_tokens=200,
frequency_penalty=0 # 這次我們不調頻率懲罰
presence_penalty=1.0 # 給重複詞彙大大的壓力

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

這段程式碼將「存在懲罰」(Presence Penalty)參數值設定為1.0,這表示我們正在強烈鼓勵模型避免重複使用已經出現過的詞彙,以此來促使它生成更多樣化和創新的內容。

我們一樣可以從一個極端值(2.0),設定到另外一個極端值(-2.0)來觀察輸出的結果有什麼變化。

## presence_penalty 2.0

Presence Penalty設定為2.0
未來城市概念將不再是擁擠的混凝土叢林,而是一個融合自然與科技的完美城市。這座城市充滿綠意,
處處都可以看到綠色空中花園和水上景觀。居民可以在大自然中享受寧靜,同時也能感受到現代科技
帶來的便利。高效的智慧交通系統將幫助人們更快速地移動,節省時間。

未來城市將建立以可再生能源為主的永續發展理念,減少

這段程式碼將Presence Penalty設定為2.0。這是正的極端值,設為正數,AI會避免再次選擇那些已經出現過的詞彙。

## presence_penalty 1.0

Presence Penalty設定為1.0
在這個全新的未來城市概念中,我們將看到許多令人驚訝的創新和改變。城市將被打造成為一個
完全智慧化和可持續發展的生態系統。居民將享有無線充電、自動駕駛汽車以及智能家居等便利
服務。大量綠化空間和垂直農場將提供當地生產的食物,降低對運輸的需求。再生能源和節能技
術將幫助城市實現碳中

這段程式碼將Presence Penalty設定為1.0,表示我們正在積極鼓勵模型避免重複使用任何已經出現過的詞彙,進而推動它生成更多樣和創新的內容。

## presence_penalty 0

Presence Penalty設定為0
在這個數位時代,我們可以想像一個全新的未來城市概念。這座城市將充滿綠色、智慧和可持續性的元素。
建築物將採用環保材料和設計,擁有自動節能系統和智慧化監控設備。城市中心將擁有綠地和公共休憩空間
,供人們放鬆身心。

交通將全面電動化,擁有智慧交通系統和自駕車技術,讓人們出行更加便利和

這段程式碼將Presence Penalty設定為0。

## presence_penalty -1.0

Presence Penalty設定為-1.0
在這個全新的未來城市概念中,我們將看到一個充滿無限可能性的城市。這座城市將充滿綠色植被,建築物
將採用環保材料,並配備太陽能板和植物屋頂。城市中的交通將完全無人化,使用無人駕駛車輛和高速鐵路
系統。人們將可以透過智能科技來管理家中的能源使用,並透過虛擬現實技術獲得更豐富的教育和

這段程式碼將Presence Penalty設定為-1.0。

## presence_penalty -2.0

Presence Penalty設定為-2
未來城市將是一個全新的概念,擁有環保、智慧、共享的特徵。穿梭在城市中的無人載具,幫助人們輕鬆便
捷地移動,同時減少空氣污染。城市中處處是綠植,維護空氣品質,緩解城市熱島效應。智慧城市系統幫助
城市管理者更好地規劃城市發展,提高城市運行的效率。人們更注重共享資源,共同維護城市環

這段程式碼將「存在懲罰」設定為-2.0,這是一個極端的負值。設定為負數時,等於在鼓勵重複,因此這個參數意味著向AI發出「重新嘗試」的訊號。我們可以觀察到,在這段文字中「城市」這個詞彙出現了多次。

小結

存在懲罰(Presence Penalty)扮演著產出內文的創新的重要角色。透過精心調整這一參數,我們能賦予AI創作出更具活力和吸引力的內容,避免了重複使用相同詞句的窠臼,保持敘述的新鮮感和創意。

結論

深入理解並恰當的應用頻率懲罰(Frequency Penalty)和存在懲罰(Presence Penalty),能夠顯著提升大型語言模型在內容生成方面的能力。這不僅使我們能夠讓生成的內容更加豐富,更加富有多樣性和創新性。不但如此,它們還允許我們根據具體個案的需求進行精確的微調,產出更有效率、更精準的內容。藉由學習這些技巧,必能讓我們能夠從新手逐步成長邁向專家之路。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

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