RAG는 어떻게 진화했는가 — Vanilla부터 CRAG까지
검색과 생성의 단순 연결에서 시작해 adaptive retrieval과 confidence-based routing까지, RAG 아키텍처의 설계 결정들을 추적한다.
- 01 RAG의 상한선은 어디서 결정되는가
- 02 Dense Retrieval은 왜 BM25를 이겼는가
- 03 Cross-Encoder, ColBERT, 그리고 검색의 Pareto 경계
- 04 벡터 검색은 어떻게 빠를 수 있는가
- 05 RAG는 어떻게 진화했는가 — Vanilla부터 CRAG까지
- 06 RAG 검색은 왜 두 단계인가
- 07 RAG의 다음 단계: 그래프, 이미지, 긴 문맥은 무엇을 바꾸는가
RAG는 2020년 이후 단일 논문이 아니라 일련의 설계 결정들이 누적된 체계다. Vanilla RAG가 retriever와 generator를 처음으로 end-to-end로 연결했고, 이후 각 기법은 하나의 공통 질문에 답해왔다 — “검색된 문서를 어떻게, 얼마나, 언제 활용할 것인가?” 이 질문에 대한 답이 달라질 때마다 아키텍처도 달라졌다.
출발점: marginal likelihood로 묶은 두 모듈
Vanilla RAG(Lewis 2020)의 핵심 공식은 다음과 같다.
retriever 와 generator 를 marginal likelihood로 묶어 공동 학습한다는 아이디어다. 이전에는 두 모듈이 완전히 분리된 파이프라인이었다. Vanilla RAG는 “retriever가 좋은 passage를 가져오면 generator가 더 나은 답을 만든다”는 순환을 gradient로 연결한 첫 번째 시스템이다.
RAG-Sequence와 RAG-Token의 차이는 이 공식의 product 위치에서 나온다.
RAG-Token은 각 생성 스텝마다 다른 passage 집합을 참조할 수 있어 더 유연하다. 계산량은 sequence 방식의 배지만, 실험적으로 일관되게 우월하다.
marginal likelihood 계산은 top- passage에 대해 번의 forward pass를 요구한다. retriever bottleneck은 피할 수 없다 — retriever의 top-k recall이 90%라면, 완벽한 generator를 써도 최종 정확도의 상한은 90%다.
내부로 끌어들인 retrieval: RETRO와 REALM
Vanilla RAG의 retriever는 generator와 분리된 모듈이다. RETRO(Borgeaud 2022)는 이 경계를 허물었다 — retrieval을 transformer layer 내부로 가져왔다.
RETRO는 입력 시퀀스를 64-token chunk로 분할하고, 각 chunk의 앞 32 token을 query로 삼아 corpus에서 top-2 nearest chunk를 검색한다. 이 retrieved chunk는 각 transformer layer에서 Chunked Cross-Attention(CCA)으로 통합된다.
표준 self-attention이 같은 시퀀스 내에서 Query/Key/Value를 모두 취한다면, CCA는 Query만 현재 시퀀스에서, Key와 Value는 retrieved chunk에서 취한다. 결과적으로 모든 레이어가 외부 지식을 직접 참조한다.
이 구조의 실용적 함의는 스케일 효율성이다. RETRO-3B는 retrieval 없는 baseline-70B와 유사한 perplexity를 달성한다 — 약 23배 작은 모델이 같은 품질을 낸다는 의미다.
REALM(Guu 2020)은 다른 방향에서 문제를 풀었다. RETRO의 retriever는 frozen이지만, REALM은 retriever 자체를 학습 가능하게 만든다. Inverse cloze task로 사전학습한다 — 문서에서 random span을 mask하고, MLM loss의 gradient가 retriever를 통해 흐르도록 설계한다. “어떤 문서를 가져왔을 때 masked token 복구가 쉬워지는가”를 학습 신호로 삼는 utility-driven retrieval이다.
Atlas(Izacard 2023)는 REALM의 아이디어를 현대 스케일로 확장한다. Contriever(unsupervised dense retriever)와 T5-11B를 결합하고, few-shot in-context learning으로 유연성을 더했다.
generator bottleneck을 푼 FiD
passage 수 가 커질 때 Vanilla RAG의 encoder attention complexity는 로 폭증한다. FiD(Izacard 2021)는 이 문제를 encoder-decoder 비대칭으로 해결했다.
Vanilla RAG: [P₁ SEP P₂ SEP ... Pₖ] → Encoder (O((kL)²)) → Decoder
FiD: P₁ → Encoder(Q, P₁) → h₁
P₂ → Encoder(Q, P₂) → h₂ (각각 O(L²), parallel)
...
H = concat([h₁, h₂, ..., hₖ]) → Decoder cross-attention
각 passage를 독립적으로 인코딩하고, decoder에서만 전체 passage encoding에 cross-attention한다. 일 때 FiD의 encoder FLOPs는 Vanilla의 약 7분의 1이다. 더 중요한 점은 decoder의 cross-attention이 passage 순서에 민감하지 않다는 것 — retrieval ranking의 노이즈에 더 robust하다.
필요할 때만 검색하는 Self-RAG와 CRAG
Vanilla RAG부터 FiD까지는 모든 입력에 항상 retrieval을 수행한다. “2+2는 얼마인가”도 검색한다는 의미다. Self-RAG(Asai 2024)는 이 가정을 버렸다.
Self-RAG는 vocabulary에 reflection token을 추가한다 — [Retrieve], [IsREL], [IsSUP], [IsUSE]. LLM이 [Retrieve]=Yes를 생성할 때만 retrieval이 일어나고, retrieved document의 relevance와 supportiveness를 [IsREL], [IsSUP]로 self-평가한다. GPT-4로 생성한 reflection label로 fine-tuning하면, 7B 모델도 GPT-4 label과 ~92% agreement를 달성한다.
decoding은 reflection score를 beam score에 통합한다.
실험적으로 optimal은 다. 전체 입력의 약 40%에서 retrieval을 skip해 latency를 줄이지만, 더 큰 효과는 품질 향상 — hallucination을 internal critic으로 걸러낸다.
CRAG(Yan 2024)는 internal critic을 external signal로 보완한다. T5 기반 Retrieval Evaluator가 retrieved document의 utility를 세 가지 confidence 경로로 분류한다.
corpus가 outdated일 때 web search로 fallback하는 구조다. Self-RAG의 reflection이 “모델이 스스로 판단”이라면, CRAG는 “외부 평가자가 corpus 품질을 판단하고 부족하면 web으로 보완”한다.
정리
- Vanilla RAG의 marginal likelihood는 retriever와 generator를 처음으로 gradient로 묶었다. 모든 후속 기법의 수식적 출발점이다.
- RETRO는 retrieval을 layer 내부로 끌어들여 23배 스케일 효율을 달성했고, REALM은 MLM gradient로 retriever 자체를 학습 가능하게 만들었다.
- FiD는 encoder-decoder 비대칭으로 개 passage를 에 처리하고, decoder cross-attention으로 passage 융합을 순서 독립적으로 수행한다.
- Self-RAG는 reflection token으로 “항상 검색” 가정을 제거했고, CRAG는 confidence-based routing으로 corpus 한계를 web search로 보완했다.
retrieval 품질의 상한이 generation 품질의 상한을 결정한다는 사실은 2020년과 2024년이 같다. 달라진 것은 그 상한을 어디서, 어떻게 끌어올릴 것인가에 대한 답이다.