1. 問題背景(The Problem)
多くの従来型キャッシュシステムは stateless な前提で設計されています。
つまり、「現在のリクエスト」だけを見ており、過去の文脈を考慮しません。
この設計は単純な検索や API では機能しますが、
会話型 AI(Chatbot / RAG / Agent) では致命的な問題を引き起こします。
会話は本質的に stateful だからです。
例
ユーザー:「VinFast President のエンジンは何ですか?」
ユーザー:「それはいくらですか?」
2 つ目の質問は、前の文脈がなければ意味を持ちません。
しかし、もしキャッシュキーが次のように設計されていたらどうなるでしょうか。
"それはいくらですか?"
別のユーザーが、全く異なる文脈で「それはいくらですか?」と質問した場合でも、
- キャッシュヒット
- 以前の回答が返される
結果として、重大な誤情報が静かに発生します。
これはキャッシュ設計ミスによる Semantic Cache Poisoning の一種です。
2. 根本原因
問題は Redis や Memcached、VectorDB ではありません。
問題は Cache Key の設計 です。
Raw User Input の特徴
- 短い
- 曖昧
- 文脈依存
一方、会話は
- 履歴に依存する
- 話題(エンティティ)に依存する
- Intent に依存する
Stateless Cache × Stateful Conversation = バグの温床
3. 解決策(The Solution):Context-Aware Caching
核心となる原則はシンプルです。
Raw User Input を絶対にキャッシュキーにしない。
代わりに、
LLM によって文脈を補完した Refined Query をキャッシュキーにする。
4. Refined Query とは?
Refined Query とは、以下の特徴を持つ質問です。
- 曖昧さがない
- 単体で意味が通る
- Intent と対象が明確
生成元:
- 現在のユーザー入力
- 会話履歴
- アクティブな文脈
例:
| Raw Input | Refined Query |
|---|---|
| 「それはいくら?」 | 「VinFast President の価格はいくらですか?」 |
| 「必要な書類は?」 | 「ベトナムでバイク登録に必要な書類は何ですか?」 |
ここでの LLM の役割は
回答生成ではなく、文脈正規化(Context Normalization) です。
5. 推奨フロー(Recommended Flow)
- User Input を受け取る
- Conversation History を取得
- LLM で Refined Query を生成
- Refined Query を以下に利用
- Cache Key
- Vector Search Query
- ログ / 分析
User Input + History
↓
LLM による書き換え
↓
Refined Query
↓
Cache / Search / Answer
6. コード例
# Store cache using REFINED query (Context-Rich), not user input (Context-Poor)
refined_question = dispersed.refined_query
# 例:
# Raw input: "書類"
# Refined query: "ベトナムでのバイク登録に必要な書類"
store_with_language(
prompt=refined_question, # 文脈を含むセマンティックキー
response=formatted_response,
language=language
)
重要なポイント:
-
promptに raw input を使わない - キャッシュキーは 意味的に完結している必要がある
7. 得られる効果(Benefits)
- 文脈違いのキャッシュヒットを防止
- 回答精度の向上
- キャッシュ挙動が deterministic になる
以下のシステムに適合:
- Chatbot
- RAG
- Multi-step Agent
トレードオフ:
- キャッシュキー数が増える
- Semantic duplicate が発生する可能性
- → ストレージを犠牲にして正確性を取る
- → Production では正しい判断
8. Pros / Cons
Pros
- 文脈に強い
- デバッグしやすい
- 長い会話に対応可能
- Intent 単位でキャッシュできる
Cons
- Rewrite 用のトークンコスト
- キャッシュサイズ増加
- Rewrite 用 LLM の品質に依存
9. 発展的な設計案(Advanced)
- language タグ(vi, en, ja)を付与して多言語衝突を防止
- Refined Query + Intent + Domain のハッシュ化
- Raw Input はログ用途のみに限定
10. まとめ
LLM 向けキャッシュは、パフォーマンス最適化の話ではありません。正しさの問題です。
もしあなたのシステムが:
- 会話を扱う
- 文脈を持つ
- 曖昧な短文質問が多い
のであれば、Context-Aware Caching は最適化ではなく「必須要件」 です。
ユーザーが「入力した文字列」ではなく、
「本当に聞きたかった質問」をキャッシュせよ。