Python Tips: OpenAI Assistants のモデルを確認・一括変更したい

DALLE-2024-05-14

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 パッケージ openaiclick をインストールします。

# 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 the created_at timestamp of the objects...
  • extra_headers: Send extra headers
  • extra_query: Add additional query parameters to the request
  • extra_body: Add additional JSON properties to the request
  • timeout: 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_IDSMODELS_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

GitHub Gist