第 4 周 · Day 6:LLM 当评委,以及第 4 周整合

Transformers and Large Language Models · Week 4 · Day 6。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

时长 7–8 小时:§1 LLM 当评委(1.5h)· §2 偏差与缓解(1.5h)· §3 扩展:事实性、智能体的失败模式、RAG 的分项评测(1h)· §4 在讲义助手上评一次(0.5h)· §5 第 4 周整合与出关测试(2.5h)· §A–§B 穿插进行

对应正课 Lecture 8 的中间部分:LLM 当评委(LaaJ)的做法(提示 + 回答 + 标准 → 理由 → 分数)、强制输出格式、相比规则指标的好处、单点与成对两种形式、位置 / 冗长 / 自我偏好三种偏差与对策、最佳实践、修订后的评测工作流、要评的维度;扩展部分:事实性的量化(事实分解 + 加权)、智能体的失败模式(工具预测错误、工具调用错误、回答生成错误)。学习计划点名要会的:“LLM-as-judge 的三种形式:单点打分、成对比较、带参考答案的评分。成对比较通常最可靠。""已知偏差(面试必问)……对应的缓解手段""RAG 专用指标——上下文精确率 / 召回率、忠实度、答案相关性。”

配套代码 w4day6_checks.py(纯 numpy):位置偏差与三种比较方式、冗长偏差与长度控制、自我偏好与评委团、评委与人的一致率、二元与十分制的可复现性、Elo 即对 BT 的随机梯度上升、风格控制、事实性分数与 F1@K、检索与生成的误差分解

§B 参考实现(code/ 目录):w4d6_judge.py(三种评委提示与稳健解析、交换顺序的保守规则、用植入了偏差的模拟评委检验诊断工具、Arena 的 BT / Elo / bootstrap / 风格控制、给 Day 4 智能体的回答判对错并按检索命中做交叉表、忠实度、评委与人工标注的校准)。

今天的目标:能写出一个好的评委提示,说清每条最佳实践背后的理由;能说出三种主要偏差的症状、机制和对策,并能用数据把它们查出来;能推出”Elo 就是对 Bradley-Terry 的随机梯度上升”,说清 Arena 为什么换成 BT、风格控制在做什么;能把 RAG 和智能体的错误拆到具体环节;完成第 4 周出关测试。


§0 今天的主线

Day 5 结尾留下的问题:开放式的回答,规则指标判不准(Day 5 §5.4),人工又慢又贵(Day 5 §2.5)。Lecture 8 的回答:让 LLM 来当评委。

它是一个看起来很”取巧”的主意:用一个 LLM 去评另一个 LLM。它能行吗?今天的答案是:能用,但要当成一个有噪声、有偏差的测量仪器来用。你要知道它的误差有多大(§1.5,和人比)、偏向哪里(§2),用什么办法校正;就像第 3 周的奖励模型(Week 3 Day 2):LLM 评委本质上就是一个奖励模型,它学到的是”什么样的回答看起来好”,而”看起来好”和”真的好”之间的差距,就是所有偏差的来源。

今天要用到的旧结论:Bradley-Terry 模型(Week 3 Day 2 §2.2);奖励模型的长度偏见(Week 3 Day 2 §2.5);验证器被钻空子(Week 3 Day 6 §2.4);思维链(Week 2 Day 3 §5.1);Cohen’s κ 与一致性的上限(Day 5 §2.2、§2.5);配对比较与 Wilson 区间(Day 5 §3);检索是答对的上限(Day 1 §1.4);智能体的轨迹(Day 4 §7)。


§1 LLM 当评委

1.1 想法与形式

想法(Lecture 8,Zheng et al. 2023):用一个 LLM 给回答打分。它的输入是三样东西:提示(用户的问题)、模型的回答、标准(评什么,比如”相关性”);输出两样东西:理由和分数。

Lecture 8 的例子:

问题:    为什么泰迪熊让人感到安慰?
回答:    因为它们柔软,而且是忠实的伙伴。
标准:    相关性
理由:    直接的解释,没有跑题。
分数:    PASS

它给出的评委提示大意是:

评估模型的回答与用户问题的相关程度。
问题:{prompt}
模型的回答:{model_response}
返回:
- 理由(1–2 句话)
- 分数:大部分相关记 1,大部分不相关记 0。

相比规则指标的两个好处(Lecture 8):

  1. 不需要参考答案:它能直接判断”这个回答是否有用、是否切题”,而 BLEU / ROUGE 离开参考答案就没法算(Day 5 §5.4)。
  2. 可解释:理由告诉你它为什么这样判,你可以逐条抽查、发现评委自己的错误。

它评什么(Lecture 8 的”要评的维度”):任务表现(有用性、事实性、相关性)和对齐(语气、风格、安全)。每个维度写一条独立的标准、分开评,比”整体打个分”可靠得多。

1.2 三种形式

