見出し画像

OpenAIのモデルリストをpythonで確認する。(小ワザ)

こんにちはmakokonです。秒進分歩のAIの世界ですが、普段使いしているOpenAIのモデルも常に新しいものがリリースされています。公式ページを見に行ってもいいのですが、python中で確認できると便利だと思い、実装してみました。

公式ページでのモデルの確認方法

まずは普通に、現在のモデルを確認できるページを紹介しておきます。
このページにアクセスすれば、現在使用可能なモデルを確認することができます。

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

pythonでの確認

実際公式ページを見れば十分なのかもしれませんが、アプリ上でモデルを確認して選択するなどできれば便利なこともありそうなので、python上での確認方法を考えます。
最初は、上記公式ページをスクレイピングしようと思っていたのですが、調べてみると、そういう関数が用意されているようです。

LIst models 簡単じゃなかった。

https://platform.openai.com/docs/api-reference/models/list?lang=python

このページに有るサンプルコードと取得できるデータ構造です。
これならdata["data"]以下、簡単にできそうと思ったのですが、実際には簡単じゃなかった。なぜならば、このページに有る構造は実際とは違っていました。多分このページが作られた頃は、こういう構造だったのでしょう。AIあるあるですね。

from openai import OpenAI
client = OpenAI()

data = client.models.list()
print(data)
{
  "object": "list",
  "data": [
    {
      "id": "model-id-0",
      "object": "model",
      "created": 1686935002,
      "owned_by": "organization-owner"
    },
    {
      "id": "model-id-1",
      "object": "model",
      "created": 1686935002,
      "owned_by": "organization-owner",
    },
    {
      "id": "model-id-2",
      "object": "model",
      "created": 1686935002,
      "owned_by": "openai"
    },
  ],
  "object": "list"
}

実際のデータ構造

実際にデータを取得してみると実はこんな感じでした。見にくいので、中略および適当な改行を入れています。

SyncPage[Model](data=[
Model(id='dall-e-3', created=1698785189, object='model', owned_by='system'), 
Model(id='gpt-4o-mini', created=1721172741, object='model', owned_by='system'), 
Model(id='text-embedding-3-large', created=1705953180, object='model', owned_by='system'), 
Model(id='text-embedding-3-small', created=1705948997, object='model', owned_by='system'), 
Model(id='text-embedding-ada-002', created=1671217299, object='model', owned_by='openai-internal'), 
# *******中略***********
Model(id='gpt-4o-mini-2024-07-18', created=1721172717, object='model', owned_by='system')
], 
object='list')

いささかアクセスしにくいですね。見通しの悪いアクセスを強いられそう。

データ構造をクラスで管理して実装する

力ずくでアクセスする方法もありそうですが、後々面倒なことになりそう。
このデータ構造そのものをクラスで管理してとじこめてしまいましょう。
SyncPageとModelをそれぞれ定義しておけばのちのちやりやすいでしょう。
まずは、コード全体を示します。

import json
from openai import OpenAI
client = OpenAI()

data = client.models.list()


# データの定義(実際の構造に基づく)
class Model:
    def __init__(self, id, created, object, owned_by):
        self.id = id
        self.created = created
        self.object = object
        self.owned_by = owned_by

    def __repr__(self):
        return f"Model(id='{self.id}', created={self.created}, object='{self.object}', owned_by='{self.owned_by}')"

class SyncPage:
    def __init__(self, data, object):
        self.data = data
        self.object = object

    def __repr__(self):
        return f"SyncPage(data={self.data}, object='{self.object}')"






# 'data' キーのリストから 'id' をプリント
for item in data.data:
    if hasattr(item, 'id'):
        print(item.id)
        
        
# dataの構造例
"""    
data = SyncPage(
    data=[
        Model(id='dall-e-3', created=1698785189, object='model', owned_by='system'),
        Model(id='gpt-4o-mini', created=1721172741, object='model', owned_by='system'),
        Model(id='text-embedding-3-large', created=1705953180, object='model', owned_by='system'),
        Model(id='babbage-002', created=1692634615, object='model', owned_by='system'),

    ],
    object='list'
)
"""

実行結果

$ python list_model.py
dall-e-3
gpt-4o-mini
text-embedding-3-large
text-embedding-3-small
text-embedding-ada-002
dall-e-2
tts-1
tts-1-hd-1106
tts-1-1106
tts-1-hd
gpt-4
babbage-002
gpt-4-turbo-preview
gpt-4-0125-preview
gpt-3.5-turbo
gpt-3.5-turbo-1106
gpt-4o
whisper-1
gpt-3.5-turbo-16k
gpt-4o-2024-05-13
gpt-3.5-turbo-instruct-0914
gpt-3.5-turbo-0125
gpt-4-0613
gpt-3.5-turbo-instruct
gpt-4-1106-preview
chatgpt-4o-latest
gpt-4-turbo-2024-04-09
davinci-002
gpt-4-turbo
gpt-4o-2024-08-06
gpt-4o-mini-2024-07-18

無事、サポートモデルのリストができました。

コードの説明

では、簡単にコードの説明をします。

  • Modelクラス
    モデルのリスト構造(モデルID、作成日時、オブジェクトタイプ、所有者)を表す構造を定義します。

  • SyncPageクラス
    モデルのリストを含むデータオブジェクトを表す構造を定義します。

  • hasattr(item, 'id'):
    hasattr は、指定されたオブジェクトが特定の属性を持っているかを確認するために使用します。
    hasattr(object, name)

    • object: 調べたいオブジェクト。

    • name: 調べたい属性の名前(文字列)。
      つまり、dataのdata要素からID属性を持つかどうかを判定して表示しています。

まとめ

以上、models.list()メソッドを使うことによって、取得した構造からIDタグをもつものを表示することができました。
もちろんID(モデル名)だけでなく、create(作成日時)、object (オブジェクトタイプ)、ownerd_by(所有者)を抽出することもできますし、適切な辞書を作って管理することも容易です。
現在使用可能なモデルの名前、タイプ、作成日時を管理できるようにすることは、安定したアプリケーションを作成するために非常に重要です。また、現在使用しているモデルの特徴を表示できるようにすることも大切です。
利用者には、直接的な恩恵は少ないかもしれませんが、これらをいつでも確認できるようにすることで、プログラムの保守を容易にし、将来の自分が助かるかもしれません。
今回は、紹介しませんでしたが、紹介した公式ページには便利そうなメソッドがたくさん紹介されています。ぜひ、みなさんも試してみてください。
なお、今回もそうでしたが、公式ページに掲載されている利用方法、データ構造が常に、現在のバージョンに適合しているとは限りません。そこは、実際に確認して使いましょう。

#OpenAI #オープンAI
#Python #パイソン
#AIModels #AIモデル
#Programming #プログラミング
#TechTips #技術のコツ
#API
#Automation #自動化
#DataStructure #データ構造
#SoftwareDevelopment #ソフトウェア開発
#Coding #コーディング


いいなと思ったら応援しよう!