CAGとは？RAGとの違いと効果的な活用法



生成AIが普及する中で、ユーザーの期待値・システム負荷・コスト制約によって最適解が変わります。特に注目されているのが、RAG（Retrieval-Augmented Generation）と、そこから進化した形であるCAG（Cached Augmented Generation）です。

---

## 1. RAGとCAGの概要

### RAG（Retrieval-Augmented Generation）とは

* ユーザーの質問をもとに、外部データソースから関連情報を検索（retrieval）し、その情報を元にAIが回答を生成（generation）する方式。
* LLM単体の知識に依存せず、**最新情報にアクセス可能**という強みがある。

### CAG（Cached Augmented Generation）とは

* RAGの派生技術で、**過去の検索・生成結果をキャッシュとして保存**し、同じもしくは類似の質問に再利用する仕組み。
* 処理の高速化とAPIコスト削減を目的とする。

---

## 2. RAGとCAGの違い

### RAGの処理フロー

```mermaid
graph TD
    A[ユーザーの質問] 
    B[質問を埋め込み → 類似検索] 
    C[関連ドキュメントの取得] 
    D[LLMによる回答生成] 
    E[回答]

    A --> B
    B --> C
    C --> D
    D --> E
```

### CAGの処理フロー

```mermaid
graph TD
    A[ユーザーの質問]
    B[キャッシュに同一/類似の質問があるか確認]
    C[キャッシュから回答を取得]
    D[RAG処理]
    E[結果をキャッシュに保存]
    F[回答]

    A --> B
    B -->|はい| C --> F
    B -->|いいえ| D --> E --> F
```

---

## 3. RAGとCAGの比較表

| 項目       | RAG             | CAG                 |
| -------- | --------------- | ------------------- |
| 処理内容     | 毎回リアルタイムで検索・生成  | 同一または類似質問はキャッシュを利用  |
| 処理速度     | 遅くなりがち（検索 + 生成） | 高速（ヒットすれば即答）        |
| コスト      | APIコール数が多くコスト高  | キャッシュによりコスト抑制       |
| 最新情報への対応 | 常に最新情報を反映可能     | 古いキャッシュを使う可能性あり     |
| 適したケース   | 高い精度が必要な場面      | 質問が繰り返されるFAQ、サポートなど |

---

## 4. CAG導入の技術的ポイント

* **キャッシュのキー戦略**
  単純な文字列一致だけでなく、**セマンティック類似性**（ベクトル検索）を用いたキャッシュ検索が有効。

* **有効期限（TTL）管理**
  情報が古くなりすぎないように、キャッシュにはTTL（Time To Live）を設定。

* **キャッシュ層の選定**

  * 軽量なら：`functools.lru_cache`, `joblib.Memory`
  * 本格運用なら：Redis, SQLite, Pinecone（セマンティックキャッシュ向き）

* 例: **joblib.Memory**
```python
from joblib import Memory
import time
import os
import shutil

# キャッシュ用の保存先ディレクトリ
cache_dir = './cachedir'
memory = Memory(location=cache_dir, verbose=0)

# 実際のRAG処理（ここではダミーで実装）
@memory.cache
def rag_pipeline(question: str):
    print("🟡 RAG処理中...（キャッシュされていない）")
    time.sleep(2)  # 疑似的な処理時間
    return f"「{question}」に関するAIの回答（生成済み）"

# 使用例
if __name__ == "__main__":
    q1 = "Pythonとは何ですか？"
    q2 = "Pythonとは何ですか？"   # 同じ質問（キャッシュヒット）
    q3 = "Pythonの用途は何ですか？" # 異なる質問（キャッシュミス）

    print(f"1回目の質問: {q1}")
    start_time = time.time()
    response1 = rag_pipeline(q1)  # 初回：RAG処理が実行され、キャッシュされる
    end_time = time.time()
    print(f"回答1: {response1} (処理時間: {end_time - start_time:.2f}秒)")

    print(f"\n2回目の質問: {q2}")
    start_time = time.time()
    response2 = rag_pipeline(q2)  # 2回目：キャッシュから即座に返される
    end_time = time.time()
    print(f"回答2: {response2} (処理時間: {end_time - start_time:.2f}秒)")

    print(f"\n3回目の質問: {q3}")
    start_time = time.time()
    response3 = rag_pipeline(q3)  # 3回目：異なる質問なのでRAG処理が実行され、キャッシュされる
    end_time = time.time()
    print(f"回答3: {response3} (処理時間: {end_time - start_time:.2f}秒)")
```

* 出力
```text
1回目の質問: Pythonとは何ですか？
🟡 RAG処理中...（キャッシュされていない）
回答1: 「Pythonとは何ですか？」に関するAIの回答（生成済み） (処理時間: 2.00秒)

2回目の質問: Pythonとは何ですか？
回答2: 「Pythonとは何ですか？」に関するAIの回答（生成済み） (処理時間: 0.00秒)

3回目の質問: Pythonの用途は何ですか？
🟡 RAG処理中...（キャッシュされていない）
回答3: 「Pythonの用途は何ですか？」に関するAIの回答（生成済み） (処理時間: 2.00秒)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/8276a0bb-7343-4a5c-8a21-8b99c32058f1.png)


---

## 5. CAG活用事例

| 業種・領域     | 利用方法例                |
| --------- | -------------------- |
| カスタマーサポート | よくある質問への高速対応         |
| 社内ヘルプデスク  | 技術用語や社内ルールの繰り返し検索    |
| 教育分野      | 同じ質問が多いオンラインQ\&Aサービス |
| チャットボット   | ユーザー体験を損なわずにスケール対応   |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/49e5407a-08fd-4b50-b77b-fcf6e83ea5ac.png)

https://github.com/hhhuang/CAG