6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[RAG] Context-Aware Caching: 会話型 AI における「文脈を理解するキャッシュ設計」

Posted at

1. 問題背景(The Problem)

多くの従来型キャッシュシステムは stateless な前提で設計されています。
つまり、「現在のリクエスト」だけを見ており、過去の文脈を考慮しません。

この設計は単純な検索や API では機能しますが、
会話型 AI(Chatbot / RAG / Agent) では致命的な問題を引き起こします。

会話は本質的に stateful だからです。

ユーザー:「VinFast President のエンジンは何ですか?」

ユーザー:「それはいくらですか?

2 つ目の質問は、前の文脈がなければ意味を持ちません。

しかし、もしキャッシュキーが次のように設計されていたらどうなるでしょうか。

"それはいくらですか?"

別のユーザーが、全く異なる文脈で「それはいくらですか?」と質問した場合でも、

  1. キャッシュヒット
  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)

  1. User Input を受け取る
  2. Conversation History を取得
  3. LLM で Refined Query を生成
  4. 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 は最適化ではなく「必須要件」 です。

ユーザーが「入力した文字列」ではなく、
「本当に聞きたかった質問」をキャッシュせよ。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?