第 29 章
第 6 周:Judge 说 53% 的报告有效,真实是多少?
Judge 校准:用人工标注量出 Judge 的混淆矩阵、TPR / TNR 和 Cohen's κ,看清 κ 为什么会随有效率变;按漏判和误杀的代价定阈值;用 Rogan-Gladen 公式把 Judge 通过率校正成真实通过率,delta 法和 bootstrap 两种区间、覆盖率模拟,以及算出负数时的截断。全部用合成数据在本地跑。一段讲解视频,三个互动演示。
BugHunt-Bench 里,测试 Agent 每次运行会提交一批 Bug 报告。人工逐条看太贵,就让 LLM Judge 读报告和注入 Bug 清单,判 PASS(有效报告)或 FAIL(误报)。新版 Agent 提交了 1000 条,Judge 判了 530 条 PASS。有效率是 53% 吗?不一定:Judge 自己会把误报放过,也会把有效报告打掉,两种错只有刚好一样多时才会抵消。这一章把 Judge 当成一台有误差的测量仪器:先用人工标注量出它错多少,再按两种错各自的代价定阈值,最后把 53% 校正回真实有效率,并给出诚实的区间。
上一讲「Bug 报告写得好不好,打 1~5 分还是判 pass / fail?」讲两个人工标注者之间的一致性,这一讲拿人工标注当真值来校准 Judge。本章数据都是合成数据:标注集的四格计数是设定的,新版本的 1000 条报告用固定种子模拟,所以真实有效率是已知的(45.0%),可以检验校正到底对不对。
讲解视频
互动演示
三个演示:改混淆矩阵的四个格子,实时算 TPR、TNR、κ,再拖动真实有效率看 κ 怎么变;用这个混淆矩阵做 Rogan-Gladen 校正,拖动 Judge 通过率和未标注条数,对比不校正、delta 法和两种 bootstrap 的区间,预设里有截断、样本少、Judge 接近随机等情况;在双正态模型上拖阈值、改成本比,看期望成本和最优阈值。页面底部有自动判分的练习。
混淆矩阵:四个格子,两种错
人工标了 200 条报告(120 条有效、80 条误报),同一批也让 Judge 判一遍:
| Judge 判 PASS | Judge 判 FAIL | 合计 | |
|---|---|---|---|
| 人工 PASS(有效) | TP = 108 | FN = 12(误杀) | 120 |
| 人工 FAIL(误报) | FP = 16(漏判) | TN = 64 | 80 |
| 合计 | 124 | 76 | 200 |
约定 PASS 为正类,和 judgy 等工具一致。本章的两个中文词:
- 漏判:误报被 Judge 放过(FP)。漏判率 = FP / (FP + TN) = 1 − TNR = 16 / 80 = 20%。
- 误杀:有效报告被 Judge 打掉(FN)。误杀率 = FN / (TP + FN) = 1 − TPR = 12 / 120 = 10%。
注意:英文里的 miss rate 通常指 FNR = 1 − TPR(本章的误杀率),和本章的"漏判"方向相反;代码里因此用 false_pass_rate / false_fail_rate 命名。
和「什么时候不该用 Agent?」里评估者–优化者的用法一致:漏判是坏稿子被放行,误杀是好稿子被打回。
| 指标 | 算式 | 值 | 回答的问题 |
|---|---|---|---|
| 准确率 | (TP + TN) / n | 172 / 200 = 86.0% | 整体判对多少,两种错混在一起 |
| TPR(灵敏度) | TP / (TP + FN) | 108 / 120 = 90.0% | 真有效的报告,Judge 认出多少 |
| TNR(特异度) | TN / (TN + FP) | 64 / 80 = 80.0% | 真误报,Judge 拦下多少 |
| Youden J | TPR + TNR − 1 | 0.700 | 比瞎猜强多少;0 表示和随机一样 |
校正要用 TPR、TNR,不能用准确率。TPR 和 TNR 都是"人工标签给定时" Judge 判对的概率,只要 Judge 在每一类样本上的表现不变,它们就不随这批数据里有效报告的占比变化。准确率是两者按占比加权:
$$ \text{准确率} = \pi\cdot\text{TPR} + (1-\pi)\cdot\text{TNR} $$换一个 Agent 版本,有效率 \(\pi\) 变了,准确率就跟着变。
Cohen’s κ:扣掉"碰巧一致"
κ 出自 Cohen(1960, A coefficient of agreement for nominal scales, Educational and Psychological Measurement 20(1):37–46),衡量两个评判者的一致程度,扣掉随机也会有的那部分:
$$ \kappa = \frac{p_o - p_e}{1 - p_e},\qquad p_e = \pi_H\,\pi_J + (1-\pi_H)(1-\pi_J) $$\(p_o\) 是实际一致的比例;\(p_e\) 是两边按各自的 PASS 比例(人工 \(\pi_H\)、Judge \(\pi_J\))独立乱判时的期望一致率,也就是上一讲「Bug 报告写得好不好,打 1~5 分还是判 pass / fail?」里的"随机期望一致率"。上面的例子:
| 量 | 算式 | 值 |
|---|---|---|
| \(p_o\) | (108 + 64) / 200 | 0.8600 |
| \(p_e\) | 0.60 × 0.62 + 0.40 × 0.38 | 0.5240 |
| κ | (0.86 − 0.524) / (1 − 0.524) | 0.7059 |
自己写的实现和 scikit-learn 1.1.1 的
cohen_kappa_score
一致(0.7059),单元测试里另外用 50 组随机数据逐个对照。
κ 会随有效率变
同一个 Judge(TPR 90%、TNR 80% 不变),只改真实有效率:
| 真实有效率 | 准确率 | κ |
|---|---|---|
| 30% | 83.0% | 0.634 |
| 60% | 86.0% | 0.706 |
| 90% | 89.0% | 0.534 |
| 97% | 89.7% | 0.283 |
有效率往 PASS 一侧偏(90%、97%)时,准确率越来越高,κ 却越来越低;往另一侧偏(30%),两者都降。准确率总是朝 TPR、TNR 里占多数那一类的值靠,κ 则在两端都会被"碰巧一致"压低。极端情况:真实有效率 95%,Judge 永远判 PASS,准确率 95%,κ = 0,TNR = 0,一条误报都拦不住。Feinstein 和 Cicchetti(1990, High agreement but low kappa: I. The problems of two paradoxes, J Clin Epidemiol 43(6):543–549)专门讨论过这类悖论;续篇(Cicchetti & Feinstein, 1990, II. Resolving the paradoxes, 同卷 551–558)建议 κ 要和正、负两类各自的一致率一起报。
所以 κ 适合回答"这个 Judge 比瞎猜强多少",适合在同一批标注数据上比较两个 Judge 版本。做校正、定阈值、算门禁代价,用 TPR 和 TNR。跨数据集比较 κ(“上个月 0.7,这个月 0.5,Judge 变差了”)之前,先看有效率变没变。
漏判和误杀,哪个更贵?
两种错的代价取决于 Judge 用在哪:
| 用途 | 漏判(误报被放过) | 误杀(有效报告被打掉) |
|---|---|---|
| 离线评测,算 Agent 的有效率 | 有效率虚高 | 有效率虚低 |
| 线上自动关闭"无效"报告 | 开发多看一条误报 | 一个真 Bug 被扔掉,往往贵得多 |
| 自动给开发提单 | 开发被误报打扰,信任流失 | 少提一个单,还有人工兜底 |
设真实有效率为 \(\pi\),漏判一次成本 \(c_\text{miss}\),误杀一次成本 \(c_\text{kill}\)。每条报告的期望成本:
$$ \text{Cost} = (1-\pi)(1-\text{TNR})\,c_\text{miss} + \pi(1-\text{TPR})\,c_\text{kill} $$Judge 如果输出一个分数,或者 prompt 可以调松调紧,阈值往上调,TNR 升、TPR 降,反之亦然。下面用双正态模型算:有效报告的分数 ~ N(d′, 1),误报 ~ N(0, 1),d′ = 2.123,此时阈值 0.84 正好对应 TPR 90%、TNR 80%;\(\pi\) = 45%。成本以较便宜的那种错为 1 个单位:
| 成本比 cmiss : ckill | 最优阈值 | TPR | TNR | 每千条成本 | 阈值 0.84 时 |
|---|---|---|---|---|---|
| 1 : 1 | 1.156 | 83.3% | 87.6% | 143.1 | 155.0 |
| 1 : 10(误杀贵) | 0.072 | 98.0% | 52.9% | 349.8 | 560.0 |
| 5 : 1(漏判贵) | 1.914 | 58.3% | 97.2% | 264.2 | 595.0 |
等方差双正态时,对成本求导令其为 0,最优阈值有解析解(代码里用网格搜索核对过):
$$ t^* = \frac{d'}{2} + \frac{1}{d'}\ln\frac{(1-\pi)\,c_\text{miss}}{\pi\,c_\text{kill}} $$同一个 Judge,换个用途,阈值就要换。还有一个推论:把成本式展开,最大化 Youden J(即 TPR + TNR)等价于最小化成本,只在 \(\pi\,c_\text{kill} = (1-\pi)\,c_\text{miss}\) 时成立。“选 J 最大的阈值"默认了这个条件。
第 3 周「Agent 要执行 rm -rf,谁来拦?」讲过 Codex 的 Guardian 子 agent 替人审批,它就是一个做门禁的 Judge:放过危险命令是漏判,拦下正常命令是误杀。两者的代价显然不对等。
Rogan-Gladen:从 Judge 通过率反推真实通过率
设真实有效率为 \(\theta\)。Judge 判 PASS 的报告来自两部分:有效报告被认出来,加上误报被漏判:
$$ p_\text{obs} = \text{TPR}\cdot\theta + (1-\text{TNR})(1-\theta) $$这是 \(\theta\) 的一次函数,反解:
$$ \hat\theta = \frac{p_\text{obs} + \text{TNR} - 1}{\text{TPR} + \text{TNR} - 1} $$这是流行病学里用筛查结果估计患病率的 Rogan-Gladen 估计量(Rogan & Gladen, 1978, Estimating prevalence from the results of a screening test,
American Journal of Epidemiology 107(1):71–76
)。原文全文在付费墙后,我没读到;摘要说筛查阳性比例直接当患病率是糟糕的估计,并给出调整。上面的公式和 Chen et al. 2026(
arXiv 2601.05420
)第 2.2 节式 (6)、judgy 库
core.py 第 117 行
一致。分母就是 Youden J(Youden, 1950, Index for rating diagnostic tests, Cancer 3(1):32–35),必须 > 0,否则 Judge 不比随机好,judgy 直接抛错。
新版本 1000 条:Judge 判 PASS 530 条,\(p_\text{obs}\) = 53.0%。
$$ \hat\theta = \frac{0.530 + 0.800 - 1}{0.700} = 47.1\% $$合成数据里真实有效率是 45.0%。不校正的 53.0% 偏高 8 个点。其中约 6.5 个点是系统误差:真实有效率 45% 时,Judge 通过率的期望是 0.9 × 0.45 + 0.2 × 0.55 = 51.5%,因为漏判率(20%)高于误杀率(10%),误报又占了一半多;剩下约 1.5 个点是这 1000 条的抽样波动。直接对 53.0% 套「30 次挂了 2 次,失败率在什么范围?」里的 Wilson 区间,得到 [49.9%, 56.1%],连 45% 都罩不住:Wilson 只管抽样误差,管不了 Judge 的系统误差。
公式成立的前提:
- TPR、TNR 能从标注集迁移到新数据。标注集里每一类样本要能代表新数据里同一类样本。类别占比可以不同(这正是校正要处理的),但类内的难度分布不能变。新版 Agent 的误报换了一种写法、Judge 认不出来,TNR 就变了。
- Judge 的模型、prompt、阈值和标注时完全一样。换了任何一样,都要在同一批标注数据上重新量。
- 人工标签当真值。上一讲的标注一致性如果不高,这一条本身就站不住。
区间:误差有三个来源
\(\hat\theta\) 里有三个估出来的量,各带抽样误差:\(p_\text{obs}\) 来自 n 条未标注报告;TPR 来自标注集里 \(m_1\) = 120 条有效报告;TNR 来自 \(m_0\) = 80 条误报。三者来自互不重叠的样本,相互独立。
delta 法
对 \(\hat\theta\) 求偏导:\(\partial\theta/\partial p = 1/J\),\(\partial\theta/\partial\text{TPR} = -\theta/J\),\(\partial\theta/\partial\text{TNR} = (1-\theta)/J\)。一阶近似:
$$ \operatorname{Var}(\hat\theta) \approx \frac{1}{J^2}\left[\frac{p(1-p)}{n} + \theta^2\frac{\text{TPR}(1-\text{TPR})}{m_1} + (1-\theta)^2\frac{\text{TNR}(1-\text{TNR})}{m_0}\right] $$单元测试用数值梯度核对过这个式子。Chen et al. 2026 的 Proposition 1 给出了同一估计量的渐近方差,同样由这三部分组成;它假设标注集按总体比例抽样(\(m_1 \approx \theta m\)),本章直接用实际的 \(m_1\)、\(m_0\),适用于标注集类别占比和总体不同的情况。
例子里三项分别占方差的 26%、17%、57%,95% 区间是 [38.4%, 55.9%],宽度差不多是 Wilson 的 3 倍,这才是诚实的宽度。方差的大头来自 TNR,三个原因叠在一起:误报只标了 80 条(有效报告 120 条);TNR(1 − TNR) = 0.16 大于 TPR(1 − TPR) = 0.09;\((1-\theta)^2\) 的权重是 \(\theta^2\) 的约 1.26 倍。按每多一条样本算,多跑未标注报告的边际收益最小(但它不用人工,便宜):未标注从 1000 翻到 2000,方差约降 13%;有效报告的标注从 120 翻到 240,只降约 8.5%。本例最划算的是扩大随机标注量,让误报那一类变多,或者按错误分析找到的误报类别分层抽样。注意:标注前不知道哪些是误报,如果按 Judge 的判定去多抽"Judge 判 FAIL"的样本,就是按 Judge 输出分层,算 TPR、TNR 时要按各层的抽样率加权,否则有偏。
bootstrap
不想推公式就用 bootstrap,重抽的原则见第 1 周「新 prompt 从 82% 涨到 86%,是真的变好了吗?」:标注集整体重抽一次,算 TPR、TNR;未标注集也重抽一次,算 \(p_\text{obs}\);代入公式,截断到 [0, 1];重复 2 万次,取 2.5 和 97.5 百分位。两边都重抽得到 [37.6%, 55.4%]。
judgy(ai-evals-course/judgy,commit e6cd4fe)的 bootstrap 在
core.py 第 120–153 行
:只重抽标注集,\(p_\text{obs}\) 当常数;J ≤ 0 的重抽样本丢弃,每个估计截断到 [0, 1]。同一份数据它给出 [38.7%, 54.2%](我按同样做法实现的版本是 [38.6%, 54.2%],差别来自随机数)。未标注 1000 条时覆盖率约 90%(名义 95%),100 条时只有 64%:未标注集越小,偏窄越严重。重复 2000 次的模拟(真实有效率 45%,标注 120 + 80 条),95% 区间罩住真实有效率的比例:
| 未标注条数 | 直接 Wilson | delta 法 | bootstrap(两边重抽) | bootstrap(只重抽标注集) |
|---|---|---|---|---|
| 1000 | 1.1% | 95.0% | 93.8% | 89.7% |
| 100 | 71.9% | 94.6% | 94.0% | 64.1% |
2000 次模拟的蒙特卡洛误差在覆盖率 95% 附近约 ±1 个百分点,在 64% 附近约 ±2.1 个百分点。用 judgy 时,未标注样本少就要自己把 \(p_\text{obs}\) 的误差补上。
截断:算出负数怎么办
\(\hat\theta\) 落在 [0, 1] 的条件是 \(1-\text{TNR} \le p_\text{obs} \le \text{TPR}\)。\(p_\text{obs}\) 比漏判率还低,也就是 Judge 判的 PASS 比"全是误报时漏判出来的"还少,就会算出负数;比 TPR 还高,就会超过 1。真实有效率接近 0 或 1 时,光是抽样波动就能把 \(p_\text{obs}\) 推出这个范围。
例:某个坏掉的版本,200 条报告 Judge 只判了 30 条 PASS,\(p_\text{obs}\) = 15%,低于漏判率 20%:
$$ \hat\theta = \frac{0.15 + 0.8 - 1}{0.7} = -7.1\% \;\to\; 0 $$delta 区间截断后是 [0.0%, 8.0%],两边重抽的 bootstrap 是 [0.0%, 6.3%]。
截断有代价:它把所有负的估计都抬到 0,均值就偏高了。模拟 2000 次(未标注 200 条):
| 真实有效率 | 点估计 < 0 的比例 | 未截断的均值 | 截断后的均值 |
|---|---|---|---|
| 2% | 39.2% | 1.4% | 3.9% |
| 10% | 9.0% | 9.9% | 10.3% |
怎么报:对外报截断后的点估计加区间上界(“有效率不超过 8%"),日志里留未截断的原值,汇总时偏差小得多(未截断的估计因为分母 J 是估出来的,还有约 Var(TNR)/J² 量级的小偏差,本例不到 1 个点)。经常截断要当成信号:要么真实有效率确实接近 0,要么 Judge 的 TNR 在新数据上已经变了,该重新标一批。
动手实验
代码在学习目录的 week06_Judge与错误分析/code/judge_calibration/,只依赖 numpy:calibration.py 是混淆矩阵、κ、Rogan-Gladen、delta 法、两种 bootstrap、成本和阈值;synthetic.py 生成合成数据;run_experiment.py 打印本章所有数字;test_calibration.py 是 14 个单元测试。核心两个函数:
from math import sqrt
def rogan_gladen(p_obs, tpr, tnr, clip=True):
j = tpr + tnr - 1
if j <= 0:
raise ValueError(f"TPR + TNR - 1 = {j:.3f} <= 0:Judge 不比随机好,不能校正")
theta = (p_obs + tnr - 1) / j
return min(max(theta, 0.0), 1.0) if clip else theta
def rg_delta_ci(p_obs, n, m_pass, m_fail, tpr, tnr, z=1.959964):
"""n:未标注条数;m_pass / m_fail:标注集里人工 PASS / FAIL 的条数。端点截断到 [0, 1]。"""
j = tpr + tnr - 1
theta = (p_obs + tnr - 1) / j
var = (p_obs * (1 - p_obs) / n
+ theta ** 2 * tpr * (1 - tpr) / m_pass
+ (1 - theta) ** 2 * tnr * (1 - tnr) / m_fail) / j ** 2
half = z * sqrt(var)
return theta, max(theta - half, 0.0), min(theta + half, 1.0)
print(rogan_gladen(0.53, 0.9, 0.8))
print(rg_delta_ci(0.53, 1000, 120, 80, 0.9, 0.8))
print(rg_delta_ci(0.15, 200, 120, 80, 0.9, 0.8))
输出:
0.4714285714285714
(0.4714285714285714, 0.3840199715683019, 0.5588371712888409)
(-0.07142857142857131, 0.0, 0.08031843539936609)
python3 run_experiment.py(Python 3.9、numpy 1.22、scikit-learn 1.1.1,约 10 秒)的完整输出:
== 1. 标注集(200 条)上的混淆矩阵
TP=108 FN=12 FP=16 TN=64
准确率 86.0% TPR 90.0% TNR 80.0% 漏判率 20.0% 误杀率 10.0% J=0.700
人工 PASS 率 60.0% Judge PASS 率 62.0%
p_o=0.8600 p_e=0.5240 kappa=0.7059
sklearn 1.1.1 cohen_kappa_score = 0.7059
== 2. 同一个 Judge(TPR 90%、TNR 80%),换真实 PASS 率
PASS 率 60.0%: 准确率 86.0% kappa 0.706
PASS 率 30.0%: 准确率 83.0% kappa 0.634
PASS 率 90.0%: 准确率 89.0% kappa 0.534
PASS 率 97.0%: 准确率 89.7% kappa 0.283
永远判 PASS、真实 PASS 率 95%:准确率 95.0% kappa 0.000 TNR 0.0%
== 3. 漏判和误杀的成本(双正态模型,d' = 2.1232,真实 PASS 率 45%)
等价 漏判:误杀=1:1 最优阈值 +1.156 TPR 83.3% TNR 87.6% 每千条成本 143.1(默认阈值 155.0)
误杀贵 10 倍 漏判:误杀=1:10 最优阈值 +0.072 TPR 98.0% TNR 52.9% 每千条成本 349.8(默认阈值 560.0)
漏判贵 5 倍 漏判:误杀=5:1 最优阈值 +1.914 TPR 58.3% TNR 97.2% 每千条成本 264.2(默认阈值 595.0)
== 4. 新版本 1000 条报告:真实有效率 45.0%(合成数据才知道)
Judge PASS 530 条,p_obs = 53.0%;直接用 Wilson:[49.9%, 56.1%]
Rogan-Gladen:(0.530 + 0.800 - 1) / 0.700 = 47.1%
delta 法 95%:[38.4%, 55.9%]
bootstrap(两边都重抽,20000 个有效样本):[37.6%, 55.4%]
bootstrap(只重抽标注集,judgy 做法):[38.6%, 54.2%]
方差三项占比:p_obs 26% TPR 17% TNR 57%
== 5. 区间覆盖率(2000 次重复,标注集 120 PASS + 80 FAIL,真实有效率 45.0%)
未标注 1000 条:wilson 1.1% delta 95.0% boot_full 93.8% boot_judgy 89.7%
未标注 100 条:wilson 71.9% delta 94.6% boot_full 94.0% boot_judgy 64.1%
== 6. 截断到 [0, 1]
p_obs = 15%(低于漏判率 20%)、未标注 200 条:未截断 -7.1% -> 截断 0.0%;delta [0.0%, 8.0%],bootstrap [0.0%, 6.3%]
真实有效率 2.0%:39.2% 的点估计 < 0;未截断均值 1.4%,截断后均值 3.9%
真实有效率 10.0%:9.0% 的点估计 < 0;未截断均值 9.9%,截断后均值 10.3%
python3 -m unittest -v test_calibration.py 的 14 个测试全部通过。另外把 judgy 源码(commit e6cd4fe)放进 sys.path,在同一份数据上调 estimate_success_rate:点估计 0.4714,和上面一致;区间 [38.7%, 54.2%]。
测开视角:Judge 也要有回归测试
- 标注集是 Judge 的测试集。两类都要够:本例 TNR 那一项占了方差的 57%,要扩大随机标注量让误报变多(或按误报类别分层抽样;按 Judge 判定分层要加权)。两类各只有几十条时,TPR、TNR 自己的 Wilson 区间就很宽。
- Judge 的版本当代码管。模型、prompt、阈值任何一项变了,在同一批标注数据上重跑,TPR、TNR 掉了就不许上线。两个 Judge 版本在同一批数据上的对比是配对数据,用第 1 周的 McNemar 检验。
- 报指标时带上 Judge。“有效率 47.1%,95% 区间 [38.4%, 55.9%],Judge TPR 90%、TNR 80%(标注 200 条)",比"Judge 说 53%“多了能被追问的东西。
- 截断和 J 都是报警信号。J 接近 0 时分母放大误差,例如 J = 0.1 会放大 10 倍,这时先改 Judge,不要硬校正。
本章没有实测的方向:用少量人工标注加大量 Judge 判定做无偏估计的 prediction-powered inference 一类方法,Chen et al. 2026 比较了它和 Rogan-Gladen 的渐近方差,这里只做指引。
常见错误说法
- “Judge 判了 53% PASS,所以有效率 53%”:Judge 的漏判和误杀不一定抵消。本例漏判率 20%、误杀率 10%,真实是 45%。
- “Judge 准确率 86%,够用了”:准确率把两种错混在一起,还会随有效率变。校正和定阈值要看 TPR、TNR。
- “κ 从 0.7 掉到 0.5,Judge 变差了”:TPR、TNR 不变,只要有效率变偏,κ 也会掉。跨数据集比较 κ 要先看有效率。
- “阈值就用 0.5” / “选 Youden J 最大的阈值”:最优阈值取决于有效率和漏判、误杀的成本比;J 最大只在 \(\pi\,c_\text{kill} = (1-\pi)\,c_\text{miss}\) 时才是成本最小。
- “对 Judge 通过率算个 Wilson 区间就行”:Wilson 只管抽样误差,本例的 [49.9%, 56.1%] 罩不住真实的 45%。
- “校正后的区间只要重抽标注集”:未标注样本少时,\(p_\text{obs}\) 的误差占大头,只重抽标注集的区间在本章模拟里只有 64.1% 的覆盖率。
- “公式算出负数,说明公式错了,改报原始通过率”:报截断后的 0 和区间上界,日志留原值,再检查 Judge 的 TNR 在新数据上是否还成立。
下一章:Judge 的偏差。位置偏差、冗长偏差(长度偏差)、偏爱自己的输出,以及交换顺序、长度控制、评审团各治哪一种,为什么多数票治不了偏差。