OpenAI調教術:讓您的AI回答更完美

Sean Yeh
Python Everywhere -from Beginner to Advanced
12 min readJan 24, 2024

--

Te Anau, New Zealand, photo by Sean Yeh

在這個快速發展的數位時代,AI人工智慧已經漸漸成為我們日常生活的一部分。而OpenAI,作為AI研究的機構之一,提供了強大的工具和LLM模型,如GPT-3.5、GPT-4,來幫助我們更好地理解和使用AI。作為一名持續關注OpenAI、Python、大數據和AI等相關領域的筆者,認為傳授這些知識是非常重要的。

有鑑於此,在本文中,將以簡單明瞭的方式來說明如何控制OpenAI模型的一些關鍵設定。從生成多樣回覆的n參數,到控制回答長度的max_tokens,再到建立詞彙黑名單的stop參數,以及最後的temperature參數,這些都是讓AI生成的內容更加貼合我們需求的實用工具。讓我們一起探索這個令人興奮的AI世界。

A.如何用OpenAI獲得多個答案?

使用參數 n 可選擇多個答案。

當我們使用ChatGPT時,通常我們會得到一個答案。但如果你對這個答案不太滿意怎麼辦?有時候,我們希望能看到不同的答案,從中選擇一個最適合的。這時候你需要在答案的下方按下「重新生成」按鈕,讓ChatGPT重新生成一組新的回答。

ChatGPT的狀況

好消息是在OpenAI,我們可以讓它一次給我們好幾個答案作為選擇。這就是n這個參數的作用。通過設置n參數,我們可以告訴OpenAI一次生成多少個答案。比如說,設置n = 3就會一次得到三個不同的答案。

但要注意,這些答案都是針對同一個問題,回答的不同回答,而不是一來一回的連續對話。

如何做?

假設你使用Python程式語言來跟OpenAI溝通,可以這樣寫:

# openai<=1.0.0 時

reply = openai.ChatCompletion.create(
model= "gpt-3.5-turbo",
messages = [{"role": "user", "content": "今天是個晴朗的天氣吧"}],
n = 2
)

print(reply)

for choice in reply["choices"]:
print(choice["index"], choice["messages"]["content"])


# openai>=1.0.0 時

reply = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "今天是個晴朗的天氣吧"}],
n=2
)

pprint(reply)

for choice in reply.choices:
print(choice.index, choice.message.content)

這段程式會讓OpenAI給我們兩個不同的回答。我們透過一個for loop 迴圈把這些回答一個一個顯示出來。每個回答都有一個編號,從0開始。

這樣你就可以看到兩個不同的答案了。不過,這裡必需要記得的一點是,當我們要求更多的答案時,使用的token數量也會增加。token是OpenAI計算使用量的單位,所以多個答案意味著可能需要付出更多費用。

至於不知道什麼是token的朋友可以參考下面這一篇文章

B.如何設定OpenAI回答的長度限制?

使用max_tokens參數,控制回覆內容長度

如果您看了上面的文章,應該知道回答得越長,所用到的token數越多,連帶的費用也會越高。因此,有時候我們在使用OpenAI時不希望模型給我們太長的回答,以便於節省成本。這時,我們可以使用一個叫做max_tokens的設定來限制回覆的長度,控制token的使用數量。以下用兩個例子說明:

舉例 1

比如說,我們只想要一個很短的回答,可以這樣設定:

# openai<=1.0.0 時

reply = openai.ChatCompletion.create(
model= "gpt-3.5-turbo",
messages = [{"role": "user", "content": "冬天為何會下雪?"}],
max_tokens = 10
)

print(reply["choices"][0]["message"]["content"])
print(reply["choices"][0]["finish_reason"])
print(reply["usage"]["completion_tokens"])

# openai>=1.0.0 時

reply = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages = [
{"role":"user", "content": "冬天為何會下雪?"}
],
max_tokens = 10
)

print(reply.choices[0].message.content)
print(reply.choices[0].finish_reason)
print(reply.usage.completion_tokens)

這樣設定後,OpenAI只會回答一個很短的句子,大概10個詞(tokens)左右。顯然,這個回答不可能完整,因為max_tokens限制了它的長度。我們可以看到finish_reason的結果為length,就可以得知,這次的回答是因為長度受到限制而停止,回答並不完整。

舉例 2

還有,我們必須注意不要設定一個太大的max_tokens值。例如,gpt-3.5-turbo模型最多能處理4097個token。如果設定的max_tokens太大,超過這個範圍,API就會出現錯誤,因為它超出了模型的處理能力。

# openai<=1.0.0 時

reply = openai.ChatCompletion.create(
model= "gpt-3.5-turbo",
messages = [{"role": "user", "content": "冬天為何會下雪?"}],
max_tokens = 4090
)

