Skip to main content

LLM Prompt Engineering - 用 chaGPT API 建立 chatBot

back-to:: LLM Prompt Engineering MOC

Intro

在先前的介紹,我們都像是對 chatGPT 一個口令一個動作,它似乎沒辦法「記得」以前曾經說過什麼

def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{'role':'user', "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]

這是因為每一次 呼叫 get_completion,的時候,messages 都只要放入 user 的指令,並沒有看到歷史對話記錄,所以 chatGPT 根本沒有看到歷史對話的脈絡

這時就要來介紹如何讓 chatGPT 記住先前回答的脈絡,形成實際上的「聊天」

Role 的介紹

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # this is the degree of randomness of the model's output
)
print(str(response.choices[0].message))
return response.choices[0].message["content"]

其實要讓 chatGPT 記住先前的脈絡,只要記住以往的對話記錄,讓 chatGPT 「看到」就行了

messages =  [
{'role':'system', 'content':'You are friendly chatbot.'},
{'role':'user', 'content':'Hi, my name is Isa'},
{'role':'assistant', 'content': "Hi Isa! It's nice to meet you.
Is there anything I can help you with today?"},
{'role':'user', 'content':'Yes, you can remind me, What is my name?'}
]

例如這個 message list 記載了「用戶」與「助手」的對話記錄,而 chatGPT 從「role」 來區分這些話分別是誰說的:

system : 對於 chatGPT 的基礎設定(風格、角色),通常放在最前面第一個

user : 標註這是使用者的回應

assistant : 標註這是 AI 助手 (chatGPT) 的回應

這也是為什麼這個 API 又稱為 「Chat Completion」,==因為實際上 chatGPT 是看著這段對話記錄,來思考後續要講什麼話最適當==

雖然在這個範例中 'role':'assistant' 是給定的,==但實務作法會是建構 message list,把用戶的回答跟 chatGPT 實際上的回應,以 'role':'assistant' / 'role':'user' 不斷 append 進去這個歷史對話記錄==

這樣每次 chatGPT 都是依據過往的聊天記錄來生成文字,看起來就好像真的在跟他聊天了