この記事の音声は準備中です。
音声の一覧・再生リストへセマンティックキャッシュと応答再利用
この記事の目的
「同じような質問に、以前の答えを返す」応答キャッシュを、誤ヒット(似ているが違う質問に、間違った答えを高速に返す)を制御しながら設計できるようになります。完全一致から意味的類似までのキャッシュ階層を理解し、何をキャッシュしてよいか・どう無効化するか・どう計測するかを判断できる状態を目指します。入力側のプロンプトキャッシュプロンプトの固定部分(前方一致)の処理結果を再利用し、入力コストと応答開始までの時間を削減する仕組み。固定部分を先頭に置くプロンプト構造が前提。(コスト管理)とは別の、出力(応答)の再利用が主題です。
対象読者
- LLM アプリのコスト・レイテンシを下げるため、応答キャッシュの導入を検討している運用・実装担当
- 「よくある質問には即答したい」が、誤った答えを配ってしまうリスクを制御したいテックリード
前提知識
- 埋め込み(embeddings)の選定と運用 — 意味的類似の土台(埋め込みテキストや画像を、意味的な近さが距離に対応する数値ベクトルに変換したもの。RAG・記憶・分類の土台で、「何が近いか」はモデルで変わるため自社データで評価して選ぶ。モデル変更は全チャンクの再インデックスを伴う。 + しきい値)
- コスト管理 — プロンプトキャッシュ(入力側)との違い(本記事は出力側の再利用)
本文
概要: 入力側キャッシュと出力側キャッシュは別物
まず用語を分けます。LLM の「キャッシュ」には 2 種類あり、本記事は後者です。
| 種類 | 何を再利用するか | 正本 |
|---|---|---|
| プロンプトキャッシュ(入力側) | プロンプト固定部分の処理結果を再利用し、入力コスト・初回応答時間を削減 | コスト管理 / 注意機構とコンテキストウィンドウの仕組み |
| 応答キャッシュ(出力側・本記事) | 過去の最終応答そのものを、同じ/似た入力に返す | 本記事 |
応答キャッシュの狙いは、モデルを呼ばずに答えを返すことです。呼ばなければコストもレイテンシもゼロに近づきます。ただし「似ているが違う」入力に古い答えを返す誤ヒットのリスクがあり、その制御が設計の核心です。
キャッシュの階層: 完全一致 → 正規化一致 → 意味的類似
応答キャッシュは、キーの厳しさで 3 段階に分けられます。厳しいほど安全(誤ヒットが少ない)、緩いほどヒット率が上がる代わりに危険が増します。
| 階層 | キー | ヒット率 | 誤ヒットリスク |
|---|---|---|---|
| 完全一致 | 入力文字列が完全一致 | 言い換えは拾わない | 同じ権限・文脈・知識版で同じ答えを返せることが前提 |
| 正規化一致 | 用途上、意味を変えないと確認した表記変換の後に一致 | 確認済みの表記差を拾う | 正規化が意味を失うと誤ヒットする |
| 意味的類似(セマンティック) | 埋め込みの距離がしきい値内 | 言い換えも拾いうる。分布・しきい値次第 | あり(類似 ≠ 同一) |
正規化では語順を落としません。A pays B と B pays A は同じ単語でも支払う側が逆です。大小文字・空白も、コード・識別子・引用文では意味を変ええます。例えば「単一の選択肢名の前後空白は無視する」と入力仕様で決めた場合にだけ、その変換をキーへ使います。自然言語全体に一律の安全な正規化があるとは扱いません。
セマンティックキャッシュ(semantic cache)は、この 3 段目 — 入力を埋め込みベクトルにし、過去の質問と意味的に近ければ同じ応答を返す方式です。完全一致を超えた再利用ができる一方、後述の本質的リスクを抱えます。まず完全一致・意味を保存する正規化で足りないかを確認し、それでも必要なときにセマンティックを評価します(Redis の実装ガイド )。
セマンティックキャッシュの構造と本質的リスク
セマンティックキャッシュの仕組みはシンプルです。
- 構造: 入力を埋め込みでベクトル化し、キャッシュ済みの質問ベクトルと類似度を計算。しきい値内で最も近いものがあれば、その応答を返します
- 本質的リスク(類似 ≠ 同一): 意味的に近くても、答えは違うことがあります。「東京の明日の天気は?」と「大阪の明日の天気は?」は埋め込み上は近いですが、答えは別です。「解約できますか?」と「解約したくないのですが?」も近くて逆です。しきい値を緩めるほど、この誤ヒットが増えます
- 誤ヒットの被害を設計する: 誤ヒットは「速く・確信を持って・間違った答えを返す」ため、素の間違いより気づきにくく厄介です。しきい値は「ヒット率」でなく「誤ヒットの被害コスト」で決めます。間違えても軽微な用途は緩く、間違えると損害が出る用途は厳しく(またはセマンティックを使わない)
キャッシュしてよい応答の判断
そもそもキャッシュに向く応答と向かない応答があります。向かないものをキャッシュすると、事故になります。
- 向く: 決定的(同じ入力に同じ答えでよい)・非パーソナライズ(誰に対しても同じ)・鮮度不問(古くならない)。例: 一般的な用語説明、定型 FAQ、変わらない仕様の質問
- 向かない: パーソナライズされた応答(ユーザーの文脈・権限で変わる)・鮮度が要る情報(残高・在庫・当日の状況)・非決定的でよい創作系。これらをキャッシュすると、他人の答え・古い答え・不適切な使い回しになります
- 判断を明示する: 「この応答はキャッシュ可か」を、パーソナライズ・鮮度・決定性の 3 軸で判断し、キャッシュ対象を絞ります。全応答を一律にキャッシュしないことが肝心です
無効化戦略
キャッシュは古くなるため、いつ捨てるかを設計します。放置は「古い答えを返し続ける」事故につながります。
- 知識源の更新と連動: RAG外部の知識ソースを検索し、結果を LLM の入力に加えて回答の根拠にする手法。検索の判断を Agent に任せる構成は Agentic RAG と呼ばれる。 の参照ドキュメント・FAQ・仕様が更新されたら、関連するキャッシュを無効化します。知識が変わったのに古い応答を返すのは典型的な事故です
- プロンプト・モデルの更新と連動: システムプロンプトを変えた・モデルを更新したら、応答の内容が変わりうるため、キャッシュを無効化します(バージョニング・デプロイ・モデル更新追従のイベントにキャッシュ無効化を組み込む)
- TTL(有効期限)を置く: 明示的な無効化に加え、安全網として有効期限を設けます。「最悪でも N 時間で自然に消える」状態にしておきます
テナント・ユーザー境界
マルチテナント複数のテナント(顧客・部門)が同一の Agent 基盤を共有する構成です。データ・設定・容量・費用を分けて設計し、認証キーを分けた場合も上流の共有上限と容量の隔離を別に確認します。・マルチユーザーのシステムでは、キャッシュの境界を誤ると情報漏えいになります。
- キャッシュキーに境界を含める: テナント ID・ユーザーの権限スコープをキャッシュキーに含め、他テナント・他ユーザーの応答が混ざらないようにします(マルチテナント設計とテナント分離の分離原則の実装点)
- パーソナライズ応答は共有しない: ユーザー固有の情報を含む応答は、そもそも共有キャッシュに載せません(前述の「向かない」)。権限で見え方が変わるデータは特に危険です
- 境界の誤りは重大事故: キャッシュ経由の情報漏えいは、アクセス制御をすり抜けます。境界設計はコスト最適化より優先します
計測: ヒット率と品質低下を両方見る
キャッシュの効果は、片方だけ見ると誤ります。
- ヒット率だけ見ない: 「ヒット率が上がった=成功」ではありません。しきい値を緩めればヒット率は上がりますが、誤ヒットも増えます。ヒット率と誤ヒット率・品質低下を並べて見ます
- 誤ヒットを測る仕組み: サンプリングして「キャッシュ応答が、実際にモデルを呼んだ応答と乖離していないか」を評価します(Agent 評価の基礎の考え方をキャッシュ検証に適用)
- コストと品質のトレードオフを可視化: 削減できたコスト・レイテンシと、誤ヒットによる品質低下を並べて、しきい値・対象を調整します
実務での注意点
アンチパターン
- 全応答を一律にセマンティックキャッシュする → パーソナライズ・鮮度必須の応答まで使い回して事故になる → 決定性・非パーソナライズ・鮮度不問の応答に絞る
- 語順・大小文字・空白を無条件に消す → 支払方向やコードの意味が異なる入力が同じキーになる → 入力仕様で意味を保存すると確認した変換だけを適用する
- しきい値をヒット率だけで決める → 誤ヒットが増え、速く確信を持って間違える → 誤ヒットの被害コストでしきい値を決める
- 知識源・モデル更新時にキャッシュを無効化しない → 古い答えを返し続ける → 更新イベントに無効化を連動させ、TTL も置く
- キャッシュキーにテナント/権限境界を含めない → 他ユーザーの応答が漏れる → キーに境界を含め、パーソナライズ応答は共有しない
- ヒット率だけを KPI にする → 品質低下を見逃す → 誤ヒット率・品質低下を併せて計測する
チェックリスト
- 入力側(プロンプトキャッシュ)と出力側(応答キャッシュ)を区別している
- まず完全一致・正規化一致で足りるかを確認し、必要な場合だけセマンティックにした
- 正規化の意味保存を用途ごとに確認し、語順・否定・固有名詞・コードの差を区別するケースで検証した
- しきい値を「誤ヒットの被害コスト」で決めている
- キャッシュ対象を決定性・非パーソナライズ・鮮度不問の 3 軸で絞った
- 知識源・プロンプト・モデルの更新にキャッシュ無効化を連動させ、TTL も置いた
- キャッシュキーにテナント・権限境界を含め、パーソナライズ応答を共有していない
- ヒット率と誤ヒット率・品質低下を両方計測している
関連トピック
- コスト管理 — プロンプトキャッシュ(入力側)とトークン経済(本記事は出力側)
- 埋め込み(embeddings)の選定と運用 — 意味的類似の土台
- 注意機構とコンテキストウィンドウの仕組み — プロンプトキャッシュ・KV キャッシュ生成中に各トークンの中間表現(Key / Value)を保存・再利用する仕組みで、プロンプトキャッシュの実体。中間表現は先頭からの並びに依存するため、キャッシュは前方一致でしか効かない。の仕組み
- バージョニング・デプロイ・モデル更新追従 — キャッシュ無効化を連動させるイベント
- マルチテナント設計とテナント分離 — キャッシュ境界の分離原則
- Agent 評価の基礎 — 誤ヒット・品質低下の計測
- LLM ゲートウェイの設計 — キャッシュをゲートウェイ層に集約する実装点
参考資料
- Redis: Semantic cache — 類似度しきい値・名前空間・保持期限を持つ応答キャッシュの実装例。効果の数値は自分の質問分布で測定する(アクセス日: 2026-09-10)
TODO・未確認事項
なし