你所在的小区有个乒乓球俱乐部,每周举办“全民擂台赛”。新会员入门时统一从 1500 分起步,每打完一局,记分员就拿出小本本:如果强手赢了弱手,强手只加一两分;可要是新手爆冷掀翻高手,新手能一口气涨二三十分。大家都心服口服,因为这套“赢了加分、输了减分、分差决定加减多少”的规则,恰好是一个叫 Elo 的评分系统。 当把擂台上的乒乓球选手换成大语言模型,把“比赛”换成“匿名对决”——让两个模型回答同一个问题,由真实用户投票谁答得更好——你就得到了 LMArena 这类“大模型竞技场”的排行榜。全球顶尖大模型正是靠着 Elo 分数在这个榜单上明争暗斗。这套算法从国际象棋赛场一路走进 AI 评测体系,是理解“模型排行榜如何诞生”的第一块敲门砖。

岗位关联

掌握 Elo 评分系统,你就能看懂大模型排行榜背后的数据逻辑,并为自己的模型设计科学的评测与迭代指标——这是每一位 AI 评测工程师的核心技能。

目录
  1. 可视化演示
  2. 评分起源
  3. 核心公式
  4. 对战机制
  5. 参数调优
  6. 数据处理
  7. 算法性能
  8. 优化演进
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Elo预期胜率计算与评分更新机制、Chatbot Arena模型排行榜与Bootstrap置信区间分析,交互切换模式查看Elo评测各维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Elo评分更新机制 预期胜率:E_A = 1/(1+10^((R_B-R_A)/400)) 评分更新:R\'=R+K×(S-E) K因子控制评分变动幅度 ΔR = K × (实际得分 - 预期胜率) 胜者评分上升,败者下降

评分起源

小区乒乓球俱乐部早年没有积分制,谁强谁弱全凭几个老队员拍脑袋。有人抱怨“上周明明打赢了老王,怎么排名还垫底”,裁判也说不清。直到记分员翻出一本泛黄的国际象棋棋书,把里面的“等级分”搬到了乒乓球台,争议才平息下来。

这套等级分制度由匈牙利裔美国物理学家 Arpad Elo 在 1960 年代提出,1970 年被国际棋联(FIDE)正式采用。它的核心哲学是:每个选手背后有一个隐藏的“真实实力”分数,每一场比赛都是对这个分数的带噪观测——赢一场不一定说明更强,但赢多了分数自然会爬上去。

2023 年以来,LMSYS 团队把这套思想迁移到 AI 评测:让两个大模型匿名回答同一个用户问题,由真人投票选出更优者,再用 Elo 更新分数。由此诞生了 Chatbot Arena(现称 LMArena)。如今“排行榜第几名”已经成为模型发布时最有分量的宣传语之一。

老棋书里的智慧跨越了半个多世纪,从黑白棋盘一路走进神经网络时代。它告诉我们:只要存在“两两对决”和“胜负反馈”,就能给任何参赛者排出一张可信的座次表。

核心公式

记分员的小本本上最关键的一步,是赛前先算出“谁更可能赢”。实力差距越大,爆冷概率越低。这个“赛前预期”在 Elo 里叫做期望得分,公式如下:

比赛结束后,记分员根据“实际结果”和“赛前预期”的偏差来改分。如果结果符合预期,分数几乎不动;如果爆冷,分数大幅调整。更新公式如下:

记分员的这套“期望账本”保证了公平:强手胜弱手只加一分,因为那是理所当然;弱手爆冷胜强手能加二十分,因为那颠覆了账本。正是这种不对称,让积分永远向“真实实力”靠拢。

EA=11+10(RB−RA)/400\displaystyle E_A = \frac{1}{1 + 10^{(R_B - R_A)/400}}
通俗理解:分数是“被现实反复修正的预期”。输赢只决定加减方向,分差才决定加减多少。
  1. 确定实际得分赢为 1,输为 0,平局为 0.5。
    SA∈{1,  0.5,  0}\displaystyle S_A \in \{1,\; 0.5,\; 0\}
  2. 计算偏差实际得分减去期望得分,爆冷时偏差大,意料之中时偏差小。
    SA−EA\displaystyle S_A - E_A
  3. 乘上学习率K 值控制单局最大调整幅度,K 越大分数变化越剧烈。
    K(SA−EA)\displaystyle K(S_A - E_A)
  4. 累加到原分把调整量加到旧分数上,得到本轮更新后的评分。
    RA+K(SA−EA)\displaystyle R_A + K(S_A - E_A)

