ChatGPT新機能"Assistants API"のRetrieval機能をpythonで試してみる

## はじめに
2023年11月7日OpenAIから数々のアップデートが発表されました。

そのアップデートの一つであるAssistants APIは、APIを利用することにより独自のアプリケーション内でAIアシスタントを構築できます。

Assistants APIは、

- Code Interpreter（コードインタープリター）
- Retrieval（あらかじめアップロードしたデータを元に検索して応答する機能）
- Function Calling

の3つの機能を提供しており、それぞれの機能を使用して回答を得ることができます。

Assistants APIはまだベータ版ですが、 [Playground](https://platform.openai.com/playground)で試してみることができます。

アシスタントAPIを使用すると、自分のプログラムとAIアシスタントを連携することができます。

この記事では、Playgroundで作成したAIアシスタントを、pythonで呼び出して、Retrievalの機能を実行するサンプルコードについて説明します。

サンプルコードはこちら（Google Colab）
https://colab.research.google.com/drive/16XvzZXHlU1aO8GZHGbvGCpi08MR150Pz?usp=sharing

## PlaygroundでAIアシスタントを作成する
Playgroundにログインします。
https://platform.openai.com/
Gooleアカウントでもログインできます。

左のメニューのPlaygroundを選択します。
![スクリーンショット 2023-11-11 19.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/4582d851-455a-c7cb-b20c-171be59dcc7d.png)

Assistantsを選択します。
![スクリーンショット 2023-11-11 19.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/38e981ff-1c95-278c-16cb-abb6f36fd7b8.png)

＋Create assistantをクリックします
![スクリーンショット 2023-11-11 19.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/51b3145c-53a6-87eb-683e-7ff7aace6556.png)

こんな感じで設定していきます。
![スクリーンショット 2023-11-11 19.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/e1167409-4cfd-bf01-cae1-d56532470457.png)

Modelで選択できるモデルは下記の通りです。
アップロードしたファイルに基づいてアシスタントに回答して欲しい場合は
gpt-4-1106-preview　か　gpt-3.5-turbo-1106　を選択する必要があります。
そのほかのモデルではダメでした。
![スクリーンショット 2023-11-11 19.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/91fb35dd-4978-f512-e608-fe5431e8cf1e.png)

## コードの処理の概要
### シーケンス図
文章で説明するのは伝わりにくいと思い、シーケンス図で表現してみました。
![スクリーンショット 2023-11-11 18.48.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/b7bc52f0-9bb2-54f4-3574-7ba22f6b49ad.png)
### ざっくり説明
ざっくりとした手順として
- アシスタントに問い合わせするため質問文のスレッドと、そのスレッドにぶら下がるメッセージを作成する
- メッセージにぶら下がるアノテーション"annotation"(引用）を作成
- 作成した質問文のスレッドを、事前に用意したアシスタントに送る
- アシスタントが回答を生成し終わったかどうかを、一定間隔（このコードでは0.5秒おき）で確認する
- アシスタントが回答を生成し終わると、回答が返ってくる

注意として、アシスタントに質問文を送ったら、アシスタントが回答の生成を終えたかどうかを、自分で確認する必要があることです。
ここの処理は　wait_for_run_completion()　で行ってます。
OpenAIによると、この辺の仕様も近いうちにアップデートして、もっとスマートな仕様になるとのことです。
なので、このコードで説明しているやり方は、暫定的なものと考えていただければ幸い。

my_assistant_id = Playgroundで作成したアシスタントのIDを指定します。
アシスタントIDはPlaygroundの左メニューでAssitantsを選ぶと、作成したAIアシスタントの一覧が表示されます。
その一覧の中のIDの項目がアシスタントのIDとなります。

![スクリーンショット 2023-11-11 20.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/3b4d1c68-95b3-70bb-c865-4b84172ab86d.png)


## 考察
### コードについて
OpenAIのサンプルのコードはAPIでアシスタントを作成する方法を説明していたのですが、Playgroundで作成したアシスタントを呼び出すサンプルがなかったので、ちょっと試行錯誤で云々してました。

スレッドには複数のメッセージを入れることができます。
アシスタントへの質問文を複数のメッセージに分けて送ることもできます。
このコードでは、最初のメッセージのみアシスタントに送るようにしています。
複数のメッセージには対応しておりませんので、ご了承ください。

アシスタントが回答を生成し終わったかどうかを、自分で一定間隔で確認しなくてはいけない仕様は、不便ですね。
もっとスマートなコードがあるかと思いますが、ここは勘弁してください。
OpenAIもここは改善していきたいと、ドキュメントにあったので、今後のアップデートに期待です。


### コストについて
気になるAssistants APIの費用は
1つのアシスタントに対して1日0.20ドル
→1ドル150円なら1日30円、1ヶ月で900円

~~アシスタントに対してエンドユーザーが何回呼び出しても、料金は変わりません。~~

ただ、GPTsのようにたくさん作って放置してしまうと、請求が結構なものになりますので、要注意です。
[OpenAIの費用に関する資料](https://help.openai.com/en/articles/8550641-assistants-api#h_061c53c67a)

(2023.11.15追記）
上記のコストはRetrieval機能だけのコストでした。
エンドユーザーが呼び出せば呼び出すほと、コストがかかります。
また、Assistants APIで導入された「スレッド」という概念が、結構ヤバめ。

https://note.com/nike_cha_n/n/n65a6101d59d7?sub_rt=share_pw

# おわりに
GPTsで簡単に独自のチャットボットを作成して、ChatGPT Plusに課金している方にはシェアできるようになりました。

とはいえ、ChatGPTの日本人の普及率を考えると、ほんの一部の方のみGPTsの恩恵に与れない気がします。
もしかしたらOpenAIは、この機能をキラーとして、ChatGPT Plusを普及させる戦略なのかな？
個人的には懐疑的ですが、CEOのサム・アルトマンさんはもっと上をいくことを考えているかもしれません。
GPTsのチャットボットを公開して収益化が図れるようになるプラットホーム"GTP Store"の発表を待つしかないですね。 
→2023年11月末にはリリースの予定です。

ChatGPT Plusを月30ドル払ってまで課金することを躊躇しているユーザー層に対して、Assistants APIをLINEに連携させて、ChatGPTの機能を多くの人に身近に感じてもらうのはアリと個人的には考えてます。

日本のLINE普及率80％以上は、群を抜いています。しかも若年層から高齢者層まで幅広い世代に普及しているので、プラットホームとして活用しない手はないです。

PythonでAssistants APIとLINE Messaging APIを連携させましたので、近いうちにコードと資料をシェアします。

ここまでご精読いただき、ありがとうございました。

# 参考資料
OpenAI Assistants APIのドキュメント
https://platform.openai.com/docs/assistants/overview