🧑‍🏫

DeepLearning.AIとOpenAIが公開したChatGPT Prompt Engineering(6-Chatbot)

2023/05/07に公開

はじめに

ChatGPT Prompt Engineeringを受講したメモです。
全体の目次はこちらをご覧ください。
https://zenn.dev/aerialstairs/articles/aaf5aa9e42c65e

今回は、Chatbot(チャットボット)です。
最初に作りたくなるもの第1位だと思うチャットボットです。
これまでのようなPromptの渡し方では、会話が続かないので、工夫する必要があります。

チャットボット

messages

これまでメッセージは、以下のようにひとつのmessageを渡すようにしていました。

messages = [{"role": "user", "content": prompt}]

しかし、チャットボットを作るには、会話を記憶する必要があるので、過去の履歴も渡せるように複数のmessageを含められるように、messages自体を渡せる関数を用意します。

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
    )
    return response.choices[0].message["content"]

role

roleには、system、user、assistantがあります。
sysmteメッセージは、役割や条件などを指示するもので会話に現れない情報です。
userは、こちらからの入力、assistantは、チャットボットの返答です。

会話の記録

messagesは、こうした複数のroleを固めたもので、user, assistantの会話の履歴を入れることで、チャットボットが過去の会話を参考に会話できるようになります。
apiの通信は、毎回スタンドアローンで過去の会話は覚えていないので、このようにして渡す必要があります。
過去に名前を教えた履歴があるので、正しい名前を返しています。

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?'}  ]
response = get_completion_from_messages(messages, temperature=1)
print(response)

Your name is Isa.

オーダーボット

ピザの注文をとる

下のsystem messageを会話の先頭に加え、assistant、userのメッセージをmessagesに追加していく。

system message
context = [ {'role':'system', 'content':"""
You are OrderBot, an automated service to collect orders for a pizza restaurant. \
You first greet the customer, then collects the order, \
and then asks if it's a pickup or delivery. \
You wait to collect the entire order, then summarize it and check for a final \
time if the customer wants to add anything else. \
If it's a delivery, you ask for an address. \
Finally you collect the payment.\
Make sure to clarify all options, extras and sizes to uniquely \
identify the item from the menu.\
You respond in a short, very conversational friendly style. \
The menu includes \
pepperoni pizza  12.95, 10.00, 7.00 \
cheese pizza   10.95, 9.25, 6.50 \
eggplant pizza   11.95, 9.75, 6.75 \
fries 4.50, 3.50 \
greek salad 7.25 \
Toppings: \
extra cheese 2.00, \
mushrooms 1.50 \
sausage 3.00 \
canadian bacon 3.50 \
AI sauce 1.50 \
peppers 1.00 \
Drinks: \
coke 3.00, 2.00, 1.00 \
sprite 3.00, 2.00, 1.00 \
bottled water 5.00 \
"""} ]  # accumulate messages

出力

注文が終わったら、会話の履歴を全て渡し、最終出力をJsonで出力する。
この時、ランダム性を持たせる必要はないので、temperatureは0にする。

messages =  context.copy()
messages.append(
{'role':'system', 'content':'create a json summary of the previous food order. Itemize the price for each item\
 The fields should be 1) pizza, include size 2) list of toppings 3) list of drinks, include size   4) list of sides include size  5)total price '},    
)
response = get_completion_from_messages(messages, temperature=0)

結果例

{
  "pizza": [
    {
      "type": "eggplant",
      "size": "medium",
      "price": 9.75
    }
  ],
  "toppings": [],
  "drinks": [],
  "sides": [
    {
      "type": "fries",
      "size": "large",
      "price": 4.50
    }
  ],
  "total_price": 14.25
}

Discussion