こんにちは、Zero-Cheeseです。
今回はPythonからGPT-4を利用する方法を詳しく解説します。
- これを使ってボットを作りたい、
- または発話マシンを作成したい方にとって、
きっと役立つ情報となるでしょう。
使用料金
使用料金は、
- 「Prompt(私たちからの質問文)」と
- 「Completion(GPTからの応答文)」
の合計で計算されます。
ChatGPT Plusの会員であっても、API使用量に応じた料金が別途発生します。
具体的な料金は以下の通りです。
GPT-4の場合: APIは「8K context」および「32K context」が使用されます。
Model | Prompt(質問文) | 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の場合:
Model | Usage |
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)を使用する
全体手順は、以下のとおりです。
使用する前に、まずはログインしてください。(アカウントを作成していない方は、下記オレンジ枠内を参照して下さい。)
- 支払い情報を設定する
waitlistに登録する(ChatGPTのみ使用の方は不要)不要になりました- APIキー(Secret Key)の取得
- 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つに分類されます。
- user
- assistant
- 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公式のドキュメントをご覧ください。
まとめ
この記事では、API使用料金、API使用までの手順、Pythonコードについて紹介しました。
入力プロンプトは過去の会話履歴も入力するため、長文(トークン数:大)になりがちです。
使用料金に注意しながらご利用ください。
雑談
今回紹介した方法を使えば、長年の夢であった実用的な会話マシンが実現しそうです。
ラズパイやJetsonに移植することも考えています。
完成したら、それについての記事も書く予定です。 後日、会話AIに関して、記事を投稿しました。
本記事も、最後まで読んでいただき、ありがとうございました。
また、お会いしましょう!