跳到主要内容

评测(下):三个不需要标准答案的指标

这一章讲三件事: 三个数各自怎么算、算出来之后怎么读、 以及书在算第一个数的时候把两件事写混了。

它在全书链条上的位置:第 16 章配的那把尺子,这一章刻上刻度。

1. 这一章讲什么

三句话:

  1. 三个指标不是同一件事的三个角度,它们各针对一种彼此独立的失效—— 书自己说得很清楚:「系统可以检索到精确的块却照样胡编;可以守材料守得很牢 但答案跑偏;也可以答对了问题、但用的是无关的上下文」;
  2. 这一章会当场核出书里的一处实质错误:第一个指标的文字和它的公式、代码算的不是同一个数, 而且这处错误出在全书最技术的一章;
  3. 第二个指标是全书唯一一处给了明确数值判据的地方—— 80% 以上算合格,70% 以下就要当成可能在编。

2. 顶层全景:三个数,三个位置

用户的问题

检索 ─────→ 取回 k 块材料
│ │
│ └─→ 指标一:这 k 块里有几块真有用? ← 管**检索**这一步
│ (第 3 到 7 节)

生成 ─────→ 最终答案
├─→ 指标二:答案里的每句话,材料撑得住吗? ← 管**生成**,抓编造
│ (第 8、9 节)
└─→ 指标三:答案回应了这个问题吗? ← 管**生成**,抓跑偏
(第 10 节)

图说:三个数会各自独立地动 —— 改好了检索,不保证第二个变好;
第二个满分,也挡不住第三个很低。这就是"必须一次看两三个"的原因。

三者都属于第 16 章那张表里的第三行:两样标注数据都没有,照样能算。

3. 承重词一:上下文精确率 —— 取回的块里有几块真有用

这一章第一个承重词。一句话先给结论:上下文精确率量的是 「这次取回来的几块材料里,真正对生成答案有帮助的占多大比例」。

四步做法

书给的步骤1:

① 从你的题库里挑一个问题
② 让系统回答它,**同时记下答案和这次用到的那几块材料**
③ 让一个模型逐块判断:这一块对生成这个答案到底有没有帮上忙?(判 1 或 0)
④ 把判为有用的块数,除以取回的总块数

书给的例子:四块进了提示,只有两块相关 → 分数是 0.5

注意第 ③ 步的判据不是「这块和问题像不像」,而是「这块对生成这个答案有没有用」—— 它是拿块去比答案**,不是比问题。这一点下一节讲。**

三条判定路线,书用的是不需要标准答案的那条

这一节最值得记的是:同一个指标,判「有没有用」可以走三条不同的路2:

路线拿什么当判据要不要标准答案
比对参考上下文一份黄金数据集:每个问题标明「本该检索到哪几块」——而且是最贵的一种标注
比对生成的答案拿取回的块和系统自己生成的答案比,让模型判这块有没有贡献不要——这是本书用的那条
不用模型的老办法字符串相似度、关键词重叠不要,但也最粗

为什么第二条能省掉标准答案: 它换了一个问法。 不问「这块是不是该被取回」(要有人标),而问「这块有没有被用上」(看答案就能判)。

这条路的代价,书自己也说了3:它揭示的是「检索噪声」—— 那些语义上匹配了、但没有提供有用信息的块。 它查不出「本该取回却没取回」的那些——那是漏,不是脏。

教科书式的小例子

书给了一个最小的例子2:

问题: "谁画了蒙娜丽莎?"
某一块:"《蒙娜丽莎》是一幅 16 世纪的油画,归于意大利博学者列奥纳多·达·芬奇。"
答案: "《蒙娜丽莎》由达·芬奇所画。"

判:这一块对生成这个答案有帮助吗? → 有,判 1

如果某一块讲的是另一幅画或者另一个画家,
模型多半不会用它 → 判 0

4. 检索指标其实是一整族,先分清怕脏还是怕漏

这一节把第 16 章欠的账还上:检索这一头不止一个数。

书列了一整族4。先看最基本的三个:

名字它问什么一句话
精确率捞上来的这些里,有几成是有用的?
召回率本该捞上来的里,捞回了几成?(第 11 章那个)
F1把上面两个合成一个数(取它们的调和平均——两个里有一个很低,合出来就低)两头都想看

书给的选法很干脆4:

担心混进无关内容,看精确率;担心漏掉信息,看召回率。 F1 平衡两者,但它不告诉你哪一个问题占主导。

最后那半句是这一节的重点:F1 高不代表两头都好, 它也可能是「精确率很高、召回率很低」和「反过来」两种情况平均出来的同一个数。

