Assistants APIを低コストで使う方法

トレンド
この記事は約8分で読めます。

2023年11月6日にOpenAI DevDayが開催され、ChatGPTの新機能「Assistants API」が新たにリリースされました。

これまでのAPIは、Completionsと呼ばれる方式でしたが、これからはAssistants APIの方式が主流になりそうです。Assistants APIの特徴の一つに、会話履歴をプロンプトに含めなくても一貫性のある回答が得られるというのがあります。

Completionsでは、会話履歴をプロンプトに含める為の処理が煩雑だった、会話が進むごとにプロンプトが肥大化し高コストになっていた。Assistants APIを使えばこれらが解消するのですばらしい。

これは本当でしょうか?

結論を言うと、前者はその通りですが、後者は間違いです。しかも、Assistants APIの仕組みを理解せずに安易に実装してしまうと、とんでもない請求が来るかも知れません。

この記事では、Assistants APIのコストに焦点を当てた解説を行います。

Assistants APIはCompletionsに比べ多機能であることから、いづれCompletionsはオワコン化しそうです。

一方で、第二世代Completionsとも言えるAssistants APIは高機能であるが故にCompletionsと比べ方式が複雑で全容を理解することが難しい面もあります。

APIドキュメントを一見すると、実装の流れとしてまずアシスタントを作成し、スレッドを作成し、メッセージを作成し、RUNすれば良くて、会話履歴はスレッドで記憶するから、メッセージ(プロンプト)に会話履歴を含める必要が無いんだと一応の理解ができます。

ここで注意が必要なのが、会話履歴をプロンプトに含めて送信しないのだから、会話履歴のコストは発生しないだろうという思い込みです。

実際は、Completions方式と同様Assistants APIでも会話履歴のコストが発生します。

これに気付いたユーザーはOpenAI公式の開発者フォーラムでも発信しています。

デベシュザチャンプさんのテスト結果では、確かにプロンプト毎にContext Tokens(累計)が増えていることが確認できますが、具体性に欠けていたので実際にテストしてみました。

■テストに使用するAPIリクエスト

Create assistantモデルに応じたアシスタント(インスタンス)を作成
例え)GPT3.5のAIアシスタント確保、GPT4のAIアシスタント確保。
Create threadスレッド(トークルーム)を作成
例え)仕事のトークルーム確保、趣味のトークルーム確保。
Create messageメッセージ(トークメモ)を作成
例え)何のお仕事ですか?、あなたの趣味は何ですか?
Create runGPTモデルに質問や命令を送信
例え)トークメモの発信。
Retrieve runAPIリクエストの結果を取得
例え)アシスタントからの回答問い合わせ。
List messagesメッセージのリストを取得
例え)アシスタントからの回答一覧を取得。
Delete threadスレッド(トークルーム)を削除
例え)仕事のトークルーム解放、趣味のトークルーム解放。
Delete assistantアシスタント(インスタンス)を削除
例え)GPT3.5のAIアシスタント解放、AIGPT4のアシスタント解放。

■テストに使用するプロンプト

日本語全角の足し算で、一貫性のある(会話の流れを引き継ぐ)質問文。
1回目:1+1=
2回目:その答え+1=
3回目:その答え+1=

■テスト結果1

実行順使用APIコンテキストトークン数生成トークン数質問回答
1Create assistant00
2Create thread00
3Create message001+1=
4Create run2410
5Retrieve run00
6List messages001+1=2です。
7Create message00その答え+1=
8Create run4910
9Retrieve run00
10List messages002+1=3です。
11Create message00その答え+1=
12Create run7410
13Retrieve run00
14List messages003+1=4です。
15Delete thread00
16Delete assistant00

コンテキストトークン数(質問に要するトークン)、生成トークン数(回答に要するトークン)は都度API実行時のトークン数であり、累計ではありません。

■テスト結果1の所見

