7/16(火)午前0時から2日間:Amazonプライムデー開催!詳細をチェック

【Python】OpenAI APIの変更点(バージョン1.x)

8 min

こんにちは。ナミレリです。

2023年11月にPython用のOpenAI APIライブラリのバージョンが1.x(1.x系)にアップデートされました。以前、バージョン0.27の使い方の記事を書きましたが、良い機会なので0.x(0.x系)から1.x(1.x系)への変更点などをまとめていきます。

ちなみに大きな変更から小さな変更まで、ここ(Open AIのChangelog)で変更履歴を見ることができます。

この記事はこんな人にオススメ

  • 古いバージョン(0.x系)のOpen AIライブラリで書いたPythonプログラムを書き直したい方
  • Python用のOpenAI APIライブラリの0.x系と1.x系の違いを把握したい方
この記事のMac環境
  • M2 MacBook Air 13.6 インチ
  • M1 Max MacBook Pro 14インチ
  • macOS Sonoma 14.3.1
  • Python ライブラリ:openai version 1.12.0
Parallels 19 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 19 for Mac

Parallels Desktop 19 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

OpenAIのPython libraryの0.x系と1.x系のインストール

今回はvenvで0.x系と1.x系の2つの仮想環境を作って両バージョンを使えるようにしてみます。

0.x系の仮想環境とopenaiライブラリのインストール

venvで下のように0.x系の仮想環境を作ります。


cd ~
mkdir v0.x
cd v0.x
python -m venv .venv_v0.x
source .venv_v0.x/bin/activate

0.x系ライブラリのインストールpipで下のようにインストールします。バージョンは0.28.1です。その前にpipコマンド自体をアップデートしておきます。


pip install -U pip
pip install openai==0.28.1

pip list0.x系のライブラリを確認しておきます。

0.x系のOpenAIライブラリをインストールした状態のpip list


pip list
Package            Version
------------------ --------
aiohttp            3.9.3
aiosignal          1.3.1
async-timeout      4.0.3
attrs              23.2.0
certifi            2024.2.2
charset-normalizer 3.3.2
frozenlist         1.4.1
idna               3.6
multidict          6.0.5
openai             0.28.1
pip                24.0
requests           2.31.0
setuptools         65.5.0
tqdm               4.66.2
urllib3            2.2.1
yarl               1.9.4

0.x系の仮想環境から抜けます。


deactivate

1.x系の仮想環境とopenaiライブラリのインストール

次に、venvで下のように1.x系の仮想環境を作ります。


cd ~
mkdir v1.x
cd v1.x
python -m venv .venv_v1.x
source .venv_v1.x/bin/activate

1.x系ライブラリのインストールpipで下のようにインストールします。2024年2月現在のバージョンは1.12.0です。この仮想環境でもpipコマンド自体をアップデートしておきます。


pip install -U pip
pip install openai

pip list1.x系のライブラリを確認しておきます。


pip list
Package           Version
----------------- --------
annotated-types   0.6.0
anyio             4.2.0
certifi           2024.2.2
distro            1.9.0
exceptiongroup    1.2.0
h11               0.14.0
httpcore          1.0.3
httpx             0.26.0
idna              3.6
openai            1.12.0
pip               24.0
pydantic          2.6.1
pydantic_core     2.16.2
setuptools        65.5.0
sniffio           1.3.0
tqdm              4.66.2
typing_extensions 4.9.0

1.x系の仮想環境から抜けます。


deactivate

これでOpenAI Pythonライブラリの0.x系と1.x系の両仮想環境を構築できました。それぞれの仮想環境で実際に試しながら紹介していきます。

仮想環境に入るには上で紹介したように仮想環境をアクティブにする必要があります。

Gritによるマイグレーションについて

1.x系のOpenAIライブラリをインストールした環境で、openai migrateコマンドにより0.x系のコードをASTベースの変換でマイグレーションしてくれます。最終的には必ず確認する必要がありますが、以下に試してみます。

1.x系のOpenAIライブラリをインストールした環境で、以下のコードを新バージョンにopenai migrateしてみます。


cd ~/v1.x
python -m venv .venv_v1.x
source .venv_v1.x/bin/activate

0.x系のテストコード:test_0.x.py


import os
import openai

openai.api_key = os.environ["OPENAI_API_KEY"]

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Pythonの歴史を教えて。"},
    ],
)
print(response.choices[0]["message"]["content"])

ファイルはマイグレーションしたものに上書きされます。元ファイルをバックアップやコピーをしてマイグレーションの内容を確認するようにします。


openai migrate test_0.x.py


     import os
    -import openai
    +from openai import OpenAI
    +
    +client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

    -openai.api_key = os.environ["OPENAI_API_KEY"]

    -response = openai.ChatCompletion.create(
    -    model="gpt-3.5-turbo",
    -    messages=[
    -        {"role": "user", "content": "Pythonの歴史を教えて。"},
    -    ],
    -)
    -print(response.choices[0]["message"]["content"])
    +response = client.chat.completions.create(model="gpt-3.5-turbo",
    +messages=[
    +    {"role": "user", "content": "Pythonの歴史を教えて。"},
    +])
    +print(response.choices[0].message.content)