对战机制

俱乐部不可能让所有会员两两打一遍——那需要几百场比赛。于是采用“随机配对、现场挑战”的方式:谁有空谁上台,每场比赛都是一次独立抽样,打得多的人分数自然更可信。

LLM 竞技场也沿用了同样的思路。它并不要求所有模型两两全覆盖,而是让“对局”自然发生,核心流程有四步:随机挑选两个模型,用户提交一个真实问题,两个模型匿名作答,用户投票选优或判平。系统每收到一条有效投票,就触发一次 Elo 更新。

这种异步机制带来三个好处。一是省数据:对局数只需随模型数量线性增长,就能支撑起可靠的排名,而不是两两全排列的平方级成本。二是去偏见:匿名展示让用户无法因为品牌名气而偏心,只能凭答案质量说话。三是近真实:用户提交的 prompt 来自真实世界,覆盖编程、写作、数学、闲聊等自然分布,比固定测试集更能反映“群众口碑”。

在篮球场上这叫“自由组队”,在 AI 评测里这叫“众包对局”。Elo 不挑剔对手,也不挑剔观众,它只要求一件事:对决是真实的、随机的、足够多的。

参数调优

记分员发现,小本本上还有三个旋钮可以调:K 值像是“记分员的脾气”,初始分像是“大家的起跑线”,400 像是“难度标尺”。调得不合适,榜单要么疯疯癫癫,要么死气沉沉。

K 值是单局最大调整量。国际棋联的做法是新手用 K=40,顶尖高手用 K=10,因为高手的分数已经过大量对局校准,不该被单场意外撼动。LLM 竞技场常取 K≈24,并在 10 到 32 之间调参。K 大收敛快但噪声大,K 小稳定但反应慢,这是一对绕不开的矛盾。

初始分数决定新模型入场时的起点。国际象棋标准是 1500,部分竞技场采用 1000。初始分并不神秘——它最终会被对局“冲掉”,但它决定了新模型在冷启动期会排在哪个位置。标尺 400 则决定“分差到胜率”的映射:调小它,分数普遍膨胀;调大它,分数普遍收缩,榜单的“水分”也随之改变。

除此之外,配对策略也很讲究:随机配对能保证无偏,但有些系统会让“对局次数少的模型优先出战”,以加速数据收集。调这三个旋钮就像调音箱的高低音——没有绝对正确的值,只有“适合当前赛场”的值。

数据处理

擂台赛裁判收到的投票并不都可信:有人乱点一通,有人只投自己喜欢的队伍,还有人觉得两边都好干脆弃权。如果把这些脏数据直接记进小本本,榜单就会被系统性地带偏。

因此,真正落地的 Elo 系统都配备一条数据清洗流水线。第一层是内容过滤:剔除答非所问的对话、内容为空或明显离题的样本。第二层是行为过滤:限制同一用户重复投票,识别并剔除机器人刷票。第三层是标签净化:有些竞技场只统计“明确关注了系统提示词”的用户投票,以降低恶意操纵。

平局也是一种重要信号。两个模型势均力敌时,硬分胜负会让分数被单场运气左右,所以 Arena 将平局记为 0.5 分,双方都获得小幅修正。最后,光有点估计还不够——榜单上“第一名比第二名高 20 分”,这 20 分到底是真差距还是噪声?统计学家用 Bootstrap 重采样给出置信区间:

裁判最后给出的不是一句“某队排名第几”,而是一份带着误差带的报告。把运气和噪声明明白白标出来,榜单才经得起推敲。

