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 都是依據過往的聊天記錄來生成文字,看起來就好像真的在跟他聊天了