今天是我們對 OpenAI API 入門章節的最後一篇,本文將深入探討 chat completion 的角色設定。這個新一代的對話 API 為我們提供了更為精細的角色設定選項。讓我們可以更加靈活地控制對話流程,從而實現更自然和實用的用戶互動。
OpenAI 為我們預先設定了三種角色,分別是:「system(系統)」、「assistant(助理)」以及「user(使用者)」。下面,我們會一一針對這些預設角色的功能和用途做詳細的介紹。
系統角色(或 "system" 角色)主要是為了定義 Chat Completion API 在整個對話中的全域行為。簡單來說,這個角色就像是舞台導演,為整個對話定下基調和規則。
或許你還記得,在我們的上一篇文章中,我們提到過一些用於提示(prompts)的基本結構。那時,我們將所有與當前任務相關的提示訊息都直接放在了 "user" 訊息中,如下圖:
然而,Chat completion API 所定義系統角色則提供了另一種方法,它允許我們把角色扮演、任務指令、背景資料等提示放在系統訊息裡。
這種安排能使 Chat Completion API 更清晰地理解全域的需求和限制,讓整個對話流程更加一致。讓我們透過一個實例來看看這是如何運作的。
#這裏是使用者的訊息
user_message = f"""你好,很高興認識你~"""
messages = [{
'role':'system',
'content': "你是一個專業的外語老師,請以簡短的方式對話。"
}, {
'role':'user',
'content': f"{user_message}"
}
]
# 呼叫 ChatCompletion
response = get_completion_from_messages(messages)
print(response)
Chat Completion 的回應:
你好!我也很高興認識你。請問有什麼外語方面的問題我可以幫助你解答嗎?
從這個範例中,你會發現在我們為系統角色設定了角色扮演指令後,Chat Completion 的回應就變得與一位專業的外語老師交談一樣。這正是因為系統訊息裡的設定,幫助 API 理解了它應該採取怎樣的角色和口吻。
總之,善用系統角色能讓你更有針對性地指導 Chat Completion API 的行為,使其更符合特定場景或用戶需求。
Assistant 和 User 角色基本上則是用於存儲聊天機器人和使用者之間的對話記錄。在這裡,assistant
角色負責存放機器人的回應,而 user
角色則儲存了使用者的問題和評論。這樣的結構使得整個對話流程能夠被清晰地記錄和管理。
一個完整的 Chat completion 訊息資料結構會大致如下:
下面的實際程式碼示例將會更清晰地展示這結構。
#這裏是使用者的訊息
user_message = f"""我想學習英文~"""
messages = [
{
'role':'system',
'content': "你是一個專業的外語老師,請以簡短的方式對話"
},
{ # 這裏存放的是使用者增進輸入的訊息
'role':'user',
'content': "你好,很高興認識你"
},
{ # 這個則是聊天機器人的回應訊息
'role':'assistant',
'content': f"你好!我也很高興認識你。有什麼外語方面的問題我可以幫助你解答嗎?"
},
{ # 這個則是這次使用者輸入的訊息
'role':'user',
'content': f"{user_message}"
}
]
# 呼叫 ChatCompletion
response = get_completion_from_messages(messages)
print(response)
實際的回應:
太好了!學習英文是一個很有趣且實用的過程。你有什麼具體的學習目標或是想要專注於哪個方面呢?我可以提供一些學習英文的建議給你
從這個例子中,你可以看到一個完整的對話流程,包括系統、使用者和助理角色的互動。特別是,透過 system
角色的全域指令,assistant
的回應顯然是遵循了專業外語老師的角色扮演,更具目的性和專業性。
總之,了解如何適當地使用 assistant
和 user
角色能夠讓你更有效地控制和管理對話流程,從而實現更多符合你需求的應用場景。
你可能會好奇,為什麼每次呼叫 Chat Completion 的時候,我們都需要附上整個對話的歷史記錄呢?
這主要是因為 Chat Completion 並不具備「記憶」功能。換句話說,它不會記得過去的對話或者用戶提供的資訊。以下是一個例子,假設我們問 Chat Completion 關於我們自己的名字:
#這裏是使用者的訊息
user_message = f"""請回答我的名字~"""
messages = [
{
'role':'system',
'content': "你是一個專業的外語老師,請如實並且簡短的回答問題"
},
{
'role':'user',
'content': f"{user_message}"
}
]
# 呼叫 ChatCompletion
response = get_completion_from_messages(messages)
print(response)
Chat Completion 會這樣回應:
很抱歉,我無法回答你的名字,因為我不知道你的名字。
然而,如果我們在對話歷史中添加了關於我們名字的資訊,Chat Completion 就能使用這個「即時的記憶」來適當地回答問題。下面是如何操作:
#這裏是使用者的訊息
user_message = f"""請回答我的名字"""
# 訊息區同時也提供給 Chat Completion 記憶的功能
messages = [
{
'role':'system',
'content': "你是一個專業的外語老師,請如實並且簡短的回答問題"
},
{
'role':'user',
'content': "我的名字叫小明"
},
{
'role':'user',
'content': f"{user_message}"
}
]
# 呼叫 ChatCompletion
response = get_completion_from_messages(messages)
print(response)
Chat Completion 這次會回應:
你的名字是小明。
這樣,只有當我們提供足夠的對話背景時,Chat Completion 才能更準確地回答我們的問題。這就是為什麼在呼叫 API 的時候,搭配完整的對話歷史是很有用的。
OpenAI 的 Chat Completion 不僅僅是基本的對話助手,它還有多種進階的應用方式。在這裡,我們會探討一些常見的用例。
首先,我們可以在系統角色(System Role)訊息中添加更多的背景資訊。這對於定制化的應用非常有用。例如,假設你正在開發一個語言學習助手,這個助手需要了解學生的語言背景。你可以這樣設定:
實際的提示訊息:
#這裏是使用者的訊息
user_message = f"""
我想學習怎麼點餐。
"""
messages = [
{ # 我們在系統訊息中增加了一些背景資料
'role':'system',
'content': """"你是一個專業的外語老師,下方是學生的學習背景,請按照使用者的需求推薦 3 個學習詞彙。
學習背景
學生的母語: 中文
想要學習的語言: 英文
"""
},
{
'role':'user',
'content': f"{user_message}"
}
]
# 呼叫 ChatCompletion
response = get_completion_from_messages(messages)
print(response)
這樣,助手就可以提供更個性化和具體的建議:
根據你的需求,我推薦以下三個學習詞彙:
1. Menu (菜單) - 學習這個詞彙可以幫助你了解點餐時可以選擇的菜品和飲料。
2. Order (點餐) - 學習這個詞彙可以幫助你表達你想要點的菜品和飲料。
3. Bill (帳單) - 學習這個詞彙可以幫助你理解點餐後需要支付的金額。
希望這些詞彙能夠幫助你在點餐時更加流利地使用英文。祝你學習順利!
你也可以在系統訊息中指定回應的格式,這樣 Chat Completion 就會按照這個格式來回應。這非常有用,尤其是當你需要結構化的回應。
user_message = f"""
我想學習怎麼點餐。
"""
messages = [
{
'role':'system', # 這個訊息區塊我們增加了格式的範例
'content': """"你是一個專業的外語老師,請依照使用者的需求,隨機挑選一個單字來造句。
學習背景:
學生的母語: 中文
想要學習的語言: 英文
回應格式
單字: <單字>(<單字的翻譯>)
例句: <例句在這裏>
<例句翻譯>
"""
},
{
'role':'user',
'content': f"學習需求:{user_message}"
}
]
# 呼叫 ChatCompletion
response = get_completion_from_messages(messages)
print(response)
這樣,助手的回應會符合指定的格式:
單字: order (點餐)
例句: I would like to order a pizza.
例句翻譯:我想點一個比薩。
最後,我們也可以使用所謂的「小樣本提示」來訓練助手。這基本上是提供一個小型的對話歷史來引導 Chat Completion 的行為。
我們透過實際的範例可能會比較清楚:
messages = [
{
'role':'user',
'content': f"隨便給我一個詞彙"
},
{
'role':'assistant',
'content': f"旅遊:我愛旅遊"
},
{
'role':'user',
'content': f"隨便給我一個詞彙"
},
{
'role':'assistant',
'content': f"揹包: 這揹包真重"
},
{
'role':'user',
'content': f"隨便給我一個詞彙"
},
]
# 呼叫 ChatCompletion
response = get_completion_from_messages(messages, verbose=False)
print(response)
透過這樣的方式,助手會根據提供的小樣本對話來生成回應:
綠意:春天的綠意總是令人心情愉悅。
透過這些進階功能,你可以更靈活地定制 Chat Completion,以滿足各種不同的應用需求。希望這篇文章能幫助你更深入地理解這個工具應用的多樣性和潛力!