Pythonスキルの習得

【Python】GPT-4 APIとChatGPTの使用方法: 申請から費用までの完全ガイド

【Python】GPT-4 APIとChatGPTの使用方法: 申請から費用までの完全ガイド

こんにちは、Zero-Cheeseです。

今回はPythonからGPT-4を利用する方法を詳しく解説します。

  • これを使ってボットを作りたい
  • または発話マシンを作成したい方にとって、

きっと役立つ情報となるでしょう。

使用料金

使用料金は、

  • 「Prompt(私たちからの質問文)」と
  • 「Completion(GPTからの応答文)」

の合計で計算されます。

ChatGPT Plusの会員であっても、API使用量に応じた料金が別途発生します。

具体的な料金は以下の通りです。

GPT-4の場合: APIは「8K context」および「32K context」が使用されます。

ModelPrompt(質問文)Completion(応答文)
8K context$0.03 / 1000トークン$0.06 / 1000トークン
32K context$0.06 / 1000トークン$0.12 / 1000トークン

「8K context」の場合、1000トークン分の質問をして、1000トークンの応答があると、0.09ドル発生します。

GPT-3.5の場合:  

ModelUsage
gpt-3.5-turbo$0.002 / 1000トークン

詳細はOpenAIの公式ページをご覧ください.。

トークンとは?

トークンとは、自然言語処理で扱われる単語の単位 のことです。

例えば、「Hello World」は2単語なので、トークン数は2になります。

なお、一部の単語は1単語でもトークン数が1以上になることがあります。

日本語では、ひらがな1文字が1トークン、漢字1文字が2〜3トークンとなることが多いです。

例えば

  • 質問:こんにちは
  • 応答:こんにちは 

の場合、「Prompt:5トークン」、「Completion:5トークン」なので、$0.00045(約0.06円)発生します。(GPT-4 8K contextの場合)

料金の確認はこちらから可能です。

また、料金の上限設定も可能で、使い過ぎを防ぐためにオススメです。

https://platform.openai.com/account/billing/limits

上限設定はこちらから行えます。

上限金額を設定する場合、Hard limitに金額を入力しましょう。

(Soft limitは設定金額を超えると通知が飛ぶ機能となっています。)

Pythonから、GPT-4(ChatGPT)を使用する

全体手順は、以下のとおりです。

使用する前に、まずはログインしてください。(アカウントを作成していない方は、下記オレンジ枠内を参照して下さい。)

  1. 支払い情報を設定する
  2. waitlistに登録する(ChatGPTのみ使用の方は不要) 不要になりました
  3. APIキー(Secret Key)の取得
  4. Pythonでの、GPT-4(ChatGPT)の利用方法

これらの手順を順に、詳しく解説します。

OpenAIのアカウント作成方法

OpenAIの公式ページにアクセスし、Product → Overview → Get Startedから登録を行います。

① 支払い情報を設定する

OpenAIの支払い設定画面に進み、「Set up paid account」ボタンを押します。

次に、

  • 「個人 or 法人」を選択し、
  • クレジットカードの情報を登録します。

これで設定は完了です。

② waitlistに登録する(ChatGPTのみ使用の方は不要)

2023年7月 GPT-4 APIが一般開放になりました!

waitlistへの登録作業は不要です。 本章はSkipして下さい。

2023年5月現在、GPT-4を使用するにはwaitlistに登録し、承認を得る必要があります。

ただし、すぐに承認されるわけではありません。

条件を満たしていない場合、下記のようなエラーが表示されます。

openai.error.InvalidRequestError: The model: `gpt-4` does not exist

waitlistへの登録方法

GPT-4 API waitlistで、必要事項を記入し、登録します。

※ Company name(会社名)の入力欄がありますが、任意項目なので、空白でOKです。

※ Organization IDは、公式サイトのsettingsから、確認できます。

筆者の経験では、登録から承認まで1ヶ月かかりましたが、数日で承認される方もいるようです。

承認が完了すると、下記のようなメールが届きます。

私を含めてほとんどの方は、招待メールに記載されている通り、「GPT-4 models with 8K context」のみ使用可能です。

これは、公式サイトで紹介されている、「gpt-4」というモデル名に該当します。(下記表を参照)

ただし、API上で「gpt-4」と設定しても、実際には「gpt-4-0314」が使用されます。

これは、2023年3月14日時点の学習モデルで、GPT-4は常にアップデートされていくためです。

新バージョンはおおよそ3ヶ月ごとにリリースされるとのことです。

③ APIキー(Secret Key)の取得

OpenAIのプラットフォームから、「API Keys」を選択します。

下記図に従い、「Secret Key」を取得します。

取得したSecret Keyは絶対に控えておくようにしてください。

一度閉じてしまうと、再表示はできません。

④ Pythonでの、GPT-4(ChatGPT)の利用方法

パッケージのインストール方法

GPT-4(ChatGPT)を利用するためには、「openai」パッケージのインストールが必要です。

pipを使ってインストールできます。

pip install openai

Pythonコード(基本形)

以下のコードは、GPT-4(ChatGPT)から一括でデータ(応答文)を受け取るための基本的なコードです。

ただし、長い応答文の場合、フリーズしたような挙動になります。

ストリーム形式でのデータ取得方法については、次のセクションで説明します。

3行目には、取得した「APIキー」を代入します。

11行目の「model=gpt-4」を「gpt-3.5-turbo」に変更すると、ChatGPTがGPT-3.5バージョンになります。

12行目の「messages=・・・」には、これまでの会話履歴を入力します。これにより、前回までの会話も考慮して返答が得られます。