库里真正相关的块有 10 块,系统取回 5 块。

情形甲:取回的 5 块全相关 精确率 5/5 = 1.00 召回率 5/10 = 0.50
情形乙:取回的 5 块中 3 块相关 精确率 3/5 = 0.60 召回率 3/10 = 0.30

情形甲 F1 ≈ 0.67,情形乙 F1 = 0.40

(这些数是为演示编的。)

图说:F1 能排出好坏,但看不出甲的问题是"漏"、而不是"脏" ——
于是你可能跑去调嵌入模型,而该调的是取回的块数。

5. 排名进不进公式,是两个不同的指标

这一节讲那一族里的另一半,而这一半的分界很干净。

上一节那三个数有一个共同点:它们不看顺序。 取回三块、其中第 1 块和第 3 块相关,和第 1、2 块相关,精确率是同一个数。

可书自己给了一条理由说明顺序要紧4:

当结果的顺序会影响生成质量时,考虑排名的指标才重要。 如果你的模型主要用前几块,那么排得差就会伤到你,哪怕所有相关的块都在结果里。

「模型主要用前几块」这一点,第 12 章那一整章都在处理—— 那里的重排就是专门为了「把对的挪到前面」。

于是有了两个把顺序算进去的数4:

名字它量什么
平均倒数排名(常写作 MRR)第一个相关结果出现得有多早——它只看第一个
归一化折损累积增益(常写作 NDCG@k)相关结果越靠前,权重越高;并且做了归一化,便于跨不同查询做比较

中间还有一个,书也列了:平均精度(AP)——它兼顾相关性和排名位置。 记住这个名字,下一节会用到它。

另外书给了一条排除项,值得记5: 摘要和翻译里常用的那两个老指标(ROUGE、BLEU)不适合用来评这里的检索器—— 它们量的是字面上的词组重叠,抓不住语义上的相关。

6. 书里的文字和它的公式,算的不是同一个数

这是我们在这一章核出来的一处实质错误,而且它出在全书最技术的一节上。

三处说法摆在一起

书在同一节里,用三种方式描述了同一个指标6:

① 文字(步骤那一段):
"把判为有用的块数,除以取回的总块数。
比如四块进了提示、只有两块相关,精确率就是 0.5。"
→ 这是**不看顺序**的那个精确率

② 公式:
分子 = Σ(precision@k × v_k) 分母 = 前 k 个里相关项的总数
→ 这是**把顺序算进去的**那个:平均精度

③ 代码:
numerator = Σ_i [ (前 i+1 块里相关的个数 ÷ (i+1)) × v_i ]
denominator = Σ v_i
score = numerator / denominator
→ 和公式一致,也就是**平均精度**

拿书自己的例子算一遍,差多少

书的代码注释里自带一个例子:判定结果是 [1, 0, 1] 时,分数约 0.835。 我们把两种算法都算一遍:

判定结果:第 1 块相关、第 2 块不相关、第 3 块相关 → [1, 0, 1]

── 按文字那种算(不看顺序)──
相关块数 ÷ 总块数 = 2 ÷ 3 ≈ 0.667

── 按公式和代码那种算(看顺序)──
第 1 块:前 1 块里有 1 块相关 → 1/1 = 1.00,它本身相关 → 计入 1.00
第 2 块:它本身不相关 → 计入 0
第 3 块:前 3 块里有 2 块相关 → 2/3 ≈ 0.667,它本身相关 → 计入 0.667
分子 = 1.667 分母 = 相关块总数 = 2
分数 = 1.667 ÷ 2 ≈ 0.8333

← 书注释里写的是 0.835,而按它自己的代码精确算是 0.8333。
(代码在分母上加了一个极小数防止除零,但那只会让结果更小、不会更大。)
这 0.002 书没有交代。

两者差 0.17。而它们在书里被当成同一个指标的两种表达。

判断(我们的,不是书里的):这是全书最实质的一处概念错误, 而且它比一个笔误更值得警惕——因为它会让读者对这个数产生错误的直觉。 具体地说:按文字理解,你会以为「把不相关的那块挪到最前面」不影响分数; 而按代码,把 [1, 0, 1] 换成 [0, 1, 1],分数会从 0.833 掉到 0.583 (第 1 块判 0 不计入;第 2 块:1/2 = 0.5;第 3 块:2/3 ≈ 0.667; 分子 1.167,分母 2)。同一批块,只是换了顺序,分数掉了四分之一。 我们核了一个主流评测框架的源码,它这个指标的实现方法名就叫「平均精度」—— 也就是说,书抄对了公式,只是在正文里把它描述成了另一个指标。7 如果错,会错在: 如果书的用意是「先用最简单的说法让读者理解方向, 具体公式看代码就好」,那这只是详略取舍,不算错。 判据是:书的文字里明确给了一个数值例子(四块两相关等于 0.5), 而那个数用它自己的代码算出来不是 0.5——给了数,就不是详略问题了。