テスト結果では、初回の質問でのトークン数24に対して、2回目の質問ではトークン数49であり、2回目の質問文字数だけのトークン数では無いことがわかります。3回目の質問でも同様な結果でした。

一方、回答でのトークン数は常に10であり、3回の回答ともに文字数は同じであるので妥当な結果です。

以上のことから、プロンプトに会話履歴が含まれている可能性が高いと言えます。

ここで少し補足します。生成トークン数が何故List messagesでは無くCreate runで発生しているのか疑問を持つ人がいるかも知れません。

List messagesでは会話履歴全てが送信されるので通信量は多くなりますがトークン消費とは別です。なので何度List messagesを実行してもトークン消費からするとノーコストになります。

Assistants APIでのコストの抑え方

プロンプトに会話履歴を含むと高コストになります。テストした手順では、一貫性が不要な会話の場合も高コストになってしまいます。ではコストを抑えるにはどうすれば良いでしょうか。Completions方式にするのも一つの手ですが、やがて非推奨になるかも知れないリスクがあるのでAssistants APIで実現したいところです。

どのようにやるのか?は簡単で、スレッドを毎回削除するだけです。ChatGPTのブラウザ画面でもよく使う「New chat」に相当します。合わせてアシスタントも削除しても構いません。

アシスタントやスレッドの作成や削除は、テスト結果からもわかるようにゼロトークンノーコストです。一貫性の不要な会話の場合は、この手順を強く推奨します。

試しに会話毎にスレッドを削除するようにしたテスト結果がこちらです。

■テスト結果2

実行順使用APIコンテキストトークン数生成トークン数質問回答
1Create assistant00
2Create thread00
3Create message001+1=
4Create run2410
5Retrieve run00
6List messages001+1=2です。
7Delete thread00
8Create thread00
9Create message00その答え+1=
10Create run26156
11Retrieve run00
12List messages00長いので#1参照
13Delete thread00
14Delete assistant00

#1(AIの回答)・・・「その答え+1」というフレーズだけでは、具体的な答えが何であるかを知ることはできません。もし特定の問題や数値があれば、その答えに1を加えた数値を提供することができます。例えば、「答えが4である」という場合、4 + 1 = 5となります。具体的な問題や文脈を教えていただければ、もっと詳しい回答をすることができます。

■テスト結果2の所見

1回目と2回目の質問でコンテキストトークン数がほぼ変わらないことがわかります。これは質問毎のコストしか発生していないことを意味します。

生成トークン数は劇的に増えていますが、会話毎にスレッドを削除することで一貫性のある会話ができなくなり、2回目の質問の意味をAIが汲み取れなくなった結果、質問内容が不明である旨の長文の回答をしている為です。

以上のことから、会話毎にスレッドを削除することでトークン数を少なくできることが言えます。

■テスト結果の考察

それぞれのテスト結果をグラフにしたのが以下です。X軸が会話回数、Y軸は消費トークン数、青線がテスト結果1、赤線がテスト結果2です。

テスト結果1では、会話回数の増加に伴いトークン数も比例して増えています。一方、テスト結果2では会話回数が増えてもトークン数が変わりません。

一貫性のある会話が不要である場合、テスト結果1とテスト結果2のトークン量の差分が不要なゴミトークンとなります。

※編集前のグラフはChatGPTが作成しています。

まとめ

Assistants APIのコストを理解せずに安易に実装してしまうと、余計なコストがかかってしまうことをテスト結果を交えて解説しました。

Assistants APIはいろいろな機能を持つ魅力的な機能ですが、使い方を誤ると残念な結果になりかねないので、用途に応じて機能や使い方を適切に選択することが重要です。

又、実装する上でどのAPIリクエストを使えばコストを消費するのかも重要な指標となりますので、本記事のテスト結果を参考にして頂ければと思います。

Assistants APIと言えば、こちらの記事もいかがでしょうか。

コメント