import openai

openai.api_key = '取得したAPIキー'

def generate_text(prompt, conversation_history):
    # プロンプトを会話履歴に追加
    conversation_history.append({"role": "user", "content": prompt})

    # GPT-4モデルを使用する場合
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=conversation_history
    )
    message = ""

    for choice in response.choices:
        message += choice.message['content']

    # 応答文を会話履歴に追加
    conversation_history.append({"role": "assistant", "content": message})
    return message

if __name__ == "__main__":
    # 会話履歴を格納するためのリストを初期化
    conversation_history = []

    while True:
        # ユーザーに質問を入力させる
        input_prompt = input("プロンプト: ")
        generated_text = generate_text(input_prompt, conversation_history)
        print("応答:", generated_text)

Pythonコード(ストリーム形式でのデータ取得)

13行目の「stream=True」を設定すると、ストリーム形式でデータを取得できます。

ストリーム形式を選択すると、返ってくるレスポンスが変わるため、17〜22行目のコードがそれに対応して変更されています。

import openai

openai.api_key = '取得したAPIキー'

def generate_text(prompt, conversation_history):
    # プロンプトを会話履歴に追加
    conversation_history.append({"role": "user", "content": prompt})

    # GPT-4モデルを使用する場合
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=conversation_history,
        stream=True
    )
    message = ""

    for stream_response in response:
        for choice in stream_response.choices:
            if choice['delta'].get('content'):
                stream_message = choice['delta'].get('content')
                print(stream_message, end='')
                message += stream_message

    # 応答文を会話履歴に追加
    conversation_history.append({"role": "assistant", "content": message})
    return message

if __name__ == "__main__":
    # 会話履歴を格納するためのリストを初期化
    conversation_history = []

    while True:
        # ユーザーに質問を入力させる
        input_prompt = input("プロンプト: ")
        # GPT-4からの回答を生成
        generated_text = generate_text(input_prompt, conversation_history)

messagesで使われている、ロールについて

下記の”messages”引数は、会話履歴を入力します。

response = openai.ChatCompletion.create(
    model=”gpt-4″,
    messages=conversation_history
)

ここでの”messages”引数には、以下のような形式で入力されます。

[{“role”: “user”, “content”: prompt}, ・・・・]

この”role”(役割)は、3つに分類されます。

  1. user
  2. assistant
  3. system

① user

GPT-4(ChatGPT)に質問をする人を指す。通常は「あなた」になります。

使用例:

{"role": "user", "content": "こんにちは"}

② assistant

OpenAIのサーバー(つまり、GPT-4)を指します。

つまり、userの質問に対する応答者を指します。

使用例:

{"role": "assistant", "content": "こんにちは!何かお手伝いできることがあれば教えてください。"}

③ system

systemは、対話に関するメタ情報や設定情報を提供するために使用されます。

  • AIがどのように対話を始めるべきか、
  • 特定の状況でどのように反応すべきか

など、ガイドラインを、指示します。

使用例:

{"role": "system", "content": "あなたはシャーロック・ホームズ、名探偵です。"}

messages引数には、過去の会話履歴と現在のプロンプト(質問)を、時系列でリスト化して入力します。

これにより、過去の対話内容も考慮した返答を得られます。

使用例:

messages = [
    {"role": "system", "content": "あなたはシャーロック・ホームズ、名探偵です。"},
    {"role": "user", "content": "この事件の犯人は誰だと思いますか?"}
    {"role": "assistant", "content": "{省略}"}
    {"role": "user", "content": "私は、〇〇が怪しいとおもってます。"}
]

GPT-4(ChatGPT)の、その他の使い方

今まで紹介してきた、下記コードに対し、追加の引数を設定することができます。

response = openai.ChatCompletion.create(
model=”gpt-4″,
messages=conversation_history
)

  • temperature: 値が高いほど、多様で予測不能な応答になり、逆に、値が低いと、より確定的で予測可能な応答となります。(設定可能範囲:0〜2、デフォルト:1)
  • top_p: temperatureと同様、応答文のランダム性が変わります。「nucleus sampling」とも呼ばれています。(デフォルト:1)
  • n: 1回のプロンプトに対する応答文の個数を設定(デフォルト:1)
  • max_tokens: 入力の最大トークン数を指定。会話が続いていくと入力トークンが増えていくため、発生費用を抑制したい場合、指定するのが有効です。(デフォルト:無限)
  • stream: ストリーム形式で応答が返る(デフォルト:False)

詳細はOpenAI公式のドキュメントをご覧ください。

OpenAI API Reference

まとめ

この記事では、API使用料金、API使用までの手順、Pythonコードについて紹介しました。

入力プロンプトは過去の会話履歴も入力するため、長文(トークン数:大)になりがちです。

使用料金に注意しながらご利用ください。

雑談

今回紹介した方法を使えば、長年の夢であった実用的な会話マシンが実現しそうです。

ラズパイやJetsonに移植することも考えています。

完成したら、それについての記事も書く予定です。 後日、会話AIに関して、記事を投稿しました。

友達がいない?大丈夫! AIがあなたのパートナーになる! PythonとGPT-2で自作対話パートナーを作る
友達がいない?大丈夫! AIがあなたのパートナーになる! PythonとGPT-2で自作対話パートナーを作る友達がいないあなたへの解決策を提供します。本ブログでは、PythonとGPT-2を使用して、自分だけのAI対話パートナーを作る方法をステップバイステップで解説しています。...

本記事も、最後まで読んでいただき、ありがとうございました。

また、お会いしましょう!