在前一篇基本設定的最後,有使用了一個簡單範例來確認所有設定都是正確的,而這個範例即是聊天模型的使用方式。
目前聊天模型主要分為兩個系列:GPT-3.5 與 GPT-4,兩系列皆可以透過呼叫 Chat Completion API 來使用,而此篇主要即針對 Chat Completion API 的使用方式做介紹。
必要條件
- 需要具備可使用 Azure OpenAI 服務的 Azure 訂閱,可參考下方連結中的申請流程。
- 此系列文皆使用 Python 的 openai 函式庫,安裝與引入方式可參考下方連結中的基本設定。
- 可先設定 Azure OpenAI 端點與金鑰,以下設定方式不會再重複出現在每個範例中。
import openai
openai.api_base = "https://xxxxx.openai.azure.com/" # 你的 Azure OpenAI 端點
openai.api_key = "OPENAI_API_KEY" # 你的 Azure OpenAI 金鑰
相關連結:【Azure OpenAI】Azure OpenAI Python SDK 使用方式:基本設定
基本設定
這邊說明一下會使用到的兩個設定,一般會連同 Azure OpenAI 端點與金鑰一起設定在程式碼中。
api_type
因為 openai 這個函式庫在 OpenAI 與 Aazure OpenAI 之間是共用的,所以這邊需要事先聲明我們要使用的是 Aazure OpenAI,設定方式如下:
openai.api_type = "azure"
OpenAI 與 Aazure OpenAI 兩者的寫法與回傳格式會有一點差異,如果在網上參考文章或範例程式碼時也記得先確認對方是使用哪一家公司的服務。
api_version
雖然是使用 SDK 來呼叫 GPT,但大部分的 SDK 底層都是透過包裝 API 來實現的,所以需要向 SDK 聲明目前的寫法是要使用哪一個版本。
openai.api_version = "2023-08-01-preview"
近期只要跟 GPT 有關的東西更新都非常快速,API 版本在 2023 年幾乎是每一兩個月一版的速度在更新;而這個系列的文章都會固定使用截至目前(2023/10)的最新版本:2023-08-01-preview。
Chat Completion API 呼叫方式
現在終於可以進入本篇的重點,讓我們先回顧前一篇基本設定中的測試範例:
response = openai.ChatCompletion.create(
deployment_id="gpt-35-turbo", # 模型部署名稱
messages=[
{"role": "system", "content": "助手是一個預訓練的大型語言模型"},
{"role": "user", "content": "天空是什麼顏色的?"}
]
)
開頭的 openai.ChatCompletion.create 即是 Chat Completion API 的呼叫方式,而其中比較容易搞混的地方是 deployment_id ,要填入的是在 Aazure OpenAI 中模型的部署名稱,忘記的話可以在 Studio 上找到。
交談格式
Chat Completion API 中最關鍵的就是交談內容的格式化輸入,GPT 的 API 都是無狀態的,所以在呼叫時必須包含想要讓 GPT 知道的歷史對話內容,其中包含每句話是由誰講出來的,而對話的順序需要依序排列的 list 中,最後彙整完成設定在 messages 參數中。
能使用的角色有以下三種:
- system:對於回話助理的簡短描述或人格特質,也能包含一些希望遵守的規則。
- user:使用者的說話內容。
- assistant:助手的回話內容,使用在多回合交談情境。
以下兩個案例可以更清楚的了解這三種的角色的使用方式。
系統角色
比較特別的用法是在 system 中設定回話的風格,像是如果把上面的範例更改為以下:
response = openai.ChatCompletion.create(
deployment_id="gpt-35-turbo", # 模型部署名稱
messages=[
{"role": "system", "content": "助手是一個酸言酸語的酸民"},
{"role": "user", "content": "天空是什麼顏色的?"}
]
)
你會得到這樣的回應:
天空是蔚藍色的,除非你住在一個污染嚴重的城市,那你可能看到的只是一片灰濛濛的天空,很可憐呢。不過,如果你是住在北極或南極,你可能會看到一段時間的極夜或極昼,然後你就不會看到什麼顏色的天空了,只會看到黑暗或亮光罷了。 但說實話,我對你問這種問題有點無言以對。
嗯...真的很酸。
而其他比較一般的用法,像是設定回話時遵守的規則,例如不希望助手回話時講了一大串沒有用的資訊,這時可以使用:請直接回答問題;這邊助手的設定都是包含在 token 數中的,如果是會考量費用的朋友需要稍微留意。
多回合交談
如果想要在多次來回的交談中,又保留歷史對話過程的上下文,這時可以交叉使用 user 與 assistant 兩個角色,範例如下:
response = openai.ChatCompletion.create(
deployment_id="gpt-35-turbo", # 模型部署名稱
messages=[
{"role": "system", "content": "助手是一個預訓練的大型語言模型"},
{"role": "user", "content": "天空是什麼顏色的?"},
{"role": "assistant", "content": "藍色"},
{"role": "user", "content": "那雲朵呢?"},
]
)
基本上這也是目前最常見的情境,在程式上只要不斷的將對話 append 進 list,就能一直保留對話的上下文內容。但同時,這表示每次對話消耗的 token 數都會持續上升,所以實務上會加上只保留最後 10 個對話內容等機制。
Chat Completion API 回應
雖然上述幾個例子都包含了回話內容,但實際上這個回話內容會包含在一個多層的 json 物件中,可以直接透過以下方式抓出:
print(response['choices'][0]['message']['content'])
Token 使用數量
回應的 json 物件中還有包含該次呼叫所消耗的 Token 數,可以使用以下方式抓出:
print(response['usage'])
而其中的格式會像這樣
{
"completion_tokens": 121,
"prompt_tokens": 45,
"total_tokens": 166
}
prompt_tokens 是呼叫時使用的 Token 數,completion_tokens 是回話時使用的 Token 數,total_tokens 即是兩者相加,算是一個還蠻實用的資訊。
總結
這邊主要介紹了 Chat Completion API 來呼叫聊天模型,基本上已經涵蓋了大多數的使用情境,在 system 角色中有適當的 Prompt 設計,加上多回合交談的使用方式,就能做出很多不同特色的對話機器人。
而在企業應用中,對於回話內容的設計會有更多的要求,這是一個目前極熱門的課題,在下一篇中會介紹其中最關鍵的技術:Embedding,請繼續收看下一篇!
系列文章
- 【Azure OpenAI】Azure OpenAI 申請流程全紀錄
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:基本設定
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:聊天模型
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Embedding
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Function Calling
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Whisper
- 【Azure OpenAI】Azure OpenAI 申請流程全紀錄
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:基本設定
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:聊天模型
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Embedding
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Function Calling
- 【Azure OpenAI】Azure OpenAI Python SDK 使用方式:Whisper
留言
張貼留言