はじめに
LLMを使ったアプリケーションを作る際、外部知識を利用する方法として
RAG(Retrieval-Augmented Generation) がよく使われます。
RAGは非常に有用なアーキテクチャですが、
CAG(Cache-Augmented Generation) というアプローチも議論されるようになってきました。
名前が似ているため混同しやすいのですが、両者は「知識の取り扱い方」が異なります。
この記事では、RAGとCAGの違いを整理しながら、それぞれが向いているケースについてまとめてみます。
RAG(Retrieval-Augmented Generation)とは
RAGは 外部データを検索してLLMに渡すアーキテクチャです。
LLMは学習データに含まれる知識しか持たないため、「社内データ」などはそのままでは扱えません。
そこでRAGでは、質問に関連する文書を検索してLLMに渡します。
処理の流れは次のようになります。
RAGの特徴
- 大量のドキュメントを扱える
- 知識更新が容易
- ベクトル検索インフラが必要
- 検索レイテンシが発生する
CAG(Cache-Augmented Generation)とは
CAGは 必要な知識を事前にキャッシュしておくアプローチです。
RAGでは質問ごとに検索を行いますが、CAGでは検索を行いません。
必要な知識を あらかじめLLMのコンテキストとして用意しておきます。
処理の流れは次のようになります。
CAGの特徴
- 検索処理が不要
- レイテンシが小さい
- システム構成がシンプル
- コンテキストサイズの制限を受ける
RAGとCAGの違い
| 項目 | RAG | CAG |
|---|---|---|
| 知識取得 | 検索 | キャッシュ |
| 処理タイミング | 推論時 | 事前処理 |
| レイテンシ | 検索分の遅延あり | 低い |
| データ量 | 大規模データ向き | 小〜中規模向き |
| システム構成 | 検索インフラが必要 | シンプル |
CAGが登場した背景
CAGが注目される背景には、LLMの コンテキスト長の拡大があります。
以前のLLMではコンテキストが数千トークン程度だったため、大量の文書を直接入れることはできませんでした。
そのため検索 → 必要な文書だけ取得というRAGが必要でした。
しかし最近の一部のモデルでは、最大で数百万トークン規模の長いコンテキストを扱えるものも登場しています。
この場合、
最初から知識を入れてしまえば検索は不要では?
という発想が成り立ちます。
これがCAGの基本的な考え方です。
まとめ
RAGとCAGはどちらもLLMの知識を拡張するためのアプローチですが、知識の扱い方が異なります。
-
RAG
外部知識を検索して取得する -
CAG
知識を事前にキャッシュしておく
LLMアプリケーションを設計する際には、「データ量」「更新頻度」「レイテンシ」などを考慮して、
RAGとCAGを使い分けることが重要です。
参考
Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
https://arxiv.org/abs/2005.11401
Don't Do RAG: When Cache-Augmented Generation is All You Need for
Knowledge Tasks
https://arxiv.org/abs/2412.15605