CI95%=[ R(2.5%),  R(97.5%) ]\displaystyle \text{CI}_{95\%} = \left[\, R_{(2.5\%)},\; R_{(97.5\%)}\,\right]
通俗理解:与其相信“1550 分”这个单点,不如说“有 95% 的把握认为真实分数在 1542 到 1560 之间”。
  1. 准备重采样样本从原始投票集合中有放回地抽取 B 套新样本,B 常取 1000。
    {D1,D2,…,DB}\displaystyle \{D_1, D_2, \dots, D_B\}
  2. 逐样本重算分数对每套重采样数据完整跑一遍 Elo 更新,得到 B 个分数估计。
    R^1,R^2,…,R^B\displaystyle \hat{R}_1, \hat{R}_2, \dots, \hat{R}_B
  3. 排序取分位点把 B 个估计从小到大排列,取 2.5% 和 97.5% 位置的值作为区间端点。
    R(2.5%),R(97.5%)\displaystyle R_{(2.5\%)}, \quad R_{(97.5\%)}
  4. 构成置信区间两端点之间的范围,表示真实分数有 95% 的概率落在这里。
    [ R(2.5%),  R(97.5%) ]\displaystyle \left[\, R_{(2.5\%)},\; R_{(97.5\%)}\,\right]

算法性能

新入会的小白选手头几场分数乱跳,赢了强手能加 20 分,输给新手又能跌回去。这不是记分员出错,而是因为他的实力还没被“校准”——所有评分系统在冷启动期都会这样。

冷启动问题是 Elo 迁移到 LLM 评测时最明显的痛点:新模型对局少,分数噪声大,过早打出排名会误导用户。常见的对策是设置“最小对局数”门槛,比如至少几百场投票才有资格上榜。同时,榜单尾部的模型因为对局稀疏,分数波动剧烈,因此通常只展示前几十名,避免把噪声当真相。

随着对局数增加,分数更新的幅度会逐渐收窄,最终趋于稳定。工程上常用如下收敛判据:

老球员的分数纹丝不动,不是因为他们不打比赛,而是因为大量对局已经把他们的分数“校准”到位。收敛越快、越稳的系统,越能让人信任那张榜单。

∣Rt−Rt−1∣<ε\displaystyle |R_t - R_{t-1}| < \varepsilon
通俗理解:当分数每场只动零点几分时,我们可以放心地说——这位选手的实力基本定型了。
  1. 记录相邻两次分数$R_{t-1}$ 是上一次更新后的分数,$R_t$ 是本次更新后的分数。
  2. 取偏差绝对值$|R_t - R_{t-1}|$ 度量本轮评分“动了多少”。
  3. 与阈值比较当连续多轮满足该不等式,就判定该模型分数已收敛。

优化演进

老记分法有个先天缺陷:所有观众的投票权重一模一样,但懂球的人和随手乱点的人,显然不该拥有同样的影响力。于是记分员开始给投票“称重”——靠谱的观众权重更高,乱点的观众权重趋近于零。

这就是加权投票的思路:根据用户历史投票与大众共识的一致性,动态调整每条投票的权重。与之配套的还有平局的精确建模:把 0.5 分从“折中”升级为“概率模型的一部分”。这些改进最终都指向同一个统计框架——Bradley-Terry 模型,它给出两个模型对战胜率的显式形式:

现代竞技场还会按 prompt 语言、答案长度、对话轮数分组计算分数,以消除“长答案偏好”和“英语偏好”带来的偏差。经过这些打磨,“英雄榜”不再是一本粗糙的小本本,而是一台精心校准的统计机器。

P(A≻B)=eRAeRA+eRB\displaystyle P(A \succ B) = \frac{e^{R_A}}{e^{R_A} + e^{R_B}}
通俗理解:Elo 的期望胜率与 Bradley-Terry 模型在数学上等价——取标度 $\beta = 400/\ln 10 \approx 173.7$ 时两者完全一致。前者来自棋类传统,后者来自统计建模,殊途同归。
  1. 指数化分数把两个模型的原始分数分别取自然指数,得到正的“强度值”。
    eRA,eRB\displaystyle e^{R_A}, \quad e^{R_B}
  2. A 强度作分子分子是 A 的强度。
  3. 双方强度之和作分母两者相加做分母,保证概率归一化。
    eRA+eRB\displaystyle e^{R_A} + e^{R_B}
  4. 比值即胜率A 的强度占总强度的比例,就是 A 胜过 B 的概率。

