Semantic Caching
セマンティックキャッシングは、新しいクエリが以前のクエリと同じ意味の場合、保存済みのLLM応答を返します。埋め込みを照合してモデル呼び出しを省略し、コストを削減します。
セマンティックキャッシュは、大規模言語モデル(LLM)などの生成モデルの応答を保存し、表現が異なっても、以前のリクエストと同じ意味を持つ新しいリクエストに再利用します。キャッシュは各プロンプトを埋め込みに変換し、保存済みプロンプトの中から最も類似したものを見つけ、類似度がしきい値を超えた場合に保存済みの回答を返します。キャッシュがヒットすればモデル呼び出し全体を省略できるため、レイテンシはミリ秒単位に短縮され、トークンも消費しません。意味に基づいて照合するので、「パスワードを忘れました」と「パスワードをリセットするにはどうすればよいですか?」は同じ回答を共有できます。プロンプトのテキストをキーとする完全一致キャッシュでは、回答を別々に保存する必要があります。Zillizは2023年、この用途向けにオープンソースのGPTCacheライブラリを公開しました。現在では、ベクトルデータベースやAPIゲートウェイが組み込み機能として提供しています。
セマンティックキャッシュの仕組み#
文埋め込みモデルが受信したプロンプトをエンコードし、ベクトル検索で、通常はコサイン類似度を使って、回答済みプロンプトの埋め込みと比較します。小規模なキャッシュはメモリに収まり、大規模なキャッシュは近似最近傍インデックスを備えたベクトルデータベースに保存されます。キャッシュがミスした場合は、モデルが新しい回答を生成し、新しいプロンプトの埋め込みと回答を通常は有効期限とともに保存します。
キャッシュキーでは、正しい回答を変える他のすべての要素も考慮する必要があります。異なるシステムプロンプト、モデルのバージョン、ユーザー権限レベル、または検索した文書セットに基づいて生成された回答は、別々のスコープに保存します。これにより、ある顧客のキャッシュ済み回答が別の顧客に提供されることはありません。鮮度にも同じ配慮が必要です。価格、ポリシー、またはソース文書が変わっても、古いバージョンに基づくエントリーは新しいプロンプトとの一致が続きます。そのため、各エントリーに有効期間を設定し、ソースデータが変わったときは該当するスコープを消去します。
類似度のしきい値の選び方#
しきい値によって、2つのプロンプトがどの程度異なっていても同じ回答を共有できるかが決まります。この例では、Sentence Transformersのall-MiniLM-L6-v2モデルをエンコーダーとして使用し、3件のエントリーを持つキャッシュを構成します。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
# Earlier prompts whose answers are already stored in the cache
cached = ["How do I reset my password?", "What are your opening hours?", "How do I cancel my subscription?"]
cached_embeddings = model.encode(cached)
# Each new prompt reuses the closest cached answer if it clears the threshold
queries = ["I forgot my password, how can I change it?", "When does the store open?", "How do I cancel my order?"]
for query in queries:
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, cached_embeddings)[0]
best = scores.argmax().item()
status = "hit" if scores[best] >= 0.7 else "miss"
print(f"{query} -> {cached[best]} ({scores[best]:.2f}, {status})")パスワードに関する言い換えのスコアは0.89で、正しくキャッシュがヒットします。営業時間に関する言い換えのスコアはわずか0.61で、ヒットしません。「注文をキャンセルするにはどうすればよいですか?」は「サブスクリプションをキャンセルするにはどうすればよいですか?」に対して0.71となり、誤った手順を返す可能性があります。埋め込みの類似度は共通する表現やトピックを測るため、この3つのケースを分けられる単一のしきい値はありません。本番環境のキャッシュでは、自社のトラフィックから得た言い換えペアでエンコーダーをファインチューニングする、カテゴリごとにしきい値を設定する、または候補となるキャッシュヒットをリランカーに渡し、回答を返す前に2つのプロンプトをまとめてスコア付けすることで、この差を縮めます。
セマンティックキャッシュの適用先#
セマンティックキャッシュは、多くのユーザーが同じ質問をし、回答の変化が少ない場面で効果を発揮します。たとえば、サポート用チャットボット、社内ヘルプデスク、安定したドキュメントを参照する検索拡張生成(RAG)アシスタントなどです。パーソナライズされたリクエスト、時間に左右されるリクエスト、創造的なリクエストでは、再利用した回答が誤りや繰り返しになるため、効果は限定的です。
LLMサービングで使われる他の2種類のキャッシュは、異なるレイヤーで機能します。
- プロンプトキャッシュ: モデルサーバーは、完全一致するプロンプトの接頭辞について計算済み状態を保存し、プリフィルを短縮します。モデルは引き続き新しい回答を生成します。
- KVキャッシュ: 1回の生成処理内で以前のトークンのキーと値を保持し、新しいトークンごとに再計算する必要をなくします。
セマンティック検索は同じ埋め込み検索を使ってクエリに関連する文書を取得し、セマンティックキャッシュは完成済みの回答を取得します。多くの場合、アプリケーションとモデルプロバイダーの間に位置するAIゲートウェイ内で動作します。
画像も同じ方法でキャッシュキーにできます。Ultralytics YOLOのembed()は各画像の特徴ベクトルを返すため、画像分類用に学習したYOLO26モデルが検索キーを提供できます。これにより、ほぼ重複するカメラフレームで、視覚言語モデルが以前に生成した説明を再利用できます。










