RAG 시스템을 처음 만들어봤을 때를 기억하시나요?
벡터 DB에 문서를 넣고, 쿼리를 던지고, Top-5 문서를 LLM에 넘기고, 그럴싸한 답변을 받았을 때의 그 쾌감. "오, 이거 되네?" 싶었던 그 순간.
그런데 시스템을 조금만 본격적으로 쓰다 보면 이상한 일이 생기기 시작합니다.
"분명히 관련 문서를 5개나 줬는데 왜 엉뚱한 답이 나오지?"
"Top-k를 3에서 10으로 늘렸더니 오히려 답이 더 나빠졌어."
"검색 점수 1등 문서가 있는데... 이게 진짜 도움이 되는 건가?"
이 불편한 감각, 바로 오늘 이야기할 주제입니다.
Top-k 검색은 생각보다 훨씬 근본적인 한계를 갖고 있습니다. 그리고 최근 두 편의 논문 — CAR와 LANCER — 이 그 한계를 정면으로 파고들어, 꽤 흥미로운 해결책을 제시했습니다.
RAG 시스템을 아주 단순하게 비유하면, 이렇습니다.
여러분이 도서관에 들어가서 사서한테 묻습니다.
"인공지능의 윤리 문제에 대해 알고 싶어요."
사서가 책장을 훑어보다가 책 5권을 가져다줍니다. 기준은 딱 하나 — "인공지능 윤리"라는 키워드가 얼마나 많이 나오느냐. 제목에 있으면 1등, 첫 페이지에 있으면 2등... 이런 식으로요.
그 5권을 받아서 읽어보니, 1등 책은 "인공지능 윤리 용어 사전"이고, 진짜 여러분이 필요했던 "AI 편향 사례 연구"는 4등이나 5등입니다. 심지어 어떤 책은 두 권이 거의 똑같은 내용인데 저자만 다릅니다.
이게 지금 대부분의 RAG 시스템이 하는 일입니다.
Top-k 검색의 문제는 크게 세 가지로 나눌 수 있습니다.
문제 1: 관련성(Relevance) ≠ 유용성(Utility)
문제 2: 중복 문서(Redundancy)로 인한 정보 낭비
문제 3: Context Dilution — 노이즈가 답변을 흐린다
하나씩 풀어볼게요.
직관적으로 그럴 것 같습니다. 하지만 아닙니다.
CAR 논문(arXiv: 2605.04495)이 정확하게 이 지점을 찌릅니다.
"A relevant document may still introduce noise, while a lower-ranked document may better reduce the generator's uncertainty."
— CAR 논문 Abstract
번역하면: 관련성 높은 문서가 오히려 노이즈가 될 수 있고, 낮은 순위의 문서가 오히려 모델의 불확실성을 더 잘 줄여줄 수 있다.
이게 무슨 뜻인지 예시로 보겠습니다.
질문: "2024년 파리 올림픽에서 한국의 금메달 수는?"
| 순위 | 문서 내용 | 관련성 점수 | 실제 유용성 |
|---|---|---|---|
| 1위 | "파리 올림픽 개요: 2024년 7월 26일 개막, 참가국 206개국, 종목 32개..." | ★★★★★ | ★★☆☆☆ |
| 2위 | "한국 올림픽 역사: 1988 서울 올림픽부터 현재까지..." | ★★★★☆ | ★★☆☆☆ |
| 3위 | "파리 올림픽 최종 메달 집계: 한국 금 13, 은 9, 동 10..." | ★★★☆☆ | ★★★★★ |
1위 문서는 "파리"와 "올림픽"이라는 키워드가 넘쳐흐르기 때문에 관련성 점수가 높습니다. 하지만 정작 "금메달 수"라는 핵심 정보는 3위 문서에 있죠.
기존 검색 시스템은 이 차이를 구분하지 못합니다.
CAR가 제안하는 아이디어는 우아하게 단순합니다.
핵심 아이디어: 문서의 유용성을 LLM의 답변 자신감 변화로 측정하자.
구체적으로는 이렇게 작동합니다:
Step 1: 문서 없이 쿼리만으로 LLM에게 여러 번 답변을 생성하게 한다
→ 답변들이 얼마나 일관적인가? (기준 자신감 측정)
Step 2: 특정 문서를 추가한 뒤 다시 여러 번 답변을 생성하게 한다
→ 답변들이 더 일관적으로 모였나? 아니면 더 흩어졌나?
Step 3: 자신감이 올라간 문서 → 순위 올리기
자신감이 떨어진 문서 → 순위 내리기
변화 없는 경우 → 기존 순서 유지
특히 영리한 부분은 "이미 LLM이 확신하고 있는 쿼리"에는 개입을 하지 않는다는 점입니다. 쿼리 레벨 게이트(Query-level gate)라고 부르는 이 기능 덕분에 불필요한 리랭킹을 줄입니다.
💡 CAR의 핵심 철학:
"문서가 검색 점수와 얼마나 관련 있느냐"가 아니라,
"이 문서가 LLM의 답변 품질을 실제로 높이느냐"로 판단하자.
그리고 이건 학습(training)이 필요 없는 plug-and-play 방식입니다. 기존 RAG 파이프라인에 갖다 붙이기만 하면 됩니다.
결과도 인상적입니다. BEIR 벤치마크 4개 데이터셋에서 일관적으로 NDCG@5를 개선했고, 특히 YesNo 리랭커에서 Contriever 검색 기준 평균 25.4% 향상을 보였습니다. 그리고 랭킹 개선이 실제 답변 F1 개선과 Spearman ρ = 0.964라는 거의 완벽에 가까운 상관관계를 보였습니다.
이게 뭘 의미하냐면 — CAR가 순위를 올리는 문서는 실제로 답변 품질도 올려주는 문서라는 증거입니다.
"그럼 Top-k를 그냥 많이 늘리면 되는 거 아냐?"
이 생각, 저도 해봤습니다. 여러분도 해봤을 겁니다.
실제로 RAG를 만들다 보면 이런 유혹이 옵니다:
# 처음엔 이렇게 시작하고
retriever.search(query, top_k=3)
# 답이 별로면 이렇게 바꾸고
retriever.search(query, top_k=5)
# 그래도 별로면...
retriever.search(query, top_k=10)
# 그래도 별로면...???
retriever.search(query, top_k=20)
근데 어느 순간부터 오히려 답이 나빠지는 경험을 하게 됩니다.
왜일까요?
LLM은 긴 컨텍스트에서 모든 정보를 똑같이 처리하지 않습니다. 관련 없는 문서가 많아질수록:
이걸 Context Dilution이라고 부릅니다. 좋은 정보가 나쁜 정보에 희석되는 현상이죠.
Top-k를 늘릴 때 생기는 또 다른 문제가 있습니다. 바로 중복(Redundancy)입니다.
예를 들어 "파리 협정의 주요 내용"을 물어봤을 때, 검색 결과 Top-10 중 7개가 모두 "파리 협정은 지구 온도 상승을 1.5도로 제한하는 것을 목표로..."라는 같은 내용을 담고 있을 수 있습니다.
이 7개 문서는 모두 관련성은 높습니다. 하지만 정보적 가치(Information Value)는 첫 번째 문서를 본 이후로는 사실상 0에 가깝습니다.
이걸 LANCER 논문(arXiv: 2601.22008)이 정면으로 다룹니다.
LANCER의 문제의식은 명확합니다.
"In practice, however, the retrieved context often includes irrelevant and redundant information, limiting the information that the generator can use and wasting some of the generator's limited input context."
— LANCER 논문
그리고 이 문제는 특히 Long-form RAG에서 더 치명적입니다.
짧은 팩트 기반 질문(예: "파리 올림픽 금메달 몇 개?")은 하나의 문서에서 답을 찾으면 끝입니다. 하지만 리포트 생성, 종합 요약, 복잡한 분석 같은 태스크는 다릅니다. 이런 경우엔:
LANCER에서 중요하게 다루는 개념이 바로 너겟(information nugget)입니다.
너겟은 쉽게 말해 "하나의 독립적인 정보 조각"입니다.
예를 들어 "기후 변화의 영향"에 대한 리포트를 쓴다면:
너겟 1: 해수면 상승 (현재 속도, 예측치)
너겟 2: 극단적 기상 현상 증가
너겟 3: 생태계 변화 (산호초 백화 등)
너겟 4: 농업 생산성 변화
너겟 5: 인류 이주 패턴 변화
...
좋은 검색 결과는 이 너겟들을 최대한 많이 커버해야 합니다. 그런데 기존 Top-k 검색은 "기후 변화 영향"이라는 키워드에 가장 유사한 문서를 골라오기 때문에, 결과적으로 같은 너겟만 반복적으로 가져오는 경향이 생깁니다.
LANCER의 핵심 아이디어는 이렇습니다:
Step 1: 사용자의 질문을 여러 개의 서브 질문(sub-questions)으로 분해
예) "기후 변화의 영향은?"
→ "해수면은 얼마나 상승했나?"
→ "농업에 어떤 영향을 주나?"
→ "생태계 변화는 무엇인가?"
→ ...
Step 2: 각 문서가 어떤 서브 질문에 답할 수 있는지 예측
Step 3: 가능한 한 많은 서브 질문을 커버하는 문서 조합을 선택
(단순히 관련성 높은 순서가 아니라, 커버리지를 최대화하는 순서로 리랭킹)
결과적으로 검색된 문서들이 서로 보완적인 정보를 담게 됩니다.
🎯 LANCER의 핵심 철학:
"Top-k 문서가 모두 비슷한 내용일 필요가 없다.
서로 다른 정보 조각을 최대한 많이 커버하는 조합이 최선이다."
두 논문은 비슷해 보이지만, 사실 문제를 바라보는 시각이 꽤 다릅니다.
| 구분 | CAR | LANCER |
|---|---|---|
| 주요 문제 | 관련성 ≠ 유용성 | 커버리지 부족 + 중복 |
| 타깃 태스크 | Short-form QA (팩트 기반 질문) | Long-form RAG (리포트, 종합 분석) |
| 핵심 아이디어 | LLM 자신감 변화로 유용성 측정 | 서브 질문 기반 너겟 커버리지 최대화 |
| 접근 방식 | Training-free, plug-and-play | LLM 기반 서브 질문 생성 + 리랭킹 |
| 개입 시점 | 개별 문서의 유용성 판단 | 문서 집합의 다양성 설계 |
| 주요 지표 | NDCG@5, 답변 F1 | α-nDCG, Information Coverage |
이 두 논문을 함께 읽으면 흥미로운 그림이 그려집니다.
CAR는 "잘못된 문서를 걸러내는" 문제를 풀고,
LANCER는 "올바른 문서들을 다양하게 조합하는" 문제를 풉니다.
현실의 RAG 시스템에서는 두 문제가 동시에 일어납니다. 즉, 이상적으로는 두 접근법을 함께 쓰는 것이 가장 좋을 수 있습니다 — 먼저 유용하지 않은 문서를 CAR로 걸러내고, LANCER로 남은 문서들의 다양성을 확보하는 식으로요.
이 질문을 기존 Top-5 검색 시스템과 CAR+LANCER 스타일의 개선된 시스템에 던져봅시다.
[검색 결과]
1위 (점수: 0.95) — "GPT-4 기술 리포트 요약: GPT-4의 능력과 특징"
2위 (점수: 0.93) — "GPT-4 vs GPT-3.5 비교: 성능 개선 사항"
3위 (점수: 0.91) — "OpenAI GPT-4 발표: 멀티모달 기능 소개"
4위 (점수: 0.88) — "GPT-4의 한계: 환각 문제와 최신성 문제"
5위 (점수: 0.85) — "GPT-4 API 사용 가이드: 토큰 한계와 비용"
1~3위는 관련성은 높지만 "한계점"이라는 핵심 정보와는 거리가 있습니다. 4위에 핵심 정보가 있고, 5위는 부분적으로 유용합니다. LLM이 이 5개를 받으면 1~3위 문서의 내용에 영향을 받아 GPT-4의 장점을 늘어놓다가 한계를 짧게 언급하는 답변이 나오기 쉽습니다.
CAR 처리 후 (유용성 기반 리랭킹):
[리랭킹 결과]
1위 (유용성↑↑) — "GPT-4의 한계: 환각 문제와 최신성 문제"
2위 (유용성↑) — "GPT-4 API 사용 가이드: 토큰 한계와 비용"
3위 (유용성-) — "GPT-4 기술 리포트 요약"
4위 (유용성↓) — "GPT-4 vs GPT-3.5 비교"
5위 (유용성↓↓) — "OpenAI GPT-4 발표: 멀티모달 기능 소개"
LANCER 처리 후 (커버리지 최적화):
서브 질문 분해:
├── GPT-4는 어떤 사실 오류를 범하나? (환각)
├── 지식의 시간적 한계는? (최신성)
├── 맥락 길이 제한은? (컨텍스트 윈도우)
├── 추론 능력의 한계는? (논리적 오류)
└── 비용 및 접근성 문제는?
최종 선택 문서:
- 환각 + 최신성을 다루는 문서 ✓
- 컨텍스트 길이 + 비용을 다루는 문서 ✓
- 추론 실패 사례를 다루는 문서 ✓
- (중복되는 내용의 문서는 제외) ✗
결과적으로 LLM이 받는 컨텍스트가 훨씬 밀도 있고 다양해집니다.
여기까지 읽으셨다면, 이런 생각이 드실 겁니다.
"좋은데... 이거 LLM을 여러 번 호출하는 거잖아?"
맞습니다. 솔직하게 얘기해봅시다.
CAR는 각 문서의 유용성을 측정하기 위해 여러 번 LLM을 샘플링합니다. 문서가 n개라면, 대략:
기본 비용: 1번 LLM 호출 (쿼리만으로 샘플링)
추가 비용: n번 LLM 호출 (각 문서를 추가한 상태로 샘플링)
Top-10 문서를 리랭킹한다면, 최소 11번의 추가 LLM 호출이 필요합니다. GPT-4 같은 비싼 모델로 이걸 하면 비용이 꽤 올라갑니다.
다만, 논문에서는 이를 완화하는 방법들을 제안합니다 — 작은 모델을 신뢰도 측정에 쓰거나, 이미 확신이 있는 쿼리는 건너뛰는 게이트 메커니즘 등.
LANCER는 서브 질문 생성에 LLM을 쓰고, 각 문서와 서브 질문의 매칭에도 LLM을 씁니다. 역시 추가 비용이 발생합니다.
둘 다 검색 이후 추가적인 리랭킹 단계가 생기므로, 응답 시간이 늘어납니다. 실시간 챗봇에 적용하려면 이 지연 시간을 어떻게 관리할지가 중요한 엔지니어링 과제입니다.
| 상황 | 추천 여부 |
|---|---|
| 실시간 챗봇, 응답 속도 최우선 | 신중히 검토 필요 |
| 정확도가 중요한 기업용 QA | ✅ 적극 권장 |
| 배치 처리 리포트 생성 | ✅ 매우 적합 |
| 의료/법률 등 고신뢰성 요구 도메인 | ✅ 강력 권장 |
| 소규모 개인 프로젝트 | 복잡도 대비 효과 고려 필요 |
두 논문을 읽고 나면, 더 근본적인 질문이 떠오릅니다.
전통적인 정보 검색(Information Retrieval)의 목표는 "관련 문서를 찾는 것"이었습니다. 검색엔진 시대의 산물이죠. 사용자가 문서를 직접 읽으니, 관련 있는 문서를 가져다주면 충분했습니다.
하지만 RAG에서는 다릅니다. 문서를 읽는 주체가 사람이 아니라 LLM입니다.
LLM은 사람과 다르게 정보를 처리합니다. 컨텍스트가 너무 길면 중간 부분을 놓치고("Lost in the Middle" 현상), 상충되는 정보가 있으면 혼란스러워하며, 이미 알고 있는 정보를 반복해서 받으면 오히려 확증 편향이 강해질 수 있습니다.
따라서 RAG에서의 검색 목표는 이렇게 재정의되어야 합니다:
"LLM이 좋은 답변을 생성하는 데 필요한 정보를, 최소한의 노이즈로, 최대한의 커버리지로 제공하는 것"
이게 단순한 관련성 랭킹과 얼마나 다른 목표인지 이제 느껴지시나요?
CAR는 특히 이 관점에서 혁신적입니다. 검색/리랭킹 단계에서 이미 생성 모델의 반응을 피드백으로 활용합니다. 즉, 검색과 생성이 완전히 분리된 파이프라인이 아니라, 서로 영향을 주고받는 순환적 과정이 되는 것입니다.
이것은 더 큰 트렌드인 Agentic RAG, Iterative RAG 같은 방향과도 맥을 같이합니다.
오늘 이야기를 정리하면 이렇습니다.
Top-k 검색은 나쁜 게 아닙니다. 빠르고, 단순하고, 대부분의 경우 그럭저럭 동작합니다. 하지만 이것이 충분하다고 착각하는 순간, 시스템의 품질은 거기서 멈춥니다.
CAR와 LANCER가 우리에게 가르쳐주는 것은 결국 하나입니다:
🎯 "검색 점수 1등 문서가 반드시 답변에 가장 유용한 문서는 아니다.
그리고 Top-k를 늘리는 것이 반드시 더 좋은 답변으로 이어지지 않는다."
다음에 RAG 시스템을 만들거나 개선할 때, 이렇게 물어보세요:
다음에 RAG 시스템을 만들거나 개선할 때, 이렇게 물어보세요:
이 세 질문만 가지고 있어도, 여러분의 RAG 시스템은 한 단계 더 깊어질 수 있습니다.
글을 마치기 전에, 실제로 써볼 수 있는 간단한 체크리스트를 드릴게요.
✅ RAG 시스템 자가 진단 체크리스트
[ ] Top-k를 3, 5, 10으로 바꿔가며 답변 품질을 비교해본 적 있는가?
→ 어느 순간부터 나빠진다면, Context Dilution 의심
[ ] 검색된 문서들의 내용이 서로 얼마나 겹치는지 확인해본 적 있는가?
→ 중복률이 높다면, LANCER 스타일의 다양성 최적화 고려
[ ] 검색 점수 1위 문서를 제거했을 때 답변이 오히려 좋아진 경우가 있는가?
→ 있다면, CAR 스타일의 유용성 기반 리랭킹 고려
[ ] 복잡한 질문(리포트, 종합 분석)에서 답변이 한쪽 측면만 다루는 경우가 있는가?
→ 너겟 커버리지 부족 신호, 서브 질문 분해 전략 고려
[ ] 리랭킹 단계가 파이프라인에 존재하는가?
→ 없다면, 최소한 간단한 MMR(Maximal Marginal Relevance)이라도 적용 고려
두 논문을 직접 읽어보고 싶은 분들을 위해:
그리고 관련해서 함께 읽으면 좋은 주제들:
📚 함께 읽으면 좋은 주제
1. Lost in the Middle (Liu et al., 2023)
→ LLM이 긴 컨텍스트의 중간 정보를 잘 놓친다는 연구
→ Top-k를 무조건 늘리면 안 되는 이유를 더 깊이 이해할 수 있음
2. Maximal Marginal Relevance (MMR)
→ 관련성과 다양성을 동시에 고려하는 고전적 방법
→ LANCER의 아이디어와 연결되는 고전 알고리즘
3. RAGAS (RAG Assessment)
→ RAG 시스템을 평가하는 프레임워크
→ "내 RAG가 실제로 잘 작동하는지" 측정하고 싶을 때
4. Contextual Compression (LangChain)
→ 검색된 문서에서 불필요한 부분을 제거하는 접근법
→ CAR와 상호 보완적으로 쓸 수 있는 실용적 기법
RAG를 처음 만들 때는 누구나 비슷한 여정을 걷습니다.
"일단 벡터 DB에 넣고 Top-5로 뽑자"
→ "왜 이상한 답이 나오지? Top-10으로 늘려볼까"
→ "어, 더 나빠졌네. Top-3으로 줄여볼까"
→ "...도대체 뭐가 문제인 거야?"
이 답답한 순환을 겪고 있다면, 이제 방향이 보이실 겁니다.
문제는 k의 크기가 아니라, 어떤 문서를 고를 것인가의 기준이었습니다.
관련성(Relevance)에서 유용성(Utility)으로, 단순 순위에서 커버리지 최적화로. 이 방향으로 RAG의 검색 전략이 진화하고 있고, CAR와 LANCER는 그 진화의 흥미로운 이정표입니다.