这一处对读者的实际影响: 你照书的文字去理解, 会以为这个数只管「脏不脏」;而实际上它同时在管「排得好不好」。 于是你调重排策略的时候,会看到这个数在动,却不知道它为什么动。

7. 这个数要和答案质量交叉着看

单看这一个数,读不出该修哪里。书给了一张四格表,这是这一章最实用的一张8:

上下文精确率答案质量说明什么
检索器工作正常
是生成端的问题:胡编,或者推理差
第一块就够了,后面的块只是噪声——考虑把取回的块数调小
检索失败。 去查换算模型、切块策略,或者知识库内容本身

第三行最反直觉,也最有用:分数低不一定是坏事。 它可能只是说明「你取多了」。

书还给了这个数最该被用在什么时候8:

调检索参数时(取回几块、相似度阈值、重排策略); 以及为成本和延迟做优化时——「把取回的块数从 10 降到 3 能省 token, 但只有当那三块含有关键信息时才划算。调这个数的时候要盯着上下文精确率。」

这正是第 16 章那条主走查在做的事。

8. 承重词二:忠实度 —— 把答案拆成一条条独立主张

这一章第二个承重词。一句话先给结论:忠实度量的是 「答案里的每一句话,能不能在给它的材料里找到支持」—— 做法是先把答案拆成一条条不带代词的独立陈述,再逐条查。

三步做法

书给的步骤9:

① 用模型把答案拆成一条条独立的主张
② 逐条查:这一条有没有被取回的材料支持?
③ 被支持的条数 ÷ 总条数

拆解那一步长什么样(另起一处走查)

这是这一章另起的一处走查,它是第 ① 步的放大镜。用的是书那个例子10:

问题:"巧克力饼干的主要原料有哪些?"

答案:"它们通常包括面粉、糖、黄油、鸡蛋和巧克力豆。
有些配方还会用香草精或小苏打。"

↓ 拆成七条独立陈述(书给的原样):

① 巧克力饼干通常包含面粉。
② 巧克力饼干通常包含糖。
③ 巧克力饼干通常包含黄油。
④ 巧克力饼干通常包含鸡蛋。
⑤ 巧克力饼干包含巧克力豆。
⑥ 有些配方会用香草精。
⑦ 有些配方会用小苏打。

图说:注意两件事 ——
第一,原答案只有两句话,拆出来七条:**"包括 A、B、C" 被拆成了三条**,
因为材料可能只支持其中两样。
第二,每一条都把"它们"换成了"巧克力饼干" ——
**一条主张必须能脱离上下文单独看懂,否则没法判它有没有被支持。**

拆解的提示词里那条要求是承重的11:

把答案里的每个句子拆成一条或多条能被完全理解的陈述。 确保任何陈述里都不出现代词或含糊的指代。

这一手法你在第 07 章见过

这是全书一处没有被点破的呼应: 第 07 章讲切块时,最贵的那种切法是「把文本重写成一条条命题」, 要求也是「每条只讲一件事、不靠上下文也读得懂、不出现代词」。

同一个手法,那里用在入库,这里用在评测。书隔了六章各讲了一遍,一次都没说它们是同一件事。

书自己那个更长的跑例也印证了这一点12:一段讲亚马逊雨林的四句话答案, 拆出了九条陈述;而材料里没提「氧气产量常被高估」这类内容,那几条就会被判为不支持。

9. 那条 80% 的线 —— 全书唯一一处明确的数值判据

书在这里给了全书唯一一组可以直接照用的阈值13:

分数该怎么办
85% 以上扎得很牢,系统很少编造
80% 以上生产系统该争取的水平
70% 到 80%要调查:去看失败案例,判断问题是系统性的(比如总在某个特定主题上编)还是随机的
持续低于 70%可能有编造问题。 三条应对:调生成提示强调「只用给定内容」、把温度调低、换一个更听指令的模型

表里那个「温度」是调用模型时的一个旋钮:它管的是「下一个字挑不挑最有把握的那个」。 拧大了它会更愿意挑排名靠后的词,输出更多样也更容易跑偏;拧到最小,它每次都挑最稳的那个—— 所以在这里,调低温度就是让它少发挥、多照抄材料。

