OpenAI の Assistants を使ってみた
https://gyazo.com/8e37484285f5546dec3e9ba50e5cfee4
今更ながら、 Assistants を利用したことがなかったので調査がてら触ってみた。
今回、 Tools はほぼ触れていない。
概要
1. アシスタントは、特定の指示を使用してOpenAIのモデルを呼び出し、その性格や能力を調整することができます。
2. アシスタントは複数のツールに並行してアクセスできます。これらのツールには、code_interpreterやfile_searchなどのOpenAIがホストするツールや、関数呼び出しを介して構築/ホストするツールが含まれます。
3. アシスタントは永続的なスレッドにアクセスできます。スレッドはメッセージ履歴を保存し、会話がモデルのコンテキスト長を超えるときにそれを切り詰めることで、AIアプリケーションの開発を簡素化します。スレッドは一度作成し、ユーザーが返信するたびにメッセージを追加するだけです。
4. アシスタントは、作成の一部として、またはアシスタントとユーザー間のスレッドの一部として、さまざまな形式のファイルにアクセスできます。ツールを使用する際、アシスタントはファイル(例:画像、スプレッドシートなど)を作成し、メッセージで参照するファイルを引用することもできます。
スレッドという概念が重要そうだ。
データアクセス
現在、APIを介して作成されたアシスタント、スレッド、メッセージ、およびベクトルストアは、それらが作成されたプロジェクトに限定されています。そのため、そのプロジェクトにAPIキーアクセスを持つ人は誰でも、そのプロジェクト内のアシスタント、スレッド、メッセージ、およびランを読み書きすることができます。
以下のデータアクセス制御を強く推奨します:
1. 認証を実装する。アシスタント、スレッド、メッセージ、およびベクトルストアの読み取りまたは書き込みを行う前に、エンドユーザーがそれを行う権限を持っていることを確認してください。例えば、エンドユーザーがアクセスできるオブジェクトIDをデータベースに保存し、APIでオブジェクトIDを取得する前にそれを確認します。
2. APIキーアクセスを制限する。組織内で誰がAPIキーを持ち、プロジェクトの一部であるべきかを慎重に検討してください。このリストを定期的に監査します。APIキーは、メッセージやファイルなどの機密情報の読み取りおよび変更を含む広範な操作を可能にします。
3. 別々のアカウントを作成する。複数のアプリケーション間でデータを分離するために、異なるアプリケーションごとに別々のプロジェクトを作成することを検討してください。
認証、権限管理をしっかりしようね、という話のようだ。
値段
モデルの利用料とは別で、 Code Interpreter や File Search でお金がかかる。
ただ、これは Assistants に限った話ではないが、会話の履歴を繋げるとその分トークン数が増えてしまうので、不要にスレッドを長くするのは危険だと思われる。
使ってみる
GUI からアシスタントを作成
API 経由でアシスタントを作成できるが、PlayGround が用意されているのでそこからアシスタントを作成してみた。
この後の作業も GUI 上で試すことができる。
temperature や top P パラメータも選択できるので、回答を固定したかったり、逆にばらつきを持たせたい場合の設定も簡単そうである。
API
アシスタントは Web UI から作ったが、 API 経由で作ることも可能。
今回は同期的に結果を取得するコードで試した。
code:main.py
from openai import OpenAI
import os
client = OpenAI()
assistant_id = os.getenv('ASSISTANT_ID')
thread = client.beta.threads.create()
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="質問内容"
)
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant_id,
)
if run.status == 'completed':
messages = client.beta.threads.messages.list(
thread_id=thread.id
)
print(messages)
print(messages.data0.content0.text.value) else:
print(run.status)
その他
スレッドという単位がかなりやっかい。
アシスタントに紐づくスレッドをまとめて取得、もしくはアシスタントごとに削除する API は用意されていないよう。
以下の方法でできると報告はあった。
ただ、 GUI 上で Thread の表示を ON にすることができる。
ON にすると左メニューにスレッドが表示されるので、そこで一覧を確認可能だが、編集や削除ができるわけではない。
また、アシスタントを削除してもスレッド自体は残るようだ。
後で見返すことができるという点では良いが、気持ち悪い。
削除したい場合は、先ほどの方法でスレッド一覧を手に入れるか、どこかに控えておき、後でまとめて削除すると良さそう。
もちろん、利用が終わったらすぐにスレッドを削除するコードを仕込んでも良いかと思われる。
code:main.py
from openai import OpenAI, NotFoundError
client = OpenAI()
thread_ids = [
'xxxxxxx',
'yyyyyyy',
]
for thread_id in thread_ids:
try:
my_thread = client.beta.threads.retrieve(thread_id)
client.beta.threads.delete(thread_id)
print(f"delted: {thread_id}")
except NotFoundError:
print(f"Thread not found: {thread_id}")
continue
使ってみて
今回は Tools をほぼ利用できなかったので、あくまでもシンプルな応答チャットボットとしてだけの感覚にはなるが、
履歴がそこまで重要でなければわざわざ Assistants を選択する意味がないのかなと思う(当然と言えば当然だが)
また、余分なメッセージは追加しない、スレッド管理をする、という点で煩わしさも残る。
一方で強力なツールであることに変わりはないので、今後も色々試していきたいと思う。