2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTのAssistants APIを使ったわかったこと

Last updated at Posted at 2024-03-13

はじめに

先駆者さまがいろいろ記事を出してくれたおかげで、Assistants APIにつて理解が深まったので私もかるく使ってみました。
基本的には以下のTutorial通り利用しただけですが、使ってみるといろいろ気付けたことがあったので備忘録をここに残します。

気づいたこと

① Assistantは自然に消えない

Assistantは1回つくると永続?なんですかね。
作成後放置すると一定期間で消えてくれると思ってました。
このため何度もテストをしていたらすごい数のAssistantができちゃってました。
ちなみにAssistant作成状況は以下で確認できました。

client = OpenAI()
""" 何個かAssistantを作成後 """
client.beta.assistants.list().__dict__

>> {'data': [Assistant(id='asst_ZFW***dw**yDk***OO**uC*E', created_at=1710231458, description=None, file_ids=[], instructions='You are a personal math tutor. Write and run code to answer math questions.', metadata={}, model='gpt-4-turbo-preview', name='Math Tutor', object='assistant', tools=[ToolCodeInterpreter(type='code_interpreter')])],.....}

無駄に作ってしまったAssistantは以下で削除できました。

client.beta.assistants.delete('asst_ZFW***dw**yDk***OO**uC*E')

>> AssistantDeleted(id='asst_ZFW***dw**yDk***OO**uC*E', deleted=True, object='assistant.deleted')

② Assistantの管理がOrganaization単位

この件はココに記載がありましたが、
assistants, threads, messages, files の管理空間はorganaizationになるようです。
このためアプリ毎にAPI Tokenを使い分けていても、
AAAのトークンで作成したAssistantが、
BBBのトークンでインスタンス化したCliantから利用&削除ができちゃいました。。

③ Threadsは一覧がみえない?

不要なThreadを削除するためにThread一覧がみたかったのですが、Treadsにはlistメソッドがない?のですかね。見つかりませんでした。
ただretrieveメソッドはあったので、都度Thread IDを管理しておけば削除等はできそうです。

client.beta.threads.retrieve("thread_1z1j***4tMRG***OqSa***u1")

>> Thread(id='"thread_1z1j***4tMRG***OqSa***u1', created_at=1710231526, metadata={}, object='thread')

④ prompt_tokensが雪だるま式

これはココに書いてあったので、認識はしていましたが、code_interpreterでデータ分析しているとすぐに数万トークンになりました。

⑤ 戻り値の平坦化

雑ですが、code_interpreterに関する戻り値は取得できました

def ravel_json(input_data, key=None):
    def conv_dict(obj):
        try:
            return obj.__dict__
        except AttributeError:
            return obj

    input_data = conv_dict(input_data)
        
    dataDict = {}
    for current_key, val in input_data.items():
        if current_key.startswith('_'):
            continue

        full_key = f'{key}_{current_key}' if key else current_key

        if current_key == 'file_ids':
            dataDict[full_key] = ",".join(val)
            continue

        val = conv_dict(val)

        if isinstance(val, (dict, list)):
            if isinstance(val, dict):
                dataDict.update(ravel_json(val, full_key))
            else:  # val is a list
                if val:
                    for num, j in enumerate(reversed(val)):
                        j = conv_dict(j)
                        list_key = f'{full_key}_{num}'
                        if isinstance(j, dict):
                            dataDict.update(ravel_json(j, list_key))
                        else:
                            dataDict[list_key] = j
        else:
            dataDict[full_key] = val

    return dataDict


### 使い方 ###
client = OpenAI()
messages = client.beta.threads.messages.list(
            thread_id=thread_id,
            limit=7
            )
result = messages.data
raveledDatas = [ravel_json(val) for val in result]

⑥ 結構エラーがでて動きません(2024/03時点)

code_interpreterは以下のエラーがかなりでます。。

image.png

また本記事の記載時点では、limitが9以上(デフォルト値は20)の場合、戻り値の中の‘file_ids’が消えてしまうようです。。

num=9  
client.beta.threads.messages.list(
            thread_id=self.thread_id,.
            limit=num
            )

徐々にアップデートしていきます

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?