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