Top K는 도대체 어떻게 정하나 — 2단계 검색과 동적 임계값
← 전체 목차 · 이전: 쿼리 재작성은 왜 함부로 하면 안 되나 · 다음: Rerank 모델은 언제 반드시 필요한가
고정된 숫자를 답하면 무엇이든 함정이다. Top K는 하이퍼파라미터가 아니라 하나의 파이프라인 설계 문제다.
함정 1: K가 너무 작다 — Top 1만 가져올 때의 리스크
- 벡터 검색이 비교하는 것은 의미 유사도이므로, 적중한 그 조각이 "의미는 유사하지만 구체적 데이터는 없는" 것일 수 있다.
- 결과: 모델이 컨텍스트를 잃고 어쩔 수 없이 지어낸다.
함정 2: K가 너무 크다 — Top 20을 그대로 밀어 넣기
대가 1: 주의력이 심하게 분산된다.
"장편 소설을 읽는 사람처럼 흔히 처음과 끝만 기억하고, 중간의 핵심 정보는 오히려 무시된다."
대가 2: 연산력과 비용
| 지표 | 변화 방향 |
|---|
| 입력 Token | 폭증 ↑ |
| 첫 글자 생성 | 느려짐 ↓ |
| API 과금 | 상승 ↑ |
해법: 2단계 검색 + 동적 임계값
회사가 사람을 뽑는 과정에 비유할 수 있다.
| 단계 | RAG 대응 | 채용 대응 |
|---|
| 1단계 | 벡터 검색 거친 정렬 | 인사팀 서류 선별 |
| 2단계 | 재정렬 모델 정밀 정렬 | 전문 면접 채점 |
| 최종 소비자 | 대규모 언어 모델 | 사장 |
| 후보 문서 | 텍스트 블록 | 이력서 |
1단계: 거친 정렬(서류 선별)
전량 지식베이스 --[ 벡터 검색 ]--> Top 50 후보
- 수량: 가장 관련 있는 50건을 건져 올린다.
- 목적: 목표가 반드시 후보 풀 안에 있게 보장하고 빠뜨리지 않는다(리콜 보장).
- 마음가짐: 일단 정밀도는 신경 쓰지 않는다.
2단계: 정밀 정렬(면접)
50개 후보 문서 --[ 재정렬 모델 · 건별 정밀 채점 ]--> 점수 상위 5건
예시 점수 분포: 0.99 / 0.97 / 0.95 / 0.93 / 0.91.
결과: "사장"(대규모 언어 모델)에게 넘기는 자료가 적으면서도 전부 고품질이다.
동적 임계값: 수량을 하드코딩하지 말 것
- 합격선을 하나 긋는다: Score = 0.7.
- 1명이 통과하면 → 1건만 본다, 10명이 통과하면 → 10건을 본다.
- 점수에 따라 동적으로 조정할 수 있는 것이 진짜 만점 사고다.
만점 사고 요약: K 값을 고르는 데 고정 숫자에 집착하지 말 것.
전체 파이프라인
사용자 Query
│
▼
[ 1단계 · 거친 정렬 ] Embedding 벡터 검색
전량 지식베이스 ──► Top 50 후보 텍스트 블록
목표: 리콜 보장(답이 반드시 후보 풀 안에 있을 것)
│
▼
[ 2단계 · 정밀 정렬 ] Rerank 재정렬 모델
50건 후보 ──► 건별 정밀 채점 ──► 점수순 정렬
목표: 품질 보장(진짜 관련 있는 것을 위로)
│
▼
[ 3단계 · 동적 임계값 ] Score >= 0.7 이라야 선정
통과 1건 → 1건 전달
통과 10건 → 10건 전달
(상한은 Top 5를 기본 절단으로 참고)
│
▼
대규모 언어 모델이 답변 생성
핵심 통찰
- Top K는 하이퍼파라미터가 아니라 하나의 파이프라인 설계 문제다 — 묻는 것은 "리콜"과 "정렬"을 두 가지 일로 쪼개는 의식이 있는가이며, 단일 숫자로 답하는 순간 인식이 단일 단계 검색에 머물러 있음이 드러난다.
- 리콜 단계와 정렬 단계의 최적화 목표는 반대이므로 반드시 분리해야 한다 — 리콜은 누락을 두려워하고(넘칠지언정 빠뜨리지 않기, 50건), 정렬은 잡음을 두려워한다(모자랄지언정 넘치지 않기, 5건). 하나의 K로 둘을 동시에 만족시키는 것은 수학적으로 불가능하다.
- 벡터가 유사하다 ≠ 답이 들어 있다 — 의미적으로 가장 가까운 단락이 구체적 숫자나 사실을 담고 있지 않을 수 있다. "K=1이면 충분하다" 류 직관의 가장 큰 허점이자 환각의 주요 원천 중 하나다.
- 롱컨텍스트는 공짜가 아니며 대가는 세 겹이다 — 주의력 희석(품질), 첫 글자 생성 지연(지연), 입력 Token 과금(비용). 답변할 때 세 겹을 함께 말하는 편이 "느려진다"만 말하는 것보다 완전하다.
- "중간 망각"은 예측 가능한 모델 행동이다 — 장편 소설을 읽고 처음과 끝만 기억하는 것(Lost in the Middle)과 같아서, 컨텍스트에 담긴다 해도 모델이 그것을 쓴다는 보장이 없다.
- 동적 임계값은 "몇 건을 가져갈지"의 결정권을 데이터 자체에 넘긴다 — 고정 K는 단순한 문제에서 예산을 낭비하고 복잡한 문제에서 리콜이 부족하다. 점수선이 입력량이 질문 난이도에 따라 자동으로 맞춰지게 만든다.
- 좋은 답변에는 기억할 수 있는 한 줄 구호가 있어야 한다 — "거친 정렬은 리콜 보장, 정밀 정렬은 품질 보장" 같은 대구가 파라미터 나열보다 기억에 남는다.
엔지니어링 실전 Tips
- 거친 정렬 수량은 지식베이스 규모와 청킹 입도에 맞춰 조정할 것: 50은 예시값이지 보편 상수가 아니다 — 이것이 바로 "고정 숫자에 집착하지 말라"와 호응한다.
- 정밀 정렬은 지연으로 품질을 사는 것이다: Rerank는 N개 후보를 건별로 모델에 통과시켜야 하므로 거친 정렬 K가 클수록 정밀 정렬 오버헤드가 커진다. 50 → 5의 수렴비는 비교적 균형 잡힌 출발점이다.
- 임계값은 자기 Rerank 모델에 맞춰 보정해야 한다: 재정렬 모델마다 점수 분포 차이가 크므로 0.7을 그대로 옮겨 쓸 수 없다.
- 동적 임계값에 상하한을 둘 것: 통과 0건일 때의 백스톱 전략(예: 다운그레이드로 Top 1을 반환하되 신뢰도가 낮음을 알림), 통과가 너무 많을 때의 하드 상한(컨텍스트 예산 보호).
- 총 소요 시간만이 아니라 첫 글자 생성 지연(TTFT)에 주목할 것: 입력이 길어지면 가장 먼저 악화되는 것이 첫 글자 지연이며, 사용자 체감이 가장 강한 지표다.
- 모니터링 3종: 리콜률(1단계), 적중 품질(2단계), 입력 Token / 첫 글자 지연(3단계의 비용 면).
- 더 파고들 방향: 혼합 검색(벡터 + BM25)으로 거친 정렬 리콜을 더 끌어올리기, 청킹 전략(chunk size / overlap)이 "의미는 유사하나 데이터가 없는" 문제에 미치는 영향, Rerank 모델 선택과 지연 예산의 취사선택, 임계값의 자동 보정 방법(오프라인 라벨링셋의 PR 곡선으로 지점 정하기), 통과 0건일 때의 백스톱과 거부 응답 전략.