形式输入输出优点缺点
单点打分一个回答分数(二元或分级)便宜(每个回答一次调用);可以直接汇总成”通过率”绝对分数难校准;不同题之间尺度不一
成对比较两个回答A 好 / B 好 / 平局相对判断比绝对判断容易、更一致;直接对应偏好数据(Week 3 Day 2 §2.1)比较次数随系统数平方增长;有位置偏差(§2.1)
带参考答案回答 + 参考答案对 / 错有标准答案的题上最准;评委不需要自己会做这道题需要参考答案(人写的)

什么时候用哪种:比较两个系统(新旧版本、两个模型)用成对比较,这是 MT-Bench 论文的主要做法,也是学习计划说的”通常最可靠”;给一个系统打分、监控线上质量用单点打分;有标准答案的问答(我们的黄金集)用带参考答案。

带参考答案为什么重要:MT-Bench 发现,评委批改数学和推理题的能力有限,即使它自己能做对这道题,看到候选回答里的错误推理也会被带偏。在 10 道数学题(交换顺序,共 20 次判断)上,GPT-4 把错误答案判成正确的次数:默认提示 14/20,让它先自己解一遍再评(思维链)6/20,先让它独立作答、再把它的答案作为参考放进评委提示 3/20。

1.3 输出格式:结构化输出

评委的输出要被程序解析。Lecture 8 的做法:第一步定义期望的输出结构(比如一个类,字段是 rationale: str 和 score: Literal[0, 1]),第二步把它作为模型调用的一部分传进去(各家 API 的”结构化输出”功能,Day 3 §3.4 的约束解码)。这样输出一定能被解析,score 一定是 0 或 1。

没有结构化输出时(本地小模型、某些服务),要自己稳健地解析:参考代码的 parse_verdict 从代码块或前后有说明文字的输出里抠出 JSON;JSON 坏了时用正则兜底(比如 MT-Bench 风格的 [[A]]),但会记录下来;分数不在允许的范围内(二元量表里出现 7 分)直接报错,而不是猜。解析失败的比例本身就是一个要报告的数:它高,说明评委的提示或模型有问题。

1.4 最佳实践,以及每一条的理由

Lecture 8 列出的最佳实践:

  1. 清晰的标准:写成可以判断的条件(“回答的核心结论与参考答案一致,且没有与之矛盾的内容”),而不是一个形容词(“好”)。标准越模糊,评委越依赖自己的偏好(§2 的偏差就有了空间)。
  2. 二元量表优于细粒度量表:w4day6_checks.py 第 5 组:同一个评委对 200 个回答打两次分(感受有噪声),二元量表两次一致的比例是 0.815(κ 0.63),十分制只有 0.260(κ 0.17)。细粒度的分数信息更多(和真实质量的相关 0.923 vs 0.679),但每一次判断很难复现,也很难和人对齐(“7 分还是 8 分”,人自己都说不准)。需要细粒度时,用多条二元标准的组合(相关吗?有依据吗?完整吗?)。
  3. 先写理由,再给分数:分数在理由之后生成,相当于让评委先做一遍思维链(Week 2 Day 3 §5.1)。反过来”先给分再解释”,理由只是在为已经给出的分数找借口。
  4. 缓解偏差:位置、冗长、自我偏好……(§2)。
  5. 用人工评分校准:见 §1.5。
  6. 低温度,便于复现:同样的输入给出同样的判断。温度 0 也不保证完全确定(Week 2 Day 3 §A.3),重要的评测最好跑两次,看结论是否稳定。

1.5 评委和人一致吗

这是决定评委能不能用的问题。MT-Bench 论文在 MT-bench 的数据上,比较了 GPT-4 评委和人类专家的一致率(Day 5 §2.2 的 pop_o),用两种口径:S1 包含平局(三种结果,两个随机评委的一致率是 33%),S2 只看两者都没判平局的样本(随机是 50%):

S1(含平局)S2(不含平局)
GPT-4(成对)vs 人66%85%
人 vs 人63%81%

(第一轮对话的结果。)GPT-4 和人的一致率达到、甚至超过了人和人之间的一致率。这是 LLM 当评委能被接受的主要证据。

为什么评委和人的一致率能高过人和人? 不是评委”比人更懂”。第 4 组:设每个评分者感受到的质量差 = 真实差 + 自己的噪声,人的噪声大(σ = 1.0),评委的噪声小(σ = 0.6):

S1S2
人 vs 人0.5280.742
评委 vs 人0.5600.802
评委 vs 真相0.6860.898

两个噪声大的人之间,一致率被双方的噪声拉低;噪声小的评委和一个人之间,只被那个人的噪声拉低。这和 Day 5 §2.5 是同一个道理:评分者之间的一致率,比每个评分者对真相的准确率低得多。

在你自己的任务上校准:抽 20–50 道题自己判一遍,算评委和你的一致率与 κ(参考代码的 --calibrate)。特别留意评委放水的题(你判错、评委判对):它们让系统看起来比实际好,比”评委太严”更危险。一致率不够高时,先读评委的理由:多半是标准写得不清楚。


§2 偏差与缓解

2.1 位置偏差

