Back to Blog
Self-RAGCorrective RAGCRAGReflection TokenRAG

0x09. Self-RAG & CRAG - 스스로 검증하는 RAG

모델이 스스로 검색 필요성을 판단하고 결과를 검증하는 Self-RAG와 Corrective RAG의 원리를 비교한다.

기본적인 RAG 파이프라인은 "검색하고 생성한다"는 단순한 흐름을 따른다. 질문이 들어오면 벡터 데이터베이스에서 관련 문서를 찾고, 그 문서를 컨텍스트로 넣어 LLM이 답변을 생성하는 구조다.

그런데 여기에 근본적인 문제가 있다. 검색된 문서가 정말 관련이 있는가? 그리고 애초에 검색이 필요한 질문이었는가? 기본 RAG는 이런 질문을 던지지 않는다. 무조건 검색하고, 검색된 결과를 그대로 믿는다.

Self-RAG와 Corrective RAG(CRAG)는 바로 이 문제를 해결한다. 두 기법 모두 검색 결과를 맹신하지 않고, LLM 스스로 검증하고 판단하는 메커니즘을 도입한다.


Self-RAG: 스스로 생각하고 판단하는 RAG

Self-RAG는 LLM이 검색 필요 여부, 문서의 관련성, 생성된 답변의 품질을 단계별로 판단하고 평가하여 최적의 답변을 도출하는 동적 RAG 기법이다.

일반 RAG가 "시키면 시키는 대로 하는 사원"이라면, Self-RAG는 "스스로 판단하고 결과를 검토하는 팀장"에 가깝다. 질문을 받으면 먼저 외부 검색이 필요한지부터 생각하고, 검색 결과를 걸러내고, 자기가 만든 답변까지 점수를 매겨 최종 결과를 선택한다.

작동 방식

Self-RAG의 파이프라인은 네 단계로 구성된다.

1단계 - 검색 결정(Retrieve Decision)

LLM이 질문을 분석하여 외부 정보 검색이 필요한지 먼저 판단한다. "대한민국의 수도는?"처럼 이미 알고 있는 내용이라면 굳이 검색할 필요가 없다. 반면 "2026년 1분기 실적"처럼 학습 데이터에 없는 정보라면 검색이 필요하다고 결정한다.

이 단계가 Self-RAG의 핵심적인 차별점이다. 기존 RAG는 무조건 검색부터 하지만, Self-RAG는 불필요한 검색을 생략할 수 있다.

2단계 - 문서 필터링(Document Filtering)

검색을 수행한 경우, 검색된 각 문서가 질문과 실제로 관련이 있는지 평가한다. 관련 없는 문서는 이 단계에서 걸러낸다. 키워드가 일치하더라도 맥락이 다른 문서가 섞여 들어올 수 있기 때문에, 이 필터링 과정이 답변 품질에 큰 영향을 미친다.

3단계 - 병렬 생성 및 평가(Parallel Generation & Evaluation)

관련성이 확인된 각 문서를 기반으로 답변 후보를 병렬로 생성한다. 그리고 생성된 각 답변에 대해 두 가지를 자체 채점한다.

  • 근거 충실도(Faithfulness): 답변이 검색된 문서의 내용에 얼마나 충실한가?
  • 유용성(Usefulness): 답변이 사용자의 질문에 얼마나 유용한가?

이 자체 채점 메커니즘이 환각(Hallucination) 을 크게 줄이는 핵심 장치다. 모델이 문서에 없는 내용을 지어내면 근거 충실도 점수가 낮아지기 때문이다.

4단계 - 최종 선택(Final Selection)

모든 평가 점수를 종합하여, 가장 높은 점수를 받은 답변을 최종 결과로 선택한다.

장점

  • 효율성: 불필요한 검색을 생략하고, 관련 없는 정보를 사전에 제거하여 LLM의 부하와 비용을 줄인다.
  • 품질 향상: 답변이 근거에 충실한지 자체적으로 검증하여 환각 현상을 크게 줄인다.
  • 적응성: 질문의 종류와 검색 결과의 품질에 따라 동적으로 작업 흐름을 조절한다.

구현 방식

LangChain의 구조화된 출력 기능(with_structured_output)을 핵심적으로 활용한다. 각 의사결정 단계(검색 여부, 관련성, 충실도, 유용성)를 위한 별도의 프롬프트와 Pydantic 출력 모델을 정의하고, 이렇게 만들어진 여러 개의 "판단 Chain"을 순차적으로 호출하는 파이썬 함수를 작성한다.

결과적으로 LLM이 스스로 생각하고 판단하는 전체 Self-RAG 로직이 하나의 파이프라인으로 완성된다.


Corrective RAG (CRAG): 검색 결과를 교정하는 RAG

