検索
連載

ChatGPTのAPIを使ってみよう:コンソールで対話するコードとは?ChatGPT入門(2/2 ページ)

2023年3月にリリースされたChatGPTのAPIの使い方、APIの振る舞い、対話をどのように管理するのか、コンソールでAPIを介して対話をするコードなどを紹介します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

messagesリストで対話内容を管理する

 「ユーザーが入力して返答を受け取り表示する」という一往復の対話を繰り返しながら、さもChatGPT APIと流れるように対話を行うには以下のようなことを行います。かっこ内の「"system"メッセージ」などは”role”キーに指定する値を表しています。”system”/"user"/"assistant"のいずれかになることを先ほどお話しした通りです

  1. messagesリストに最初のメッセージを格納する("system"メッセージ)
  2. ユーザーからの入力をリストに追加する("user"メッセージ)
  3. APIを呼び出す
  4. APIから返答をリストに追加する("assistant"メッセージ)
  5. ユーザーからの入力をリストに追加する("user"メッセージ)
  6. APIを呼び出す
  7. APIから返答をリストに追加する("assistant"メッセージ)
  8. 対話が終わるまでこれを繰り返す

 このようにしてユーザーが何を入力したか、APIが何を返したかをmessagesリストに全て保管して、APIを呼び出すときにそれらをまとめて渡すようにします。

 以下のコードを見てください。

user_inputs = [
  {"role": "user", "content": "Who won the world series in 2020?"},
  {"role": "user", "content": "Where was it played?"}
]

messages = [
  {"role": "system", "content": "You are a helpful assistant."}
]

for user_input in user_inputs:
    print(f'>>> {user_input["content"]}')
    messages.append(user_input)
    completion = openai.ChatCompletion.create(
        model = 'gpt-3.5-turbo',
        messages=messages
    )
    content = completion["choices"][0]["message"]["content"] # type: ignore
    print(content)
    messages.append({"role": "assistant", "content": f'{content}'})

messagesリストで対話内容を管理する

 ここではユーザー入力を模したものをuser_inputsリストに含めるようにして、messagesリストには最初は"system"メッセージだけを含めるようにしました。"assistant"メッセージがないのは、APIからの返答をmessagesリストに追加するためです。

 その後は、user_inputsリストの内容をmessagesリストに追加するたびに、APIを呼び出して、その返答を表示して、リストに追加しているだけです(最初の"system"メッセージの表示は省略しています)。

 このコードの実行結果を以下に示します。

対話の内容が毎回表示されるようになった
対話の内容が毎回表示されるようになった

 "user"メッセージは「>>> 」というプロンプト付きで表示するようにしたので、いかにも人間とChatGPTが対話しているように見えますね。

 この状態でmessagesリストがどうなっているかを見てみましょう。

messagesリストの内容
messagesリストの内容

 最後のAPI呼び出しの結果も含まれているので5行になっていますが、最初の例で見たものと同様な要素が含まれていることが分かります(最初の例のmessagesリストも似たような方法で作成したものだと筆者は予想しています)。


かわさき

 上の画像を見ると、2往復の対話が一度のAPI呼び出しで行われているように見えますが、そうではなくAPI呼び出しが2回行われていることには注意してください。この例では過去のイベントの結果を問い合わせているので、一貫性のある会話となっていますが、1回目の呼び出しで行われた対話の内容が2回目の内容と大きく変化して、対話の内容がかみ合っていないように見える可能性もあります。


コンソールでチャットする

 messagesリストで対話内容を管理して、APIにそれを渡せばよいことが分かったので、コンソールでChatGPTと対話をするためのコードを紹介します。

import openai
KEY = "取得したAPIキーをここに記述"
openai.api_key = KEY

class ChatManager:
  def __init__(self, model, sysmsg="こんにちは、アシスタントさん!"):
    self.model = model
    self.messages = []
    self.sysmsg = sysmsg
    self.compose_message("system", self.sysmsg)
    self.params = {}
    self.setup_params()

  def compose_message(self, role, content):
    self.messages.append({"role": role, "content": content})

  def setup_params(self, **kwargs):
    self.params["model"] = self.model
    self.params["messages"] = self.messages
    keys = kwargs.keys()
    key_list = ["temperature", "top_p", "n", "stream", "stop", "max_tokens",
                "presence_penalty", "frequency_penalty", "logit_bias", "user"]
    for key in key_list:
      if key in keys:
        self.params[key] = kwargs[key]
  
  def call_chat_api(self):
    completion = openai.ChatCompletion.create(**self.params)
    result = completion["choices"][0]["message"] # type: ignore
    return result

  def get_response_from_api(self):
    result = self.call_chat_api()
    print(result["content"])
    self.compose_message(result.role, result.content)

  def chat_by_api(self, content):
    self.compose_message("user", content)
    print(f">>> {content}")
    self.get_response_from_api()

  def chat_on_console(self):
    print("チャットを始めます。終わるときには「exit」と入力してください。")
    content = input(">>> ")
    while content != "exit":
      if content == "show status":
        print(self.messages)
        content = input(">>> ")
        continue
      self.compose_message("user", content)
      self.get_response_from_api()
      content = input(">>> ")

if __name__ == "__main__":
  chatmgr = ChatManager("gpt-3.5-turbo")
  chatmgr.chat_on_console()
  print("exit chat")

ChatManagerクラス

 詳細なことには触れませんが、ここではChatManagerクラスにmessagesリストとそれを管理するコード、ChatGPT API呼び出しを行うコードなどをまとめてあります。setup_paramasメソッドではcreateメソッド呼び出しで指定可能なパラメーターを設定できるようにしました(が、本稿では使いませんでした)。

 chat_on_consoleメソッドがコンソールで対話するメインコードです。ここではコンソールから入力された値を受け取って、それを基にmessagesリストに"user"メッセージを追加し、APIを呼び出して、その結果を使ってmessagesリストを更新する処理を行っています。このときには、messagesリストの内容を表示したり、「exit」と入力すると対話を終了したりするようにしてあります。


かわさき

 VS Code上のJupyterノートブックで対話をできるようなメソッドも含めてあります(Jupyterで試してからコンソールに話を移す予定だったのですが、文字数的にあきらめました)。


 実行している様子を以下に示します。

VS Codeのコンソールで対話をしているところ
VS Codeのコンソールで対話をしているところ

 ChatGPT APIを介してChatGPTの言語モデル(gpt-3.5-turbo)と対話をしているように見えますね。ChatGPTの動作がある程度分かれば、これを活用したWebアプリなどを構築するのもそれほど難しいことではないでしょう。


かわさき

 どうすれば作れるのかをChatGPTに聞いてみればよいのでは!!(笑)



一色

 ChatGPTに聞いてみましたが、最新のAPIは知らないみたいでした。残念。


 とはいえ、基礎的なお話はできたので、ここから先は読者の皆さんにお任せしようと思います。

「ChatGPT入門」のインデックス

ChatGPT入門

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
[an error occurred while processing this directive]
ページトップに戻る