iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
AI & Data

以 OpenAI 以及 LangChain 實做我的聊天機器人系列 第 8

[D8] OpenAI API 入門 - Chat Completion 訊息角色

  • 分享至 

  • xImage
  •  

今天是我們對 OpenAI API 入門章節的最後一篇,本文將深入探討 chat completion 的角色設定。這個新一代的對話 API 為我們提供了更為精細的角色設定選項。讓我們可以更加靈活地控制對話流程,從而實現更自然和實用的用戶互動。

OpenAI 為我們預先設定了三種角色,分別是:「system(系統)」、「assistant(助理)」以及「user(使用者)」。下面,我們會一一針對這些預設角色的功能和用途做詳細的介紹。

系統角色(System Role)

https://ithelp.ithome.com.tw/upload/images/20230912/20154415LLhCN2AWCH.jpg
系統角色(或 "system" 角色)主要是為了定義 Chat Completion API 在整個對話中的全域行為。簡單來說,這個角色就像是舞台導演,為整個對話定下基調和規則。

或許你還記得,在我們的上一篇文章中,我們提到過一些用於提示(prompts)的基本結構。那時,我們將所有與當前任務相關的提示訊息都直接放在了 "user" 訊息中,如下圖:
https://ithelp.ithome.com.tw/upload/images/20230912/20154415nAIGMTGWGQ.png
然而,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 角色基本上則是用於存儲聊天機器人和使用者之間的對話記錄。在這裡,assistant 角色負責存放機器人的回應,而 user 角色則儲存了使用者的問題和評論。這樣的結構使得整個對話流程能夠被清晰地記錄和管理。

一個完整的 Chat completion 訊息資料結構會大致如下:
https://ithelp.ithome.com.tw/upload/images/20230912/20154415GK1TFpvcLb.jpg
下面的實際程式碼示例將會更清晰地展示這結構。

#這裏是使用者的訊息
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 的回應顯然是遵循了專業外語老師的角色扮演,更具目的性和專業性。

總之,了解如何適當地使用 assistantuser 角色能夠讓你更有效地控制和管理對話流程,從而實現更多符合你需求的應用場景。

Chat Completion 的記憶問題

你可能會好奇,為什麼每次呼叫 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)訊息中添加更多的背景資訊。這對於定制化的應用非常有用。例如,假設你正在開發一個語言學習助手,這個助手需要了解學生的語言背景。你可以這樣設定:
https://ithelp.ithome.com.tw/upload/images/20230912/20154415tjheTRsxXb.png
實際的提示訊息:

#這裏是使用者的訊息
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.
例句翻譯:我想點一個比薩。

小樣本提示(Few-shot prompting)

最後,我們也可以使用所謂的「小樣本提示」來訓練助手。這基本上是提供一個小型的對話歷史來引導 Chat Completion 的行為。
https://ithelp.ithome.com.tw/upload/images/20230912/20154415SEFMqcp8e0.png
我們透過實際的範例可能會比較清楚:

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,以滿足各種不同的應用需求。希望這篇文章能幫助你更深入地理解這個工具應用的多樣性和潛力!


上一篇
[D7] OpenAI API 入門 - 基本提示技巧
下一篇
[D9] 我的第一個聊天機器人 - 實做規劃
系列文
以 OpenAI 以及 LangChain 實做我的聊天機器人41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言