WEEK 07 · RAG 평가와 고도화

RAG는 어디서 틀리는가

오답 진단 · 평가 데이터셋 · 검색 지표 · 하이브리드·리랭킹·쿼리 재작성

오답을 진단하고 지표로 재고 검색을 고친다

  • RAG 4단계
  • 평가 데이터셋
  • Hit Rate@K
  • Recall
  • Precision@K
  • MRR
BIG IDEA

RAG 오답은 검색에서 생기는 경우가 많다. Top-K가 그대로 컨텍스트가 되므로 검색 품질이 생성 품질의 천장이 된다. 정답 근거가 있는 평가셋으로 Hit Rate·Recall·Precision·MRR을 재고, 부족하면 하이브리드 검색·리랭킹·쿼리 재작성으로 보완한다.

오답이 나오면 어디부터 볼까?

RAG 오답은 네 단계 어디서든 생긴다. 모델에 넘어간 컨텍스트에 정답이 있었는지부터 확인한다.

RAG는 질의 처리, 검색, 컨텍스트 구성, 생성의 4단계를 거친다. 오답도 이 네 단계 어디서든 생긴다. 그래서 원인을 찾을 때는 모델이 실제로 본 컨텍스트부터 확인한다. 컨텍스트에 정답이 있는데 틀렸다면 생성 문제다.

없었다면 DB에 정답이 있었는지 본다. DB에도 없으면 인덱싱 문제, DB에는 있으면 검색 문제다. 검색 문제는 Top-K, 순위, 하이브리드 검색 여부로 좁힌다.

RAG 4단계
질의 처리 → 검색 → 컨텍스트 구성 → 생성. 오답 진단의 좌표가 된다.
컨텍스트 구성
검색된 조각을 프롬프트에 넣는 단계. 여기에 정답이 있는지가 첫 분기점이다.
인덱싱 문제
DB에 있는 문서가 청크·임베딩되지 않았거나 빠진 경우. 검색으로는 찾을 수 없다.
검색 문제
Top-K가 작거나, 순위가 밀리거나, 하이브리드 검색이 빠진 경우.
대화 맥락 유실
'언제까지야?'를 그대로 임베딩하면 주제가 빠진다. 엉뚱한 조각이 검색되고 답도 질문과 멀어진다.
FIG. 01 오답 진단 분기
오답이 나왔다 컨텍스트 → DB → 인덱싱·검색 순서
컨텍스트에 정답이 있나? Yes → 생성 문제
  • 근거 무시
  • 내용 왜곡·혼합
DB에 정답이 있나? No → 인덱싱 문제
  • 청크 누락
  • 임베딩 안 됨
DB에는 있다 → 검색 문제
  • Top-K 부족
  • 순위 밀림
  • 하이브리드 미적용

위에서 확인하고, 아니면 다음 단계로 내려간다.

무엇을 기준으로 채점할까?

지표를 계산하려면 기준점이 필요하다. 그래서 평가 데이터셋을 먼저 만든다.

평가셋은 질문마다 정답 근거와 기대 답변을 붙인 표다. 정답 근거는 검색을, 기대 답변은 생성을 채점하는 기준이 된다. 항목은 질문, 정답 근거, 기대 답변, 질문 유형, 답변 가능 여부다. 질문 유형은 직접형, 표현 변형형, 식별자형 등 6가지로 둘 수 있다.

정답 근거에는 DB ID 대신 고유 식별자를 적는다. 청크 크기를 바꾸거나 재인덱싱하면 ID가 바뀌어 평가셋을 고치기 어렵다. LLM에게 평가셋을 만들게 할 수도 있다. 다만 청크 문장을 거의 그대로 베끼는 경우가 있어 사람이 확인해야 한다.

평가 데이터셋
질문, 정답 근거, 기대 답변, 질문 유형, 답변 가능 여부를 담은 표. 모든 지표의 분모가 된다.
정답 근거
검색이 찾아야 할 원문 조각. 검색 지표를 채점하는 기준이다.
기대 답변
생성이 내야 할 답. 생성 지표를 채점하는 기준이다.
질문 유형
직접형, 표현 변형형, 식별자형 등 6가지. 어느 유형에서 약한지 드러난다.
고유 식별자
DB ID 대신 쓰는 안정적인 표식. 재인덱싱에도 평가셋이 살아남는다.

검색이 좋아야 답이 좋다

Top-K가 그대로 컨텍스트가 되므로 검색 지표가 생성 품질의 천장을 정한다.

Hit Rate@K는 상위 K개 안에 정답이 하나라도 든 질문의 비율이다. 여기에 정답이 없으면 생성은 아무리 좋아도 맞출 수 없다. 그래서 Hit Rate가 생성 품질의 천장이 된다. Hit@3과 Hit@5가 같다면 Hit@3만 써서 컨텍스트 토큰을 아낀다.