症状(Lecture 8):成对比较时,同样的两个回答,交换一下顺序,评委的结论就变了,它偏爱某个位置(通常是第一个)的回答。

MT-Bench 的测量:对每一对回答问两次(交换顺序),统计”一致”(两次选了同一个回答)、“偏向第一个”(两次都选了排在前面的那个)、“偏向第二个”。在两个质量相近的回答上(用 GPT-3.5 采两次构造的难题):

评委(默认提示)一致偏向第一个偏向第二个
Claude-v123.8%75.0%0.0%
GPT-3.546.2%50.0%1.2%
GPT-465.0%30.0%5.0%

怎么读:没有位置偏差时,“偏向第一个”和”偏向第二个”应该差不多(两个回答难分,评委的判断有噪声,两个方向的不一致一样多)。第 1 组的模拟(选第一个的概率 = σ(3Δq+b)\sigma(3\Delta q+b)):b=0b=0 时两者都是 0.21;b=1b=1 时 0.470 对 0.066。两者严重不对称,就是位置偏差的特征。MT-Bench 还发现 Claude-v1 有”名字偏差”:把”助手 A / B”换个名字后,偏向第一个降到 11.2%、偏向第二个升到 28.7%,说明它偏爱的部分是”A”这个名字。

危害在比较两个系统时最明显。第 1 组:两个一样好的系统,如果 A 的回答总是放在前面:

位置偏差 bbA 总在前时 A 的胜率随机顺序时 A 的胜率保守规则:A 胜 / 平 / B 胜
00.5000.4980.291 / 0.420 / 0.290
1.00.6990.4970.229 / 0.536 / 0.235
2.50.8990.4970.091 / 0.813 / 0.096

对策(Lecture 8:“取平均”,或者调整位置编码;MT-Bench 论文第 3.4 节):

  • 交换顺序、保守规则:问两次,只有两次一致才判胜负,否则判平局(参考代码的 pairwise_swap)。结果对称,代价是很多平局(信息被丢掉),调用次数翻倍。
  • 随机顺序:每次随机决定谁在前。在大量比较上偏差被平均掉(上表 0.497),但每一次单独的判断仍然有偏,只适合看总体胜率。
  • 少样本示例:MT-Bench 在评委提示里加了三个示范(A 好、B 好、平局各一个),GPT-4 的一致率从 65.0% 升到 77.5%。代价是提示变长(他们说 API 调用贵了 4 倍),而且一致不等于正确。

为什么会有位置偏差:MT-Bench 的作者猜测它可能来自训练数据,或者是从左到右的因果 Transformer 固有的;Lecture 8 提到的”调整位置编码”就是从后一个角度下手。这仍是一个开放问题,但对策不依赖于答案。

2.2 冗长偏差

症状(Lecture 8):一个回答简短而正确,另一个长篇大论、很多内容不必要、整体没什么帮助,评委却选了长的那个。

MT-Bench 的”重复列表”攻击:挑 23 个含有编号列表的回答,让 GPT-4 把列表换个说法、不增加任何信息,插在原列表前面(比如 5 条变 10 条,前 5 条是后 5 条的改写)。评委认为加长版更好,就算攻击成功:

评委Claude-v1GPT-3.5GPT-4
失败率91.3%91.3%8.7%

作为对照,评委对两个完全相同的回答都能正确地判平局;但更隐蔽的”重复列表”就骗过了较弱的评委。

这和奖励模型的长度偏见是同一件事(Week 3 Day 2 §2.5):人类标注者本身就偏爱更长、更详细的回答,在这种数据上训练出来的模型(不论是奖励模型还是被当作评委的 LLM)会学到这个偏好。

对策(Lecture 8:明确的指引、少样本、对输出长度的惩罚):

  • 在标准里写明”更长不代表更好""不要因为长度偏向任何一方”(参考代码的 PAIRWISE_PROMPT)。
  • 少样本:给一个”短而对的回答赢了长而空的回答”的示范。
  • 长度控制:统计上把长度的影响回归掉。第 2 组:8 个模型和一个基线比,评委选模型 mm 的概率 =σ(qm−qbase+γ Δℓ)=\sigma(q_m-q_{base}+\gamma\,\Delta\ell),Δℓ\Delta\ell 是对数长度差。模型 1、3、5 写得啰嗦,朴素胜率被抬高(模型 1 的真实胜率 0.394,朴素胜率 0.589),与真实质量排名的 Spearman 相关只有 0.429。拟合”胜 ~ σ(βm+γΔℓ)\sigma(\beta_m+\gamma\Delta\ell)“,报告 σ(βm)\sigma(\beta_m)(回答和基线一样长时的胜率):Spearman 升到 0.976,估计出的 γ\gamma = 0.996(真值 1.0)。AlpacaEval 2 的”长度控制胜率”就是这个思路。
  • 长度控制的前提是长度偏好能被一个加性的 γ\gamma 描述;它也会把”真正需要长回答”的收益一起扣掉。

2.3 自我偏好

症状(Lecture 8):评委偏爱自己(或同一家族的模型)生成的回答。

