解説! ChatGPT API(gpt-3.5-turbo)の使い方とパラメーターについて

noteで書く

記事の概要

2023 年 3 月 2 日に一般公開された ChatGPT API(gpt-3.5-turbo-0301)を試してみました。
とても気軽に利用できますが、いくつか注意点もありますので合わせてご確認ください。

ChatGPT API のリクエストについて

以下のコマンドがリクエストの基本になります。
YOUR_API_KEY の箇所は、OpenAI Platform から取得した API Key(SECRET KEY)を差し替えます。
リクエスト例
curl https://api.openai.com/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
  "model": "gpt-3.5-turbo",
  "messages": [
    { "role": "user",
      "content": "緑色にあう色を3色選んでください。"
    },
    {
      "role": "assistant",
      "content": "\n\n1. 白色\n2. 黒色\n3. 茶色"
    },
    {
      "role": "user",
      "content": "上記の色を選んだ理由を教えてください。"
    },
    {
      "role": "assistant",
      "content": "1. 白色:緑色と白色は、明るく爽やかな印象を与える組み合わせで、春や夏の季節感を表現することができます。\n2. 黒色:緑色と黒色は、落ち着いた大人っぽい雰囲気を表現することができ、秋や冬の季節感にも合います。\n3. 茶色:緑色と茶色は、自然をイメージした温かみのある組み合わせで、自然やアウトドアに関するデザインにも適しているためです。"
    }
  ]
}'
messages パラメーターにメッセージが複数あることにお気づきでしょうか。各メッセージには role パラメータがあり、user と assistant が設定されています。これについては後述の「ChatGPT API の概要」にて説明いたします。 レスポンス例
{
    "id": "",
    "object": "chat.completion",
    "created": 1677741105,
    "model": "gpt-3.5-turbo-0301",
    "usage": {
        "prompt_tokens": 261,
        "completion_tokens": 170,
        "total_tokens": 431
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "いいえ、私には好みや偏見はありません。ただ、ボロネーゼは世界的に有名なパスタの一つで、多くの人々に愛されていることが知られているため、私が最初に思い浮かんだおすすめスパゲティの一つとしました。異なる好みや食文化があることを理解し、様々な選択肢があることを強調したいと思い、いくつかの異なるオプションを提供しました。"
            },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

【注意事項】API Key の取り扱いについて

API Key の取得には、支払情報(クレジットカード等)の登録が必要です。
また、API Key は、IP やドメイン等で制限をかけることができませんので、基本的にはバックエンドでリクエストを処理するようにしてください。
JavaScript や HTML に記載したり、Git で公開リポジトリにあげて API Key が流出してしまうと、不特定多数で利用され意図しない高額費用が発生するかもしれません。
よって、予め利用料金に制限をかけておくことをおすすめします。

ChatGPT API の概要

基本的なリクエスト例の messages パラメーターを見てください。
チャットモデルは、一連のメッセージを入力として受け取ることができます。これにより、会話の流れを組んだ返信を出力として返します。 role は 3 種類あり, “system“, “user“(入力側), “assistant“(チャットモデル) を各メッセージに付与することで、会話の流れを再現します。 よって、 messages パラメーターには、会話が続く限りどんどん、レスポンスや質問を追加していくことになります。
以下にその例を提示します。

ChatGPT API の文脈を活かしたリクエストの例

質問 1:
ChatGPT API にリクエストする最初の質問を行います。role には user を指定します。
{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "お薦めのスパゲティを3つ教えてください。"
    }
  ]
}
返答 1:
ChatGPT API から質問 1 に対する返答があります。返答には message パラメーターが存在し、role が assistant で content に返答が入っていることを確認してください。
この message パラメーターをコピーして、質問 2 の messages パラメーターに追加します。
{
  "role": "assistant",
  "content": "\n\n1. ボロネーゼ:ミートソースの代表的なスパゲティ。肉の旨みが溶け込んだトマトソースがパスタと相性抜群です。\n2. カルボナーラ:卵とベーコンが絶妙なバランスで絡み合った、濃厚でクリーミーなパスタです。お酒のお供にもぴったり。\n3. アラビアータ:トマトと唐辛子がスパイシーな辛さをプラスしたパスタ。あっさりとした茹で上がりに、スパイシーな味付けでアクセントを加えます。"
},
質問 2:
返答 1 のメッセージを messages パラメーターに追加し、さらに質問を加えます。
{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "user",
      "content": "お薦めのスパゲティを教えてください。"
    },
    { //- 返答1のメッセージを追加。roleがassistantになっていることを確認する
      "role": "assistant",
      "content": "\n\n1. ボロネーゼ:ミートソースの代表的なスパゲティ。肉の旨みが溶け込んだトマトソースがパスタと相性抜群です。\n2. カルボナーラ:卵とベーコンが絶妙なバランスで絡み合った、濃厚でクリーミーなパスタです。お酒のお供にもぴったり。\n3. アラビアータ:トマトと唐辛子がスパイシーな辛さをプラスしたパスタ。あっさりとした茹で上がりに、スパイシーな味付けでアクセントを加えます。"
    },
    { //- レスポンス1に対する質問を追加。roleはuserとする
      "role": "user",
      "content": "ボロネーゼを最初に表示したことに理由はありますか?"
    }
  ]
}
返答 2:
質問 2 に対する返答があります。
{
  "role": "assistant",
  "content": "いいえ、特に理由はありません。ボロネーゼは一般的に人気のあるパスタの一つであり、多くの方が知っていると考えたため最初に挙げました。ただし、これ以上の情報を必要とする場合はお気軽にお問い合わせください。"
},
以上のように、文脈を判断させるには role と content からなるメッセージ構造を随時追加して行く必要があります。
ただし、単発の質問だけでも十分効果的なレスポンスを得ることは可能です。

