기본 콘텐츠로 건너뛰기

RAG 검색 평가하는 법: Hit@k와 MRR로 채점해 봤다 [RAG 검색 이해하기 5편]

4편 끝에 이렇게 적었다. 질문 5개를 눈으로 보는 걸로는 정말 좋아졌는지 말하기 어렵다고. 지금 내 서비스도 그렇다. 완료라는 게 없고 계속 고도화해야 하는데, 뭔가 바꿀 때마다 "이게 나아진 건가?"를 확인할 방법이 필요하다.

그래서 시리즈 마지막 편은 검색 품질을 숫자로 재는 법이다. 1~4편의 문서 14개로 시험지를 만들어 키워드, 벡터, 하이브리드, 필터, 재정렬을 채점해 봤다. 그런데 첫 시험은 거의 다 만점이 나왔다. ㅡ,.ㅡ; (1편 · 2편 · 3편 · 4편)

시험지 만들기: 질문과 정답을 미리 정해 둔다

검색 평가는 시험과 같다. 질문을 만들고, 각 질문의 정답 문서를 사람이 미리 정해 둔다. 그다음 검색 방법마다 정답을 몇 위에 찾는지 본다.

# 평가용 질문과 정답 문서 번호 (사람이 미리 정해 둔다)
EVAL = [
    ("GPU 서버 최대 사용 기간",           {7}),      # 정답이 하나
    ("문서를 자동으로 분류해 주는 AI",     {2, 13}),  # 정답이 둘 이상이어도 된다
    ("2주 넘게 쓰고 싶으면?",              {7}),      # 문서와 겹치는 단어가 적은 질문
    ("0137 문서",                          {12}),     # 사용자는 번호를 다 안 쓴다
    # ...
]
NO_ANSWER = ["연차 휴가 신청 방법", "사내 식당 메뉴"]  # 문서에 답이 없는 질문

자바 개발자 입장에서는 JUnit 테스트 케이스와 똑같다. 입력(질문)과 기대값(정답 문서)을 적어 두고, 코드를 바꿀 때마다 다시 돌린다. 검색 설정을 하나 바꿨는데 다른 질문이 망가지는 일을 이걸로 잡는다.

채점 기준: Hit@k와 MRR

점수는 두 가지만 봤다.

  • Hit@k: 정답 문서가 k위 안에 들어온 질문의 비율. Hit@3이 0.9면 질문 10개 중 9개는 3위 안에 정답이 있다는 뜻이다. RAG는 보통 상위 3~5개를 생성형 AI에게 넘기니 Hit@3, Hit@5가 실무에서 중요하다.
  • MRR(Mean Reciprocal Rank): 정답이 처음 나온 순위의 역수를 평균 낸 값. 1위면 1점, 2위면 0.5점, 3위면 0.33점, 못 찾으면 0점이다. 1에 가까울수록 정답이 위에 있다.
def first_hit(ranks, gold):
    """정답 문서가 처음 나온 순위 (못 찾으면 None)"""
    for r, doc in enumerate(ranks, 1):
        if doc in gold:
            return r
    return None

def evaluate(search):                       # search(질문) -> 문서 번호 순위 목록
    hits = {1: 0, 3: 0, 5: 0}; mrr = 0
    for q, gold in EVAL:
        r = first_hit(search(q), gold)
        for k in hits:
            if r and r <= k: hits[k] += 1   # Hit@k: k위 안에 들었나
        mrr += 1 / r if r else 0            # MRR: 1위면 1, 2위면 0.5, 3위면 0.33
    n = len(EVAL)
    return {f"Hit@{k}": v / n for k, v in hits.items()} | {"MRR": mrr / n}

for name, search in [("키워드", kw_rank), ("벡터", vec_rank), ("RRF", hybrid)]:
    print(name, evaluate(search))

정답 문서가 여러 개일 때 그중 몇 개를 찾았는지 보는 Recall@k, 순위별로 점수를 깎는 nDCG 같은 지표도 있다. 처음에는 Hit@k와 MRR 두 개면 충분했다.

첫 번째 시험: 다 만점이었다

질문 20개로 첫 시험을 쳤다. 질문은 "GPU 서버 최대 사용 기간", "영수증은 어떻게 제출해?"처럼 만들었다.

방법Hit@1Hit@3MRR질문당 시간
키워드0.850.900.8750 ms
벡터0.951.000.97514 ms
하이브리드(RRF)0.951.000.97513 ms
RRF + 필터1.001.001.00014 ms
+ 재정렬0.951.000.975381 ms

