OpenAI APIのAssistants APIを試す

OpenAI APIのAssistants APIを試す

Assistants APIによるアシスタント構築 Python

11月6日のアップデートでOpenAI APIにAssistants APIという機能が追加された。
Pythonで簡単に試せそうなので実験。

ベータ版らしいが良い感じに動く。

1. 実装

公式ドキュメントをもとにオリジナルのアシスタントを作成。

python3.11
インストールしたライブラリはopenaiのみ。

  1. アシスタント設定まで
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は過去に実験したが非常に便利。

  1. アシスタントの実行まで
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. 結果の表示
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. 出力結果
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では導けない情報を得られるようにしたい。
今後試す。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×