RAG 검색 전략은 어떻게 설계하는가 — 3층 구조
← 전체 목차 · 이전: BM25와 벡터 검색은 도대체 무엇이 다른가 · 다음: 쿼리 재작성은 왜 함부로 하면 안 되나
기술 명사를 늘어놓지 말고 목표를 먼저 밝힐 것. RAG 검색이 쫓는 것은 두 글자다 — 정확함과 완전함. 그런데 이 둘은 본질적으로 모순된다.
| 목표 | 정의 | 반례 |
|---|
| 정확함 | 리콜된 내용이 반드시 질문과 관련될 것 | 사용자가 주문을 물었는데 재고를 찾아준다 |
| 완전함 | 핵심 정보를 빠뜨리지 말 것, 특히 다각도·다증거가 필요한 질문에서 | 증거의 절반만 건져 온 채 모델에게 답하게 한다 |
- 많이 리콜하면 → 노이즈가 많다.
- 적게 리콜하면 → 핵심 증거를 놓친다.
- 결론: 진짜 실제로 돌아가는 RAG는 "벡터 검색 하나 붙이면 끝"이 아니라 계층 설계다.
Query
├─ 1층 리콜층(다경로 리콜, 「완전함」 추구)
├─ 2층 융합층(통일 정렬, 점수 비교 불가 문제 해결)
└─ 3층 정밀 정렬층(Re-rank, 「정확함」 추구) → 대규모 모델에 전달
1층: 리콜층 — 단일 경로 검색을 맹신하지 말 것
이 층은 특별히 정확할 것을 추구하지 않고 **"관련 가능성이 있는 내용을 최대한 건져 올리는 것"**만 추구한다.
| 리콜 경로 | 우위 | 적용/한계 |
|---|
| 벡터 검색 | 의미 이해력이 강하다. 사용자가 "환불은 어떻게 하나요"라고 묻고 문서에는 "애프터서비스 환불 절차"라고 쓰여 있어도, 단어가 달라도 의미가 가까우면 리콜된다 | 고유명사, 모델명, 브랜드, 주문 번호, 인터페이스명 같은 정확 정보에는 반드시 믿을 만하지 않다(급소) |
| 키워드 검색 | 벡터의 급소를 보완, 정확 매칭 | 의미 일반화 없음 |
| 구조화 필터 | 업무 라인 / 시간 범위 / 카테고리 / 권한 범위로 먼저 거른다 | 메타데이터 필드가 있어야 한다 |
| 그래프 검색 | 엔티티 관계, 다단계 관계 문제 처리 | 복잡한 시나리오에서만 도입 |
리콜층의 핵심 로직: 서로 다른 시점에서 후보 문서를 최대한 완전하게 건져 올린다.
2층: 융합층 — 여러 경로의 점수는 비교할 수 없다
문제: 벡터 검색에는 자체 점수가 있고 키워드 검색에도 자체 점수가 있는데, 두 점수는 같은 체계가 아니어서 직접 비교할 수 없다.
- 가장 단순한 방안: 가중 융합 —
벡터 검색 × 0.7 + 키워드 검색 × 0.3 → 종합 점수 → 다시 한 번 정렬.
- 핵심 주의: 가중치를 절대 하드코딩하지 말 것. 통일된 표준 답이 없으며 업무·데이터·질문 유형이 다르면 최적 가중치도 반드시 다르다.
- 더 성숙한 방안: 과거 클릭 + 사람 라벨링 + 문답 효과로 학습 순위(LTR) 모델 또는 융합 정렬 모델을 학습시킨다.
융합층의 요점은 결과를 이어 붙이는 것이 아니라 여러 경로의 검색 결과를 어떻게 통일해서 정렬할 것인가를 해결하는 것이다.
3층: 정밀 정렬층 — RAG 시스템의 상한을 결정한다
- 다경로 리콜은 50편, 심지어 100편의 문서를 건져 올 수 있는데 전부 대규모 모델에 던지면 안 된다: ①너무 비싸고 ②너무 느리고 ③노이즈가 많아 오히려 답변을 방해한다.
- 해법: Re-rank 정밀 정렬 모델을 도입해 Query와 Doc의 의미 관련성을 깊이 계산하고 가장 관련 있는 Top 5~10만 남긴다.
- 정밀 정렬층은 "충분히 정확함"을 추구하며, 이 단계를 잘하면 RAG 답변 품질이 한 등급 뚜렷이 올라간다.
가점 요소 3종
① 동적 리콜 수량
| 질문 유형 | 예시 | 권장 리콜량 |
|---|
| 단순 사실 질문 | "환불은 며칠 만에 입금되나요" | Top 5~10 |
| 복잡 추론·분석 | 다단계 / 비교 / 총괄 | Top 50+ |
전제 조건: 의도 인식 + 질문 복잡도 판단을 먼저 하고 나서 얼마를 가져올지 결정한다.
② Query 재작성과 확장
- 사용자의 질문은 대개 전문적이지 않고 불완전하다.
- 예: "이 돈 어떻게 돌려받아요" → "환불 절차", "환불 조건", "환불 입금 시간"으로 재작성·확장.
- 수익: 리콜 품질이 직접 올라간다. (경계는 문서 07 참조)
③ 검색 공간을 먼저 압축한 뒤 정밀 검색
- 문서량이 특별히 많을 때 처음부터 전체 라이브러리에서 검색하지 말 것.
- 1단계: 다차원 거친 필터 — 업무 도메인 / 카테고리 / 장·절 / 권한 / 시간 범위.
- 2단계: 좁혀진 범위에서 벡터 검색 + 키워드 검색.
- 수익: 효율이 높아지고 효과도 더 안정적이다.
전체 검색 링크
사용자 Query
│
├─[0] 의도 인식 + 복잡도 판단 → 동적 top_k 결정(단순 사실 5~10 / 복잡 추론 50+)
├─[0] Query 재작성과 확장 → "이 돈 어떻게 돌려받아요" → 환불 절차 / 조건 / 입금 시간
│
├─[1] 다차원 거친 필터(검색 공간 압축)
│ 업무 도메인 / 카테고리 / 장·절 / 권한 / 시간 범위
│
├─[2] 리콜층(다경로 병렬, 완전함 추구)
│ ├── 벡터 검색 (의미 근접)
│ ├── 키워드 검색 (모델명 / 주문 번호 / 인터페이스명 등 정확 정보)
│ ├── 구조화 필터 (업무 라인 / 시간 / 카테고리 / 권한)
│ └── 그래프 검색 (엔티티 관계 / 다단계 추론, 복잡 시나리오에서만)
│ ↓ 후보 50~100편
│
├─[3] 융합층(통일 정렬)
│ 단순: 벡터 ×0.7 + 키워드 ×0.3 → 종합 점수 → 재정렬
│ 진급: LTR / 융합 정렬 모델(과거 클릭 + 사람 라벨링 + 문답 효과)
│
├─[4] 정밀 정렬층(Re-rank, 정확함 추구)
│ Query × Doc 의미 관련성 심층 계산 → Top 5~10만 보존
│
└─→ 대규모 모델 생성
핵심 통찰
- 목적 함수를 먼저 주고 나서 기술을 고를 것 — "정확함과 완전함"은 측정 가능한 한 쌍의 목표다(Precision / Recall에 근사). 어떤 검색 컴포넌트든 그 존재 이유가 **"정확함을 올리는가 완전함을 올리는가"**에 답할 수 있어야 하며, 그러면 답변에 자연히 구조가 생기고 명사 나열을 피할 수 있다.
- 정확함과 완전함의 모순은 "파라미터 조정"이 아니라 "계층화"로 풀어야 한다 — 단층 검색에서 top_k를 조정하는 것은 정확함과 완전함 사이를 미끄러지는 것뿐이다. 계층화는 "완전함 추구"와 "정확함 추구"를 서로 다른 단계로 쪼개 앞은 느슨하게 뒤는 조이게 함으로써 둘을 동시에 얻는다. 검색/추천 분야의 "리콜 – 거친 정렬 – 정밀 정렬" 깔때기 패러다임을 RAG에 그대로 옮긴 것이다.
- 단일 경로 검색에는 반드시 사각지대가 있고, 사각지대는 데이터 형태가 결정한다 — 벡터는 의미 근사(환불 ↔ 애프터서비스 환불)에 강하지만 식별자 계열 정보(모델명, 주문 번호, 인터페이스명, 브랜드)에는 실효한다. 이런 token은 의미 공간에서 변별력이 극히 낮기 때문이다. 키워드 경로를 추가할지 여부는 코퍼스에 이런 필드가 있는지를 보면 된다.
- 다경로 리콜의 진짜 난점은 "리콜"이 아니라 "병합"이다 — 서로 다른 검색 경로의 점수 분포는 출처도 척도도 다르므로 직접 크기를 비교하는 것은 틀렸다. 융합층은 중복 제거를 위해서가 아니라 비교 가능성 문제를 풀기 위해 존재한다.
- 가중치는 업무 파라미터이지 상식 상수가 아니다 — 0.7/0.3은 시작 자세일 뿐이며, "업무·데이터·질문 유형이 다르면 최적 가중치가 다르다"를 인정하고 과거 클릭·사람 라벨링·문답 효과로 정렬 모델을 학습시키는 진급 경로를 함께 제시해야 한다. 자기가 준 경험값을 스스로 부정하는 것은 감점이 아니라 가점이다.
- 정밀 정렬이 상한을 결정하고 리콜이 하한을 결정한다 — 리콜층에서 빠뜨린 내용은 이후 영원히 되살릴 수 없고(하한 결정), 정밀 정렬은 최종적으로 모델에 넘기는 신호 대 잡음비를 결정한다(상한 결정). 자원이 제한적이면 먼저 리콜 누락을 막고 그다음에 정밀 정렬을 보완할 것.
- 모델에 주는 컨텍스트는 "비싸고, 느리고, 시끄럽다" 세 겹의 비용을 함께 계산해야 한다 — 정밀 정렬 없이 100편을 그대로 밀어 넣는 대가는 돈과 지연만이 아니라 노이즈 오염으로 인한 답변 품질 저하다.
- 검색 공간 압축은 "구조화 메타데이터"의 승리다 — 문서에 업무 도메인/카테고리/장·절/권한/시간 필드만 있으면 다차원 거친 필터로 리콜 품질과 지연을 동시에 개선할 수 있다. RAG 수익의 상당 부분이 검색 시점의 알고리즘이 아니라 적재 시점의 메타데이터 설계에서 온다.
엔지니어링 실전 Tips
- 단일 경로 검색을 맹신하지 말 것: 벡터 검색은 기준선이지 전부가 아니다. 정확 식별자가 있는 코퍼스에는 반드시 키워드 경로를 붙일 것.
- 가중 융합의 가중치를 설정 파일에 둘 것: 업무/질문 유형별로 따로 조정하고, 오프라인 평가(과거 클릭, 사람 라벨링)로 이터레이션할 입구를 남길 것.
- 후보량 통제: 50
100편 리콜이 흔한 규모이며, 대규모 모델에 넘기기 전에 반드시 Top 510으로 압축해야 세 겹의 비용이 동시에 내려간다.
- 동적 top_k가 고정 top_k보다 이득이다: 단순 사실 질문은 5~10이면 충분하고, 예산은 다단계/비교/총괄 유형에 남길 것.
- Query 재작성은 대체식이 아니라 확장식으로: 하나의 구어체 질문을 여러 전문적 표현으로 확장해 병렬 리콜하는 편이 하나로 바꿔 쓰는 것보다 안정적이다.
- 거친 필터 차원은 적재 메타데이터에 의존한다: 지금 문서에 업무 도메인/카테고리/장·절/권한/시간 필드가 없다면, 메타데이터를 먼저 보완하는 편이 모델을 바꾸는 것보다 가성비가 높다.
- 권한 차원은 효율 최적화이자 보안 경계다: 권한 필터를 검색 링크의 가장 앞에 두어 월권 내용이 컨텍스트에 들어가는 것을 막을 것.
- 더 파고들 방향: 고정 가중치 대신 RRF(Reciprocal Rank Fusion)로 "점수 비교 불가" 문제를 우회하기, Re-rank 모델 선택과 비용(cross-encoder의 지연 vs 효과), 리콜 평가 지표 실무 적용(Recall@k, 적중률, 사람 라벨링 집합 구축), 그래프 검색(GraphRAG)의 다단계 문답에서의 실제 수익과 그래프 구축 비용.