임계값은 근거 있음과 없음을 나누는 분류다. 4주차에는 감으로 정했지만 이제 답 없음 질문으로 측정한다. 임계값을 올리면 오수용은 줄고 잘못된 거부는 는다. 오수용은 답 없는 질문을 통과시켜 지어내게 한다. 잘못된 거부는 답할 수 있는 질문을 막아 '모른다'고 하게 한다.

Hit Rate@K
상위 K개에 정답이 든 질문의 비율. 검색의 천장을 보여준다.
Recall
정답 조각 여러 개 중 몇 개를 찾았나. 휴학·복학 질문에서 휴학만 찾으면 Hit는 1, Recall은 0.5다.
Precision@K
상위 K개 중 정답이 차지하는 비율. K를 키우면 Recall은 오르고 Precision은 떨어진다. 정답 1개, K=5면 최대 0.2다.
MRR
첫 정답 순위의 역수 평균. 1위 1, 2위 0.5, 3위 0.333, 못 찾으면 0. 순위가 1, 3, 없음, 2, 1이면 (1+0.333+0+0.5+1)/5 = 0.567이다.
임계값
근거 유무를 가르는 기준. 오수용과 잘못된 거부 사이의 균형을 정한다.
검색 평가 지표 비교
지표계산보는 것주의점
Hit Rate@K상위 K개에 정답이 든 질문 비율검색의 천장K를 줄이면 토큰 비용도 준다
Recall찾은 정답 조각 / 전체 정답 조각다중 근거 회수휴학만 찾으면 Hit 1, Recall 0.5
Precision@K상위 K개 중 정답 비율군더더기 없는 정도정답 1개, K=5면 최대 0.2
MRR첫 정답 순위 역수의 평균정답이 얼마나 위에 있나1위 1, 2위 0.5, 3위 0.333, 없음 0
NDCG순위와 관련도 등급을 함께 반영다중 근거·등급보조 지표로만 쓴다

검색이 맞아도 답은 틀릴 수 있다

정답 조각을 넣어줘도 모델은 다른 내용을 섞는다. 생성은 따로 채점한다.

근거 충실도는 답변을 주장 단위로 쪼개 각 주장이 컨텍스트에서 확인되는지 본다. 주장 4개 중 3개가 확인되면 0.75다. 그 외에 답변 관련성, 기대 답변과 같은 내용인지 보는 정답 일치, 출처 표시가 맞는지 보는 출처 정확도, 답 없는 질문에 '모른다'고 하는지 보는 거부 적절성이 있다.

'8주차 금요일까지'와 '학기 시작 후 8주째 금요일 전'은 글자는 다르지만 내용은 같다. 문자열 비교로는 이런 판정이 어렵다. 그래서 LLM에게 채점을 맡기는 LLM-as-a-Judge를 쓴다. 판정 프롬프트에는 컨텍스트만 사실 근거로 쓰고 자기 지식은 쓰지 말라고 적는다.

근거 충실도
답변의 주장이 컨텍스트에서 확인되는 비율. 주장 4개 중 3개면 0.75다.
답변 관련성
답이 질문에 실제로 대답하는지 본다. 맞는 내용도 질문과 무관하면 낮다.
정답 일치
기대 답변과 같은 내용인지 본다. 표현이 달라도 의미가 같으면 맞다.
출처 정확도
표시한 출처가 실제 근거와 맞는지 본다. 출처만 틀리는 경우도 잡는다.
거부 적절성
답 없는 질문에 '모른다'고 하는지 본다. 지어내면 감점이다.

순위를 고치고, 질문을 고친다

리랭킹은 후보의 순위를 정밀하게 만들고, 쿼리 재작성은 검색에 들어가는 질문 자체를 고친다.

Bi-Encoder는 질문과 문서를 따로 임베딩해 빠르지만 정밀도가 낮다. 주제는 같지만 답이 없는 조각이 높은 점수를 받기도 한다. 그래서 1단계에서 후보 30개를 뽑고 2단계에서 다시 채점한다. Cross-Encoder는 질문과 문서를 한 쌍으로 넣어 점수 하나를 내고, 정확하지만 문서마다 계산해야 해서 느리다.

쿼리 재작성은 검색에 들어갈 질문 자체를 고친다. '그럼 그건 몇 번까지 돼?'를 '휴학은 재학 중 최대 몇 번까지 신청할 수 있나?'로 바꾸는 식이다. 다시 쓴 질문은 검색에만 쓰고 생성에는 원 질문과 원 대화 이력을 넘긴다. 재작성으로 의도가 바뀌거나 환각이 히스토리에 쌓일 수 있기 때문이다.