AI 应用场景

大模型公测竞技场排行榜

阶段:模型评测与基准测试(LLM Evaluation)

解决的问题:传统评测靠人工专家给模型输出打分,成本高、主观性强、难以规模化。Elo 通过“众包对战 + 分数更新”,把“谁的答案更受欢迎”自动转化为可排序的分数,且支持海量真实用户实时参与。

具体案例:LMArena(原 Chatbot Arena)上,用户随意输入一个 prompt,两个匿名模型同时作答,投票后系统立即更新分数。每周发布的排行榜成为业界引用最多的模型实力参考之一。

企业内部模型迭代盲评

阶段:模型迭代回归测试

解决的问题:微调新版本后,如何客观判断“变好还是变差”?一两条 sample 说明不了问题,逐条人工打分又太慢。Elo 盲评把新旧模型与基线模型随机配对,用投票数据给出分数差和置信区间。

具体案例:某团队对 500 条 prompt 做 A/B 盲评,新版本 Elo 分数比线上版本高 18 分,但置信区间重叠,最终决定继续训练而不是贸然上线——避免了凭直觉发货的翻车。

RLHF 偏好建模

阶段:人类反馈强化学习(RLHF)

解决的问题:奖励模型本质上要回答“人类更偏好哪个回答”。Bradley-Terry(Elo 的统计等价形式)恰好提供了可微的对战胜率形式,可直接作为奖励模型的训练目标。

具体案例:从人类标注的偏好对(chosen / rejected)中采样,用负对数似然训练奖励模型,再交给强化学习优化策略。无数大模型的对齐训练都依赖这个被 Elo 验证过的建模思路。

Python 演示

python56 行
import mathimport random  class ArenaElo:    """A lightweight Elo rating system for LLM battle evaluation."""     def __init__(self, k=32, initial=1500):        self.ratings = {}        self.k = k        self.initial = initial     def get_rating(self, model):        return self.ratings.get(model, self.initial)     @staticmethod    def expected(ra, rb):        return 1.0 / (1.0 + 10.0 ** ((rb - ra) / 400.0))     def report(self, winner, loser, tie=False):        ra, rb = self.get_rating(winner), self.get_rating(loser)        ea = self.expected(ra, rb)        sa, sb = (0.5, 0.5) if tie else (1.0, 0.0)        self.ratings[winner] = ra + self.k * (sa - ea)        self.ratings[loser] = rb + self.k * (sb - (1.0 - ea))     @staticmethod    def model_win_prob(delta_mu, scale=0.7):        return 1.0 / (1.0 + math.exp(-delta_mu / scale))     def simulate(self, models, rounds=3000, seed=42):        random.seed(seed)        true_mu = {m: random.gauss(0.0, 1.0) for m in models}        for _ in range(rounds):            a, b = random.sample(models, 2)            if random.random() < self.model_win_prob(true_mu[a] - true_mu[b]):                self.report(a, b)            else:                self.report(b, a)     def leaderboard(self):        return sorted(self.ratings.items(), key=lambda x: x[1], reverse=True)  def main():    models = ["model-alpha", "model-beta", "model-gamma", "model-delta",              "model-epsilon"]    arena = ArenaElo(k=24)    arena.simulate(models, rounds=3000)    print("Leaderboard after 3000 random battles:")    for rank, (name, score) in enumerate(arena.leaderboard(), 1):        print("  {}. {}: {:.1f}".format(rank, name, score))  if __name__ == "__main__":    main()
目的:用 3000 轮随机对战模拟大模型竞技场,在未知“真实实力”的情况下,仅靠胜负结果用 Elo 还原排行榜。
  1. self.ratings.get(model, self.initial)新模型首次出现时默认拿到初始分,无需提前注册。
  2. return 1.0 / (1.0 + 10.0 ** ((rb - ra) / 400.0))期望得分公式的代码形态,核心就是一个 logistic 函数。
  3. self.ratings[winner] = ra + self.k * (sa - ea)胜者分数更新:实际得分减期望得分,再乘 K。
  4. sa, sb = (0.5, 0.5) if tie else (1.0, 0.0)平局双方记 0.5,胜负则胜方记 1、负方记 0。
  5. return 1.0 / (1.0 + math.exp(-delta_mu / scale))用 Bradley-Terry 概率模拟“真实世界”里强者胜出的概率。
  6. random.sample(models, 2)随机匿名配对,保证对战无偏。
  7. random.seed(seed)固定随机种子,让实验可复现。
  8. sorted(self.ratings.items(), key=lambda x: x[1], reverse=True)按分数降序生成排行榜。

