ストリーミングとキャッシングでAIのレイテンシを解決した方法

クライアントのためにチャットアシスタントを構築しましたが、動作は散々なものでした。

ユーザーが質問をしても、15秒間待たされ、画面には何も表示されません。そして、そのまま離脱してしまいます。クライアントも不満を感じていました。

問題はAIモデルではなく、私のコードにありました。ユーザーに何かを表示する前に、レスポンスがすべて完了するのを待っていたのです。

いくつかの修正を試みました。非同期処理(Async)では解決せず、完全一致のテキストキャッシングはFAQにしか通用しませんでした。トークン数を制限すると、回答の内容が使い物にならなくなってしまいました。

そこで、2つの手法を用いて解決しました。

  1. ストリーミング

ほとんどのAI APIはストリーミングをサポートしています。テキストの塊全体を待つのではなく、小さなチャンク(断片)として受け取ります。これらのチャンクが届くたびに、逐次表示することが可能です。

最初の単語は300ms以内に表示されます。回答の全文が表示されるまでには依然として時間がかかりますが、ユーザーは即座に進行状況を確認できます。これにより、ユーザーのエンゲージメントを維持できます。

  1. セマンティック・キャッシング

ユーザーはしばしば似たような質問をします。そこで、意味を理解できるキャッシュを構築しました。

文章の埋め込み(sentence embeddings)とベクトルデータベースを使用しています。APIを呼び出す前に、キャッシュ内に類似した質問が存在するかどうかを確認します。

一致するものがあれば、10msで回答を返します。これにより、ユーザーの30%においてAPI呼び出しが不要になりました。

結果:

• ストリーミングは、リアルタイムの進行状況を表示することでユーザーエクスペリエンスを向上させます。 • セマンティック・キャッシングは、コストを削減し、繰り返される質問に対するレイテンシを短縮します。

トレードオフ:

• ストリーミングはバックエンドを複雑にします。オープンな接続を管理しなければなりません。 • キャッシングには、ベクトルデータベースのような追加のハードウェアやソフトウェアが必要です。 • キャッシュの閾値(しきい値)の設定は困難です。閾値が高すぎると一致を見逃し、低すぎると誤った回答を返してしまいます。

速度が遅いことをAIモデルのせいにしないでください。データの扱い方を見直しましょう。

Source: https://dev.to/__c1b9e06dc90a7e0a676b/how-i-tamed-ai-api-latency-with-streaming-and-prompt-caching-g0

Optional learning community: https://t.me/GyaanSetuAi