벡터 이후로는 Hit@3이 전부 1.00이다. 차이가 안 보인다. 오히려 재정렬은 "PyTorch 까는 법" 하나를 1위에서 2위로 내렸고, 시간은 27배 더 걸렸다. 이 결과만 보면 "재정렬은 돈만 들고 쓸모없다"는 결론이 나온다.

원인은 시험지였다. 첫 시험지의 질문은 문서 제목을 보면서 만든 것이라, 질문과 문서가 단어를 많이 공유했다. 시험이 쉬우면 누가 잘하는지 가려지지 않는다.

두 번째 시험: 어려운 질문과 답이 없는 질문

그래서 실제 사용자가 물을 법한 말투로 12개를 다시 만들었다. 문서와 겹치는 단어가 적은 질문이다.

  • "2주 넘게 쓰고 싶으면?" (정답: 제3장 사용 시간)
  • "서버 다 쓰고 나서 해야 할 일" (정답: 제5장 반납)
  • "0137 문서" (정답: TD-2024-0137. 사용자는 번호를 다 안 쓴다)
  • "운영 매뉴얼 옛날 버전 말고 지금 거" (정답: R2)
  • "텐서플로 설치" (정답: 딥러닝 프레임워크 설치 가이드)
쉬운 시험과 어려운 시험의 MRR 비교: 어려운 시험에서는 재정렬만 버텼다
방법쉬운 시험 MRR어려운 시험 MRR어려운 시험 Hit@1어려운 시험 Hit@5
키워드0.8750.6390.580.75
벡터0.9750.8440.750.92
하이브리드(RRF)0.9750.7250.581.00
RRF + 필터1.0000.7290.581.00
+ 재정렬0.9750.9580.921.00

시험이 어려워지자 순위가 완전히 바뀌었다. 쉬운 시험에서 쓸모없어 보이던 재정렬이 어려운 시험에서는 혼자 0.958이다. 키워드 검색은 '택시비', '머신러닝 공부', '0137 문서'를 아예 못 찾았다. '0137 문서'는 형태소 분석기가 문서 쪽 번호를 '2024-0137' 한 덩어리로 다루기 때문에 '0137'만으로는 맞지 않았다. 4편에서 만든 문서번호 필터도 'TD-0000-0000' 모양만 알아봐서 움직이지 않았다.

제일 흥미로운 줄은 하이브리드다. Hit@1은 0.58로 벡터(0.75)보다 낮다. 4편에서 본 것처럼 키워드 쪽 잡음이 섞이면서 1위를 자주 놓친다. 그런데 Hit@5는 1.00이다. 정답을 1위로 올리지는 못해도 5위 안에는 빠짐없이 넣는다. 그걸 재정렬이 다시 줄 세우니 0.92가 된다.

정리하면 하이브리드는 "후보를 놓치지 않는 역할", 재정렬은 "후보 중에 정답을 위로 올리는 역할"이다. 4편에서 정리한 순서(하이브리드 → 재정렬)가 왜 그 순서인지 숫자로 확인한 셈이다.

답이 없는 질문: '관련 문서 없음'은 생각보다 어렵다

마지막으로 문서 14개 어디에도 답이 없는 질문 3개를 던졌다. RAG에서는 이때 "모르겠다"고 해야 한다. 엉뚱한 문서를 근거로 그럴듯한 답을 만들면 안 된다.

답이 없는 질문의 점수: 벡터는 0.8 이상, 재정렬은 0.004 이하
답이 없는 질문벡터 1위 (점수)재정렬 1위 점수
연차 휴가 신청 방법출장비 정산 규정 (0.840)0.004
사내 식당 메뉴출장비 정산 규정 (0.839)0.000
법인카드 한도 올리는 법출장비 정산 규정 (0.815)0.000

벡터 검색은 셋 다 출장비 정산 규정에 0.8 넘는 점수를 줬다. 3편에서 본 것처럼 벡터 점수로는 "관련 없음"을 거를 수 없다. 재정렬은 0.004 이하로 확실히 낮다.

그런데 4편에서 "재정렬 점수가 낮으면 관련 문서 없음으로 볼 수 있다"고 쓴 건 반만 맞았다. 답이 있는 질문 12개의 재정렬 1위 점수도 최저 0.000, 중간값 0.017, 최고 0.597이었다. 이번 문서들이 대부분 제목 한두 줄짜리라, 재정렬 모델 눈에는 "답이 될 만큼 내용이 충분한 문서"가 거의 없었던 거다. 이 상태로 기준점을 0.01에 두면 답이 있는 질문의 절반을 "모르겠다"로 버리게 된다.

