Assistants APIによるアシスタント構築 Python
11月6日のアップデートでOpenAI APIにAssistants APIという機能が追加された。
Pythonで簡単に試せそうなので実験。
ベータ版らしいが良い感じに動く。
1. 実装
公式ドキュメントをもとにオリジナルのアシスタントを作成。
python3.11
インストールしたライブラリはopenai
のみ。
- アシスタント設定まで
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from openai import OpenAI import time
# OpenAI APIのクライアントを作成 client = OpenAI()
# 質問回答用のスレッドを作成 thread = client.beta.threads.create()
# アシスタントの設定 assistant = client.beta.assistants.create( name="最強数学マスター", instructions="あなたは数学の天才です。世界最強の数学力により人々に数学を教えます。", tools=[ {"type": "code_interpreter"}, {"type": "retrieval"} ], model="gpt-4-1106-preview" )
|
「最強数学マスター」を作成した。
tools=
のところに「code_interpreter」、「retrieval」が設定されている。
ここに関数を設定するとFunction Callingのように扱えるようだ。
Function Callingは過去に実験したが非常に便利。
Function CallingのParallel function callingを試す
OpenAI APIのParallel function callingによる複数関数呼び出しOpenAI APIにはFunction Callingという機能…
- アシスタントの実行まで
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| # ユーザーメッセージをスレッドに追加 message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content="教えて!「7x^2 - 21 = 14x」がわからない!!!!" )
# アシスタント実行時の指示 run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id, instructions="回答する際は語尾に「!」をたくさんつけましょう。" )
# アシスタントの実行 while(1): # ループしないと中身がユーザーメッセージだけのまま更新されず終わる(多分並列処理してる) run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id )
if(run.status) == "in_progress": # 実行中("in_progress")の場合は2秒待機 print("実行中") time.sleep(2) elif(run.status) == "completed": break # 実行完了("completed")の場合はループを抜ける
|
ブラウザ版のChatGPTとかでやるように
を設定。
ここまでは何の問題もないが「アシスタントの実行」で少しはまる。
コメントにも書いたがループしないとスレッドの中身がユーザーメッセージだけのまま更新されず終わる。
したがってwhile(1)でループ。
run.status
で現在のアシスタントの状態を判断してcompleted
ならループ脱出。
(本当はfailed
とかcancelling
とか他の状態にも対応すべきだけど妥協)
正しく動作すると、スレッドの中にアシスタントのメッセージが次々と追加されていく。
- 結果の表示
1 2 3 4 5 6 7 8 9 10 11
| # 実行結果の取得 messages = client.beta.threads.messages.list( thread_id=thread.id ) data = messages.data
# 実行結果の出力 for d in data[::-1]: # 0から昇順に過去のメッセージが入っているので逆順ループ role = d.role content = d.content[0].text.value print(f"[{role}]:\n{content}\n")
|
結果を表示する。
深い階層に入っていて取り出すのが面倒。
今回の場合は以下のような結果となる。
- 出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 実行中... 実行中... 実行中... 実行中... 実行中... [user]: 教えて!「7x^2 - 21 = 14x」がわからない!!!!
[assistant]: この方程式「7x^2 - 21 = 14x」を解くには、まず方程式を0に等しい形に整理し、その後に解を求めますね!!!
まず、方程式の右辺にある「14x」を左辺に移行して、 \[ 7x^2 - 14x - 21 = 0 \] とします。
次に、この2次方程式を解くために、因数分解を試みるか、2次方程式の解の公式(もしくは別の方法)を使って解を求めます。
因数分解ができるか試してみましょう!もし因数分解が難しい場合は、2次方程式の解の公式を使って解きましょう!じゃあ、計算してみますね!!!!!
[assistant]: 方程式「7x^2 - 14x - 21 = 0」を解くと、解は \( x = -1 \) と \( x = 3 \) です!!!!
これらが方程式の解になりますね!何か他にわからないことがあればいつでも聞いてくださいね!!!!!
|
指示通り「!」をふんだんに用いていることが分かる。
計算結果も正しいが、問題がそれほど複雑ではないので素のGPT-4でも解けるような気もする。
実力を測るためにはやはり「Function Calling」を使って素のGPT-4では導けない情報を得られるようにしたい。
今後試す。