「系统性还是随机」这个分法值得单记: 系统性的问题能修(那个主题的资料没入库,或者切碎了); 随机的问题只能靠换模型或调参数。 两者的处置完全不同。

它换掉的是什么

书给了一个诚实的权衡14:

忠实度高的模型是保守的,它只说材料里明确写着的东西。 对多数场景,优先保忠实度——用户期待的是可靠的信息检索。

换句话说:这个数不是越高越好,它顶到 100% 的时候, 系统会拒绝一切需要一点推断的问题。 而书的判断是:在这个取舍上,宁可保守。

10. 第三个指标:答案相关性 —— 反过来出题

这一节讲第三个数,而它的做法是一个巧思:不判答案,判「从答案倒推出来的问题」。

五步做法

书给的步骤15:

① 让系统回答用户的问题,拿到答案
② 让模型**从这个答案倒推出几个问题** —— "什么样的问题会得到这段回答?"
③ 给原问题和每个倒推出来的问题各算一串数
④ 算每个倒推问题和原问题的余弦相似度
⑤ 取平均,就是这个分数

书给的公式:答案相关性 = (1/N) × Σ 余弦相似度(倒推问题_i, 原问题)

机制一句话,书自己写得很好16:

如果模型从一个答案里倒推出问题,那么这些问题应该像原问题—— 前提是这个答案确实回应了被问的东西。 相似度高说明对齐;相似度低就暴露了跑偏。

「不置可否」这一层

光算相似度还不够,书加了一道判断17: 每个倒推出来的问题还要被判一次「不置可否」—— 意思是「这个答案没有为它提供相关、有价值的信息」。

书给的三个例子把这件事说透了17:

问题答案判定
「法国的首都是哪?」「法国的首都是巴黎。」0(好)——直接给了具体信息
「你今天感觉怎么样?」「作为一个语言模型,我没有情绪。」1——承认了问题,但没给相关信息
「特斯拉股票现在多少钱?」「我无法提供实时股价。」1——同上

注意这个标记的方向:0 是好的,1 是坏的。

打分逻辑是一刀切的18:只要有任何一个倒推出来的问题被判为不置可否,总分直接置 0。 书自己给了一个软一点的版本:分数 = 平均相似度 ×(1 − 不置可否的比例)。

判断(我们的,不是书里的):那个一刀切的默认做法, 会把「诚实地承认自己不知道」判成彻底失败。 第 01 章讲过,让模型说「材料里没有」是压住编造的关键指令之一; 而在这个指标下,一个规规矩矩回答「我无法提供实时股价」的系统,这一题得 0 分。 也就是说,这个指标和第 01 章那条纪律在方向上是打架的。 书给出了那个软版本的公式,但没有点破这个冲突。 如果错,会错在: 如果你的题库里根本不该有「实时股价」这类超出知识库范围的问题 (第 16 章那条:题必须能从现有资料答出来),那这个冲突就不会发生。 判据是:先看你的题库里有没有「本来就答不了」的题。有,就必须换成软版本。

它测不到什么

书自己点明了这个指标的盲区19:

这个指标能发现答非所问,但发现不了答得不全。 一个多部分的问题只答了其中一部分,相关性分数照样可能很高。

这也正是第 16 章那条主走查里,「块数降到 3」之后暴露的那类问题—— 比较型问题只答了一半。

两个生成指标的分工,一句话记住

书写了一句很干净的对照20:

忠实度问的是「答案有没有守住检索到的事实」; 答案相关性问的是「答案有没有回应问题」。 两个都必要:忠实度保可靠,答案相关性保有用。

11. 主走查:「法国的首都是哪?」三个指标各算一遍

这是本章的主走查,前面每个机制都在它上面占一步。 用的是书那个真实跑例21

(问题、三块上下文、「模型给前两块判 1、第三块判 0」、 [1,0,1] 那个例子和 0.835 那个数,都是书里的; 下面的主张拆解、倒推问题、以及最终三个分数,是我们照书的算法一步步算的,并当场标了出来。)

第 0 步:输入

问题:"法国的首都是哪?"

检索取回三块:
块 1:"法国是西欧的一个国家,它的首都是巴黎。"
块 2:"巴黎是法国的首都,也是它最大的城市。"
块 3:"亚马逊雨林是世界上最大的热带雨林。" ← 完全无关

系统生成的答案:"法国的首都是巴黎。"

第 1 步:指标一 —— 上下文精确率

逐块判"这块对生成这个答案有没有帮上忙":
块 1 → 1 (书里的判定)
块 2 → 1 (书里的判定)
块 3 → 0 (书里的判定)

