[Elasticsearch] _rank_eval API 로 검색 품질 평가하기

Woong·2026년 2월 20일

ElasticSearch

목록 보기
29/31

_rank_eval API

  • 검색 결과의 품질을 정답셋(ground truth) 기반으로 정량적으로 평가
    • 랭킹 로직 변경 전/후 품질 비교
    • 검색 튜닝의 회귀 (regression) 검증
    • 쿼리 단위 품질 저하 탐지

request

POST /my-index-000001/_rank_eval
{
  "requests": [
    {
      "id": "JFK query",
      "request": { "query": { "match_all": {} } },
      "ratings": []
    } ],
  "metric": {
    "precision": {
      "k": 20,
      "relevant_rating_threshold": 1,
      "ignore_unlabeled": false
    }
  }
}
  • requests

    • 평가 대상 쿼리 집합
    • id: 각 쿼리 id. response의 details에서 key로 사용
    • request: 평가할 search 쿼리
      • search API request
    • ratings: 각 쿼리별 정답셋
      • _index, doc _id, rating
  • metric

    • 어떤 평가 지표로 품질을 계산할지 정의
    • 한 번의 요청에서 단 하나의 metric만 지정 가능
      • precision, recall, mean_reciprocal_rank (MRR), dcg, expected_reciprocal_rank (ERR)

response

{
  "metric_score": 0.6666667,
  "details": { ... },
  "failures": { ... }
}
  • metric_score : 모든 쿼리에 대한 평균 점수
  • details : 쿼리별 상세 평가
  • failures : 실패한 쿼리가 있는 경우

평가 지표

아래는 _rank_eval에서 사용 가능한 주요 metric들을 “무슨 지표인지 / 어떤 파라미터가 있고 / 언제 쓰는지” 기준으로 정리한 내용입니다.
실무에서 바로 참고할 수 있도록 의미 → 파라미터 → 해석 포인트 순서로 정리했습니다.


precision

  • 상위 k개 검색 결과 중 relevant 문서의 비율
    • 상위 결과가 얼마나 정확한지 측정
    • 상단 품질(top-k quality) 에 가장 민감
      • rating이 0/1일 때 가장 직관적
      • 상단 결과가 중요한 검색 UX에 적합
      • relevant 문서가 많아도 상위에 없으면 점수가 낮다
"precision": {
  "k": 10,
  "relevant_rating_threshold": 1,
  "ignore_unlabeled": false
}
  • k : 평가에 포함할 상위 결과 개수 (default: 10)
  • relevant_rating_threshold : relevant 판정할 기준 rating 값 (default: 1)
  • ignore_unlabeled : label 없는 문서를 무시할지 여부 (default: false)
    • false : unlabeled 문서를 irrelevant로 취급
    • true : unlabled 문서를 계산에서 제외
주요 용도
  • 검색 결과 첫 페이지 품질
  • BM25 / reranker 튜닝 전후 비교
  • regression 테스트의 기본 지표

recall

  • 정답셋 중 검색 결과에 포함된 비율
    • “놓치지 않고 찾아냈는가”를 측정
    • ranking 품질보다는 검색 범위 커버리지 평가
      • 상위에 있든 없든 포함되기만 하면 카운트
"recall": {
  "k": 50,
  "relevant_rating_threshold": 1
}
  • k : 상위 k개 결과까지만 고려 (default: 10)
  • relevant_rating_threshold :relevant 판정할 기준 rating 값 (default: 1)
주요 용도
  • 법률 / 의료 / 분석 도구 검색
  • “하나라도 빠지면 안 되는” 도메인
  • recall-first → rerank 구조의 1차 검색 평가

mean_reciprocal_rank (MRR)

  • 첫 relevant 문서가 등장한 rank의 역수 평균
    • 정답이 얼마나 빨리 나오는지 측정
      • rating이 여러 개여도 첫 번째만 영향
      • 첫 정답만 중요, 그 뒤는 무시
    • navigation / QA 성격 쿼리에 적합
MRR=1rankfirstrelevantMRR = \frac{1}{rank_{first_relevant}}
"mean_reciprocal_rank": {
  "k": 10,
  "relevant_rating_threshold": 1
}
  • k : 상위 k개까지만 탐색 (default 10)
  • relevant_rating_threshold :relevant 판정할 기준 rating 값 (default: 1)
주요 용도
  • 브랜드 검색
  • FAQ / 지식 검색
  • “정답 하나면 끝”인 시나리오

dcg (Discounted Cumulative Gain)

  • relevance 점수 + 순위(position) 를 함께 고려
    • 상위에 있을수록 더 큰 가중치
      • relevance 크기(0/1/2/3…)가 중요
    • relevance 누적량 분석
    • 쿼리 단위 내부 비교
DCG=i=1krelilog2(i+1)DCG = \sum_{i=1}^{k} \frac{rel_i}{\log_2(i+1)}
"dcg": {
  "k": 10,
  "normalize": false
}
  • k : 상위 k개 평가 (default: 10)
  • normalize : nDCG 여부 (default: false)

nDCG

  • DCG를 이상적인 랭킹(IDCG) 으로 나눈 값
    • 0~1 범위
    • 쿼리 간 비교 가능
    • graded relevance에 최적
    • 상위에 “더 좋은 문서”가 있을수록 점수 상승
    • reranker 평가의 표준
"dcg": {
  "k": 10,
  "normalize": true
}
주요 용도
  • ML reranker 비교
  • semantic search 품질 평가
  • offline evaluation의 핵심 지표

expected_reciprocal_rank (ERR)

  • 사용자 만족 확률 모델 기반
    • 각 rank에서 사용자가 멈출 확률을 고려
    • relevance가 높을수록 만족 후 종료 확률 증가
"expected_reciprocal_rank": {
  "k": 10,
  "maximum_relevance": 3
}
  • k : 상위 k개 평가 (default: 10)
  • maximum_relevance : rating의 최대값 (default 없는 필수 필드)

지표 요약

목적추천 metric
상단 품질 빠른 체크Precision@k
첫 정답 중요MRR
graded relevancenDCG
recall-first 시스템Recall
연구 / 실험ERR (선택)

reference

0개의 댓글