openai migrateコマンドで上のように変更点が出力されマイグレーションすることができます。(上書きされます)ただしその変更内容は必ず確認する必要があります。


import os

from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])


response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Pythonの歴史を教えて。"},
    ],
)
print(response.choices[0].message.content)

それでは、より具体的に違いを見ていきましょう。

Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

初期化の記述方法の違い

まずは、初期化の違いです。主な違いは、APIキーの設定方法と管理の範囲です。0.x系はグローバルに設定され、1.x系はインスタンスレベルでの設定となります。

0.28.1の初期化は、os.getenvを使用して環境変数からOpenAIのAPIキーを取得し、それをopenai.api_keyに設定しています。これはグローバルな設定を通じてAPIキーがOpenAIライブラリに適用されます。

0.28.1の初期化


import os
import openai

openai.api_key = os.getenv("OPENAI_API_KEY")

1.12.0の初期化は、from openai import OpenAIを使用してOpenAIクラスをインポートし、インスタンスを作成する際に環境変数から直接APIキーを渡しています。APIの各呼び出しでそのインスタンスを使用し、設定をより局所的に管理することができます。


import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

レスポンスの生成

0.28.1のレスポンス生成は、openaiライブラリのグローバルなChatCompletionクラスを使用しレスポンスのオブジェクトを作成します。ライブラリのグローバル設定やメソッドを直接利用しています。

0.28.1のレスポンス生成


response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Pythonの歴史を教えて。"},
    ],
)

1.12.0のレスポンス生成は、事前に設定されたclientインスタンスを使用してレスポンスのオブジェクトを作成します。


response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Pythonの歴史を教えて。"},
])

roleについて

roleは以下の3つがあります。

role説明例(content)
systemAIアシスタントの設定あなたは優秀なコンサルタントです
userユーザーの発信今日の天気は?
assistantAIアシスタントの回答今日は晴れです

先程の例の通り、messagesリストに辞書形式でroleとそのrolecontentを記述します。systemメッセージはオプションでなくてもOKですが、適切に設定すると回答が良くなります。

テキストの生成

テキストを生成するには、client.chat.completions.create()関数を使います。先程の例ではパラメーターにmodelmessagesを設定しています。modelにはモデルIDを文字列で指定します。

2024年5月現在、主なモデルIDは以下の通りです。
下記以外にもpreviewやスナップショットモデルなどがあります。

詳細:https://platform.openai.com/docs/models

モデルIDコンテキストウィンドウ学習データ
gpt-4o128,000トークン2023年10月まで
gpt-4-turbo128,000トークン2023年12月まで
gpt-48,192トークン2021年9月まで
gpt-4-32k32,768トークン2021年9月まで
gpt-3.5-turbo16,385トークン2021年9月まで
テキスト生成のモデルID
Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

レスポンスへのアクセス

0.28.1のresponseオブジェクトへのアクセスは辞書形式でキーを文字列で指定し値にアクセスします。

0.28.1のレスポンスへのアクセス


print(response.choices[0]["message"]["content"])

1.12.0のresponseオブジェクトへのアクセスは、responseオブジェクト内のデータに属性アクセスを使用します。responseオブジェクトの属性は、choicesmessagecontentです。


print(response.choices[0].message.content)
Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

テキストのリクエスト

これまで紹介してきた、1.x系でのテキストリクエスト方法をまとめます。ファイル名はtext_request.pyとしています。


from openai import OpenAI 
import os

# モデル指定
MODEL="gpt-4o"

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

completion = client.chat.completions.create(
  model=MODEL,
  messages=[
    {"role": "system", "content": "You are a helpful assistant. Help me with my math homework!"},
    {"role": "user", "content": "Hello! Could you solve 2+2?"}
  ]
)

print("Assistant: " + completion.choices[0].message.content)

python ./text_request.py
Assistant: Of course! The sum of 2 + 2 is 4.

openai.embeddings_utilsがなくなった

0.28.1にあったopenai.embeddings_utilsが1.x系ではなくなっています。従って、get_embedding, cosine_similarity, distances_from_embeddings, なのなど関数が使えなくなっています。

openai.embeddings_utilsを使う方は、0.28.1を使った方が良いかもしれません。OpenAIのCookbookやドキュメントはこの件でまだ更新されていないようです。(2024年2月21日現在)

最後に

最後まで読んでいただきありがとうございます。今回の【Python】OpenAI APIの変更点(バージョン1.x)はいかがでしたでしょうか。

より良い生成AIの活用に少しでもお役に立てることができれば幸いです。

MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。

初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。

ChatGPT関連の別の記事

公式ChatGPTのMac用デスクトップアプリを使う

OpenAIライブラリ1系の変更点

neovimでChatGPT

PythonでChatGPTのAPI

MacでChatGPT

MacでChatGPT

VSCodeでChatGPT

LinuxのターミナルからChatGPT

PythonでGPT-3

カテゴリー:
関連記事