常见误区

误区听说排行榜第一名比第二名高 20 分,那我直接用第一名的模型就行,Elo 分数就是模型实力的绝对尺子。

正解Elo 分数是相对量,受对战分布、投票人群和时间窗口影响。榜首 20 分的领先可能完全落在置信区间之内(比如 ±15 分),并不构成显著差异。正确做法是比较置信区间是否重叠,而不是盯着小数点咬死差距。

为何常见:人天生喜欢把数字当作精确真理,排行榜的排序又进一步强化了“一分耕耘一分收获”的错觉。

误区K 值调大,分数更新快,新模型打几场就能追上老模型,收敛得更快,那我干脆用 K=100。

正解K 值是“学习率”,太大等于把单场比赛的分量无限放大。偶然爆冷会带动分数剧烈震荡,几场坏数据足以把模型抬进前三。工程上要在响应性和稳定性之间取平衡,比如国际棋联对新老选手使用不同 K 值。

为何常见:直觉上“更新快 = 学得快”,容易忽略噪声也被同步放大的副作用。

误区反正投票数量很大,噪声会相互抵消,把原始投票直接丢给 Elo 就行。

正解随机噪声确实会互相抵消,但系统性偏差不会。刷票、答非所问的对话、同一账号反复提交,都会把分数往某个方向推。真实的竞技场都有清洗流水线:过滤无效对话、限制重复投票、剔除离题样本。

为何常见:大数定律给人“样本多就可靠”的安全感,却忽略了大数定律只对独立同分布的噪声成立。

误区Elo 是棋类比赛用的积分,Bradley-Terry 是统计学里的偏好模型,它们是两个风马牛不相及的东西。

正解两者在数学上等价。Elo 的期望胜率公式 $1/(1+10^{(R_B-R_A)/400})$ 本质上就是 Bradley-Terry 的 logistic 形式,只是把“强度参数”用 400 分的标尺具体化了。理解这一层,才能把排行榜经验平滑迁移到 RLHF 奖励模型上。

为何常见:两个概念来自不同学科,命名习惯和符号体系不同,掩盖了底层的同构关系。

面试题

Q1. 在 Elo 评分中,期望得分 EA = 0.75 表示什么?

单选题 · easy

  • A.A 击败 B 的概率约为 75%← 正确答案
  • B.B 击败 A 的概率约为 75%
  • C.A 与 B 平局的概率约为 75%
  • D.本场得分总和约为 75 分

答案:A。期望得分就是“预计能拿到的分数”,胜取 1、平均 0.5,因此 E=0.75 含义是 A 有约 75% 概率获胜。选项 B 是反过来的概率,C 说的是平局概率,D 混淆了得分与概率。

Q2. Elo 更新公式中,平局时双方的实际得分取多少?

单选题 · easy

  • A.双方各记 1.0 分
  • B.双方各记 0.5 分← 正确答案
  • C.获胜一方记 1 分
  • D.双方都记 0 分

答案:B。平局意味着双方都没赢、都没输,各记 0.5 分最合理。记 1 分会导致双方分数同时上涨,记 0 分则抹掉了“打成平手”这一信息。

Q3. 弱手爆冷击败强手,下列说法正确的是?

单选题 · mid

  • A.双方评分都保持不变
  • B.强手反而会大幅度加分
  • C.弱手加分多于强手扣分
  • D.弱手加分等于强手扣分← 正确答案

