Chapter 08

评估:ViDoRe 与业务自建集

没有评估就没有改进。本章讲清:ViDoRe benchmark 怎么跑、nDCG@5 数字怎么读、怎么用 200 条标注就能对几套方案排序,选出最适合你业务的模型。

三个核心指标

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 + OCR0.550.38
BGE-M3 + OCR0.680.52
ColPali v1.20.820.68
ColQwen2-2B0.890.76
ColQwen2.5-3B0.910.81

自建 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 测模型时要控变量

ViDoRe v2 的变化

更难的 query
从"直接问页面里的事实"升级到"多页 reasoning"——正确答案可能需要合并两页信息。
更大的文档池
干扰页从 ViDoRe v1 的 500 扩到 v2 的 10000,模拟真实业务规模。
多语言
法语、西班牙语、阿拉伯语子集加入——测试模型泛化。

本章小结