同一次检索命中了2份相关资料,精确率和召回率却可能不同:前者看返回结果里有多少相关项,后者看已知相关资料有多少被找回。计算前要先固定问题、相关集合和去重规则。

用五份资料算一次
设一道问题的已标注相关资料是A、B、C、D,系统按顺序返回A、X、C。前3条中有2条相关,因此Precision@3为2/3;已知4份相关资料找回2份,Recall@3为2/4。X虽然被返回,却不在本题的相关集合中。
| 指标 | 本例计算 | 回答的问题 |
|---|---|---|
| Precision@3 | 2 ÷ 3 ≈ 0.667 | 前三条里有多少是相关资料 |
| Recall@3 | 2 ÷ 4 = 0.5 | 已知相关资料有多少被找回 |
先统一文档还是片段的口径
如果A文档切成三个片段,而标注集合按文档计数,不能把三个片段算成三次不同命中。本站练习先按资料ID去重,再取前k项;这只是明确的一种口径,实际评测也可以按片段标注,但两端必须一致。
def at_k(ranked, relevant, k):
if k <= 0:
raise ValueError("k must be positive")
unique = list(dict.fromkeys(ranked))
if len(unique) < k:
raise ValueError("not enough distinct results")
hits = len(set(unique[:k]) & relevant)
return hits / k, hits / len(relevant) if relevant else None
p, r = at_k(["A", "X", "C"], {"A", "B", "C", "D"}, 3)
assert abs(p - 2 / 3) < 1e-12 and r == 0.5
assert at_k(["A", "A", "X", "C"], {"A", "B", "C", "D"}, 3) == (p, r)
assert at_k(["X"], set(), 1) == (0.0, None)
print(round(p, 3), r)
空集合、短结果不要悄悄补成成功
示例输出0.667和0.5。没有相关资料时,召回率的分母为零,因此本练习返回None,单独统计这类问题;不足k个不同结果时直接报错。不要在一份报告里有时除以k、有时除以实际返回数,却都写同一个指标名。
它仍不能说明最终回答正确
这些数字只衡量检索集合。文档版本是否过期、片段是否足以回答、生成时有没有曲解,都要另查。可把漏掉的B和D逐条记录:是没建索引、被过滤,还是排在k之后,再决定改哪一步。以上集合演算已本地运行,没有测量本站真实检索服务。
资料来源与继续学习
资料查阅日期:2026年10月14日。示例、阅读练习与操作建议由本站整理。
资料查阅与编辑日期:2026年10月14日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







