こんにちは。ナミレリです。
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系の違いを把握したい方
- M2 MacBook Air 13.6 インチ
- M1 Max MacBook Pro 14インチ
- macOS Sonoma 14.3.1
- Python ライブラリ:openai version 1.12.0
目次
OpenAIのPython libraryの0.x系と1.x系のインストール
今回はvenvで0.x系と1.x系の2つの仮想環境を作って両バージョンを使えるようにしてみます。
0.x系の仮想環境とopenaiライブラリのインストール
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 listで0.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ライブラリのインストール
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 listで1.x系のライブラリを確認しておきます。
1.x系のOpenAIライブラリをインストールした状態のpip list
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してみます。
1.x系の仮想環境に入ります
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"])
1.x系の仮想環境でopenai migrateの実行
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コマンドで上のように変更点が出力されマイグレーションすることができます。(上書きされます)ただしその変更内容は必ず確認する必要があります。
マイグレーション後のコード:test_0.x.py
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)
それでは、より具体的に違いを見ていきましょう。
初期化の記述方法の違い
まずは、初期化の違いです。主な違いは、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の各呼び出しでそのインスタンスを使用し、設定をより局所的に管理することができます。
1.12.0の初期化
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インスタンスを使用してレスポンスのオブジェクトを作成します。
1.12.0のレスポンス生成
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Pythonの歴史を教えて。"},
])
レスポンスへのアクセス
0.28.1のresponseオブジェクトへのアクセスは辞書形式でキーを文字列で指定し値にアクセスします。
0.28.1のレスポンスへのアクセス
print(response.choices[0]["message"]["content"])
1.12.0のresponseオブジェクトへのアクセスは、responseオブジェクト内のデータに属性アクセスを使用します。responseオブジェクトの属性は、choices、message、contentです。
1.12.0のレスポンスへのアクセス
print(response.choices[0].message.content)
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関連の別の記事
OpenAIライブラリ1系の変更点
neovimでChatGPT
PythonでChatGPTのAPI
MacでChatGPT
MacでChatGPT
VSCodeでChatGPT
LinuxのターミナルからChatGPT
PythonでGPT-3