OpenAI の公式 Python ライブラリ openai
で assistants のモデルを確認したり一括で変更したりする方法についてです。
2024 年 5 月 14 日(日本時間)、 OpenAI は最新モデルの GPT-4o をリリースしました。
この新モデルはひとつ前のモデル GPT-4 Turbo と同等の性能を持ちながら 50% 低いコストで提供されています。 GPT-4 Turbo 自体もその前のモデル GPT-4 より高性能でコストパフォーマンスが高い製品だったので、最近の OpenAI の傾向として新モデルが前モデルよりも安価で同等またはより高い性能を持つ流れが続いています。
そのため、研究など特殊な用途で使うのでないかぎり、一般のユーザーにとっては旧モデルを使い続ける利点はあまりありません。 特に今回の GPT-4 Turbo → GPT-4o ではトークン単価が半分になったのに加えて日本語のトークン数が 20 〜 30% ほど短縮されたため、トータルで 60 〜 70% ほどのコスト削減になります。
この記事を作成した時点では GPT-4o はまだ assistants では利用できないようなので注意してください。 → その日中に利用できるようになりました。
前提
- Python
>=3.12
- assistants を作成済み
私は macOS 上で実行しました。 他の OS でも同じコードが使えそうですが確認していません。
準備
venv を作って PyPI パッケージ openai
と click
をインストールします。
# venv を作成して有効化:
python -m venv .venv
. .venv/bin/activate
# `openai` をインストール:
pip install "openai=1.29.0"
# CLI 用に `click` をインストール:
pip install "click=8.1.7"
click
は CLI の --dry-run
フラグオプションを定義するためだけに導入するもので、 OpenAI の API の利用に必要なわけではありません。
実行
環境変数 OPENAI_API_KEY
に API キーをセットした上でスクリプトを書いて実行します。
assistants のモデルを確認する
list_openai_assistants_models.py
:
"""OpenAI assistants のモデルを確認する"""
from openai import OpenAI
def main():
client = OpenAI()
assistants = yield_all_assistants(client)
for a in assistants:
print(f"{a.id=} {a.name=} {a.model=} {a.description=}")
def yield_all_assistants(client):
assistants = [*client.beta.assistants.list()]
while assistants:
yield from assistants
after = assistants[-1].id
assistants = [*client.beta.assistants.list(after=after)]
if __name__ == "__main__":
main()
client.beta.assitants.list()
はデフォルトで 20 件の assistants を返してくれます。
assistants の数が 20 件以下の場合は引数なしで一度実行するだけでよいのですが、 21 件以上ある場合は引数 limit
(最大 100 件)や after
を使う必要があります。
ここでは limit
は使わず after
のみ使っています。
ちなみに、 client.beta.assistants.list()
は openai=1.29.0
で次の引数を受け取るようです:
after
: A cursor for use in pagination...before
: A cursor for use in pagination...limit
: A limit on the number of objects to be returned...order
: Sort order by thecreated_at
timestamp of the objects...extra_headers
: Send extra headersextra_query
: Add additional query parameters to the requestextra_body
: Add additional JSON properties to the requesttimeout
: Override the client-level default timeout for this request, in seconds
関連コード: openai-python/src/openai/resources/beta/assistants.py at v1.29.0 · openai/openai-python
assistants のモデルを一括変更する
change_multiple_openai_assistants_models.py
:
"""OpenAI assistants のモデルを一括で変更する"""
import click
from openai import OpenAI
EXCLUDED_IDS = []
MODELS_MAP = {
"gpt-4-turbo-preview": "gpt-4-turbo",
}
@click.command()
@click.option("--dry-run", is_flag=True)
def main(dry_run: bool):
client = OpenAI()
assistants = yield_all_assistants(client)
for a in assistants:
if a.id in EXCLUDED_IDS:
continue
if new_model := MODELS_MAP.get(a.model):
print(f"Changing model of {a.name} from {a.model} to {new_model}")
if dry_run:
continue
client.beta.assistants.update(assistant_id=a.id, model=new_model)
def yield_all_assistants(client):
assistants = [*client.beta.assistants.list()]
while assistants:
yield from assistants
after = assistants[-1].id
assistants = [*client.beta.assistants.list(after=after)]
if __name__ == "__main__":
main()
実行前に EXCLUDE_IDS
と MODELS_MAP
を変更してください。
最初は --dry-run
をつけて実行すれば、対象の assistant を確認できます。
python change_multiple_openai_assistants_models.py --dry-run
問題なければ --dry-run
を外して実行します。
python change_multiple_openai_assistants_models.py
実行すると次のような出力がされて該当する assistant のモデルが変更されます。
Changing model of アシスタント 1 from gpt-4-turbo-preview to gpt-4-turbo
Changing model of アシスタント 2 from gpt-4-turbo-preview to gpt-4-turbo
Changing model of アシスタント 3 from gpt-4-turbo-preview to gpt-4-turbo