はじめに
OpenAI API は、自然言語処理を手軽に行える強力なツールです。この記事では、Python を使用してOpenAI API をセットアップし、簡単なテキスト生成を行う方法を実際のコード付きで分かりやすく解説します。
Pythonで始めるOpenAI APIの使い方
ここがポイント
OpenAI API を Python で使うには以下の手順を行います。
OpenAI Python ライブラリをインストールする
API キーを設定する
API を使用してテキスト生成する
1. OpenAI Python ライブラリのインストール
まず、以下のコマンドで必要なライブラリをインストールします:
2. APIキーの取得と設定
OpenAI APIを利用するには、APIキーが必要です。OpenAIの公式サイトでアカウントを作成し、APIキーを取得してください。その後、Pythonコード内でAPIキーを設定します:
Organization ID と API キーを環境変数に設定するか、直接コードに設定することができます。以下はその例です:
import os
import openai
openai.organization = os.environ.get("OPENAI_ORGANIZATION")
openai.api_key = os.environ.get("OPENAI_API_KEY")
3. テキスト生成の実行
APIキーを設定したら、次にテキスト生成を行います。以下のコードは、プロンプトからテキストを生成する例です。
パラメータの詳細については、主要な API の仕様 にて後述します。
# プロンプトの設定
prompt = "空の色を教えてください。"
# APIリクエストの設定
response = openai.Completion.create(
model="text-davinci-002", # GPTのエンジン名を指定します
prompt=prompt,
max_tokens=100, # 生成するトークンの最大数
n=5, # 生成するレスポンスの数
stop=None, # 停止トークンの設定
temperature=0.7, # 生成時のランダム性の制御
top_p=1, # トークン選択時の確率閾値
)
# 生成されたテキストの取得
for i, choice in enumerate(response.choices):
print(f"\nresult {i}:")
print(choice.text.strip())
このスクリプトを実行すると以下のような結果が得られます:
result 0:
空の色は、本来は色のない透明なものです。しかし、空は大気の屈折や反射などにより、様々な色を帯びて見えることがあります。
result 1:
空の色は青です。
result 2:
空の色は青です。
result 3:
青です。
result 4:
空の色は青です。
4. エラーハンドリング
APIの利用中にエラーが発生することがあります。例えば、APIキーが無効になったり、リクエストの上限に達したりする場合です。以下のコードは、エラーハンドリングの例です:
try:
response = openai.Completion.create(
model="text-davinci-002",
prompt="空の色を教えてください。",
max_tokens=100,
n=5,
stop=None,
temperature=0.7,
top_p=1
)
for i, choice in enumerate(response.choices):
print(f"\nresult {i}:")
print(choice.text.strip())
except openai.error.OpenAIError as e:
print(f"エラーが発生しました: {e}")
このコードは、APIリクエストが失敗した場合にエラーメッセージを出力します。エラーの内容に応じて、適切な対策を取ることができます。
主要な API の仕様
この章では、OpenAI APIで利用可能な主要エンドポイントの仕様を説明します。
Create completion
このエンドポイントでは、プロンプトを与えるとモデルが予測された補完を返します。各位置での代替トークンの確率も返すことができます。
使用例は以下の通りです。
response = openai.Completion.create(
model="text-davinci-002", # GPTのエンジン名を指定します
prompt=prompt,
max_tokens=100, # 生成するトークンの最大数
n=5, # 生成するレスポンスの数
stop=None, # 停止トークンの設定
temperature=0.7, # 生成時のランダム性の制御
top_p=1, # トークン選択時の確率閾値
)
パラメータの説明:
model
:使用するモデルの名前(必須)
prompt
:生成の基となるプロンプト
suffix
:生成結果の後に追加する文字列
max_tokens
:補完で生成するトークンの最大数
temperature
:生成のランダム性の制御
- 0
~ 2
の間で指定します。temperature
の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、temperature
の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります(一般的には、top_p
と temperature
両方の値を変更することは非推奨です。)
top_p
:トークン選択の確率閾値
0
~ 1
の間で指定します。top_p
の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、top_p の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります。(一般的には、top_p
と temperature
両方の値を変更することは非推奨です。)
n
:生成するレスポンスの数
stop
:テキスト生成を停止するトークン
stream
: True
にすると、生成されるテキストがリアルタイムでストリームされる
logprobs
: 生成されたトークンの対数確率を取得するためのパラメータ
echo
: True
にすると、出力結果にプロンプトを追記して返します。
たとえば、以下のコードを実行すると
response = openai.Completion.create(
model="text-davinci-003",
prompt="空の色は何色ですか?",
max_tokens=100,
n=1,
stop=None,
temperature=0.7,
top_p=1,
echo=True, # ここをTrueにする
)
for i, choice in enumerate(response.choices):
print(f"\nresult {i}:")
print(choice.text.strip())
以下のような出力結果が得られます。
result 0:
空の色は何色ですか?
空の色は、気温や空気の状況によって変化しますが、一般的には青色となります。
stop
: テキスト生成を停止するトークンを指定するために使用されます。stop
に文字列または文字列のリストを設定することで、モデルは指定されたトークンが現れた場合にテキスト生成を停止します。
presence_penalty
: 生成されたテキスト内で単語やフレーズが繰り返し現れることを制御するために使用される -2.0
以上 2.0
以下の値です。このパラメータは、モデルに対して繰り返しを減らすか増やすかを指示する役割を果たします。0
の場合、繰り返しに対するペナルティはありません。これは、デフォルトのモデルの挙動になります。正の値の場合、繰り返しのペナルティが増加し、生成されたテキスト内での単語やフレーズの繰り返しが減少します。逆に、負の値の場合、生成されたテキスト内での単語やフレーズの繰り返しが増加します。
frequency_penalty
: -2.0
から 2.0
の間の数値。正の値は、それまでのテキストにおける出現数に応じて新しいトークンにペナルティを与え、モデルが同じ文をそのまま繰り返す可能性を減少させます。
best_of
: このパラメータを設定すると、サーバーサイドでこのパラメータで指定した個数の補完を生成し、それらの補完の中からもっとも高いスコアを持つものを返します。n
と共に使用する場合、best_of
は生成する補完候補の数を制御し、n
はリクエストに対して返却する補完の個数を指定します。このことからわかるように best_of
は n
よりも大きくなければならないことに注意してください。このパラメータは多くの補完を生成するため、トークンの使用量をすぐに消費してしまう可能性があります。max_tokens
と stop
を適切に設定し、慎重に使用してください。
logit_bias
: 指定したトークンが補完に登場する可能性を変更します。トークン(GPT トークナイザーのトークン ID で指定)を -100
から 100
までのバイアス値にマッピングする json オブジェクトを受け取ります。(文を token ID に変換するには、tokenizer tool を使用できます。)正確な効果はモデルによって異なりますが、-1
~ 1
の値は選択の可能性を減少または増加させるもので、-100
や 100
のような値は関連するトークンを禁止または独占的に選択します。たとえば、{"50256": -100}
と指定すると、<|endoftext|>
というトークンが補完に登場する可能性を排除できます。
user
: エンドユーザーを表す一意の識別子で、OpenAI の監視や不正利用の検知に役立ちます。詳しくはこちら
Create chat completion
この API エンドポイントにチャットの会話を与えると、モデルはチャットを補完する応答を返します。
以下の Python コードは Create chat completion の使用例です。
# チャットプロンプトの設定
messages = [
{"role": "system", "content": "あなたは親切なアシスタントです。"},
{"role": "user", "content": "春の季語を絡めた冗談を教えてください。"},
{"role": "assistant", "content": "「春眠(しゅんみん)暁(ぎょう)を覚(さ)えず」という言葉がありますが、「春は眠くても、アシスタントは覚えてるよ!」と言って、ツッコミを入れるのはいかがでしょうか?笑"},
{"role": "user", "content": "面白くない。もう一度。"},
]
# APIリクエストの設定
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo", # GPTのエンジン名を指定します
messages=messages,
max_tokens=500, # 生成するトークンの最大数
n=1, # 生成するレスポンスの数
stop=None, # 停止トークンの設定
temperature=0.7, # 生成時のランダム性の制御
top_p=1, # トークン選択時の確率閾値
)
# 生成されたテキストの取得
for i, choice in enumerate(response.choices):
print(f"index: {i}:")
print(f"role: {choice.message.role}.")
print(f"content: {choice.message.content.strip()}")
このコードを実行すると、messages
で定義した会話に続く返答を返してくれます。以下は実行結果の一例です。
index: 0:
role: assistant.
content: すみません。では、春になると“桜前線”が話題になりますが、「桜前線って、何かの戦争の名前みたいですね」と言ってみるのはどうでしょうか?笑
パラメータの説明:
model
:使用するモデルの名前(必須)
messages
:チャット補完の対象メッセージ
temperature
:生成のランダム性の制御
0
~ 2
の間で指定します。temperature
の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、temperature
の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります(一般的には、top_p
と temperature
両方の値を変更することは非推奨です。)
top_p
:トークン選択の確率閾値
0
~ 1
の間で指定します。top_p
の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、top_p の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります。(一般的には、top_p
と temperature
両方の値を変更することは非推奨です。)
n
:生成するレスポンスの数
stop
:テキスト生成を停止するトークン
stop
に文字列または文字列のリストを設定することで、モデルは指定されたトークンが現れた場合にテキスト生成を停止します。
max_tokens
:補完で生成するトークンの最大数
stream
: True
にすると、生成されるテキストがリアルタイムでストリームされるようになります。実装例は How to stream completions で確認できます。
presence_penalty
: 生成されたテキスト内で単語やフレーズが繰り返し現れることを制御
-2.0
以上 2.0
以下の値です。このパラメータは、モデルに対して繰り返しを減らすか増やすかを指示する役割を果たします。0
の場合、繰り返しに対するペナルティはありません。これは、デフォルトのモデルの挙動になります。正の値の場合、繰り返しのペナルティが増加し、生成されたテキスト内での単語やフレーズの繰り返しが減少します。逆に、負の値の場合、生成されたテキスト内での単語やフレーズの繰り返しが増加します。より詳細な内容を確認したい方はこちら をご覧ください。
frequency_penalty
: -2.0
から 2.0
の間の数値
正の値は、それまでのテキストにおける出現数に応じて新しいトークンにペナルティを与え、モデルが同じ文をそのまま繰り返す可能性を減少させます。より詳細な内容を確認したい方はこちら をご覧ください。
logit_bias
: 指定したトークンが補完に登場する可能性を変更
トークン(GPT トークナイザーのトークン ID で指定)を -100
から 100
までのバイアス値にマッピングする json オブジェクトを受け取ります。(文を token ID に変換するには、tokenizer tool を使用できます。)正確な効果はモデルによって異なりますが、-1
~ 1
の値は選択の可能性を減少または増加させるもので、-100
や 100
のような値は関連するトークンを禁止または独占的に選択します。たとえば、{"50256": -100}
と指定すると、<|endoftext|>
というトークンが補完に登場する可能性を排除できます。
user
: エンドユーザーを表す一意の識別子
OpenAI の監視や不正利用の検知に役立ちます。詳しくはこちら
List Models
現在利用可能なモデルを一覧表示し、それぞれのオーナーや利用可能状況などの基本情報を提供します。
以下の Python コードは Create chat completion の使用例です。
# モデル一覧の取得
models = openai.Model.list()
for model in models.data:
print(f"{model.id}")
実行結果は以下のようになります。
babbage
davinci
babbage-code-search-code
text-similarity-babbage-001
text-davinci-001
ada
# (中略)
davinci-if:3.0.0
davinci-instruct-beta:2.0.0
text-ada:001
text-davinci:001
text-curie:001
text-babbage:001
まとめ
この記事では、OpenAI APIをPythonで利用する方法を説明しました。以下の主要なポイントをカバーしました:
OpenAI Pythonライブラリのインストール :pip install openaiを使用してライブラリをインストールします。
APIキーの設定 :OpenAIの公式サイトからOrganization IDとAPIキーを取得し、環境変数またはコード内に設定します。
テキスト生成の実行 :プロンプトを設定し、APIを使ってテキストを生成します。
さらに、主要なAPIエンドポイントであるCreate Completion、Create Chat Completion、List Modelsの仕様とパラメータについて詳しく解説しました。これにより、OpenAI APIの基本的な使い方と設定方法を理解できるでしょう。
参考文献
~AIの力をビジネスに~