MT-Bench 的观察:和人类的判断相比,GPT-4 当评委时给自己的胜率高了约 10%,Claude-v1 高了约 25%;但它们也会偏爱其他一些模型,GPT-3.5 并不偏爱自己。作者明确说:数据有限、差别不大,不能确定这就是自我偏好;而且做受控实验很难,因为没法在不改变质量的前提下把一个回答改写成另一个模型的风格。

机制上说得通的原因:模型对自己生成的文本困惑度更低,“读起来更顺”;同一家族的模型在相似的偏好数据上训练过,偏爱相同的风格。

对策:

  • Lecture 8 的对策最直接:不要用被评的模型当评委。尤其不要用同一个模型既生成又评判,然后报告”它评自己的结果很好”。
  • 评委团:第 3 组:三家模型 A、B、C 的真实质量 A > C > B,三个评委各给自家加 0.4(logit)。评委 B 认为 B 比 A 好(胜率 0.599,真相相反);三个评委投多数票,A vs B 回到 0.639(真值 0.599),方向正确。来自不同家族的评委偏差方向不同,可以互相抵消。Verga et al.(2024)“用陪审团代替法官”报告,几个较小的、不同家族的评委组成的评委团,比单个大评委更准、偏差更小、也更便宜。

2.4 其他偏差与局限

  • 推理能力有限:§1.2 的数学题:评委会被候选回答里的错误推理带偏。对策是带参考答案、或者让评委先自己作答。
  • 谄媚与权威:回答里写着”根据权威研究……”、语气自信,评委更容易信;这和奖励模型学到的偏见一样(Week 3 Day 2 §2.5)。
  • 格式偏好:更多的 markdown 标题、列表、加粗,看起来”更专业”。§2.5 的风格控制把它和长度一起处理。
  • 被钻空子:一旦评委的分数被用作优化目标(用它做 best-of-n、用它当 RL 的奖励),生成方就会去找评委的漏洞(Week 3 Day 6 §2.4)。评委适合当测量工具,拿它当优化目标要格外小心:这是 Goodhart 定律在评委上的表现(Day 5 §4.5)。

2.5 Chatbot Arena:Elo 与 Bradley-Terry

Chatbot Arena(Zheng et al. 2023 同一篇论文提出):用户在网站上提问,两个匿名的模型同时回答,用户投票选更好的一个(或平局),投完才揭晓是哪两个模型。它是”动态排行榜”的代表(Day 5 §4.5):题目来自真实用户、不断更新,不容易被背题。问题是怎么把成千上万次两两对局变成一个排名。

Elo:国际象棋的评分系统。每局之后

RA←RA+K(SA−EA),EA=11+10(RB−RA)/400.R_A\leftarrow R_A+K(S_A-E_A),\qquad E_A=\frac{1}{1+10^{(R_B-R_A)/400}}.

推导:Elo 就是 Bradley-Terry 的随机梯度上升。令 c=ln⁡10/400c=\ln10/400,则 EA=σ(c(RA−RB))E_A=\sigma\big(c(R_A-R_B)\big),这正是 Bradley-Terry 模型(Week 3 Day 2 §2.2),评分 RR 就是乘了 1/c1/c 的”效用”。一局的对数似然 ℓ=SAlog⁡EA+(1−SA)log⁡(1−EA)\ell=S_A\log E_A+(1-S_A)\log(1-E_A),对 RAR_A 求导:

∂ℓ∂RA=c (SA−EA).\frac{\partial\ell}{\partial R_A}=c\,(S_A-E_A).

所以 Elo 的更新 K(SA−EA)=Kc⋅∂ℓ∂RAK(S_A-E_A)=\frac{K}{c}\cdot\frac{\partial\ell}{\partial R_A}:学习率为 K/cK/c 的随机梯度上升,每局一个样本。第 6 组用数值导数核对了这个等式(0.002878 = 0.002878)。

随机梯度的毛病,Elo 都有:结果依赖样本的顺序;KK(学习率)大时波动大、小时反应慢。第 6 组:10 个模型、2 万场对局,只是换一下对局的顺序,K=32K=32 时各模型评分的标准差约 49 分,K=4K=4 时也有约 17 分,足以改变相邻模型的排名。

Bradley-Terry 的最大似然:用全部对局一次拟合(就是一个逻辑回归:设计矩阵每行在 A 处 +1、B 处 −1,Week 3 Day 2 §2.2)。结果唯一、与顺序无关,还能用 bootstrap(对对局有放回地重抽、重新拟合)给出置信区间。第 6 组:BT 评分与真值的相关 0.9995,前 4 名的评分与区间是 1152 [1141, 1161](真值 1147)、1115 [1104, 1127](1114)……区间重叠的两个模型,排名先后没有意义。Chatbot Arena 因此从在线 Elo 换成了 BT 的最大似然 + 置信区间。

风格控制:用户投票也有偏好:更长的回答、更多的格式(§2.2)。一个模型可以靠”写得长”在排行榜上升。风格控制把风格当作协变量放进 BT:

P(A≻B)=σ(βA−βB+γlen Δ长度+γfmt Δ格式),P(A\succ B)=\sigma\big(\beta_A-\beta_B+\gamma_{len}\,\Delta\text{长度}+\gamma_{fmt}\,\Delta\text{格式}\big),

β\beta 就是”风格相同的情况下”模型的强度。第 7 组:6 个模型,模型 1、3 写得特别长,模型 4 爱用格式;用户偏好长度(0.8)和格式(0.5):

模型真实质量长度朴素 BT 排名风格控制后排名
0+0.6031
1+0.40.912
30.01.024

朴素 BT 把写得长的模型 1、3 排到第 1、2 名,真正最好的模型 0 被挤到第 3;风格控制后排名完全恢复(与真实质量的 Spearman 从 0.600 到 1.000),估计出的风格系数 0.776 / 0.374(真值 0.8 / 0.5)。Chatbot Arena 2024 年推出了这样的”风格控制”视图。它不是说长回答不好,而是把”内容好”和”看起来好”分开报告。


§3 扩展:事实性、智能体的失败模式、RAG 的分项评测

3.1 事实性的量化

问题(Lecture 8):“泰迪熊最早在 1920 年代被制造出来,以西奥多·罗斯福总统命名,因为他在一次狩猎中很自豪地想射杀一只被捕获的熊。“这段话部分对、部分错。该怎么量化这种”部分正确”?

做法(Wei et al. 2024,长文本事实性):

  1. 事实分解:拆成原子事实,每条只包含一个可以单独核实的事实。
  2. 逐条核实:用搜索或资料判断每一条是否有依据。
  3. 汇总:Lecture 8 按每条事实的重要性加权。

第 8 组:

原子事实重要性核实
泰迪熊最早在 1920 年代被制造出来0.3✗(实际是 1902–1903 年)
泰迪熊以西奥多·罗斯福总统命名0.4✓
罗斯福的一次狩猎中有一只熊被捕获0.2✓
罗斯福很自豪地想射杀那只被捕的熊0.1✗(他恰恰拒绝了,这才有了”泰迪熊”的故事)

加权事实性 =∑iwisi∑iwi=0.60=\frac{\sum_i w_i s_i}{\sum_i w_i}=0.60;不加权是 0.50。

SAFE 的 F1@K(同一篇论文):精确率 = 有依据 / (有依据 + 无依据);召回 = min(有依据 / K, 1),K 是”一个理想回答应该包含的事实数”;两者的调和平均是 F1@K。召回项防止模型用”只说一句绝对正确的话”刷高精确率:1 条有依据、0 条无依据时精确率 1.000,但 F1@10 只有 0.182。

忠实度是事实性在 RAG 里的版本:不是”符合世界上的事实”,而是”有检索到的资料作为依据”。参考代码的 faithfulness:先让 LLM 把回答拆成原子陈述,再逐条问”资料是否支持”,被支持的比例就是忠实度。注意它测的是”忠于资料”:资料本身错了,忠实的回答也会错。

3.2 智能体的失败模式

Lecture 8 用 Day 3 的三步(模型预测调用 → 执行 → 根据结果回答)给智能体的失败做了分类。每一类都有症状、可能的原因、对策:

环节失败症状可能的原因对策
① 工具预测不用工具模型直接回答(“抱歉,我不知道哪里有熊”)工具路由出错;模型不会用这个工具重训路由;SFT,或改进这个工具的说明
编造工具调用一个不存在的工具(find_bear())模型太弱;API 命名不合逻辑;顶层指令不清楚换更强的模型;重新设计 API;迭代顶层指令
用错工具调用了另一个可用的工具(给商家 send_message 问有没有熊卖)路由出错;模型选错重训路由;SFT,或改进说明
参数错误位置填成了 (0, 0)参数没法从上下文推出来;模型不会用加一个辅助工具(比如先查用户位置)、确保上下文里有需要的信息;SFT,或改进说明
② 工具调用返回错误工具返回错误的值或抛异常工具本身的问题修工具(有时报错是合理的,但那不是常态)
没有返回工具什么也不返回;常常伴随最终回答是编的bug,或者工具就是这么设计的总要返回点什么,哪怕是空的 JSON;工具的输出要有意义
③ 回答生成回答错误最终回答没有反映工具的结果(工具找到了熊,模型说”没找到”)模型的依据能力(grounding)不足;工具返回的内容撑爆了上下文;返回的内容不好理解换更强的模型来写回答;裁剪后端返回的信息;让工具的输出格式更有描述性

Lecture 8 的总结:问题要么出在建模(推理和依据能力弱、上下文里塞了太多东西、工具的建模方式不对),要么出在工具(工具本身有问题、输出不好理解)。“调试和修复这些问题需要格外的细心和耐心。”

这张表和这一周的代码一一对应:Day 3 的 ToolRegistry.call 对”不存在的工具”给出可用列表、对”没有返回”明确地说”(没有结果)“、截断过长的返回;Day 4 的轨迹(trace)记录了每一步的动作和观察,按这张表给失败的轨迹分类,就知道该修模型、修提示、修路由还是修工具。