CRAG는 검색된 정보의 품질을 맹신하지 않고, LLM 기반의 '평가기'를 통해 검색 결과의 관련성을 먼저 점검하고 교정하는 RAG 기법이다.

Self-RAG가 "검색할지 말지부터 고민"하는 방식이라면, CRAG는 "일단 검색은 하되, 결과가 쓸만한지 검증"하는 방식이다. 그리고 결과가 부족하면 웹 검색이라는 대안까지 동원한다는 점이 독특하다.

작동 방식

CRAG의 파이프라인은 네 단계로 진행된다.

1단계 - 검색(Retrieve)

로컬 벡터 데이터베이스에서 일반적인 RAG와 동일하게 문서를 검색한다. 여기까지는 기본 RAG와 다를 것이 없다.

2단계 - 평가(Evaluate)

LLM 기반의 평가기(Evaluator) 가 검색된 각 문서에 대해 관련성 점수(Relevance Score) 를 매긴다. 이 점수가 이후 전체 흐름의 방향을 결정하는 핵심 기준이 된다.

3단계 - 결정 및 교정(Decide & Correct)

가장 높은 관련성 점수를 기준으로 세 가지 경로 중 하나를 선택한다.

점수 범위판정행동
0.7 이상Correct검색된 문서를 그대로 사용
0.3 이하Incorrect로컬 문서를 버리고 웹 검색 수행
0.3 ~ 0.7Ambiguous로컬 문서와 웹 검색 결과를 함께 사용

이 분기 로직이 CRAG의 핵심이다. 로컬 데이터베이스의 한계를 인정하고, 웹 검색이라는 폴백(fallback) 을 전략적으로 활용한다.

4단계 - 생성(Generate)

최종적으로 확보된 지식(로컬 문서, 웹 검색 결과, 또는 둘 다)을 바탕으로 답변을 생성한다.

장점

  • 정확성 및 신뢰성 향상: 관련 없거나 오래된 정보가 답변에 사용되는 것을 방지한다.
  • 최신성 유지: 로컬 데이터베이스에 없는 최신 정보가 필요할 때 웹 검색을 통해 보완할 수 있다.
  • 지능적 자원 활용: 무조건 웹 검색을 하는 것이 아니라, 필요할 때만 수행하므로 효율적이다.

구현 방식

전체 로직이 평가 점수에 따라 분기하는 조건부 파이프라인으로 구현된다. 핵심 구성 요소는 다음과 같다.

  • retrieval_evaluator: 검색된 문서의 관련성 점수를 평가하는 체인
  • rewrite_query: 웹 검색을 위한 쿼리 변환 체인
  • knowledge_refinement: 검색된 정보를 요약하고 정제하는 체인

점수 임계값(0.3, 0.7)을 기준으로 어떤 체인을 실행할지 결정하는 라우터(Router) 가 전체 흐름을 제어한다.


Self-RAG vs CRAG: 어떤 차이가 있는가?

두 기법 모두 "검색 결과를 검증한다"는 공통 철학을 공유하지만, 접근 방식에는 분명한 차이가 있다.

비교 항목Self-RAGCRAG
검색 시점검색이 필요한지 먼저 판단항상 검색 먼저 수행
검증 범위문서 관련성 + 답변 충실도 + 유용성문서 관련성
대안 전략검색 생략 가능웹 검색 폴백
답변 생성여러 후보를 생성 후 최선을 선택확보된 지식으로 단일 답변 생성
핵심 강점환각 감소, 자기 검증최신 정보 보완, 유연한 소스 활용

Self-RAG는 깊이에 강하다. 모델이 스스로 여러 단계의 평가를 수행하며, 답변의 품질을 끝까지 검증한다. 반면 CRAG는 넓이에 강하다. 로컬 데이터베이스의 한계를 인식하고, 웹이라는 외부 소스까지 활용 범위를 확장한다.


정리

기본 RAG의 가장 큰 약점은 검색 결과를 무조건 신뢰한다는 점이다. Self-RAG와 CRAG는 각각 다른 방식으로 이 문제를 해결한다.

  • Self-RAG: 검색 필요성 판단부터 답변 품질 채점까지, LLM이 전 과정을 스스로 평가하고 최적의 답변을 선택한다. 환각 감소에 특히 효과적이다.
  • CRAG: 검색 결과의 관련성을 점수화하고, 점수에 따라 로컬 문서 사용, 웹 검색, 또는 둘의 조합을 동적으로 결정한다. 최신 정보가 필요한 상황에서 유리하다.

두 기법 모두 "RAG 시스템이 더 똑똑해져야 한다"는 같은 방향을 가리킨다. 단순히 검색하고 생성하는 것을 넘어, 검색의 질을 스스로 판단하고 교정하는 능력이 신뢰할 수 있는 RAG 시스템의 핵심이다.