判定序列 = [1, 1, 0]

── 按书的文字算 ──
2 ÷ 3 ≈ 0.667

── 按书的公式和代码算 ──
块 1:前 1 块里 1 块相关 → 1/1 = 1.00,本身相关 → 计入 1.00
块 2:前 2 块里 2 块相关 → 2/2 = 1.00,本身相关 → 计入 1.00
块 3:本身不相关 → 计入 0
分子 = 2.00 分母 = 2
分数 = 1.00

↑ 这一次两种算法差得更大:0.667 对 1.00。
而 1.00 其实更符合直觉 —— 两块相关的都排在最前面,一块噪声垫底,
从"排序质量"看确实是满分。

(0.667 和 1.00 是我们照两种算法各算的;书只给了三块的判定结果。)

第 2 步:指标二 —— 忠实度

把答案拆成独立主张:
答案只有一句 "法国的首都是巴黎。"
→ 拆出一条: ① 巴黎是法国的首都。

逐条查有没有被材料支持:
① → 块 1 和块 2 都明说了 → 支持

分数 = 1 ÷ 1 = 1.00

(这次拆解是我们照书的做法做的;书这个例子只用来演示第一个指标。)

第 3 步:指标三 —— 答案相关性

从答案 "法国的首都是巴黎" 倒推出三个问题(N 默认取 3):
① "法国的首都是哪座城市?"
② "巴黎是哪个国家的首都?"
③ "法国的行政中心在哪里?"

每个和原问题 "法国的首都是哪?" 算余弦相似度:
① 0.97 ② 0.88 ③ 0.91

平均 = 0.92

不置可否判定:三个都判 0(好)—— 答案给了具体信息
→ 没有任何一个被判 1,所以不置 0

分数 = 0.92 × 1 = 0.92

(倒推出来的三个问题和这三个相似度都是为演示编的;
"任何一个被判不置可否就置 0" 这条规则是书里的。)

第 4 步:把三个数放在一起读

这次的分数 它说明什么
上下文精确率 1.00 取回的块排得很好,噪声垫底
忠实度 1.00 答案里的每一条都有材料撑着
答案相关性 0.92 答案确实在回答被问的东西

→ 三个都高,对照第 7 节那张四格表的第一行:检索器工作正常。

图说:注意这是一道最简单的题。三个指标真正的价值在它们**不一致**的时候 ——
比如上下文精确率 0.95、忠实度 0.62,那就是"材料对但模型在编",
该去改生成提示,不该去调检索。

第 5 步:换一种失败,看指标怎么分工

假设答案变成:"法国的首都是巴黎,那里的人口约为 900 万。"
(人口那半句材料里没有,是编的。)

上下文精确率 1.00 ← **一点没变**,因为检索这一步没出问题
忠实度 0.50 ← 两条主张里只有一条被支持,当场掉一半
答案相关性 0.93 ← **几乎没变**,因为它确实在回答"首都是哪"

图说:这就是"三个指标各针对一种独立失效"的具体样子 ——
这次故障只有中间那一个数抓得到。
(这些数是为演示算的。)

12. 节奏,以及为什么读源码才靠谱

三个指标各自独立地动

书特意强调了这一点22:

改进检索并不保证忠实度变好,如果模型照样胡编; 而完美的忠实度也挡不住答案相关性偏低,如果模型盯错了上下文里的方面。

所以第 16 章那条「选两三个覆盖不同部件」的纪律,在这里得到了具体的解释。

一条方法建议:去读评测框架的源码

书给了一条很实在的建议23: 想弄清一个指标到底怎么算,最可靠的办法是读实现它的那个框架的源码—— 它甚至点了具体做法:在编辑器里点进那个函数,一路翻下去, 会找到一个负责「把答案拆成陈述」的类。

我们照做了,而且这条建议自己就验证了自己24: 那个类确实存在,它的提示词写的是「确保任何陈述里都不出现代词」; 而同一个框架里,上一节那个指标的实现方法名直接就叫「平均精度」—— 这正是第 6 节那处错误的实锤。

判断(我们的,不是书里的):这条「去读源码」的建议,是这一整章最值钱的一句话, 而它被放在了最不显眼的位置(一节的末尾)。 理由很直接:这一章的三个指标,每一个在不同框架里都有细节差异—— 拆几条主张、N 取几、不置可否怎么判、除零怎么处理。 而这些细节直接决定你看到的那个数字。 书自己那处「文字和代码不一致」,恰恰就是不读源码会踩的坑。 如果错,会错在: 如果你只是在两个版本之间做相对比较(改动前 vs 改动后), 那实现细节被抵消掉了,读不读源码影响不大。 判据是:你要用这个数和别人比,还是只和自己的上一版比。

