ストリーミングとキャッシングでAIのレイテンシを解決した方法
クライアントのためにチャットアシスタントを構築しましたが、動作は散々なものでした。
ユーザーが質問をしても、15秒間待たされ、画面には何も表示されません。そして、そのまま離脱してしまいます。クライアントも不満を感じていました。
問題はAIモデルではなく、私のコードにありました。ユーザーに何かを表示する前に、レスポンスがすべて完了するのを待っていたのです。
いくつかの修正を試みました。非同期処理(Async)では解決せず、完全一致のテキストキャッシングはFAQにしか通用しませんでした。トークン数を制限すると、回答の内容が使い物にならなくなってしまいました。
そこで、2つの手法を用いて解決しました。
- ストリーミング
ほとんどのAI APIはストリーミングをサポートしています。テキストの塊全体を待つのではなく、小さなチャンク(断片)として受け取ります。これらのチャンクが届くたびに、逐次表示することが可能です。
最初の単語は300ms以内に表示されます。回答の全文が表示されるまでには依然として時間がかかりますが、ユーザーは即座に進行状況を確認できます。これにより、ユーザーのエンゲージメントを維持できます。
- セマンティック・キャッシング
ユーザーはしばしば似たような質問をします。そこで、意味を理解できるキャッシュを構築しました。
文章の埋め込み(sentence embeddings)とベクトルデータベースを使用しています。APIを呼び出す前に、キャッシュ内に類似した質問が存在するかどうかを確認します。
一致するものがあれば、10msで回答を返します。これにより、ユーザーの30%においてAPI呼び出しが不要になりました。
結果:
• ストリーミングは、リアルタイムの進行状況を表示することでユーザーエクスペリエンスを向上させます。 • セマンティック・キャッシングは、コストを削減し、繰り返される質問に対するレイテンシを短縮します。
トレードオフ:
• ストリーミングはバックエンドを複雑にします。オープンな接続を管理しなければなりません。 • キャッシングには、ベクトルデータベースのような追加のハードウェアやソフトウェアが必要です。 • キャッシュの閾値(しきい値)の設定は困難です。閾値が高すぎると一致を見逃し、低すぎると誤った回答を返してしまいます。
速度が遅いことをAIモデルのせいにしないでください。データの扱い方を見直しましょう。
Optional learning community: https://t.me/GyaanSetuAi