Field Log · Entry

Embedding 평가 방법: Metric·Protocol·통계 (10/14)

하나의 embedding model을 STS, 분류, clustering, bitext, exact retrieval, ANN, RAG 단계에서 서로 다른 metric과 paired 통계로 평가하는 구조

이번 글의 결론

  • Embedding quality는 하나의 metric이 아닙니다. STS의 Spearman, classification accuracy, clustering V-measure, retrieval nDCG는 서로 다른 관계를 시험합니다.
  • RAG용 model 선택이라면 전체 MTEB 평균보다 내 corpus의 exact Recall@N·nDCG@k, ANN 보존율, downstream answer utility가 우선입니다.
  • Query·corpus·qrel·prompt·pooling·normalization·dimension을 고정하지 않으면 model 비교가 아닙니다.
  • 평균 차이에는 query-level paired confidence interval과 critical slice가 필요합니다. 작은 평균 gain이 일부 고위험 query의 큰 regression을 숨길 수 있습니다.
  • Exact search와 ANN·quantization을 분리해 representation quality와 serving approximation loss를 각각 측정합니다.

앞 글까지 무엇을 어떻게 표현할지 배웠습니다. 이제 “더 좋은 embedding”이라는 문장을 검증 가능한 protocol로 바꿉니다.


1. 평가 질문을 먼저 고른다

연구 질문적절한 평가
문장 유사도 순서를 잘 맞추나STS Spearman/Pearson
Frozen feature로 class가 나뉘나kNN/linear probe accuracy
Label 없이 group이 형성되나clustering V-measure
번역문을 찾나bitext mining F1/accuracy
Query로 relevant corpus item을 찾나Recall/MRR/MAP/nDCG
ANN이 exact neighbor를 보존하나ANN recall@k
RAG 답이 좋아지나answer·citation metric

한 task의 승자가 다른 task에서도 승자라고 가정하지 않습니다. MTEB 원 논문도 한 방법이 모든 task를 지배하지 않았다고 보고했습니다.

2. Semantic Textual Similarity, STS

문장 pair마다 human similarity score가 있습니다.

pred_i = cosine(embed(a_i), embed(b_i))
gold_i = human similarity

Spearman Correlation

Score 절대값보다 순위 일치를 봅니다. Monotonic transform에 강합니다.

Pearson Correlation

선형 관계와 score calibration에 더 민감합니다.

주의:

  • STS의 “비슷함”은 검색 relevance와 다름
  • train/test source overlap
  • 번역 STS와 native STS 차이
  • score range·tie 처리
  • prompt가 symmetric task에 맞는지

3. Pair Classification

Duplicate/non-duplicate, paraphrase/non-paraphrase처럼 pair label을 예측합니다.

score = cosine(z1, z2)
predict positive if score >= threshold

Metric:

  • Average Precision: threshold 전반의 ranking
  • F1: 선택된 threshold의 균형
  • Accuracy: class balance에 민감
  • ROC-AUC: negative가 압도적일 때 과대 낙관 가능

Threshold는 dev에서 고르고 test에서 다시 맞추지 않습니다.

4. Classification

Embedding을 frozen feature로 사용합니다.

kNN Evaluation

Train embedding의 가까운 label로 예측합니다. Vector geometry와 neighbor structure를 봅니다.

Linear Probe

Embedding 위에 linear classifier만 학습합니다. Class 정보가 선형적으로 분리되는지 봅니다.

재현 조건:

  • train/dev/test split
  • classifier hyperparameter search 범위
  • seed 수
  • class imbalance metric
  • embedding normalization

Probe가 강할수록 model보다 classifier tuning 차이가 결과에 섞일 수 있습니다.

5. Clustering

Label을 학습에 쓰지 않고 embedding을 clustering한 뒤 gold class와 비교합니다.

대표 metric:

  • V-measure: homogeneity와 completeness의 조화 평균
  • Adjusted Rand Index
  • Adjusted Mutual Information

K-means라면 cluster 수를 gold class 수로 줄지, 추정할지 명시합니다. Random initialization seed별 평균·표준편차를 보고합니다.

6. Bitext Mining

한 언어 문장에 대응하는 번역 문장을 다른 corpus에서 찾습니다.

source language embedding
  ↔ target language nearest neighbor

