検索
連載

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

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

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「ChatGPT入門」のインデックス

連載目次

ChatGPT API

 2023年3月1日、OpenAIがChatGPTのAPIをリリースしました。今回はこのAPIを実際に使って、その特徴を調べてみることにします。


かわさき

 さらに2023年3月14日にはGPT-4がリリースされましたね。GPT-4はChatGPTでも使用できますが、筆者はまだ待機リストに登録された状態なので、今回はgpt-3.5-turboを言語モデルとして使用します(かわさき)。


 ChatGPT APIのドキュメントによれば、このAPIは一連のメッセージを入力として受け取り、モデルが生成したメッセージを出力とするとのことです。

 API呼び出しには次のようなものが必要になります。この連載の第2回でも説明しましたが、それとほぼ同じです(使用するクラスがopenai.Completionからopenai.ChatCompletionに変わっているところと、createメソッドで単なるプロンプトではなく、メッセージを要素とするリストを渡すところが異なる点です)。もう一度ここで簡単にまとめておきましょう。

  • OpenAIへサインアップする
  • OpenAIのサイトでAPIキーを取得する
  • openaiモジュールのインストールする(pip install openai)
  • oepnai.ChatCompletion.createメソッドを呼び出す

 APIキーを取得する詳しい手順などは第2回を参照してください。また、openaiモジュールを使うことでPythonからこのAPIを呼び出せます。

 コード的には次のようにとてもシンプルです。

import openai

KEY = "取得したAPIキー"
openai.api_key = KEY

messages = [
  # ChatGPTとの対話内容:
  # {"role": ロール, "content": メッセージ}という辞書を要素とするリスト
]

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo"# ChatGPT APIを使用するには'gpt-3.5-turbo'などを指定
  messages=messages
)

print(completion)

ChatGPT APIを呼び出すコードのひな型

 以下ではmessagesリストの内容についてお話をした後に、実際にAPIを呼び出してみます。

ChatGPT APIを呼び出してみよう

 第2回で取り上げたInstructGPTではopenai.Completion.createメソッドを呼び出すときにprompt引数にプロンプトを指定していました。第2回では次のようなコードを紹介していました。

response = openai.Completion.create(
  model="text-davinci-003"# InstructGPT
  prompt="晴れた日曜日の午後には何をすればいいかな?",
  # ……省略……
)

InstructGPT APIを呼び出すコードの例

 これに対して、OpenAIのドキュメントではChatGPT APIを呼び出すコード例としては以下が紹介されています。

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
  ]
)

ChatGPT APIを呼び出すコードの例

 2つのコード例の差は、createメソッドのprompt引数とmessages引数に現れています(model引数の値も違っていますが)。InstructGPT APIのprompt引数はInstructGPTに対して何をしてほしいのかを指示するプロンプトです。対して、ChatGPT APIのmessages引数はいわば人間とChatGPTとの間で行われる対話で送受信されるメッセージをリストに含めたものといえます。上のリストを見れば、リストの要素となっている辞書の"content"キーの値がそれらのメッセージを表していることは分かります。

 では、"role"キーの値は何を表しているのでしょう。その値としては"system"か"role"か"assistant"のいずれかを指定します。"system"は「ChatGPT APIと会話を始めるときに、ChatGPTがどんなふうに振る舞うかを指定するときに使う」と考えておきましょう。その後、「人間がChatGPTにメッセージを投げかけるときには"role"に"user"を指定」します。"assistant"は対話を続けるのに必要な情報を含めるものですが、これについては後で見てみましょう。

 何はともあれ、上のメッセージリストを使ってAPIを呼び出してみましょう。以下に示すコードは、APIからの戻り値を変数completionに取っておくようにしたり、リストを変数messagesに代入したりしていますが、やっていることは上で紹介したAPI呼び出しと同じです。

import openai

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

messages = [
  {"role": "system", "content": "You are a helpful assistant."},
  {"role": "user", "content": "Who won the world series in 2020?"},
  {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
  {"role": "user", "content": "Where was it played?"}
]

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=messages
)

print(completion)

ChatGPT APIを呼び出してみる

 openai.ChatCompletion.createメソッドを呼び出す際に、model引数に"gpt-3.5-turbo"と指定していますが、ChatGPT APIを呼び出す際にはこれを指定します。なお、ChatGPTでGPT-4を使用するのであれば、"gpt-4"を指定します。モデルの詳細についてはOpenAIのドキュメント「Models」を参照してください。特定の日付が付いたスナップショットもリリースされていますが("gpt-3.5-turbo-0301"や"gpt-4-0314"など)、"gpt-3.5-turbo"と"gpt-4"を指定した場合はAPIを呼び出した時点で最新の言語モデルが使われます。日付付きはその特定の日付で指定された言語モデルが使われます。

 以下はこれをVisual Studio Code(以下、VS Code)で実行した結果です。

呼び出し結果
呼び出し結果

 戻り値の先頭要素("choices"要素)の値はリストになっていますが、筆者が試した限りではその要素は辞書(と同様に使えるオブジェクト)が1つだけとなっています(将来変更される可能性はあります)。その"message"キーの値(completion["choices"][0]["message"])にChatGPTが生成したテキストが含まれています("content"キーの値)。

 生成されたテキストは、上の例では「The 2020 World Series was played in Globe Life Field in Arlington, Texas due to the COVID-19 pandemic」となっています。これはmessagesリストの最後の要素にある「Where was it played?」(それはどこで開催されましたか?)に対応する返答です。

 ここで「ん?」と思いませんか? messages引数には幾つかのメッセージが含まれているのに、返送されたテキストは1つだけです。「Who won the world series in 2020?」(2020年のワールドシリーズで優勝したのはどこ?)に対応する返答はありません。

 ここから予想されるのは、ChatGPT APIは対話の最後に生成したメッセージだけを返信するということです。対話の途中で生成されたテキストは全て捨てられているようです。APIがそういう仕様であれば、メッセージを1つずつ送信すればよさそうな気もします。次にこれを試してみましょう。

Copyright© Digital Advantage Corp. All Rights Reserved.

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