返回博客

换模型结论就变|LLM 度量的秩相关只有 0.52

人工智能5291
换模型结论就变|LLM 度量的秩相关只有 0.52

把 LLM 当作测量工具时,最常见的默认假设是"模型只是个执行者"——换一个模型,同一批文本打出来的分应该差不多。

这个假设不成立。一组覆盖 13 个度量、7 个来自不同厂商模型的对照显示,跨模型秩相关平均只有 0.52。我在 4sapi(https://4sapi.com)上做评测与数据管线时,这个数字改变了我对"LLM 生成变量"的用法。

一、实验规模与结论

实验设计得很直接:13 个度量(含情感、管理层清晰度、不确定性、答案具体性与气候/政治风险),7 个来自不同厂商的 LLM,对 S&P 500 公司财报电话会议记录在这些构念上打分。

结果有三层:

第一,跨模型秩相关平均仅 0.52。也就是说,把同一批文稿按某个度量排序,换一个模型,排序会变掉近一半。

第二,跨厂商共有的文稿级差异只解释总得分变异的 34%。剩下的大头是模型特异的成分——不是文本本身有歧义,而是模型各有各的偏好。

第三,跨模型分歧不能预测后续分析师或市场的分歧。这一条排除了"分歧来自底层披露本身模糊"的解释:如果文本真的含糊,那么模型之间的分歧应当与人类的分歧相关;实测不相关。

二、这个数字的实际含义

0.52 秩相关意味着什么,用排序场景说更清楚:如果按某个度量筛选出排名前 20% 的文稿,换一个模型重排,会有相当一部分文稿进出这个区间。

对下游推断的影响更值得警惕:系数的大小、符号与统计显著性在不同模型间差异明显。符号反转意味着结论方向都变了。任何"用 LLM 打分再做回归"的流程,如果没记录用的是哪个模型,结论就不可复现。

把这三层结果合起来看,可以得到一个更根本的判断:LLM 度量测到的不完全是文本属性,其中相当一部分是模型属性。34% 这个数字划出了分界线——只有约三分之一的分歧能归因到文本本身,其余随模型而变。这不是某个模型的缺陷,而是这类测量方式的固有性质。

理解了这一点,用法的调整方向就明确了:不是去找"最准的模型",而是把模型当成测量仪器的一部分来管理——记录它的标识与版本,在换仪器时重新标定。这与实验室里的做法一致:换了量具就要重新校准,而不是假设读数不变。

三、集成平均能解决什么、不能解决什么

一个自然的补救是多模型平均。实测结果是:跨厂商平均能让多数构念的文稿排序更稳定,但得分水平仍对纳入集成的模型敏感。

这条区分很关键,也常被混淆:

平均只解决了前者。所以需要绝对阈值(比如"情感分低于某值就告警")的场景,多模型平均不足以支撑,必须另有定标。

四、裁判的另一类偏差:位置

同一类问题在"用 LLM 当裁判"时表现得更具体。LLM 裁判可实现可扩展的评测,但其判断对回答顺序敏感:把两个候选回答换个展示顺序,偏好可能翻转。

更麻烦的是,即使移除位置效应,判断仍可能系统性地偏离人类偏好。位置效应是表层偏差,可以通过交换顺序取平均来削弱;系统性偏离是深层偏差,来自模型自身的偏好结构,交换顺序对它无效。

所以裁判的治理要分两层:先去位置偏差,再做人类偏好校准。

两类偏差的性质差别很大,处置方式也不同:

偏差类型来源换顺序能否消除需要人类标签处置方式
模型选择偏差各模型偏好结构不同无关否跨厂商验证、记录模型标识
集成构成偏差成员不同则水平不同无关否固定集成成员并版本化
位置偏差展示顺序影响判断能,双序取平均否两种顺序都跑
系统性偏离裁判偏好偏离人类不能是少量人类标签做校准

这张表最实用的一点是明确了哪些偏差不需要人类标签就能处理。前两行与第三行都可以靠工程手段处理:记录模型标识、固定集成成员、双序调用。只有最后一行必须依赖人类标签。把人类预算集中用在唯一需要它的地方,是这类治理的成本要点。

五、校准该怎么做

一个可行的框架是把大量 LLM 比较与有限的人类比较结合起来用:先分离裁判特有的位置效应,再学习经位置去偏后的 LLM 偏好中的共享结构,最后把这个结构自适应地校准到人类偏好目标上。

这个设计解决了两个现实约束:人类标签贵,所以只能用少量;LLM 比较便宜,但单独用不可信。用少量人类标签去校准大量 LLM 比较的方向,比两者各自单独使用都更有效。

理论层面需要处理三件事:可识别性(潜在偏好、位置效应与人类校准能否被区分开)、自适应估计(在 LLM 锚定与有限人类证据之间取平衡)、以及固定权重的不确定性量化(校准结果的置信范围)。

六、有限的人类标签该花在哪

既然人类标签是稀缺资源,分配方式就值得设计。实测显示这类方法对不平衡的回答顺序保持稳健,并能在有限标签下取得强的人类对齐排序。落到操作上,我的分配顺序是:

  1. 先用于确定位置效应的大小,这部分用少量样本就能估出来;
  2. 再用于校准排序,让 LLM 比较的方向对齐人类;
  3. 最后才考虑绝对水平对齐,这是最费标签的一项。

多数场景下到第 2 步就够了;需要绝对阈值的场景才做到第 3 步。

还有一条使用纪律:人类标签一旦用掉就应当固定下来,不要在每次换模型后重新采集。校准的目标是把 LLM 比较对齐到那一批人类偏好上,如果人类基准本身在变动,横向比较就失去了锚点。把人类标签集当成一份版本化的固定资产,每次换模型时只重跑 LLM 侧,是更经济的做法。

七、真实数据规模的一个参考

作为规模参考,一项真实数据研究收集了 21 个 LLM 裁判在两种展示顺序下的超过 410,000 条判断。两种顺序都跑是必要的——只跑单一顺序,位置效应无法与真实偏好分离。

这个规模也说明位置偏差检测并不需要复杂设施,需要的只是把两种顺序都跑一遍并记录结果。成本翻倍,但换来可分离的偏差项。

值得一提的是,两种顺序都要跑这件事必须在评测设计阶段决定。如果在评测跑完之后才发现只记录了单一顺序,位置偏差就无法事后分离——那批数据只能整体作废重跑。所以这是少数"事后无法补救"的设计决策之一,值得写进评测规范里。同理,裁判的模型标识、温度参数、以及是否有系统提示词,都应当在评测时就记录进结果文件,而不是靠事后回忆补齐。

八、偏差来源分解

把两类偏差放在一起,度量与裁判的偏差来源可以这样拆:

text
文本 -> [LLM 度量] -> 分数 -> 下游推断
          |
          +-- 模型选择偏差      换模型,分数与排序都变   <- 秩相关 0.52
          +-- 集成构成偏差      平均后的水平仍依赖成员
          |
       [LLM 裁判] -> 偏好
          |
          +-- 位置偏差          展示顺序影响判断         <- 双序可分离
          +-- 系统性偏离        去位置后仍偏离人类偏好   <- 需人类校准

九、检查脚本

下面这段脚本做两件事:计算多模型打分的跨模型秩相关,以及用双序调用检测位置偏差。

python
import os, json, itertools
from statistics import mean
import requests

BASE_URL = os.getenv("MODEL_BASE_URL", "https://4sapi.com/v1")
API_KEY = os.getenv("FOURSAPI_API_KEY", "")

MODELS = [m for m in os.getenv("JUDGE_MODELS", "gpt-6-sol,claude-opus-5-5").split(",") if m]
CONSTRUCT = os.getenv("CONSTRUCT", "管理层清晰度")


def score(model, text):
    resp = requests.post(
        f"{BASE_URL}/chat/completions",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={"model": model, "temperature": 0,
              "messages": [
                  {"role": "system",
                   "content": f"对以下文本的「{CONSTRUCT}」打 1-5 分,只输出数字。"},
                  {"role": "user", "content": text}]},
        timeout=60,
    )
    resp.raise_for_status()
    return float(resp.json()["choices"][0]["message"]["content"].strip())


def rank(vals):
    """平均秩,处理并列。"""
    order = sorted(range(len(vals)), key=lambda i: vals[i])
    ranks = [0.0] * len(vals)
    i = 0
    while i < len(order):
        j = i
        while j + 1 < len(order) and vals[order[j + 1]] == vals[order[i]]:
            j += 1
        avg = (i + j) / 2 + 1
        for k in range(i, j + 1):
            ranks[order[k]] = avg
        i = j + 1
    return ranks


def spearman(a, b):
    ra, rb = rank(a), rank(b)
    n = len(a)
    ma, mb = mean(ra), mean(rb)
    num = sum((x - ma) * (y - mb) for x, y in zip(ra, rb))
    den = (sum((x - ma) ** 2 for x in ra) * sum((y - mb) ** 2 for y in rb)) ** 0.5
    return num / den if den else 0.0


def judge_pair(model, a, b):
    """返回 1 表示偏好 a,0 表示偏好 b;用于双序检测。"""
    resp = requests.post(
        f"{BASE_URL}/chat/completions",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={"model": model, "temperature": 0,
              "messages": [
                  {"role": "system", "content": "在 A 与 B 中选择更好的一项,只输出 A 或 B。"},
                  {"role": "user", "content": f"A:\n{a}\n\nB:\n{b}"}]},
        timeout=60,
    )
    resp.raise_for_status()
    pick = resp.json()["choices"][0]["message"]["content"].strip().upper()[:1]
    return 1 if pick == "A" else 0


if __name__ == "__main__":
    with open(os.getenv("TEXTS", "./texts.json"), encoding="utf-8") as f:
        texts = json.load(f)

    per_model = {m: [score(m, t) for t in texts] for m in MODELS}

    print("== 跨模型秩相关 ==")
    for a, b in itertools.combinations(MODELS, 2):
        print(f"{a} vs {b}: rho={spearman(per_model[a], per_model[b]):.3f}")
    if len(MODELS) >= 2:
        rhos = [spearman(per_model[a], per_model[b])
                for a, b in itertools.combinations(MODELS, 2)]
        print(f"平均秩相关: {mean(rhos):.3f}")

    print("== 位置偏差(双序)==")
    pair = texts[:2]
    for m in MODELS:
        fwd = judge_pair(m, pair[0], pair[1])
        rev = judge_pair(m, pair[1], pair[0])
        consistent = (fwd == 1) == (rev == 0)     # 双序应给出相反的 A/B,否则偏好翻转
        print(f"{m}: 正序={fwd} 反序={rev} 一致={consistent}")

用法上两个要点:跨模型秩相关应当在每次换模型或改 prompt 模板后重算,作为常规监控项;双序一致性若明显偏离,说明该裁判不适合用于需要稳定偏好的场景。

十、成本与风险提示

结论

把 LLM 当测量工具时,必须放弃"模型只是执行者"的假设。跨模型秩相关只有 0.52、跨厂商共有差异只解释 34% 的变异、以及分歧与人类分歧无关,这三条合起来说明 LLM 生成的是模型依存的测量——模型标识是变量的一部分,不是无关紧要的实现细节。裁判侧的偏差分两层:位置偏差可以用双序分离,系统性偏离要靠少量人类标签校准。落到操作上,先记录模型标识、再算跨模型秩相关、然后按顺序花人类标签,这三步就能把大部分不可复现的风险挡在前面。我在 4sapi.com 上把这三步做成常规监控之后,评测结论被质疑的次数明显下降。

最后补一条实践提醒:这套监控的触发点应当绑定在变更上,而不是按固定周期跑。会改变度量的变更其实只有几种——换模型、改模型版本、调整系统提示词、改 prompt 模板、改解析与规范化逻辑。把这几个位置登记成变更点,每次改动后自动重算跨模型秩相关与双序一致性,就能用很小的成本覆盖绝大部分风险。按固定周期跑则容易在真正的变更发生时正好错过,而在没有变更的周期里白跑。

如果业务必须使用绝对数值阈值,还有一条折中路径:不追求跨模型可比,而是把阈值与模型绑定。即每个模型版本各自维护一套阈值,换模型时重新标定阈值而不是沿用旧值。这样虽然失去了横向比较的便利,但换来的是每个版本内部的自洽——在多数生产场景里,自洽比可比更实用。

把这套做法整理成可执行的清单,大致是四步:登记变更点、变更后重算跨模型秩相关、对裁判做双序一致性检查、把人类标签集版本化。四步都不需要新设施,需要的只是把原来默认忽略的元数据补上——模型标识、展示顺序、集成成员、以及标签集版本。这些字段一旦齐备,后面几乎所有与可复现性有关的问题都能被回答。

欢迎在评论区聊聊各自在 LLM 度量与裁判上的验证方式,以及跨模型分歧对选型的影响。

标签:LLM度量秩相关位置偏差偏好校准评测方法

推荐阅读

探索更多前沿洞察与行业干货。