정확도, F1, retrieval recall을 사용합니다. Hubness 때문에 한 target 문장이 많은 source의 neighbor가 될 수 있어 margin score나 CSLS류 보정을 비교할 수 있습니다.

7. Retrieval의 Candidate와 Qrel

Query (q), corpus (D), graded relevance (rel(q,d))를 고정합니다.

embedding model
  → encode all D
  → exact similarity
  → ranked list π_q
  → compare with qrels

Corpus preprocessing와 document ID mapping까지 freeze합니다. Chunker가 바뀌면 embedding model 비교가 아닙니다.

8. Recall@k

Relevant set을 (G(q))라 할 때:

Recall@k(q) = |top-k(q) ∩ G(q)| / |G(q)|

Open-domain QA에서 gold가 하나라면 hit@k와 같아집니다. Multi-hop에서는 모든 evidence를 회수했는지 complete evidence@k도 봅니다.

Candidate generator의 주 목적에는 Recall@50/100이 중요하고, user-facing top results에는 precision/nDCG가 더 중요할 수 있습니다.

9. MRR

첫 relevant document의 rank (r_q):

RR(q) = 1 / r_q
MRR = mean_q RR(q)

첫 relevant 이후의 문서는 반영하지 않습니다. 답 하나만 빨리 찾는 task에 적합합니다.

10. MAP

Relevant가 등장하는 각 rank에서 precision을 평균합니다.

AP(q) = average of Precision@r
        over ranks r containing relevant docs
MAP = mean_q AP(q)

여러 binary relevant document의 전체 ordering을 봅니다.

11. nDCG

Graded relevance를 상위 rank에 더 크게 보상합니다.

DCG@k = Σ_{i=1..k} (2^rel_i - 1) / log2(i+1)
nDCG@k = DCG@k / IDCG@k

규약:

  • gain을 rel로 할지 2^rel-1로 할지
  • unjudged를 0으로 볼지
  • IDCG가 corpus qrel 기준인지 candidate 기준인지
  • positive 없는 query를 제외할지 0으로 둘지

Library 이름이 같아도 규약이 다르면 숫자가 다릅니다.

12. Exact Search부터 평가한다

작거나 shard된 test corpus에서는 matrix multiplication으로 exact top-k를 구합니다.

import torch
import torch.nn.functional as F

q = F.normalize(query_embeddings, dim=-1)
d = F.normalize(document_embeddings, dim=-1)

scores = q @ d.T
top_scores, top_indices = torch.topk(scores, k=100, dim=1)

Corpus가 GPU memory보다 크면 document block을 순회하며 global top-k를 merge할 수 있습니다. Approximate index를 model 품질 평가에 먼저 넣지 않습니다.

13. ANN Recall은 Relevance Recall과 다르다

Exact top-k를 기준으로 ANN이 neighbor를 얼마나 보존하는지 봅니다.

ANN_recall@k(q)
  = |ANN_top-k(q) ∩ Exact_top-k(q)| / k

반면 relevance Recall@k는 qrel과 비교합니다.

exact relevance recall: representation quality
ANN recall: index approximation quality

ANN이 exact neighbor 일부를 놓쳐도 우연히 다른 relevant document를 찾아 relevance metric은 유지될 수 있습니다. 두 값을 모두 냅니다.

14. 평가 단계 Pyramid

Level 1  pair sanity / geometry
Level 2  exact task metrics
Level 3  public benchmark transfer
Level 4  ANN + dimension + quantization
Level 5  hybrid/reranker system
Level 6  downstream RAG/online utility

낮은 단계가 실패하면 높은 단계의 원인을 해석하기 어렵습니다.

15. Prompt·Pooling·Dimension을 고정한다

각 model은 공식 사용법이 다를 수 있습니다. 비교 report에 다음을 씁니다.

model_eval:
  model_id: "..."
  revision: "..."
  query_prompt: "..."
  document_prompt: "..."
  pooling: official
  normalization: true
  dimension: 1024
  dtype: float32
  max_query_tokens: 512
  max_document_tokens: 2048
  truncation_side: right

Model A가 MRL 256d, model B가 native 1,024d라면 quality뿐 아니라 storage 조건도 명시합니다.

16. Paired Bootstrap

Model A와 B를 같은 query에서 비교하므로 query-level delta를 resample합니다.

import numpy as np

