三个核心指标
nDCG@K(Normalized Discounted Cumulative Gain)
看"理想排序"和实际排序差多少。越靠前的相关页得分权重越大。范围 [0,1],ColPali 论文主指标。
MRR@K(Mean Reciprocal Rank)
每条 query,第一条相关结果排第 r 位,得分 1/r。适合"只找第一条正确结果"场景,如问答。
Recall@K
top-K 里覆盖了多少相关页。忽略顺序,关心"找没找到"。RAG 上游用 Recall 判断够不够。
nDCG@5 手算示例
query: "2024 年营收"
理想排序(金标): p.12(主相关), p.13(次), p.45(次)
实际排序: p.45, p.12, p.100, p.13, p.200
相关度: p.12=2, p.13=1, p.45=1, 其他=0
gains = [1, 2, 0, 1, 0]
discounts = 1/log2(i+1) for i in 1..5
= [1.00, 0.63, 0.50, 0.43, 0.39]
DCG@5 = 1*1.00 + 2*0.63 + 0*0.50 + 1*0.43 + 0*0.39 = 2.69
ideal = 2,1,1,0,0 → IDCG@5 = 2*1.00 + 1*0.63 + 1*0.50 + 0+0 = 3.13
nDCG@5 = 2.69 / 3.13 = 0.86
用 ViDoRe 官方脚本跑
git clone https://github.com/illuin-tech/vidore-benchmark cd vidore-benchmark pip install -e . vidore-benchmark evaluate-retriever \ --model-class colpali \ --model-name vidore/colpali-v1.2 \ --collection-name vidore/vidore-benchmark-v1 \ --split test
跑完会输出每个子集(ArxivQA / DocVQA / ...)的 nDCG@5,最后给平均。2026 年初 leaderboard:
| 模型 | ViDoRe v1 平均 | ViDoRe v2 平均 |
|---|---|---|
| BM25 + OCR | 0.55 | 0.38 |
| BGE-M3 + OCR | 0.68 | 0.52 |
| ColPali v1.2 | 0.82 | 0.68 |
| ColQwen2-2B | 0.89 | 0.76 |
| ColQwen2.5-3B | 0.91 | 0.81 |
自建 200 条评估集的正确姿势
不要跳过这一步
公开 benchmark 的分数不等于你业务上的分数。哪怕只标 200 条,也能给你方案选型一个客观的数字。
公开 benchmark 的分数不等于你业务上的分数。哪怕只标 200 条,也能给你方案选型一个客观的数字。
步骤 1:采样 200 条"真实用户问题"
从 logs / 客服工单 / 产品经理脑子里收集——不要让 LLM 造,因为 LLM 造的 query 偏书面化,和真实用户口语化、错别字、省略风格差距很大。
步骤 2:标注相关页
两位业务专家独立标,每条 query 给出 1-3 个 "主相关页"(level 2)和 2-5 个 "次相关页"(level 1)。两位不一致的条目第三人裁定,一致性 > 85% 才算及格。
步骤 3:存成 qrels 格式
{
"q001": { "page_012": 2, "page_013": 1, "page_045": 1 },
"q002": { "page_200": 2, "page_201": 1 }
}
步骤 4:算指标
from ranx import Qrels, Run, evaluate qrels = Qrels.from_dict(qrels_dict) # 把模型输出转成 Run 格式 runs = {} for qid, q in queries.items(): hits = model.search(q, k=20) runs[qid] = {h.id: h.score for h in hits} run = Run.from_dict(runs) print(evaluate(qrels, run, ["ndcg@5", "mrr@5", "recall@10"])) # {'ndcg@5': 0.812, 'mrr@5': 0.786, 'recall@10': 0.917}
A/B 测模型时要控变量
- 同一批数据、同一切分、同一标注
- DPI 相同(别一个 150、一个 200)
- query 预处理相同(prompt 前缀、长度截断一致)
- 评估脚本用同一个(推荐
ranx或ir_measures)
ViDoRe v2 的变化
更难的 query
从"直接问页面里的事实"升级到"多页 reasoning"——正确答案可能需要合并两页信息。
更大的文档池
干扰页从 ViDoRe v1 的 500 扩到 v2 的 10000,模拟真实业务规模。
多语言
法语、西班牙语、阿拉伯语子集加入——测试模型泛化。
本章小结
- nDCG@5 是 ColPali 论文主指标,关心"前 5 位顺序"
- MRR 关心"第一条对",Recall@K 关心"有没有"
- ViDoRe v1 / v2 给出公共对比,v2 难度显著上升
- 自建 200 条评估集是选型刚需,不跳过
- A/B 对比时严格控变量,用 ranx/ir_measures 工具