業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【AI・機械学習】
AI

執筆者:Handbook編集部

Pythonで始めるOpenAI API活用ガイド

はじめに

OpenAI APIは、自然言語処理を手軽に行える強力なツールです。この記事では、Pythonを使用してOpenAI APIをセットアップし、簡単なテキスト生成を行う方法を実際のコード付きで分かりやすく解説します。

Pythonで始めるOpenAI APIの使い方

tip
ここがポイント

OpenAI API を Python で使うには以下の手順を行います。

  1. OpenAI Python ライブラリをインストールする
  2. API キーを設定する
  3. API を使用してテキスト生成する

1. OpenAI Python ライブラリのインストール

まず、以下のコマンドで必要なライブラリをインストールします:

pip install openai

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:生成結果の後に追加する文字列

    • 例えば、suffix="緑色だという人もいるかもしれません。" と指定すると、緑色だという人もいるかもしれません。 という文が続くのが自然なように補完が生成されます。

    • つまり、以下のコードを実行すると、

      # プロンプトの設定
      prompt = "空の色を教えてください。"
      
      # APIリクエストの設定
      response = openai.Completion.create(
          model="text-davinci-003",  # GPTのエンジン名を指定します
          prompt=prompt,
          max_tokens=1000,  # 生成するトークンの最大数
          n=5,  # 生成するレスポンスの数
          stop=None,  # 停止トークンの設定
          temperature=0.7,  # 生成時のランダム性の制御
          top_p=1,  # トークン選択時の確率閾値
          suffix="緑色だという人もいるかもしれません。",
      )
      
      # 生成されたテキストの取得
      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:
      空の色は、通常は青色です。しかし、夕日が沈むときなどは橙色や赤色にもなりますし、雲が濃いときは
      
  • max_tokens:補完で生成するトークンの最大数

  • temperature:生成のランダム性の制御  - 02 の間で指定します。temperature の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、temperature の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります(一般的には、top_ptemperature 両方の値を変更することは非推奨です。)

  • top_p:トークン選択の確率閾値

    • 01 の間で指定します。top_p の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、top_p の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります。(一般的には、top_ptemperature 両方の値を変更することは非推奨です。)
  • n:生成するレスポンスの数

  • stop:テキスト生成を停止するトークン

  • stream: True にすると、生成されるテキストがリアルタイムでストリームされる

  • logprobs: 生成されたトークンの対数確率を取得するためのパラメータ

    • None または int で指定します。最大値は 5 です。None の場合、logprobs は返されません。int の場合、logprobsint で指定したトークン数分返されます。

    • たとえば、以下に記すリクエストを実行すると

      response = openai.Completion.create(
          model="text-davinci-003",
          prompt="こんにちは",
          max_tokens=10,
          n=1,
          stop=None,
          temperature=0.7,
          top_p=1,
          logprobs=3 # ここを設定
      )
      

      以下のようなレスポンスが得られます。このレスポンス中の logprobslogprobsNone 以外の値を設定したことで、返ってくる値です。

      {
        "choices": [
          {
            "finish_reason": "stop",
            "index": 0,
            "logprobs": {
              "text_offset": [
                5,
                6,
                7,
                8,
                9,
                10,
                10,
                11,
                12
              ],
              "token_logprobs": [
                -0.5915109,
                -0.038296074,
                -0.42270857,
                -0.00020501523,
                -0.00394385,
                -4.9187893e-05,
                0.0,
                -4.9069615e-05,
                -0.6978184
              ],
              "tokens": [
                "\n",
                "\n",
                "\u3053",
                "\u3093",
                "\u306b",
                "bytes:\\xe3\\x81",
                "bytes:\\xa1",
                "\u306f",
                "\u3002"
              ],
              "top_logprobs": [
                {
                  "\n": -0.5915109,
                  "bytes:\\xef": -1.7410011,
                  "\u3001": -2.658493
                },
                {
                  "\n": -0.038296074,
                  " \u00a7\u00a7": -5.4302874,
                  "+": -5.233715
                },
                {
                  "bytes:\\xe3\\x81": -1.3863021,
                  "\u3053": -0.42270857,
                  "\u306f": -3.762392
                },
                {
                  "bytes:\\xe3\\x81": -8.661305,
                  "\u308c": -10.806704,
                  "\u3093": -0.00020501523
                },
                {
                  "<|endoftext|>": -10.410602,
                  "bytes:\\xe3\\x81": -5.5464296,
                  "\u306b": -0.00394385
                },
                {
                  "<|endoftext|>": -10.070627,
                  "bytes:\\xe3\\x81": -4.9187893e-05,
                  "\u306f": -12.68257
                },
                {
                  "bytes:\\xa1": 0.0,
                  "bytes:\\xa9": -28.772821,
                  "bytes:\\xb0": -27.583141
                },
                {
                  "<|endoftext|>": -11.241264,
                  "bytes:\\xe3\\x82": -10.499659,
                  "\u306f": -4.9069615e-05
                },
                {
                  "<|endoftext|>": -3.4772403,
                  "bytes:\\xef": -0.875814,
                  "\u3002": -0.6978184
                }
              ]
            },
            "text": "\n\n\u3053\u3093\u306b\u3061\u306f\u3002"
          }
        ],
        "created": 1679903077,
        "id": "cmpl-6ybordLnLtSMJwOe9uMve2wKDiokJ",
        "model": "text-davinci-003",
        "object": "text_completion",
        "usage": {
          "completion_tokens": 9,
          "prompt_tokens": 6,
          "total_tokens": 15
        }
      }
      
  • 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_ofn よりも大きくなければならないことに注意してください。このパラメータは多くの補完を生成するため、トークンの使用量をすぐに消費してしまう可能性があります。max_tokensstop を適切に設定し、慎重に使用してください。

  • logit_bias: 指定したトークンが補完に登場する可能性を変更します。トークン(GPT トークナイザーのトークン ID で指定)を -100 から 100 までのバイアス値にマッピングする json オブジェクトを受け取ります。(文を token ID に変換するには、tokenizer tool を使用できます。)正確な効果はモデルによって異なりますが、-11 の値は選択の可能性を減少または増加させるもので、-100100 のような値は関連するトークンを禁止または独占的に選択します。たとえば、{"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:チャット補完の対象メッセージ

    • 値は chat format に従った形式で指定します。
  • temperature:生成のランダム性の制御

    • 02 の間で指定します。temperature の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、temperature の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります(一般的には、top_ptemperature 両方の値を変更することは非推奨です。)
  • top_p:トークン選択の確率閾値

    • 01 の間で指定します。top_p の値が低いほど、生成されるテキストはより決定論的(繰り返し同じテキストが生成されやすい)になります。一方、top_p の値が高いほど、生成されるテキストはより多様でランダムになりますが、一貫性や品質が低下する可能性があります。(一般的には、top_ptemperature 両方の値を変更することは非推奨です。)
  • 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 を使用できます。)正確な効果はモデルによって異なりますが、-11 の値は選択の可能性を減少または増加させるもので、-100100 のような値は関連するトークンを禁止または独占的に選択します。たとえば、{"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で利用する方法を説明しました。以下の主要なポイントをカバーしました:

  1. OpenAI Pythonライブラリのインストール:pip install openaiを使用してライブラリをインストールします。
  2. APIキーの設定:OpenAIの公式サイトからOrganization IDとAPIキーを取得し、環境変数またはコード内に設定します。
  3. テキスト生成の実行:プロンプトを設定し、APIを使ってテキストを生成します。

さらに、主要なAPIエンドポイントであるCreate Completion、Create Chat Completion、List Modelsの仕様とパラメータについて詳しく解説しました。これにより、OpenAI APIの基本的な使い方と設定方法を理解できるでしょう。

参考文献

info
~AIの力をビジネスに~

OpenAI の API を業務で活用したり、自社のサービスに組み込みたくありませんか?Hakky では、ChatGPT を用いた企業独自のシステムを構築するご支援を行っています。

▶ソリューションサイト:https://www.about.st-hakky.com/chatgpt-solution

「どんなことが出来るのか」「いま考えているこのようなことは本当に実現可能か」など、ご検討段階でも構いませんので、ぜひお気軽にフォームよりお問い合わせくださいませ。

Hakkyへのお問い合わせ
2025年05月31日に最終更新
読み込み中...