교정 검색 증강 생성 (Corrective RAG)
검색 결과를 평가해 맞음·틀림·애매함에 따라 정제·웹 검색·혼합으로 바로잡는 RAG
먼저 알아야 할 것
다루는 내용
CRAG는 T5-large 기반 가벼운 검색 평가기로 질문-문서 관련성을 매기고, 두 임곗값으로 Correct · Incorrect · Ambiguous를 판정합니다. Correct면 문서를 지식 조각으로 쪼개 관련 없는 조각을 버리고 다시 붙이며, Incorrect면 ChatGPT로 질문을 키워드로 바꿔 웹 검색한 결과를 정제해 쓰고, Ambiguous면 둘을 합칩니다. 생성기를 재학습하지 않는 플러그 앤 플레이 방식으로 RAG와 Self-RAG에 붙여 PopQA · Biography · PubHealth · ARC-Challenge 성능을 크게 올렸고, 계산량 증가는 작았습니다.
초록
대형 언어 모델(LLM)은 생성한 텍스트의 정확성을 자신이 담은 파라미터 지식만으로는 보장할 수 없기 때문에 필연적으로 환각을 보입니다. 검색 증강 생성(RAG)은 LLM을 실용적으로 보완하지만, 검색된 문서의 관련성에 크게 의존하므로 검색이 잘못됐을 때 모델이 어떻게 행동할지에 대한 우려를 낳습니다. 이를 위해 우리는 생성의 견고성을 높이는 교정 검색 증강 생성(CRAG)을 제안합니다. 구체적으로, 질의에 대해 검색된 문서들의 전반적 품질을 평가하는 가벼운 검색 평가기를 설계했으며, 이 평가기가 내놓는 신뢰도에 따라 서로 다른 지식 검색 행동을 실행합니다. 정적이고 제한된 말뭉치에서의 검색은 최적이 아닌 문서만 돌려줄 수 있으므로, 대규모 웹 검색을 검색 결과를 보강하는 확장 수단으로 활용합니다. 또한 검색된 문서에 대해 분해 후 재조합 알고리즘을 설계해, 핵심 정보에 선택적으로 집중하고 관련 없는 정보는 걸러 냅니다. CRAG는 플러그 앤 플레이 방식이라 다양한 RAG 기반 방법과 매끄럽게 결합할 수 있습니다. 짧은 글과 긴 글 생성 과제를 포함하는 네 데이터셋에서의 실험은 CRAG가 RAG 기반 방법들의 성능을 크게 높일 수 있음을 보여 줍니다.
해설
교정 검색 증강 생성 (Corrective RAG)
검색한 문서가 틀렸을 때 RAG가 어떻게 행동해야 하는지를 다룬 논문입니다. 가벼운 평가기(T5-large, 7억 7천만 파라미터)가 검색 결과를 '맞음 · 틀림 · 애매함'으로 판정하고, 맞으면 문서를 잘게 쪼개 핵심만 남기고, 틀리면 웹 검색으로 갈아타며, 애매하면 둘을 섞습니다. 기존 RAG와 Self-RAG 어디에나 끼워 쓸 수 있고, 네 개 데이터셋에서 성능을 크게 올렸습니다.
| 항목 | 내용 |
|---|---|
| 원제 | Corrective Retrieval Augmented Generation |
| 저자 | Shi-Qi Yan 외 3명 (중국과학기술대 · UCLA · Google DeepMind) |
| 발표 | 2024 · arXiv 2401.15884 |
| 트랙 · 수준 | RAG·검색 · 심화 |
| 먼저 알면 좋은 것 | 기본 RAG 구조, Self-RAG, 교차 인코더식 관련성 평가, 질의 재작성, 웹 검색 API |
들어가기 전에
이 해설은 아래 내용을 안다고 보고 씁니다. 처음이라면 먼저 읽고 오면 수식과 손계산을 훨씬 쉽게 따라올 수 있습니다.
- Self-RAG: 검색 · 생성 · 자기 비평을 함께 학습 — 검색 필요 · 관련성 · 근거 · 유용성을 반성 토큰으로 스스로 판단하며 생성하는 RAG
한눈에 보기
- 기본 RAG가 "검색이 틀리면 어떡하지?"라는 질문을 무시해 온 이유와 그 위험을 알게 됩니다.
- 검색 결과를 Correct / Incorrect / Ambiguous 세 가지로 판정하는 두 임곗값 규칙을 손계산으로 이해합니다.
- 문서를 '지식 조각(strip)'으로 쪼개 걸러 내고 다시 붙이는 분해-재조합(decompose-then-recompose) 방식을 압니다.
- 이 방법이 왜 '플러그 앤 플레이'이고, Self-RAG와 무엇이 다른지 판단할 수 있게 됩니다.
초록 (번역)
대형 언어 모델(LLM)은 생성한 텍스트의 정확성을 자신이 담은 파라미터 지식만으로는 보장할 수 없기 때문에 필연적으로 환각을 보입니다. 검색 증강 생성(RAG)은 LLM을 실용적으로 보완하지만, 검색된 문서의 관련성에 크게 의존하므로 검색이 잘못됐을 때 모델이 어떻게 행동할지에 대한 우려를 낳습니다. 이를 위해 우리는 생성의 견고성을 높이는 교정 검색 증강 생성(CRAG)을 제안합니다. 구체적으로, 질의에 대해 검색된 문서들의 전반적 품질을 평가하는 가벼운 검색 평가기를 설계했으며, 이 평가기가 내놓는 신뢰도에 따라 서로 다른 지식 검색 행동을 실행합니다. 정적이고 제한된 말뭉치에서의 검색은 최적이 아닌 문서만 돌려줄 수 있으므로, 대규모 웹 검색을 검색 결과를 보강하는 확장 수단으로 활용합니다. 또한 검색된 문서에 대해 분해 후 재조합 알고리즘을 설계해, 핵심 정보에 선택적으로 집중하고 관련 없는 정보는 걸러 냅니다. CRAG는 플러그 앤 플레이 방식이라 다양한 RAG 기반 방법과 매끄럽게 결합할 수 있습니다. 짧은 글과 긴 글 생성 과제를 포함하는 네 데이터셋에서의 실험은 CRAG가 RAG 기반 방법들의 성능을 크게 높일 수 있음을 보여 줍니다.
무엇을 풀었나
기본 RAG는 검색기 이 말뭉치에서 상위 개 문서 를 가져오면, 생성기 가 질문 와 를 함께 보고 답 를 만듭니다.
논문은 이 식이 보여 주듯 검색기와 생성기가 단단히 묶여 있어 위험에 약하다 고 지적합니다. 생성기가 아무리 뛰어나도 검색이 실패하면 답이 망가집니다. 그런데 대부분의 RAG는 문서가 관련 있든 없든 무조건 집어넣습니다.
문제는 두 가지입니다.
- 틀린 검색: 품질이 낮은 검색기는 관련 없는 정보를 잔뜩 가져와 모델을 오도하고 환각을 일으킵니다.
- 문서 전체를 통째로 쓰는 습관: 관련 있는 문서라도 상당 부분은 답과 무관한데, 기존 방법은 문서 전체를 똑같이 참고합니다.
앞선 Self-RAG는 '검색이 필요한지'와 '문서가 관련 있는지'를 판단했지만, 반성 토큰을 내도록 모델을 따로 학습해야 했습니다. CRAG는 검색이 틀렸을 때 바로잡는 교정 전략 에 초점을 맞추고, 어떤 생성기에도 붙일 수 있는 가벼운 부품으로 만들었습니다.
핵심 아이디어
flowchart TD
X[질문] --> R[검색기: 문서 10개]
R --> E[검색 평가기 T5-large: 문서마다 관련성 점수]
E --> J{신뢰도 판정}
J -->|Correct: 하나라도 상한 초과| KR[지식 정제: 쪼개기 → 거르기 → 다시 붙이기]
J -->|Incorrect: 모두 하한 미만| WS[질문을 키워드로 재작성 → 웹 검색 → 지식 정제]
J -->|Ambiguous: 그 밖| BOTH[내부 정제 + 웹 검색 결과 합치기]
KR --> G[아무 생성기 LLM]
WS --> G
BOTH --> G
G --> Y[답]1. 가벼운 검색 평가기
직관. 요리사(생성기)에게 재료를 넘기기 전에, 검수 담당자가 재료마다 "신선함 · 상함"을 빠르게 점수 매기는 단계입니다. 검수 담당자는 요리사만큼 비싼 사람일 필요가 없습니다.
단계별 설명.
- 질문마다 보통 문서 10개를 검색합니다(Self-RAG와 같은 Contriever 검색 결과를 그대로 사용).
- 질문과 문서 하나를 이어 붙여 평가기에 넣고, 쌍마다 관련성 점수 를 냅니다.
- 평가기는 T5-large(0.77B)를 미세조정해 만듭니다. 예를 들어 PopQA는 질문마다 정답 위키 문서 제목을 주므로, 그것으로 '관련 있는' 문단을 찾아 양성으로, 검색 결과 중 비슷하지만 관련 없는 것을 음성으로 씁니다.
왜 이렇게 했나. 큰 LLM에게 관련성을 물으면 비쌉니다. 논문의 비교에서 PopQA 검색 결과 판정 정확도가 T5 평가기 84.3, ChatGPT 58.0, ChatGPT + 생각의 사슬 62.4, ChatGPT 퓨샷 64.7로, 작은 전용 평가기가 더 정확 했습니다. Self-RAG의 비평 모델(Llama-2 7B)보다 훨씬 가볍다는 점도 강조합니다.
2. 세 가지 행동: 두 임곗값으로 판정
직관. 시험 채점처럼 '확실히 합격(상한 이상)', '확실히 불합격(하한 미만)', '애매(그 사이)' 세 구간을 둡니다. 애매할 때 한쪽으로 몰아붙이지 않는 것이 핵심입니다.
단계별 설명.
- 상한 임곗값 과 하한 임곗값 를 정합니다.
- 문서 중 하나라도 점수가 상한을 넘으면 → Correct. 관련 문서가 있다고 보고 그 문서를 정제해 씁니다.
- 문서 모두 점수가 하한보다 낮으면 → Incorrect. 검색 결과를 버리고 웹 검색으로 새 지식을 찾습니다.
- 그 밖이면 → Ambiguous. 정제한 내부 지식과 웹 검색 결과를 둘 다 씁니다.
수식 (논문의 규칙을 식으로 정리).
| 기호 | 뜻 |
|---|---|
| 평가기가 매긴 번째 문서의 관련성 점수 | |
| , | 상한 · 하한 임곗값. 논문은 데이터셋별로 실험적으로 정함 |
| 가장 관련 있어 보이는 문서의 점수 ('모두 하한 미만'은 최댓값이 하한 미만인 것과 같음) |
논문이 쓴 임곗값 예시는 (상한, 하한) = PopQA (0.59, −0.99), PubHealth · ARC-Challenge (0.5, −0.91), Biography (0.95, −0.91)입니다.
숫자로 해 보기 (PopQA 임곗값 사용, 점수는 설명용).
- 문서 점수가 → 최댓값 0.72 > 0.59 → Correct
- → 최댓값 −1.05 < −0.99 → Incorrect
- → 최댓값 0.30은 상한 미만 · 하한 이상 → Ambiguous
왜 Ambiguous가 필요한가. 논문은 예비 실험에서 Correct · Incorrect 두 행동만 쓰면 평가기 정확도에 성능이 쉽게 흔들렸다고 밝힙니다. 판단이 확실하지 않아도 무조건 지식을 갈아타 버리기 때문입니다. 중간 행동을 두면 평가기가 틀려도 피해가 줄어듭니다. 절제 실험에서도 세 행동 중 무엇을 빼도 성능이 떨어졌습니다.
3. 지식 정제: 분해 → 거르기 → 재조합
직관. 두꺼운 참고서를 통째로 건네는 대신, 형광펜으로 필요한 문장만 칠해 그 부분만 오려 붙인 요약 노트를 건넵니다.
단계별 설명.
- 분해: 검색 문서를 '지식 조각(knowledge strip)'으로 나눕니다. 한두 문장짜리 문서는 그대로 하나의 조각, 긴 문서는 전체 길이에 따라 몇 문장씩 묶은 작은 단위로 자릅니다.
- 거르기: 같은 평가기로 조각마다 관련성 점수를 매기고, 낮은 조각을 버립니다(부록 설정: 상위 , 거르기 임곗값 −0.5).
- 재조합: 남은 조각을 원래 순서대로 이어 붙여 '내부 지식'을 만듭니다.
숫자로 해 보기 (설명용). 문서 하나를 조각 4개로 나눴더니 점수가 이라면, 임곗값 −0.5보다 낮은 2번 · 4번을 버리고 1번 · 3번만 순서대로 붙입니다. 생성기는 절반 길이의 더 깨끗한 근거를 받습니다.
4. 웹 검색으로 교정
직관. 회사 자료실에 답이 없다고 판단되면, 억지로 엉뚱한 자료를 쓰지 말고 바깥 도서관(웹)으로 가는 것입니다.
단계별 설명.
- ChatGPT로 질문을 검색창에 넣기 좋은 키워드 질의 로 다시 씁니다.
- 상용 웹 검색 API(구글 검색 API)로 URL 목록을 받습니다. 편향 · 부정확한 정보를 줄이려고 위키백과처럼 권위 있는 페이지를 우선합니다.
- 페이지 내용을 가져와 위와 같은 지식 정제를 거쳐 '외부 지식'으로 씁니다.
왜 이렇게 했나. 고정된 말뭉치는 범위와 다양성에 한계가 있어, 검색이 실패했을 때 그 안에서 아무리 다시 찾아도 좋은 문서가 없을 수 있습니다. 논문은 "자기가 모른다는 것을 알고 바깥 지식을 찾는 시스템이 더 똑똑하다"고 표현합니다.
결과
네 데이터셋 결과 (PopQA · PubHealth · ARC-C는 정확도, Biography는 FactScore)
| 생성기 | 방법 | PopQA | Biography | PubHealth | ARC-C |
|---|---|---|---|---|---|
| LLaMA2-hf-7b | RAG | 50.5 | 44.9 | 48.9 | 43.4 |
| LLaMA2-hf-7b | CRAG | 54.9 | 47.7 | 59.5 | 53.7 |
| LLaMA2-hf-7b | Self-RAG (재현) | 29.0 | 32.2 | 0.7 | 23.9 |
| LLaMA2-hf-7b | Self-CRAG | 49.0 | 69.1 | 0.6 | 27.9 |
| SelfRAG-LLaMA2-7b | RAG | 52.8 | 59.2 | 39.0 | 53.2 |
| SelfRAG-LLaMA2-7b | CRAG | 59.8 | 74.1 | 75.6 | 68.6 |
| SelfRAG-LLaMA2-7b | Self-RAG | 54.9 | 81.2 | 72.4 | 67.3 |
| SelfRAG-LLaMA2-7b | Self-CRAG | 61.8 | 86.2 | 74.8 | 67.2 |
- 기본 RAG에 붙이면: SelfRAG-LLaMA2-7b 생성기 기준 PopQA +7.0, Biography +14.9, PubHealth +36.6, ARC-C +15.4(%p)였습니다.
- Self-RAG에 붙이면(Self-CRAG): 같은 생성기 기준 PopQA +6.9, Biography +5.0, PubHealth +2.4였습니다.
- 생성기를 바꿔도 견고합니다. 반성 토큰을 배우지 않은 일반 LLaMA2-hf-7b로 바꾸면 Self-RAG는 크게 무너졌지만(PubHealth 0.7), CRAG는 경쟁력을 유지했습니다. CRAG는 생성기에 특별한 능력을 요구하지 않기 때문입니다.
절제 실험 (PopQA 정확도, SelfRAG-LLaMA2-7b 생성기)
| 설정 | CRAG | Self-CRAG |
|---|---|---|
| 전체 | 59.8 | 61.8 |
| Correct 행동 제거 | 58.3 | 59.6 |
| Incorrect 행동 제거 | 59.5 | 60.8 |
| Ambiguous 행동 제거 | 59.0 | 61.5 |
| 문서 정제 제거 | 54.2 | 52.2 |
| 질의 재작성 제거 | 56.2 | 58.4 |
| 외부 지식 선별 제거 | 58.6 | 57.9 |
- 어느 행동 · 어느 지식 활용 단계를 빼도 성능이 떨어졌고, 문서 정제 를 뺐을 때 하락이 가장 컸습니다.
비용 (토큰당 TFLOPs / 실행 시간): RAG 26.5 / 0.363초, CRAG 27.2 / 0.512초, Self-RAG 26.5~132.4 / 0.741초, Self-CRAG 27.2~80.2 / 0.908초. 계산량 증가는 작았습니다.
왜 중요한가 · 이후 영향
- "검색이 틀렸을 때"를 정면으로 다룬 RAG 설계 로 자리 잡았습니다. 실무 RAG에서 검색 결과를 평가해 재검색 · 웹 검색으로 넘기는 '교정 루프' 패턴의 대표 참고 사례입니다.
- 플러그 앤 플레이: 생성기를 재학습하지 않고 앞단에 평가기와 정제 단계만 붙이면 되므로, 더 좋은 LLM이 나오면 그대로 바꿔 끼울 수 있습니다.
- 문서를 조각 단위로 정제 하는 아이디어는 긴 문맥에 불필요한 내용을 넣지 않는 '문맥 압축 · 선별' 기법과 맞닿아 있습니다.
한계 · 주의할 점
- 평가기 품질에 크게 의존합니다. 논문은 결론에서 외부 평가기를 따로 미세조정해야 하는 점을 한계로 꼽고, 이 평가기를 없애고 LLM 자체에 검색 평가 능력을 주는 것을 다음 과제로 둡니다. 앞의 논의에서도 성능이 평가기 정확도에 흔들릴 수 있음을 짚습니다.
- 임곗값을 데이터셋마다 정해야 합니다. 논문은 실험적으로 값을 골랐고, 새 분야에서는 다시 맞춰야 합니다.
- 웹 검색의 위험: 편향되거나 신뢰할 수 없는 정보가 들어올 수 있어 권위 있는 페이지를 우선했지만, 완전한 해결책은 아닙니다. 또 사내 기밀 질문을 외부 검색 API로 보내는 것은 보안상 따로 검토가 필요합니다.
- 질의 재작성에 ChatGPT를 씁니다. 이 단계만큼은 외부 LLM 비용과 의존이 생깁니다.
스스로 점검
- PopQA 임곗값(0.59, −0.99)에서 문서 점수가 이면 어떤 행동인가요?
최댓값 0.40은 0.59 미만이고 −0.99 이상이므로 Ambiguous입니다. 정제한 내부 지식과 웹 검색 결과를 함께 씁니다.
- Correct · Incorrect 두 행동만 쓰면 어떤 문제가 생기나요?
평가기 판단이 애매해도 무조건 한쪽으로 지식을 갈아타 버려, 성능이 평가기 정확도에 쉽게 흔들립니다.
- CRAG가 Self-RAG보다 생성기 교체에 강한 이유는?
Self-RAG는 생성기가 반성 토큰을 내도록 학습돼 있어야 하지만, CRAG는 앞단에서 검색 결과만 고쳐 주므로 생성기에 특별한 능력을 요구하지 않습니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 교정 RAG(Corrective RAG) | 검색 결과를 평가해 틀리면 바로잡은 뒤 생성하는 RAG |
| 검색 평가기(retrieval evaluator) | 질문-문서 쌍의 관련성을 점수로 매기는 작은 모델 |
| 신뢰도(confidence degree) | 평가 점수로 정한 '검색이 맞았다고 믿을 수 있는 정도' |
| Correct · Incorrect · Ambiguous | 검색 맞음 · 틀림 · 애매함에 따른 세 가지 행동 |
| 지식 조각(knowledge strip) | 문서를 몇 문장 단위로 잘게 나눈 조각 |
| 분해-재조합 | 문서를 조각으로 나누고, 관련 없는 조각을 버린 뒤 남은 것을 다시 이어 붙이는 방법 |
| 질의 재작성(query rewriting) | 질문을 검색에 맞는 키워드 형태로 다시 쓰는 것 |
| 플러그 앤 플레이 | 기존 시스템을 고치지 않고 끼워 넣어 바로 쓸 수 있는 방식 |
| FactScore | 긴 글(전기)의 사실 정확도를 재는 지표 |
| 환각(hallucination) | 근거 없는 내용을 사실처럼 생성하는 현상 |
이어서 읽을 것
- 앞: Self-RAG · 검색 증강 생성 (RAG) · HyDE
- 뒤: RAPTOR · GraphRAG · RAG 총정리 (서베이)
다음에 볼 것
이 글을 이해했다면 이어서 보면 좋은 항목입니다.
- RAPTOR: 트리 구조로 요약해 검색하기 — 조각을 의미로 묶어 요약하기를 반복한 요약 트리에서 검색해 긴 문서 질문에 답하는 방법
출처
- 원문: https://arxiv.org/abs/2401.15884 (2024 · Shi-Qi Yan 외)
AI 원리부터 이해하기 · RAG·검색 모듈
RAG·검색 모듈 학습
이 글은 RAG·검색 모듈의 학습 자료입니다. 전체 21개 자료 중 17번째입니다.
출처·원문
원문 보기요약만