理解精确率与召回率

一、概念介绍与直观对比

精确率(Precision)和召回率(Recall)是机器学习和信息检索领域中的核心概念,目前在评测RAG应用时经常用到。

Precision(精确率)衡量的是生成文本中有多少内容是“正确且必要”的(即被参考文本支持的)。用通俗的话来说,它是:生成文本中包含的“有效信息”占“生成总信息量”的比例。

Recall(召回率) 衡量的是参考文本(标准答案)中包含的所有关键信息,有多少比例被模型成功地生成了出来。用通俗的话来说就是:参考文本中的“核心要点”被模型“捕捉到”的比例。

特性维度 精确率 (Precision) 召回率 (Recall)
核心关注点 准确性 / 质量 (Quality) 完整性 / 数量 (Quantity)
通俗的问法 “你说的这些话里,有多少是真的?” “标准答案里要求的,你漏掉了多少?”
评估目标 衡量模型乱编(幻觉)的程度。 衡量模型遗漏(漏题)的程度。
数学逻辑 生成正确的 / 总生成的 生成正确的 / 标准答案总数
极端情况 1 模型只说一句话且绝对正确:100% 虽然这句话对了,但漏了其他 99%:极低
极端情况 2 模型背下了整部百科全书:极低 (废话太多) 成功覆盖了所有知识点:100%
追求的目标 不骗人(宁愿不说,也不乱说) 不漏人(宁愿错杀,也不放过)
在 GPT-5 中的意义 减少 AI 的“一本正经胡说八道”。 确保 AI 遵循了所有的指令细节。

以下使用一个简单的比喻和对比来彻底分清 PrecisionRecall


二、深度拆解:Precision vs. Recall

假设参考文本(标准答案)是:“苹果是一种红色的、甜的水果。”。下面以两个极端的例子来帮忙记忆与理解这两个概念。

场景 A:Precision 高,Recall 低

  • 模型生成: “苹果是红色的。”
  • 分析: * 模型说出的每一句话都在标准答案里(它是精确的)。
    • 但它说得不够完整,漏掉了“甜”和“水果”这两个信息。
    • 结论: Precision 极高(100%),Recall 较低。

场景 B:Precision 低,Recall 高

  • 模型生成: “苹果是一种红色的、甜的水果,它产自山东,长在树上,很好吃。”
  • 分析:
    • 模型涵盖了标准答案里的所有点(召回了所有信息)。
    • 但它说了很多标准答案里没有的“额外信息”(产地、生长方式、主观评价)。
    • 由于“额外信息”摊薄了“标准信息”的占比, Precision 变低了
    • 结论: Recall 极高(100%),Precision 较低。

三、为什么在 GPT-5 时代 Precision 很重要?

在评价大模型时,Precision 通常被视为“抗幻觉”的指标。

  • 高 Precision: 意味着模型非常“稳重”,它说出来的东西几乎都有据可查,不乱编。
  • 低 Precision: 意味着模型可能在“一本正经地胡说八道”。即使它回答得很长、涵盖了所有要点,但由于掺杂了太多未经证实的冗余信息,其实际准确度(Precision)是下降的。

四、评估时的平衡 (F1 Score)

我们通常不单纯看精确率与召回率,还会着重看 F1 Score ,它是 Precision 和 Recall 的调和平均。它的计算公式如下: \[ F1=2× \frac {Precision+Recall} {Precision×Recall} \] 其中Precision、Recall分别代表精确率与召回率,所以计算F1之前需要先计算这两个值。

  • 如果一个模型只会复读一个词(Precision 高但 Recall 极低),或者把整个维基百科背一遍(Recall 高但 Precision 极低),它的 F1 分数都会很差。
  • GPT-5 的目标就是在保持极高 Recall(回答全面)的同时,通过强大的逻辑自检能力维持极高的 Precision(不乱说话)。

五、相关程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 安装 bert-score 以及支持它的 transformers 库
# pip install bert-score torch
from bert_score import score

# 1. 准备数据
# 候选文本 (模型生成的回答)
candiates = [
"苹果是红色的。",
"苹果是一种红色的、甜的水果,它产自山东,长在树上,很好吃。"
]

# 参考文本 (标准答案)
references = [
"苹果是一种红色的、甜的水果。",
"苹果是一种红色的、甜的水果。",
]

# 2. 计算 BERTScore
# lang="zh" 指定中文,会自动调用中文 BERT 模型 (如 bert-base-chinese)
# rescale_with_baseline=True 可以让得分更符合人的直觉(通常在 0-1 之间分布更广)
P, R, F1 = score(candiates, references, lang="zh", verbose=True)

# 3. 打印结果
# P: Precision (精确率), R: Recall (召回率), F1: F1分数
print(f"Precision: {P.mean().item():.4f}")
print(f"Recall: {R.mean().item():.4f}")
print(f"F1 Score: {F1.mean().item():.4f}")
"""
done in 0.14 seconds, 14.41 sentences/sec
Precision: 0.8451
Recall: 0.8785
F1 Score: 0.8541
"""

for i, p in enumerate(P):
print(f"句子 {i+1} 的 P 得分: {p.item():.4f}")
"""
句子 1 的 P 得分: 0.9077
句子 2 的 P 得分: 0.7825
"""

for i, r in enumerate(R):
print(f"句子 {i+1} 的 R 得分: {r.item():.4f}")
"""
句子 1 的 R 得分: 0.7813
句子 2 的 R 得分: 0.9757
"""

# 如果你想看每一个句子的具体得分
for i, f1 in enumerate(F1):
print(f"句子 {i+1} 的 F1 得分: {f1.item():.4f}")
"""
句子 1 的 F1 得分: 0.8398
句子 2 的 F1 得分: 0.8685
"""

"""
3. 关键参数解析
lang="zh": 库会自动为你选择最适合中文的预训练模型。如果你想手动指定模型(比如使用更强大的 RoBERTa),可以使用 model_type="hfl/chinese-roberta-wwm-ext"。
P (Precision): 衡量生成文本中有多少语义被参考文本覆盖。
R (Recall): 衡量参考文本中有多少核心意思被模型捕捉到了。
F1 Score: 两者的调和平均数,通常是最核心的评价指标。


4. 为什么 BERTScore 比 BLEU 好?
如图所示,BERTScore 不要求词汇完全一致:
它将每个词转换成高维向量。

计算两个句子向量矩阵之间的余弦相似度。
即使你把“AI”写成“人工智能”,在向量空间里它们非常接近,BERTScore 依然会给高分,而 BLEU 会直接给 0 分。

"""


理解精确率与召回率
https://jiangsanyin.github.io/2026/03/08/理解精确率与召回率/
作者
sanyinjiang
发布于
2026年3月8日
许可协议