print(reply["choices"][0]["message"]["content"])
print(reply["choices"][0]["finish_reason"])
print(reply["usage"]["completion_tokens"])

# openai>=1.0.0 時

reply = client.chat.completions.create(
model = "gpt-3.5-turbo",
messages = [
{"role":"user", "content": "冬天為何會下雪?"}
],
max_tokens = 4090
)

print(reply.choices[0].message.content)
print(reply.choices[0].finish_reason)
print(reply.usage.completion_tokens)

執行這個例子,會產生如下的結果。告訴我們這個模型最多只能處理4097個token,但是我們卻設定了超過這個限制的token數(This model’s maximum context length is 4097 tokens. However, you requested 4110 tokens (20 in the messages, 4090 in the completion)

總結來說,max_tokens是一個很有用的設定,可以幫我們控制回答的長度,進而控制用量與成本。反之,由於它的預設值為無限大,若沒有特別設定max_tokens的話,就沒有任何限制。因此要記得,設定得太高或太低都可能會影響回答的質量。

C.如何設定OpenAI模型回答的禁用語?

stop參數,可建立詞彙黑名單

當我們使用OpenAI的時候,可能會擔心它的回答中出現一些我們不想要的詞彙。那麼,我們怎麼才能避免這種情況呢?這時候,OpenAI提供我們一個叫做stop的參數來設定黑名單。

stop參數可以讓我們指定一些不想讓AI使用的詞彙。預設情況下,這個 list列表是空的,這也就意味著沒有任何詞彙被禁止。

我們最多可以在這個列表中設定四個詞彙。一旦AI在回答中遇到這些詞彙時,就會立刻停止回答,並返回目前的結果。以下舉例說明:

舉例

假如我們不希望回答中出現「好」這個字詞,我們可以透過下面方式設定:

# openai<=1.0.0 時

reply = openai.ChatCompletion.create(
model= "gpt-3.5-turbo",
messages = [{"role": "user", "content": "我很好,您好嗎?"}],
stop = ["好"]
)

print(reply["choices"][0]["message"]["content"])
print(reply["choices"][0]["finish_reason"])



# openai>=1.0.0 時

reply = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "我很好,您好嗎?"}],
stop=['好']
)

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

我們將stop參數設定為「好」( stop = [“好”] )。這樣一來,如果AI的回答中包含了「好」這個字詞,它就會立即停止回答。這個功能對於控制AI回答的內容非常有用,可以確保不會出現不適當或不想看到的詞彙。

D. 如何通過「溫度」設定讓OpenAI回答更有趣

temperature參數,可增加回答的多樣性

「temperature」這個參數就像是調節OpenAI回答的「溫度」設定器。當我們講溫度時,高溫通常意味著更多活力和熱情,而低溫則意味著冷靜和穩定。這個概念也適用於OpenAI的設定。通過調整temperature,我們可以控制AI回答的隨機性和創造性。這個參數的範圍從0到2,數值越高,回答就越多變和有趣;數值越低,回答就越穩定和可預測。

設定為最低值:0

當我們把temperature設為0時:

reply = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "嗨!我很好,您好嗎?"}],
temperature=0,
n=2
)
for choice in reply.choices:
print(choice.index, choice.message.content)

這樣設定後,如下圖所示:

AI產生的回答會非常穩定和一致,幾乎沒有太多變化。

設定為最高值:2

反之,如果將temperature設為2:

reply = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "嗨!我很好,您好嗎?"}],
temperature=2,
n=2
)
for choice in reply.choices:
print(choice.index, choice.message.content)

在這個設定下,AI產生的回答會非常活潑和多變,有時甚至可能顯得有點奇怪或不相關(如下圖顯示)。而且,這可能會導致AI需要更長的時間來生成回答。

實際上,temperature的預設值是1。在這個設定下的回答既不會太僵硬,也不會太過活躍,是一個較為均衡的選擇。因此,如果你不確定從哪裡開始,可以先嘗試設定temperature為1開始測試。

結語

透過本文的介紹,我們一起探索了如何控制OpenAI模型的幾個重要設定。從設定生成回覆數量的n參數,到控制回答長度的max_tokens,再到建立詞彙黑名單的stop參數,以及調節回答風格的temperature,這些都是使我們能夠更有效地利用AI技術的強大工具。這些設定,讓我們可以調整與控制AI的回答,使之更貼合我們的需求和預期,無論是在節省成本、避免不適當內容,還是創造更有趣和多樣的回答上都大有裨益。

希望這篇文章能夠幫助您對OpenAI的功能有了更深入的理解,無論目前的您是AI領域的初學者還是已經有一定經驗的使用者。在這個不斷變化的AI領域,保持學習和實驗的心是非常重要的。隨著技術的進步,你我將會看到更多令人歎為觀止的可能性。期待AI在未來的發展,並積極參與其中,共同塑造一個更智能、更有效的未來。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

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