ChatGPT API のパラメーター一覧と説明

model 文字列 必須

“gpt-3.5-turbo” もしくは “gpt-3.5-turbo-0301” のみ対応しています。

message 配列 必須

チャット形式で、文脈を生成するためのメッセージ。
詳しくは上記にある ChatGPT API の文脈を活かしたリクエストの例をご覧ください。

temperature 数値 任意 デフォルトは 1

サンプリング温度(※)を 0〜1 の間で指定します。
値が低いほど、より関連性の高い単語が選ばれやすくなり、値が高いほど、より多様な単語が選ばれやすくなります。
この値か top_p パラメーター を変更することを推奨していますが、両方は同時に変更することは推奨されません。 サンプリング温度について
文章生成時に使用される確率分布の調整パラメーターの一つで、生成される文章の多様性や不確実性を調整するために使用されます。
サンプリング温度が低い場合、より一貫性がある文章が生成され、単語の組み合わせの変化が少なくなります。
サンプリング温度が高い場合、より多様な文章が生成され、単語の組み合わせがより多様になります。
ちなみに、ChatGPT のデフォルトは 0.7 です。

top_p 数値 任意 デフォルトは 1

サンプリング温度に代わるものとして利用されます。
値が小さいほど、生成される文章は文法的により正確になります。
値が大きいほど、より多様な単語が選択されるため、生成される文章はより多様になります。
tenperature パラメーターとの併用は推奨されていません。
ちなみに ChatGPT のデフォルトは 0.9~0.95 です。

n 整数 任意 デフォルトは 1

各入力メッセージに対して生成するチャット補完の選択肢の数を設定します。
3にすれば3つ返答を返してくれます。

stream 理論型 任意 デフォルトは false

true の場合、ChatGPT のように部分的なメッセージの差分が送信されます。
例えば、API から大量の応答データを受信する場合、完全なレスポンスが返ってくるまで時間がかかる場合があります。
stream パラメーターを使用することで、API から取得したデータを逐次的に処理し、部分的なレスポンスを処理することができます。
[DONE] メッセージでストリームが終了します。

stop 文字列 or 配列 任意 デフォルトは null

トークンの生成を停止するシーケンスを最大 4 つまで指定できます。
例えば、生成された文章が指定されたトークン(単語やフレーズなど)に到達した場合に文章の生成を停止することができます。

max_tokens 整数 任意

生成されるレスポンスのトークンの最大数。デフォルトでは、モデルが返すことのできるトークン数は (4096token – 入力した文章 token) となります。

presence_penalty 数値 任意 デフォルトは 0

生成された文章がより多様性を持つように調整するために使用され、-2.0 から 2.0 の間の数値を指定します。
値が低い場合、生成された文章が同じ単語やフレーズを繰り返すことが少なくなり、より多様な文章を生成することができます。
値が髙い場合、生成された文章に既に含まれている単語やフレーズが強調されすぎて、文章の多様性が低下する可能性があります。

frequency_penalty 数値 任意 デフォルトは 0

生成された文書における単語の出現頻度を調整するために使用され、-2.0 から 2.0 の間の数値を指定します。
値が低い場合、生成された文章が同じ単語やフレーズを繰り返すことが少なくなり、より多様な文章を生成することができます。
値が髙い場合、生成された文章に既に含まれている単語やフレーズが強調されすぎて、文章の多様性が低下する可能性があります。

logit_bias map 型 任意 デフォルトは null

特定のトークンに対して好ましい、または好ましくない単語の出現確率を設定することができます。
正の値はトーンをポジティブに、負の値はトーンをネガティブに変更することができます。

user 文字列 任意

エンドユーザーを表す一意の識別子で、不正利用の検知に役立ちます。

所感

利用自体はかなり簡単です。パラメーターもデフォルトで十分だと感じます。
FineTuneについては現在のところ予定が無いようですので、局地的なサービスに実装するにはまだ難しいかなと感じました。
時間ができたら、LINEとかFacebookとかGoogle My Business等に自動返信機能を実装してみたいと思います。
noteで書く

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です