前回はAPIを使ってPythonでChatGPTに質問をして回答をもらう関数を作成しました。
今回は1回のやりとりで終わるのではなく、会話を続けられる関数を作成してChatGPTと会話を楽しめるコードを作成します。
ChatGPTと会話できるコードを作成
使用したパッケージは以下のとおりです。
APIキーの呼び出し方は前回同様です。
# パッケージ
import openai, time
# APIキーは.pyファイルに記載
from apikey import APIKEY
# APIキーを取得
openai.api_key = APIKEY
前回作成したコードはChatGPTに1回質問した回答をもらうと終わりでした。
今回は会話を続けるために、Pythonのwhile文を使用して、"exit"と入力するまで会話を続けるように設計します。
コードは以下のとおりです。
# はじめに自分の名前を入力
user_name = input("はじめに、あなたの名前(表示名)を入力して下さい。")
# 会話履歴の初期値
chat_history = ""
# GPTのモデルを指定
model = "gpt-3.5-turbo"
# 応答内容の制約条件
sys_txt = "語尾に!とつけて30字以内で答えて下さい。"
# "exit"と入力するまで会話応答を継続
while True:
# ユーザーから入力受け取り
usr_txt = input("ChatGPTに質問をしてEnterボタンを押して下さい。終了するには\"exit\"と入力して下さい。")
print(user_name + ": ", usr_txt)
# exitは大文字・小文字区別せず
if usr_txt.lower() == "exit":
break
# ChatGPTによる回答生成
response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "system", "content": sys_txt},
{"role": "user", "content": usr_txt},
{"role": "assistant", "content": chat_history}
],
temperature=0.5
)
# ChatGPTからの応答
mes = response["choices"][0]["message"]["content"]
print("ChatGPT: ", mes)
# 会話履歴更新
chat_history += f"{user_name}: {usr_txt}\nChatGPT: {mes}\n"
# サーバーへの負荷軽減のための待ち時間
time.sleep(1)
# 会話終了時の出力
print("対話を終了します。ありがとうございました。")
はじめに1回だけ自分の名前を入力します。
その後会話がはじまり、質問文を入力として受け取ってそれに対してChatGPTが応答します。
応答には文脈考慮のために今までのやり取りを反映させています。
"role": "assistant"に過去の応答内容を入れると今までのやり取りを考慮して応答を作成してくれます。
今回はChatGPTとやり取りが1回あるごとにchat_history変数に会話履歴を追加し、chat_history変数を次の回の応答作成時に"role": "assistant"に入れるという構造になっています。
試しに会話してみた例を紹介します。
名前は"geo"と入力しました。
geo: 北極と南極の違いを教えて
ChatGPT: 北極は北半球に位置し、南極は南半球に位置します!
geo: 前者と後者の具体的な地域を3つずつ挙げて
ChatGPT: 北極:カナダ、ロシア、ノルウェー
南極:南極大陸、南極海、南極半島
geo: exit
対話を終了します。ありがとうございました。
geo:〇〇… からはじまる行が入力した文章で、ChatGPT:〇〇… からはじまる行がChatGPTからの応答です。
"role": "system"で語尾に「!」をつけて30字以内で回答するように指示を与えた所、指示を守って回答してくれました。
「前者」と「後者」が何を指すかも正しく把握しており、回答もざっくりしていますが制約条件を守って正しく回答しています。
このようにwhile文を組み合わせることでChatGPTのやりとりを繰り返して会話を楽しむことができます。
参考文献
OpenAI API, OpenAI 2023/8/6閲覧
中山茂「ChatGPT API 生成AIプログラミング入門」 Independently published (2023) p68-72
ChatGPT API(gpt-3.5-turbo)のメッセージオブジェクトのroleパラメータを徹底解説 株式会社SiNCE 2023/8/6閲覧
API Reference, OpenAI 2023/8/7閲覧