결국 기준점은 실제 문서와 실제 질문으로 재서 정해야 한다. 이것도 평가셋이 있어야 할 수 있는 일이다.

평가셋을 만들 때 내가 얻은 교훈

  • 문서를 보면서 질문을 만들지 않는다: 쉬운 시험이 된다. 실제 사용자 질문 기록이 있으면 거기서 뽑는 게 제일 좋다.
  • 어려운 질문을 일부러 넣는다: 같은 뜻 다른 말, 번호 일부만 쓴 질문, "옛날 거 말고" 같은 조건 질문.
  • 답이 없는 질문도 넣는다: "모르겠다"고 할 수 있는지 재야 한다.
  • 숫자 하나에 매달리지 않는다: 질문 12개면 한 문제가 0.08이다. 틀린 질문 목록을 같이 봐야 왜 틀렸는지 안다.
  • 바꿀 때마다 같은 시험지로 다시 돌린다: 테스트 코드처럼.

이걸로 RAG 검색 이해하기 시리즈를 마친다. 키워드 검색에서 시작해 벡터, 하이브리드, 재정렬, 평가까지 왔다. 직접 돌려 보니 "어느 방법이 제일 좋다"는 정답은 없었다. 질문이 어떻게 들어오느냐에 따라 순위가 바뀌었다. 그래서 마지막에 남는 건 우리 질문으로 만든 시험지다.

이상 검색 품질 평가 끝!

댓글

이 블로그의 인기 게시물

싱가포르 여행 필수 준비물: G타입 변환 어댑터 (돼지코 전기 플러그)

조만간 우리 아이들이 싱가포르로 여행을 간다. 핸드폰 충전은 물론이고 다른 전기 제품 사용 때문에 어댑터가 꼭 필요하다. 해외여행 갈 때 어댑터 하나 잘못 챙겨가면 충전도 못 하고 전기 사용도 못 해서 낭패 보는 경우가 많다. 10년 전에 내가 싱가포르에 출장 갈 일이 있었는데 그때는 멀티 어댑터를 누군가에게 빌려갔었다. 이번 기회에 아이들 여행 준비물 중에 하나인 변환 플러그 검색하면서 알게 된 싱가포르 사용하는 전압과 플러그 타입, 어떤 어댑터를 챙겨야 하는지를 공유하려 한다. 싱가포르 여행을 계획하는 사람들을게 도움이 되겠지?  내 자식들 챙겨주는 마음으로 꼼꼼하게 설명해 줄 테니, 싱가포르 여행 준비물 리스트에 어댑터 관련 정보가 필요한 사람들은 꼭 참고했으면 한다. 1. 싱가포르 전기 환경 (전압과 플러그 타입) 해외여행 시 현지 전기 환경을 파악하는 것은 필수적인 여행 준비물 점검 사항이다. 싱가포르는 한국과 다른 전압 및 플러그 타입을 사용한다. 1.1 싱가포르 전압 (Voltage) 싱가포르는 230V(볼트) 전압을 사용한다. 한국은 220V를 사용하므로 전압 자체는 큰 차이가 없다. 대부분의 최신 전자기기(휴대폰 충전기, 노트북 충전기 등)는 100~240V의 프리볼트(Free Voltage)를 지원하므로, 전압 변환기(변압기)는 별도로 필요하지 않다. 1.2 싱가포르 플러그 타입 (Plug Type) 및 사용 국가 싱가포르는 Type G 플러그를 사용한다. 이는 영국식 3핀(세 발) 플러그 형태로, 한국(Type C, F)과는 모양이 완전히 다르다. 따라서 한국에서 사용하는 전자기기를 싱가포르에서 사용하려면 반드시 Type G 형태의 어댑터가 필요하다. Type G 플러그를 사용하는 주요 국가   아시아: 싱가포르, 홍콩, 말레이시아, 아랍에미리트(UAE) 등 유럽: 영국, 아일랜드, 몰타, 키프로스 등 기타: 사우디아라비아, 카리브해 일부 국가 등 이러한 국가들을 여행할 때도 Type G 어댑터 하나만 있으면 전기 ...

제주도 탐나는전 결제 사용 후기 (실물카드 미소지로 사용 실패)

