Field Log · Entry
Embedding 평가 방법: Metric·Protocol·통계 (10/14)
이번 글의 결론
- 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를 검증했다.
스스로 확인하기
- STS Spearman이 높은 model이 retrieval Recall@100도 높다고 보장할 수 없는 이유는 무엇인가?
- nDCG의 IDCG convention이 model score를 바꾸는 방법은 무엇인가?
- ANN recall과 qrel relevance recall은 각각 어떤 층을 평가하는가?
- Query-level delta에 paired bootstrap을 쓰는 이유는 무엇인가?
- Embedding A/B의 RAG 효과를 비교할 때 반드시 고정할 downstream 요소는 무엇인가?
다음 글에서는 MTEB·MMTEB·BEIR·MIRACL·BRIGHT·AIR-Bench·LongEmbed·ConTEB를 비교하고 leaderboard·contamination 함정을 다룹니다.