3.3 RAG 的分项评测:检索还是生成的锅

学习计划的自测题:“你的 RAG 系统答错了——怎么判断是检索的锅还是生成的锅?”

分解(第 9 组):

P(答对)=P(检索命中)⋅P(答对∣命中)+P(没命中)⋅P(答对∣没命中).P(\text{答对})=P(\text{检索命中})\cdot P(\text{答对}\mid\text{命中})+P(\text{没命中})\cdot P(\text{答对}\mid\text{没命中}).

检索命中率 0.82(我们在讲义上的 hit@5)、命中时答对 0.85、没命中时 0.30:端到端 0.751。错误里 0.126 来自检索没命中、0.123 来自命中了但生成出错。把命中率提高到 0.92 得到 0.806,把命中时的正确率提高到 0.95 得到 0.833。只看端到端的一个数,不知道该修哪里。

常用的分项指标(RAGAS 等工具的那一套,名字各家略有不同):

指标评的是怎么算
上下文召回检索:需要的信息找到了吗参考答案里的每条陈述,是否能在检索到的资料里找到依据(或者直接用 hit@k / Recall@k,Day 2 §3)
上下文精确率检索:找到的资料里有多少是有用的检索到的每一块,对回答这个问题是否有用
忠实度生成:回答是否以资料为依据回答拆成陈述,逐条核实是否被资料支持(§3.1)
答案相关性生成:回答是否切题评委判断,或者”从回答反推问题,和原问题比相似度”
答案正确性端到端:答对了吗带参考答案的评委(§1.2)

诊断的顺序:先看上下文召回。低 → 修检索(Day 1–2)。高但答案正确性低 → 看忠实度:低说明模型没用资料、自己编(修提示、换模型);高说明模型忠实地用了资料但还是答错了(资料不够、或者检索到的是相关但不含答案的块,回到上下文精确率)。


§4 在讲义助手上评一次

先检验评委本身(w4d6_judge.py --bias-demo):造一个已知有偏差的模拟评委(按真实质量 + 位置偏差 + 长度偏好 + 噪声做判断),看诊断工具能不能只从它的输出里把偏差查出来:

植入:位置偏差 / 长度偏好一致率偏向第一个偏向第二个重复列表攻击成功率
0 / 00.6130.1800.2070.220
1.0 / 00.0870.9130.0000.020
0 / 1.50.6530.1530.1931.000
1.0 / 1.50.0970.9030.0000.900

诊断工具只看评委的输出,就准确地区分出了”有位置偏差""有长度偏好""两者都有”。(没有长度偏好时攻击成功率 0.220,接近纯噪声下”交换两次都赢”的 1/4。)在正式用一个评委之前,先给它做这个体检:把 Judge(MockLLM(...)) 换成 Judge(make_llm(...)),用你的题目跑 position_report 和 verbosity_attack。

一个模拟的 Arena(--arena-sim,2 万场对局,用户偏爱长回答):朴素 BT 把写得长的乙、丁排在前面;风格控制后的评分(1099、1062、1018、977、942、901)与真实值(1100、1060、1020、980、940、900)几乎一致;K=32K=32 的 Elo 随对局顺序浮动上百分(丙在 857–1002 之间)。

端到端评测(需要一个 LLM,编写环境没有,所以这里没有数字,请你跑出来):

python code/w4d4_react_agent.py --eval --backend openai --model qwen2.5:7b          # Day 4:智能体回答 50 道黄金题
python code/w4d6_judge.py --judge-answers logs/w4d4_answers_text.jsonl --backend openai --model qwen2.5:14b

第二条命令用”带参考答案”的评委给每个回答判对错,报告正确率与 Wilson 区间,并按”回答引用的出处是否命中答案小节”做交叉表:引用命中却判错的,多半是生成的问题;引用没命中又判错的,多半是检索的问题(§3.3)。评委最好比被评的模型更强、而且不是同一家族(§2.3)。然后抽 20 道自己判,跑 --calibrate,看评委可不可信(§1.5)。


§5 第 4 周整合

5.1 全景图:从”知道”到”做到”

天要回答的问题本周的工具用什么判断
Day 1模型不知道的知识怎么给它切块、嵌入、双塔、InfoNCE、IVF / HNSW / PQ、提示拼接hit@k、上下文字数
Day 2检索怎么更准BM25、RRF、交叉编码器重排、HyDE、上下文检索、父子块Recall@k、MRR、NDCG
Day 3模型怎么做它本来做不了的事JSON Schema、三步循环、Toolformer、约束解码、路由、MCP调用成功率、token 成本
Day 4多步任务怎么交给模型自己完成ReAct、检查与重试、护栏、记忆、多智能体、A2A成功率、pass^k、停止原因
Day 5一个分数有多可信κ、标准误、配对检验、胜者的诅咒、基准与污染、BLEU / ROUGE置信区间、统计功效
Day 6开放式的回答怎么评三种评委、交换顺序、长度控制、评委团、BT 与风格控制、事实分解、失败模式与人的一致率、κ