答案:D。由于期望得分之和为 1,胜者加分 K×(1−E胜者) 恰好等于败者扣分 K×E败者,幅度完全一致。C 是常见误解,其实分数只是从败者转移给了胜者,不会凭空多出来。

Q4. 关于 K 值,下列说法正确的是?

单选题 · mid

  • A.K 值越大评分越稳定
  • B.K 值越大单局波动越大← 正确答案
  • C.K 值必须固定为 32
  • D.K 值与模型水平无关

答案:B。K 是单局最大调整量,越大单局波动越剧烈、噪声越敏感。国际棋联对新手用 40、高手用 10,说明 K 往往与选手水平和对局经验相关,并非固定值。

Q5. 大模型竞技场(LMArena)收集对战数据时的正确做法有?

多选题 · mid

  • A.匿名展示两个模型的回答← 正确答案
  • B.随机配对模型进行对决← 正确答案
  • C.只许二选一不许投平局
  • D.采用真实用户的提示词← 正确答案

答案:ABD。匿名避免品牌偏见、随机配对保证无偏采样、真实用户 prompt 让评测贴近自然分布,三者都是竞技场设计要点。平局是重要信号,应当允许用户判平并记 0.5 分,因此 C 错误。

Q6. 两个模型分数相差 400 分时,强手的期望获胜率约为?

单选题 · mid

  • A.大约是 0.75
  • B.大约是 0.91← 正确答案
  • C.大约是 0.50
  • D.大约是 0.99

答案:B。代入期望公式 1/(1+10^(−400/400)) = 1/(1+0.1) ≈ 0.909。这正是 Elo 标尺的设定:400 分差对应约九成胜率,让分数差直观对应实力台阶。

Q7. 关于 Elo 迁移到 LLM 评测,正确的说法有?

多选题 · hard

  • A.排行榜分数可直接跨榜比较
  • B.原始投票数据需要清洗筛选← 正确答案
  • C.排名比绝对分数更有参考意义← 正确答案
  • D.用户投票天然无偏无需处理

答案:BC。不同榜单的对战分布、投票人群、时间窗口都不同,分数不能直接跨榜比较,但“谁排在前面”具有相对参考价值,因此 A 错、C 对。用户投票存在刷票、乱投、答非所问等系统性偏差,必须清洗,B 对、D 错。

Q8. 冷启动问题在 LLM 评测中指什么?

单选题 · hard

  • A.模型温度参数初始设置过低
  • B.新模型对局少导致分数不稳← 正确答案
  • C.服务器启动阶段评测延迟高
  • D.模型初始分数永远无法更新

答案:B。冷启动指新模型入场时对局数太少,分数噪声大、排名不可信。解决办法是设置最小对局数门槛,等分数收敛后再上榜。它跟温度参数、服务器延迟、初始分能否更新都无关。

Q9. 以下哪些属于对 Elo 评分系统的常见改进?

多选题 · hard

  • A.按用户可靠性加权投票← 正确答案
  • B.直接删除所有低分模型
  • C.引入平局零点五分建模← 正确答案
  • D.采用 Bradley-Terry 模型← 正确答案

答案:ACD。加权投票降低乱点用户的影响,平局 0.5 分更平滑,Bradley-Terry 是 Elo 的统计等价表达,三者都是真实改进。“删除低分模型”会破坏对战随机性和榜单完整性,不是评分改进。

Q10. A、B 两模型实力接近,期望胜率约为 0.5,K=24。100 轮无平局后 A 的分数上升了 12 分,则 A 比 B 多赢几轮?

单选题 · extreme

  • A.多赢 1 轮← 正确答案
  • B.多赢 2 轮
  • C.多赢 12 轮
  • D.多赢 24 轮

答案:A。期望胜率 0.5 时,A 每赢一轮 +24×(1−0.5)=12 分,每输一轮 −12 分。净增 12 分,说明 12×(胜−负)=12,即 A 比 B 多赢 1 轮。这题考察对“期望决定加减幅度”的定量理解。