def paired_ci(metric_a, metric_b, n=10_000, seed=17):
    delta = np.asarray(metric_b) - np.asarray(metric_a)
    rng = np.random.default_rng(seed)
    means = [rng.choice(delta, len(delta), replace=True).mean() for _ in range(n)]
    return np.quantile(means, [0.025, 0.5, 0.975])

Query independence가 깨지는 session/group data라면 query가 아니라 group 단위로 bootstrap합니다.

보고할 것:

  • mean delta
  • 95% interval
  • win/tie/loss rate
  • worst regressions
  • slice intervals

17. Random Seed와 Variance

Frozen pretrained model의 deterministic encoding은 seed variance가 작지만 다음은 seed에 민감합니다.

  • fine-tuning initialization·batch order
  • negative mining
  • K-means
  • ANN index construction order
  • stochastic LLM-generated eval data

Training run을 여러 seed로 반복할 수 없다면 최소한 evaluation stochasticity와 data sampling seed를 고정합니다.

18. Critical Slice

slices:
  language: [ko, en, mixed]
  length: [short, long, truncated]
  query: [entity, lexical, semantic, reasoning]
  evidence: [single, multi_hop]
  temporal: [current, stale_conflict]
  answerability: [answerable, no_answer]
  risk: [normal, compliance, security]

각 query가 여러 slice에 속할 수 있습니다. 표본 수와 confidence interval을 함께 보여 줍니다.

19. Efficiency Metric

Quality와 같은 report에 둡니다.

  • query p50/p95 latency
  • documents/s와 tokens/s
  • corpus indexing wall time
  • vector dimension·dtype·raw storage
  • index build time·overhead
  • exact/ANN QPS at target recall
  • peak RAM/VRAM
  • API cost 또는 device-hour
  • re-embedding cost

Batch 1 query latency와 batch 256 indexing throughput을 섞지 않습니다.

20. RAG End-to-end 평가

같은 chunker, candidate depth, reranker, context selector, generator를 고정하고 embedding만 바꿉니다.

embedding A → candidates A ─┐
                            ├─ same downstream pipeline
embedding B → candidates B ─┘

Metric:

  • answer correctness
  • complete evidence coverage
  • citation precision·recall
  • claim support
  • no-answer correctness
  • total latency·cost

Retrieval gain이 generator gain으로 이어지지 않으면 top-k 중복, evidence packing, reader saturation을 분석합니다.

21. Evaluation Report Template

evaluation:
  id: embedding-eval-v8
  corpus:
    snapshot: docs-2026-07-01
    chunker: heading-v3
    checksum: "..."
  queries: eval-v5
  qrels: qrels-v7
  models: [baseline, challenger]
  exact:
    metrics: [recall_at_20, recall_at_100, mrr_at_10, ndcg_at_10]
  uncertainty:
    method: group_paired_bootstrap
    samples: 10000
    seed: 17
  ann:
    target_recall_at_10: 0.95
    quality_at_target: true
  efficiency:
    hardware: "..."
    concurrency: [1, 16, 64]
  downstream:
    generator: pinned
    prompt: sha256:...

22. Release Checklist

  • Task에 맞는 metric을 선택했다.
  • Corpus·query·qrel·chunk를 freeze했다.
  • Prompt·pooling·normalization·dimension을 기록했다.
  • Exact retrieval에서 representation quality를 비교했다.
  • ANN recall과 relevance recall을 구분했다.
  • nDCG의 gain·IDCG·unjudged 규약을 명시했다.
  • Query/group-level paired interval을 냈다.
  • Critical slice regression budget이 있다.
  • Encoding·index·storage·reindex cost를 포함했다.
  • Fixed downstream RAG에서 utility를 검증했다.

스스로 확인하기

  1. STS Spearman이 높은 model이 retrieval Recall@100도 높다고 보장할 수 없는 이유는 무엇인가?
  2. nDCG의 IDCG convention이 model score를 바꾸는 방법은 무엇인가?
  3. ANN recall과 qrel relevance recall은 각각 어떤 층을 평가하는가?
  4. Query-level delta에 paired bootstrap을 쓰는 이유는 무엇인가?
  5. Embedding A/B의 RAG 효과를 비교할 때 반드시 고정할 downstream 요소는 무엇인가?

다음 글에서는 MTEB·MMTEB·BEIR·MIRACL·BRIGHT·AIR-Bench·LongEmbed·ConTEB를 비교하고 leaderboard·contamination 함정을 다룹니다.

참고자료