13. 作者的判断与证据

说法它是什么
三个指标各针对一种独立的失效是机制论证,而且是这一章的组织原则
上下文精确率的四步做法是做法描述
三条判定路线是事实描述,而且「不需要黄金集」那条选得对
蒙娜丽莎那个例子是教学例子,不是跑出来的
文字说「相关块数 ÷ 总块数」和它自己的公式、代码不一致——见第 6 节
那个公式和那段代码和主流框架的平均精度实现一致,所以错的是文字,不是代码
四格解读表作者的经验归纳,没有数据。 但四格都能从机制推出来,尤其第三行
检索指标那一族是事实描述,都是搜索领域的成熟指标
「ROUGE 和 BLEU 不适合」是事实判断,理由(只量词组重叠)成立
忠实度的三步做法是做法描述
「陈述里不许有代词」是提示词事实,而且和第 07 章那个手法同源
七条主张、九条主张那两个例子是书里跑出来的真实输出
80% / 70% / 85% 这组阈值作者给的经验数,没有来源。 但它是全书唯一一处给了数的判据
「系统性还是随机」这个分法作者的诊断法,没有数据。 但可操作
「忠实度高的模型是保守的」是机制推导,成立
答案相关性的五步与公式是做法描述
「任何一个不置可否就置 0」是代码事实,而且书自己也提供了软版本,说明它知道这一刀切得硬
「能发现答非所问,发现不了答得不全」是机制推导,成立,而且很诚实
「读源码是最可靠的办法」作者的方法建议。 这一章最值钱的一句,位置却最不显眼

14. 边界与局限

  • 第一个指标的文字和实现不一致(第 6 节),而且书没有勘误;
  • 三个指标一次跑例都没有跑全。 书给的例子分散在三节,没有一处把三个数在同一个问答上 一起算出来 —— 第 11 节那条走查是我们拼的;
  • 判卷模型的选型没有交代。 代码里用的是当时最强的一档, 而书全书都在讲「选最小的够用模型」,唯独这里没提这个数会不会随判卷模型而变;
  • N 取几没有依据。 答案相关性默认倒推 3 个问题,为什么是 3,书没说;
  • 没有讲这三个数怎么合成一个结论。 三个数一起看, 可四格表只处理了两个数的组合,三个数的情况没有覆盖;
  • 80% 那条线没有来源。 它是全书唯一一处数值判据,却没有任何实验或引用支撑;
  • 没有讲成本。 每评一道题,这三个指标合起来要调多少次模型? 一次完整评测(比如 100 道题)要花多少钱?一个字没有;
  • 答案相关性和「诚实地说不知道」之间的冲突,书没有点破(第 10 节那个判断块)。

15. 可带走的

  1. 三个指标各针对一种彼此独立的失效: 取回的块是不是都有用(管检索)、 答案有没有守住材料(管生成,抓编造)、答案有没有回应问题(管生成,抓跑偏)。 三个会各自独立地动;
  2. 上下文精确率的判据不是「这块和问题像不像」,而是「这块对生成这个答案有没有用」—— 它拿块去比答案,所以不需要标准答案;
  3. 代价是它只查得出「脏」,查不出「漏」——本该取回却没取回的那些,它看不见;
  4. 书里这个指标的文字和它的公式、代码算的不是同一个数: 文字说「相关块数 ÷ 总块数」,公式和代码算的是带排名加权的平均精度同一组判定 [1,0,1],前者 0.667、后者 0.833;
  5. 实际后果:换个顺序分数就会变。 [1,0,1] 是 0.833,[0,1,1] 只有 0.583—— 而照书的文字理解,你会以为顺序不影响;
  6. 四格解读表: 高+高检索器正常 / 高+低是生成端问题 / 低+高说明第一块就够了、该把取回的块数调小 / 低+低是检索失败;
  7. 检索指标是一族:怕脏看精确率、怕漏看召回率、F1 平衡两者但看不出哪个占主导; 而顺序要紧时才用把排名算进去的那两个(第一个相关结果出现得多早 / 越靠前权重越高);
  8. 忠实度 = 把答案拆成一条条不带代词的独立主张,再逐条查有没有被材料支持。 「包括 A、B、C」要拆成三条;
  9. 这个拆法正是第 07 章那个把文本重写成命题的手法——同一手法, 那里用在入库,这里用在评测,书隔了六章没点破;
  10. 80% 是全书唯一一处明确的数值判据: 85% 以上扎得牢、80% 以上算合格、 70% 到 80% 要去看失败案例是系统性的还是随机的、持续低于 70% 就当它在编;
  11. 它换掉的是信息量:忠实度高的模型是保守的,只说材料里明确写着的东西。 书的判断是宁可保守;
  12. 答案相关性反过来算:从答案倒推出几个问题,看它们像不像原问题。抓得住答非所问,抓不住答得不全;
  13. 「不置可否」那一刀切得很硬:任何一个倒推问题被判为不置可否,总分直接 0。 这和「诚实地承认不知道」是打架的——书给了软版本的公式,但没点破这个冲突;
  14. 想弄清一个指标到底怎么算,最可靠的办法是读评测框架的源码。 这是这一章最值钱的一句,而书自己那处文字与代码的不一致,正是不读源码会踩的坑。

