🩼
Azure AI Assistants APIのファイルアップロード
やりたいこと
Azure AI Assistants APIをプレイグラウンドで試してから、APIで自動化しようとした際に、
ファイルアップロードのドキュメントの場所がイマイチ探しにくかったので、メモとサンプルコードを残します。
ファイルアップロードAPIのドキュメントとパラメータ
参考にした記事
サンプルコード
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%と減少幅が大きい。
"""
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