Bi-Encoder
질문과 문서를 따로 임베딩한다. 미리 계산할 수 있어 빠르지만 정밀도가 떨어진다.
Cross-Encoder
질문과 문서를 한 쌍으로 붙여 관련성 점수 하나를 낸다. 단어가 서로를 직접 참조해 정확하지만 질문마다 여러 번 계산해야 한다.
2단계 리랭킹
1단계에서 Recall@30으로 후보를 뽑고, 2단계에서 Top-5를 골라 컨텍스트로 넘긴다. 1단계는 Recall@30, 최종은 Hit@5와 MRR로 평가한다. 후보에 정답이 없으면 리랭킹은 무의미하다.
쿼리 재작성
대화 이력과 마지막 질문으로 독립적인 질문을 만든다. 임베딩 모델에는 마지막 한 줄만 들어가므로 필요한 처리다.
다중 쿼리 · HyDE · 질문 분해
같은 의도를 여러 표현으로 검색해 RRF로 합치거나, 가상 답변 문서를 임베딩해 검색하거나, 질문을 하위 질문으로 쪼갠다. HyDE의 가상 답변은 지어낸 내용이라 검색에만 쓰고 컨텍스트에 넣지 않는다.
FIG. 03 Bi-Encoder vs Cross-Encoder

Bi-Encoder

  • 질문·문서를 따로 임베딩
  • 미리 계산해 빠르다
  • 정밀도가 낮다
  • 1단계 후보 검색

Cross-Encoder

  • 질문+문서를 한 쌍으로 입력
  • 단어가 서로를 직접 참조
  • 정확하지만 느리다
  • 2단계 리랭킹

빠른 1단계로 30개를 뽑고, 정확한 2단계로 5개를 고른다.

검색·질의 고도화 기법 비교
기법고치는 것방법주의점
하이브리드 검색검색 범위의미·키워드 순위를 RRF로 결합식별자 적은 문서엔 효과가 작다
리랭킹후보 순위Bi-Encoder로 30개 → Cross-Encoder로 Top-5후보에 정답이 없으면 무효, 비용·지연
쿼리 재작성검색 질문대화 이력으로 독립 질문 생성검색에만 사용, 생성엔 원 질문
다중 쿼리질문 표현여러 표현으로 검색 후 RRFLLM 호출이 늘어난다
HyDE질문-문서 간극가상 답변 문서를 임베딩해 검색가상 답변은 검색 전용, 컨텍스트·사용자 노출 금지

시험 직전 체크

EXAM POINTS
  1. 오답 진단은 컨텍스트에 정답이 있나 → DB에 있나 → 인덱싱인가 검색인가 순서로 내려간다.
  2. Hit Rate@K는 생성 품질의 천장이다. Top-K에 정답이 없으면 생성은 맞출 수 없다.
  3. Hit와 Recall은 다르다. 휴학·복학 질문에서 휴학만 찾으면 Hit는 1, Recall은 0.5다.
  4. MRR은 첫 정답 순위의 역수 평균이다. 순위 1, 3, 없음, 2, 1이면 0.567이다.
  5. 임계값을 올리면 오수용은 줄고 잘못된 거부는 는다.
  6. 재작성 질문과 HyDE의 가상 답변은 검색에만 쓰고 생성에는 원 질문을 넘긴다.

헷갈리는 것만

COMMON TRAPS
Hit Rate와 Recall은 같은 것 아닌가?

다르다. Hit는 정답을 하나라도 찾았는지, Recall은 여러 정답 중 몇 개를 찾았는지다. 휴학만 찾으면 Hit 1, Recall 0.5다.

임계값을 올리면 무조건 안전한가?

아니다. 오수용은 줄지만 답할 수 있는 질문까지 거부한다. 에이전트 방향에 따라 균형을 정한다.

RRF는 검색 점수를 정규화해 더하는 것인가?

아니다. 점수 대신 순위를 쓴다. 1/(k+rank)를 목록마다 더하며 k=60을 많이 쓴다.

재작성한 질문을 생성에도 쓰면 더 정확하지 않나?

아니다. 의도가 바뀌고 환각이 누적될 수 있다. 생성에는 원 질문과 원 대화 이력을 넘긴다.

리랭킹만 붙이면 검색이 좋아지나?

1단계 후보에 정답이 있어야 한다. 없으면 리랭킹은 무의미하므로 Recall@30을 먼저 확인한다.

KEYWORDS

  • RAG 4단계
  • 평가 데이터셋
  • Hit Rate@K
  • Recall
  • Precision@K
  • MRR
  • 근거 충실도
  • RRF
  • Cross-Encoder
  • 쿼리 재작성

연결해서 기억하기

  • 4주차의 임베딩 검색과 감으로 정한 임계값을, 이번 주에는 평가셋과 지표로 측정한다.
  • 검색 지표가 낮으면 5~6절의 하이브리드 검색·리랭킹·쿼리 재작성으로 보완한다.
  • 질문 분해는 이후 주차에서 더 다루며, 모든 고도화는 LLM 호출 비용과 연결된다.