한줄 요약: 특수 reflection token을 학습하여 하나의 LLM이 검색 여부 판단, 관련성 평가, 생성 내용 자기 비평을 모두 수행하는 Agentic RAG의 시작점.
| 항목 | 내용 |
|---|---|
| 저자 | Akari Asai, Zeqiu Wu, Yizhong Wang, Avirup Sil, Hannaneh Hajishirzi |
| 소속 | University of Washington, IBM Research |
| 발표 | ICLR 2024 |
| 링크 | arxiv.org/abs/2310.11511 |
| 키워드 | RAG, Self-Reflection, Retrieval, Factuality |
Naive RAG의 3가지 근본 문제:
1. 무조건 검색: LLM이 이미 아는 상식 질문도 매번 검색 → 비효율 + 노이즈 유입
2. 검색 결과 무검증: 관련 없는 문서가 검색되어도 그대로 생성에 사용 → 오답
3. 생성 결과 무검증: 생성된 내용이 검색 문서에 근거하는지 확인 안 함 → 환각
핵심 아이디어: 이 세 가지 판단을 외부 모듈 없이, LLM 내부에 특수 토큰으로 내장시킨다.
| 토큰 | 역할 | 값 |
|---|---|---|
[Retrieve] | 검색이 필요한가? | {yes, no, continue} |
[IsRel] | 검색된 문서가 관련 있는가? | {relevant, irrelevant} |
[IsSup] | 생성 내용이 문서에 근거하는가? | {fully supported, partially, no support} |
[IsUse] | 생성 내용이 유용한가? | {5, 4, 3, 2, 1} |
입력: "한국의 2024년 GDP 성장률은?"
Step 1: [Retrieve] = yes → 검색 필요
Step 2: Retriever가 문서 3개 반환
Step 3: 각 문서에 대해:
문서 1: [IsRel] = relevant → 세그먼트 생성
"한국의 2024년 GDP 성장률은 2.2%로..."
[IsSup] = fully supported ✓
[IsUse] = 5 ✓
문서 2: [IsRel] = irrelevant → 건너뜀
문서 3: [IsRel] = relevant → 세그먼트 생성
[IsSup] = partially → 점수 낮음
Step 4: 점수가 가장 높은 세그먼트 선택 → 최종 출력
학습 데이터 예시:
"한국의 수도는 [Retrieve]no 서울이다. [IsUse]5"
"최신 GDP는 [Retrieve]yes [문서] [IsRel]relevant 2.2%이다 [IsSup]fully [IsUse]4"
| 모델 | PopQA | PubHealth | ARC-C | ASQA (인용) |
|---|---|---|---|---|
| Llama2-7B | 14.7% | 49.2% | 47.5% | 22.8 |
| Llama2 + RAG | 38.2% | 51.3% | 50.1% | 24.1 |
| Self-RAG 7B | 54.9% | 72.4% | 67.3% | 30.1 |
| ChatGPT | 45.7% | 70.1% | 75.3% | 28.3 |
| ChatGPT + RAG | 50.8% | 54.4% | — | 30.4 |
→ 7B Self-RAG가 ChatGPT를 PopQA, PubHealth에서 초과
| 모델 | Citation Precision | Citation Recall |
|---|---|---|
| Llama2 + RAG | 42.1% | 35.8% |
| Self-RAG | 68.4% | 60.2% |
| ChatGPT + RAG | 57.3% | 51.9% |
→ 인용 정확도에서 특히 강한 성능 — [IsSup] 토큰이 문서 근거 검증을 강제하기 때문
| 변형 | PopQA |
|---|---|
| Self-RAG (full) | 54.9% |
| − [Retrieve] 제거 (항상 검색) | 48.7% |
| − [IsSup] 제거 (근거 검증 없음) | 50.1% |
| − [IsUse] 제거 (유용성 평가 없음) | 52.3% |
| 모든 reflection 제거 | 38.2% |
→ 각 reflection token이 독립적으로 성능에 기여
Self-RAG의 가장 우아한 점은 기존 아키텍처를 전혀 바꾸지 않는다는 것이다. Vocabulary에 특수 토큰 몇 개를 추가하고, 일반적인 언어 모델링으로 학습하면 끝이다. 이 단순함이 실전 적용성을 크게 높인다.
하지만 실전에서의 핵심 우려는 reflection token의 오판이다. 모델이 "[Retrieve]=no"라고 판단했는데 실제로 최신 정보가 필요한 경우, 기존 RAG보다 오히려 나빠진다. 이 문제에 대한 체계적 분석이 부족한 것이 아쉽다.
CRAG와 결합하면 이상적이다: Self-RAG가 "검색 여부"를 판단하고, CRAG가 "검색 결과의 품질"을 평가하는 2중 안전망. 실제로 프로덕션 RAG 시스템에서 이 조합이 점점 표준이 되고 있다.
관련 논문: CRAG, Adaptive-RAG, Active RAG, FLARE