0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-05-07

生成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の処理フロー

CAGの処理フロー


3. RAGとCAGの比較表

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

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

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

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

  • キャッシュ層の選定

    • 軽量なら:functools.lru_cache, joblib.Memory
    • 本格運用なら:Redis, SQLite, Pinecone(セマンティックキャッシュ向き)
  • 例: joblib.Memory

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}秒)")
  • 出力
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


5. CAG活用事例

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

image.png

0
3
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?