🩼

Azure AI Assistants APIのファイルアップロード

2024/04/24に公開

やりたいこと

Azure AI Assistants APIをプレイグラウンドで試してから、APIで自動化しようとした際に、
ファイルアップロードのドキュメントの場所がイマイチ探しにくかったので、メモとサンプルコードを残します。

ファイルアップロードAPIのドキュメントとパラメータ

https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/code-interpreter?tabs=python

https://learn.microsoft.com/en-us/rest/api/azureopenai/files/upload?view=rest-azureopenai-2024-02-15-preview&tabs=HTTP#purpose

参考にした記事
https://zenn.dev/microsoft/articles/533488db14e442

サンプルコード

Jupyter Notebookで実行しています。

AZURE_OPENAI_ENDPOINT = "https://xxxxxxx.openai.azure.com/"
AZURE_OPENAI_KEY = "xxxxxxxx"
import time
import json
from openai import AzureOpenAI

client = AzureOpenAI(
    api_key= AZURE_OPENAI_KEY,
    api_version="2024-02-15-preview",
    azure_endpoint = AZURE_OPENAI_ENDPOINT
)

手順(システムプロンプトのようなもの)を適当に定義

INSTRUCTIONS = """あなたはxxx分析をするスペシャリストです。
1年間の業態、年代ごとの前年比データを基に、ターゲット消費者のxxを分析してください。

## 下記を抽出してください
- 年代(20代、30代、40代、50代、60代)ごと、各指標(金額構成比、数量構成比)の前年比で特徴がある業態の抽出
- 性別のデータが存在しない業態もある

## 考え方
- xxxx

## 制約
- 回答例の通りに回答を行うこと
- 年代=年齢
- 日本語で回答してください。

## 回答例
- 全ての年代
金額構成比:業態Aは前年比増加、特に業態Aは+XX%と増加幅が大きい。業態B、Cは前年比減少、特に業態Cは▲XX%と減少幅が大きい。
数量構成比:業態Aは前年比増加、特に業態Aは+XX%と増加幅が大きい。業態B、Cは前年比減少、特に業態Cは▲XX%と減少幅が大きい。
- 20代
金額構成比:業態Aは前年比増加、特に業態Aは+XX%と増加幅が大きい。業態B、Cは前年比減少、特に業態Cは▲XX%と減少幅が大きい。
数量構成比:業態Aは前年比増加、特に業態Aは+XX%と増加幅が大きい。業態B、Cは前年比減少、特に業態Cは▲XX%と減少幅が大きい。
"""

https://learn.microsoft.com/en-us/rest/api/azureopenai/files/upload?view=rest-azureopenai-2024-02-15-preview&tabs=HTTP#purpose

purposeにassistants

# ファイルの登録
file = client.files.create(
  file=open("/{filepath}/{filename}.csv", "rb"),
  purpose='assistants'
)
# アシスタントの作成
assistant_1 = client.beta.assistants.create(
    name="xx分析", # アシスタント名
    instructions=INSTRUCTIONS, # 指示 (アシスタントの定義や目的など)
    tools=[{"type": "code_interpreter"}], # アシスタントが使用できるツールのリスト (ここでは Code interpreter のみ)
    model="xxxxxxxx", # モデルのデプロイ名
    file_ids=[file.id]
)
# スレッドの作成
thread_1 = client.beta.threads.create()

実行中にセルを停止した場合など、実行中のthreadが残っていると次の実行ができないので、
その場合、削除する

# スレッドの削除
client.beta.threads.delete(thread_1.id)
CONTENTS = ["業態、年代ごとの前年比データの特徴を教えて"]
# アシスタントが回答のメッセージを返すまで待つ関数
def wait_for_assistant_response(thread_id, run_id):
    while True:
        time.sleep(5)
        run = client.beta.threads.runs.retrieve(
            thread_id=thread_id,
            run_id=run_id
        )
        status = run.status
        if status in ["completed", "cancelled", "expired", "failed"]:
            print(status)
            break

# スレッドのメッセージを確認する関数
def print_thread_messages(thread_id):
    msgs = client.beta.threads.messages.list(thread_id=thread_id)
    for m in msgs:
        assert m.content[0].type == "text"
        print({"role": m.role, "message": m.content[0].text.value})
for c in CONTENTS:
    print(c)
    # ユーザーからのメッセージをスレッドに追加
    message_1_1 = client.beta.threads.messages.create(
        thread_id=thread_1.id, # 事前作成したスレッド
        role="user", # ユーザーからの問いかけ
        content=c
    )
    run_1_1 = client.beta.threads.runs.create(
      thread_id=thread_1.id,
      assistant_id=assistant_1.id
    )

    wait_for_assistant_response(thread_1.id, run_1_1.id)

    print_thread_messages(thread_1.id)

まとめ

Azure Open AIだとトークン数に引っかかるような大容量ファイルを分析するには、
Assistantsの利用が必要になってくると思います。

ただ、Azure AI Assistants APIはプレビュー版で、時間帯やリージョンによって、挙動が不安定になります。
(ファイルが読み込めないとか、技術的な問題が発生したとか、プレイグラウンドでもAPIでも)

なので、現状だと複数リージョン(マルチリージョン)であまり使われていなさそうな時間帯に、バッチ実行することで、データを処理するみたいな使い方が想定されます。

ヘッドウォータース

Discussion