16. 原文地图

主题原书章原文位置
上下文精确率的四步与那个 0.5Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:363(搜「the precision score is 0.5」)
它的公式Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:369(搜「Total number of relevant items in the top k results」)
三条判定路线Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:377(搜「a golden dataset that specifies」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:379(搜「you don't need a golden reference dataset」)
蒙娜丽莎那个例子Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:383(搜「a simple example around the Mona Lisa」)
法国首都那个跑例与三块判定Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:412(搜「What is the capital of France」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:492(搜「verdict values of 1 to the first two chunks」)
那段计算代码与 0.835Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:507(搜「sum(verdict_list[: i + 1])」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:511(搜「score = 0.835」)
四格解读表与调 kChapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:520(搜「Reducing k from 10 to 3 cuts token usage」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:524(搜「Interpreting context precision scores」)
检索指标那一族与怎么挑Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:547(搜「Precision@k」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:575(搜「Use precision when you're concerned about irrelevant content」)
ROUGE 和 BLEU 不适合Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:579(搜「ROUGE and BLEU metrics」)
忠实度三步Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:604(搜「proportion of supported claims」)
巧克力饼干七条主张Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:620(搜「seven in total」)
拆解提示词Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:662(搜「no pronouns or」)
亚马逊雨林那个跑例、九条Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:693(搜「the question is about the Amazon rainforest」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:707(搜「nine statements have been extracted」)
80% 那条线Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:813(搜「Aim for faithfulness scores above 80%」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:815(搜「Scores of 70%–80% warrant investigation」)
三个指标各自独立地动Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:823(搜「Improving retrieval doesn't guarantee」)
忠实度 vs 信息量Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:825(搜「High faithfulness models are conservative」)
去读源码那条建议Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:833(搜「StatementGeneratorPrompt」)
答案相关性五步与公式Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:854(搜「The response relevancy score is calculated in five steps」)
「不置可否」的定义与三个例子Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:889(搜「A question is noncommittal if」)
一刀切与软版本Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:1022(搜「penalizes evasive answers」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:1034(搜「a softer penalty」)
机制与它测不到什么Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:1045(搜「reverse question generation」) · text/35-ch10-chapter-10-evaluating-rag-systems.txt:1049(搜「detects off-topic answers but not incomplete ones」)
两个生成指标的分工Chapter 10. Evaluating RAG Systemstext/35-ch10-chapter-10-evaluating-rag-systems.txt:1051(搜「Does the answer stick to retrieved facts」)

Footnotes

  1. 出处:「Chapter 10. Evaluating RAG Systems」第 355 段起的四步(text/35-ch10-chapter-10-evaluating-rag-systems.txt:363,搜「the precision score is 0.5」)。

  2. 出处:同章第 377 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:377,搜「a golden dataset that specifies」)与第 379 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:379,搜「you don't need a golden reference dataset」);第三条(不用模型的老办法)见第 381 段。蒙娜丽莎那个例子见第 383 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:383,搜「a simple example around the Mona Lisa」)。 2

  3. 出处:同章第 518 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:518,搜「This reveals retrieval noise」)。「它查不出漏」这一点是我们推的,书没有明说。

  4. 出处:同章第 547 段起的指标清单(text/35-ch10-chapter-10-evaluating-rag-systems.txt:547,搜「Precision@k」),平均倒数排名见第 559 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:559,搜「Mean reciprocal rank」),归一化那一个见第 571 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:571,搜「Normalized discounted cumulative gain」);怎么挑见第 575 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:575,搜「Use precision when you're concerned about irrelevant content」)。上面那两组情形甲乙的数是我们为演示编的。 2 3 4

  5. 出处:同章第 579 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:579,搜「ROUGE and BLEU metrics」)。补充(不在书里,来自通用知识):这两个指标量的是生成文本和参考文本之间连续几个词的重合比例,所以换一种说法表达同一个意思,它们会判为不像。

  6. 出处:文字那一段见同章第 363 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:363,搜「the precision score is 0.5」);公式见第 369 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:369,搜「Total number of relevant items in the top k results」);代码见第 507 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:507,搜「sum(verdict_list[: i + 1])」),[1,0,1] 得 0.835 那条注释见第 511 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:511,搜「score = 0.835」)。另外注意:第 496 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:496,搜「the proportion of relevant chunks relative to the total number」)在贴出那段代码之前,又把它描述了一次「相关块占总块的比例」——所以同一处的描述其实错了两遍。 上面两种算法的数值是我们照两种定义各算的。

  7. 补充(不在书里,依据我们的 frontier 书架):主流评测框架 ragas 里,这个指标的实现方法名直接叫「计算平均精度」,算法与书那段代码逐行一致(累加相关计数、除以位次、只在本项相关时计入,最后除以相关总数并加一个极小数防止除零)。依据: shelf=ai-frontier-reference/ragas@src:src/ragas/metrics/_context_precision.py:113 事实=源码里定义的方法是 def _calculate_average_precision(...),其中 numerator += cumsum / (i + 1) 只在 v 为 1 时执行,denominator = cumsum + 1e-10

  8. 出处:同章第 524 段起的表 10-1(text/35-ch10-chapter-10-evaluating-rag-systems.txt:524,搜「Interpreting context precision scores」);调 k 那句见第 520 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:520,搜「Reducing k from 10 to 3 cuts token usage」)。 2

  9. 出处:同章第 604 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:604,搜「proportion of supported claims」)。

  10. 出处:同章第 618 到 634 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:620,搜「seven in total」),七条陈述分列其后。

  11. 出处:同章第 662 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:662,搜「no pronouns or」)。

  12. 出处:同章第 693 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:693,搜「the question is about the Amazon rainforest」)与第 707 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:707,搜「nine statements have been extracted」)。

  13. 出处:同章第 813 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:813,搜「Aim for faithfulness scores above 80%」)与第 815 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:815,搜「Scores of 70%–80% warrant investigation」)。

  14. 出处:同章第 825 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:825,搜「High faithfulness models are conservative」)。

  15. 出处:同章第 854 段起的五步(text/35-ch10-chapter-10-evaluating-rag-systems.txt:854,搜「The response relevancy score is calculated in five steps」),公式见第 868 段一带(text/35-ch10-chapter-10-evaluating-rag-systems.txt:863,搜「cosine similarity」)。

  16. 出处:同章第 1045 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:1045,搜「reverse question generation」)。

  17. 出处:同章第 889 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:889,搜「A question is noncommittal if」),三个例子在其后的表 10-2 里。 2

  18. 出处:同章第 1022 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:1022,搜「penalizes evasive answers」)与第 1034 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:1034,搜「a softer penalty」)。

  19. 出处:同章第 1049 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:1049,搜「detects off-topic answers but not incomplete ones」)。

  20. 出处:同章第 1051 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:1051,搜「Does the answer stick to retrieved facts」)。

  21. 出处:那道题与三块上下文见同章第 412 段起(text/35-ch10-chapter-10-evaluating-rag-systems.txt:412,搜「What is the capital of France」)与第 421 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:421,搜「The Amazon rainforest is the world's largest tropical」);三块的判定结果见第 492 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:492,搜「verdict values of 1 to the first two chunks」)。书只用这个例子演示了第一个指标,后两个指标在这条走查上的算法是我们照书的做法补的。

  22. 出处:同章第 823 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:823,搜「Improving retrieval doesn't guarantee」)。

  23. 出处:同章第 833 段(text/35-ch10-chapter-10-evaluating-rag-systems.txt:833,搜「StatementGeneratorPrompt」)。原文的说法是:一路点进去,最终会找到一个叫 StatementGeneratorPrompt 的类,它让你看清这些框架是怎么定义评测指标的。

  24. 补充(不在书里,依据我们的 frontier 书架):我们按书的建议核了 ragas 的源码。依据: shelf=ai-frontier-reference/ragas@src:src/ragas/metrics/_faithfulness.py:34 事实=源码里确实定义了 class StatementGeneratorPrompt,它的指令写着「Given a question and an answer, analyze the complexity of each sentence in the answer. Break down each sentence into one or more fully understandable statements. Ensure that no pronouns are used in any statement.」——注意它只说「不许用代词」,而书里那份提示词多加了「或含糊的指代」;这个类还自带一个爱因斯坦的示范,把两句话拆成四条陈述。