每一行你都应该能说出”为什么这么做、不这么做会怎样、用哪个数字来判断”。

5.2 贯穿一周的四条主线

上下文是接口。 这一周的所有技术都在决定”上下文里放什么”:RAG 放检索到的块(Day 1 §5),工具调用放函数的返回(Day 3 §2.2),智能体放它的整个历史(Day 4 §5),评委放被评的回答和标准(今天 §1.1)。上下文有两笔账要算:成本(按 token 计费、多轮调用平方增长,Day 1 §1.1、Day 3 §2.3、Day 4 §5.1)和注意力(迷失在中间、无关信息的干扰、工具说明太多选不准)。少而精永远比多而全好:面包屑、重排、工具路由、裁剪工具输出、记忆压缩,都是在”让上下文里的每个 token 更有用”。

两阶段:先广后精。 稠密 + 稀疏召回、交叉编码器精排(Day 2 §4);工具路由先挑候选、模型再选(Day 3 §4.2);向量压缩粗排、原向量精排(Day 1 §4.4);智能体的计划与执行(Day 4 §6.3)。第一阶段的召回是第二阶段的上限:路由漏掉的工具、第一阶段没召回的文档,后面再精也救不回来。

可验证性决定可靠性。 每步 95% 正确、20 步后只剩 36%,但如果错误能被发现,重试一次就回到 87%(Day 4 §3.2)。工具要明确地报错(Day 3 §2.4),智能体要能读懂错误(Day 4 §2.3),评委要先写理由再给分(今天 §1.4)。检查器本身也会被钻空子:评委偏爱长回答(今天 §2.2),它和第 3 周的奖励模型、验证器是同一个问题(Week 3 Day 6 §5.2 的”代理与 Goodhart”)。

测量先于优化。 这一周最常出现的一句话是”在误差范围内,分不出来”:ICT 的三个种子(Day 1 §3.4)、混合检索(Day 2 §6)、块大小的扫描(Day 1 §2.2)。它们背后是 Day 5 的统计:50 道题的标准误约 0.06(Day 5 §3.1),配对比较更有功效(Day 5 §3.2),在测试集上挑最好的会系统性地偏高(Day 5 §3.3)。没有一个带误差棒的数字,任何”改进”都只是一个故事。

5.3 Week 4 出关测试(2.5h,闭卷)

理论(90 分钟,纸笔)

  1. RAG 解决了 LLM 的哪几个局限?模型有 1M 的上下文,为什么还需要 RAG?什么时候用微调而不是 RAG?
  2. 推出”整篇嵌入的稀释” 1/m1/\sqrt m 和”重叠多少才不会切断答案”。块的大小怎么选?
  3. 写出 in-batch 负例的 InfoNCE 损失和它对查询向量的梯度。温度和 batch 大小各起什么作用?
  4. 从二元独立模型推出 BM25 的 IDF;写出完整的 BM25,解释 k1k_1、bb 和”饱和”。稀疏与稠密各在什么查询上赢?
  5. 写出 RRF。为什么分数不能直接相加?RRF 的 kk 什么时候重要?手算一个排序的 P@5、R@5、MRR、NDCG@5。
  6. 为什么交叉编码器不能做第一阶段检索?两阶段检索里候选数怎么选?HyDE、上下文检索各修的是哪一类故障?
  7. 写出一次完整的工具调用(含并行调用和出错重试)的消息序列。谁执行函数?多轮调用的 token 成本怎么算?
  8. 推出 Toolformer 的过滤准则。用一个例子说明约束解码为什么会扭曲分布。MCP 标准化的是哪一段?
  9. ReAct 为什么要把推理和行动交替?推出”检查器召回 rr、重试 mm 次”时的每步成功率。pass@k 与 pass^k 的区别和无偏估计?
  10. 推出 Cohen’s κ,解释 κ 悖论。50 道题、准确率 0.8 的标准误是多少?为什么要配对比较?什么是胜者的诅咒?
  11. BLEU 的三个设计各防什么?为什么它和 ROUGE 在开放式生成上失效?怎么设计一个防污染的内部基准?
  12. LLM 当评委的三种形式和六条最佳实践。位置、冗长、自我偏好三种偏差的症状、机制和对策。推出 Elo 是对 Bradley-Terry 的随机梯度上升,说明风格控制在做什么。

实战(60 分钟)

  1. 不看资料写出一个”按标题切小节、小节内按长度切块、带面包屑”的切块函数,和一个 numpy 的精确检索(argpartition + 排序)。
  2. 写出 BM25(倒排索引版)和 RRF,通过 w4day2_checks.py 第 1 组的手算例子。
  3. 写出一个 ReAct 循环:文本格式的解析(在”观察:“处截断)、工具执行与错误返回、最大步数与重复检测。
  4. 写出 Cohen’s κ、McNemar 精确检验、Bradley-Terry 的最大似然(牛顿法或梯度法),在一个模拟数据上恢复真实评分。

通过线:理论 12 题至少 10 题讲清推导过程和动机,实战 4 项全部通过。达不到的项回到对应的 Day 重读。