제주도 여행을 앞두고 지역화폐인 '탐나는전'을 신청했다. 평소 성남사랑상품권을 잘 쓰고 있어서 제주도에서도 비슷하게 편리하게 쓸 수 있을 거라 생각했거든. 그런데... 결론부터 말하면 한 번도 써보지 못하고 환불하게 됐다. 탐나는전 신청과 설정 제주 출발 전에 미리 탐나는전을 신청했어. 신청 후 1주일 이내에 집에 도착.. 안내 브로셔를 보니 꽤 체계적으로 되어있더라고. 캐시백 혜택부터 시작해서 카드 등록, 사용법까지 자세히 나와있었어. 특히 소득공제 혜택도 있고, 한도상향 완료라는 문구도 보이니 더욱 기대가 됐어. 성남사랑상품권처럼 잘 활용할 수 있을 거라 생각했거든. 카드 등록 카드 등록을 진행했어. 인터페이스도 깔끔하고 사용하기 편해 보였어. "탐나는전 사용 가능한 카드를 신청 또는 등록해주세요!"라는 안내 문구를 보며 설레었지. 카드 정보를 직접 입력하거나 바코드로 인식할 수 있게 되어있어서 편리했어. 성남사랑상품권 앱과 비슷한 느낌이었거든. 난 바코드로 한큐에 등록.. 출발 전날인 6월 24일에 10만원을 충전했어. 탐나는전 선불카드로 등록도 완료하고, 제주도에서 맛있는 것도 사고 기념품도 살 생각에 들떠있었지. 그런데... 현실은? 제주도에 도착해서 탐나는전을 써보려고 했는데, 큰 문제가 있었어. 성남사랑상품권처럼 QR코드나 바코드로 간편하게 결제할 수 있을 거라 생각하고 실물카드를 안 가져갔거든. 그런데 제주도 매장들은 대부분 실물카드만 받더라고! QR코드나 바코드 결제를 지원하는 곳이 거의 없어서 당황했어. 성남에서는 거의 모든 곳에서 앱으로 간편결제가 되니까 당연히 제주도에서도 될 거라 생각했는데... 완전 오산이었어 😢 결국 환불... 여행 내내 한 번도 써보지 못하고, 마지막 날인 6월 29일에 결국 10만원 전액 환불했어. 충전 수수료나 환불 수수료 같은 건 없어서 다행이었지만, 뭔가 허무한 기분이었어. 후기와 조언 탐나는전 자체는 나쁘지 않은 시스템인 것 같아. 소득공제 혜택도 있고, 앱도 사용하기 편해...

미국 주식 투자 환전 수수료 비교 (증권사 환율우대 100% 찾는 법)

나는 달러 환테크와 미국 주식 투자를 병행하고 있다. 단순히 달러를 사고파는 것을 넘어, 환전한 달러로 바로 미국 주식을 매매할 수 있어야 하므로 증권사 환전 서비스를 이용하는 것은 필수다. 혹시 미국 주식을 아직도 한번도 매매 못한 사람을 위해 일반적인 프로세스는 아래와 같다. 이때 가장 중요한 것이 바로 '환전수수료' , 즉 환율우대 혜택이다. 1%, 0.1%의 수수료 차이가 투자 수익률에 큰 영향을 미치기 때문이다. 오늘은 미국 주식 투자를 위한 증권사별 환전 서비스를  비교하고, 환율우대 혜택을 가장 많이 받을 수 있는 곳이 어디인지 직접 정리해 본다.  1. 들어가기 전: 환전수수료와 환율우대란? 우리가 달러를 살 때, 기준이 되는 '매매기준율'에 증권사가 수수료를 붙여서 판매한다. 이 수수료를 '환전 스프레드' 라고 하며, 보통 1달러당 5원~10원 정도다. '환율우대' 란 이 환전 스프레드를 깎아주는 것을 의미한다. 예를 들어, 환율우대 95% 는 내가 내야 할 환전수수료의 95%를 할인해준다는 뜻이다. 당연히 우대율이 높을수록 우리에게 유리하며, 환율우대 100%는 환전수수료가 0원 이라는 의미다. 2. 증권사별 환전 우대율 및 이용 시간 비교 (우대율 높은 순) ※ 중요: 아래 정보는 신규 또는 휴면 고객 대상 이벤트 기준으로, 2025년 8월 말 현재 시점으로 재확인한 내용이다. 이벤트 기간이나 조건은 언제든 변경될 수 있으니, 거래 전 반드시 해당 증권사에 직접 확인해야 한다. 참고로 난 한투로 미국 주식을 하고 있는데 90% 우대를 받고 있다. 아직은 작은 금액이라 무시하고 있지만 억단위로 넘어가면 위 증권사 계좌로 넘어갈 계획이다. 3. 서비스별 심층 분석 및 투자 전략 3.1 조건부 최강자: NH투자증권 (나무증권)  NH투자증권은 '원화주문' 이라는 독특한 서비스를 통해 차별점을 가진다. 핵심 장점: 24시간 100% 자동 환율우대: 미국 주식 시장이 열리...