5.4 进入第 5 周之前

  • 把这一周的产出整理成一个能跑的项目:一个讲义问答助手(检索 + 工具 + ReAct),一份 50 题的黄金集,一套评测(检索指标、带参考答案的评委、配对检验)。每一个改动配一张带误差棒的表。学习计划第 4 周的主项目要求的就是这个。
  • 至少跑一次真模型:--eval 和 --judge-answers。模拟 LLM 只能验证管道,不能告诉你系统有多好。
  • 把你的数字发回来:--eval --embed st、--eval --dense st、--rerank、--hyde、智能体的 --eval、评委的 --judge-answers 和 --calibrate,讲义里标注了”请你跑出来”的地方会据此更新。
  • 第 5 周:Lecture 9 的前沿趋势(视觉 Transformer、扩散语言模型……)、期末考试(考 Lecture 5–8,也就是第 3、4 周)、全课复习与面试冲刺、Capstone。期末卷的第三、四部分就是这一周的内容:先把 §5.3 的出关测试做完。

§A LLM 评委:API 用法与边界

A.1 结构化输出

  • 能用就用:OpenAI 的结构化输出(response_format / text_format 传一个 Pydantic 类)、Gemini 的 response_schema、Anthropic 的工具调用强制输出(把”提交评分”定义成一个工具,tool_choice 指定它)等。输出一定能解析,分数一定在允许的范围内。
  • 理由字段放在分数字段前面:结构化输出按字段顺序生成,rationale 在前,模型才是”先想后判”(§1.4)。
  • 不能用时:像参考代码的 parse_verdict 那样稳健地解析,并统计解析失败率。

A.2 让评委可复现

  • 固定评委模型的版本:API 背后的模型会更新,同一个名字几个月后可能是另一个模型,你的历史分数就不可比了。记录完整的模型标识和日期。
  • 固定提示:评委提示也是评测的一部分,改一个字都可能改变分数。把它和评测结果一起版本化。
  • 温度 0、跑两次(§1.4)。

A.3 成本

  • 成对比较要交换顺序:调用次数 ×2;nn 个系统两两比较:×n(n−1)/2n(n-1)/2。系统多时,改成”每个系统都和一个固定的基线比”(AlpacaEval 的做法),或者 Arena 式的随机配对 + BT。
  • 评委的提示很长(标准、参考答案、两个回答、少样本示例):提示缓存能省下固定的部分。
  • 大规模评测前,先在 50 道题上校准评委(§1.5):一个和人一致率不高的评委,跑一万道题也没有意义。

A.4 现成的工具

MT-Bench 的评委提示与代码(FastChat 仓库)、AlpacaEval、RAGAS、以及各家的评测平台,都把本节的做法封装好了。用之前确认三件事:它的评委提示是什么(标准写得清楚吗?先写理由吗?)、它怎么处理位置偏差(交换了吗?)、它的分数和人比过吗。


§B 实操

  1. 跑通 w4day6_checks.py,9 组结论都看懂。第 1 组看”随机顺序”和”保守规则”各适合什么场景;第 6 组把 KK 改成 1、100,看 Elo 的波动和收敛速度。
  2. 推导(1h,纸笔):(a) Elo 更新 = BT 对数似然的随机梯度;(b) 为什么噪声小的评委和人的一致率可以高于人和人(第 4 组);(c) 长度控制的逻辑回归:写出设计矩阵,说明 σ(βm)\sigma(\beta_m) 的含义。
  3. 给评委做体检(1h):python code/w4d6_judge.py --bias-demo、--arena-sim。然后用一个真模型当评委,在 30 对回答上跑 position_report 和 verbosity_attack:它有多大的位置偏差?会被重复列表骗吗?
  4. 端到端评测(1.5h,需要 LLM):按 §4 的两条命令,得到智能体在黄金集上的正确率与区间、按检索命中的交叉表;再跑 --faithfulness --n 10。抽 20 道自己判,--calibrate。
  5. 做 §5.3 的出关测试(2.5h)。
  6. 读论文:Zheng et al.(2023)“Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena”的第 3–4 节;挑读 Wei et al.(2024)长文本事实性(SAFE)的方法部分。

参考实现:code/w4d6_judge.py。


出关标准

  • 能写出一个好的评委提示,说清三种形式的取舍和六条最佳实践的理由
  • 能解释评委和人的一致率为什么可以高于人和人,并在自己的任务上校准评委
  • 能说出位置、冗长、自我偏好三种偏差的症状、机制、对策,并能用数据查出来
  • 能推出 Elo 是对 Bradley-Terry 的随机梯度上升,说清 BT + bootstrap 和风格控制
  • 能用事实分解量化事实性,按 Lecture 8 的表给智能体的失败分类,把 RAG 的错误拆到检索和生成
  • 跑通 --bias-demo 和 --arena-sim;有模型的话跑通 --judge-answers 和 --calibrate
  • 通过 §5.3 的 Week 4 出关测试

疑问清单

← 返回课程目录