你能信任你的 LLM 评审吗?把 LLM-as-Judge 与人类校准对齐
用 LLM 给模型输出打分很容易,难的是判断它是否可信。本文带你走一遍 Potato 2.6 的盲测人类校准流程:k 次采样投票、Cohen 与 Fleiss kappa,以及期望校准误差。
用大型语言模型给其他模型的输出打分,已经成了评测中的默认做法。你写一份评分细则,让 GPT-4o 或 Claude 给上千条回复打分,然后读出一个准确率数字。这种方式快、便宜,而且能扩展到任何人工团队都无法手动标注的规模。
但它也悄悄假设了你最需要核实的那件事:评审和人类意见一致。一个把 LLM 当评审的系统,如果自信地犯错,就会产出一份看起来干净、实则建在流沙之上的排行榜。在你信任评审的裁决之前,你必须先衡量它在多大程度上跟得上人类的判断。这个衡量步骤就是校准,而 Potato 2.6 为此加入了一套工作流。
本文介绍 Judge Calibration(评审校准):它如何对模型采样、如何让人类环节保持客观,以及报告到底告诉了你什么。参考文档列出了完整的选项清单。
Potato 中的内联评审校准
问题的形态
评审可能以两种不同的方式出错,而你想把这两种都抓住。
第一种是分歧:评审把一个细心的人会判为"错误"的东西判为"正确"。这正是准确率和一致性指标所衡量的。
第二种是置信度失真:评审说自己有 95% 的把握,实际上只有 60% 的时候是对的。一个评审可以有不错的准确率,却严重失校;一旦你开始用它的置信度来分配工作或设定阈值,这个问题就会立刻显现。这正是校准误差所衡量的。
Potato 的校准流程就是为了同时暴露这两种问题而设计的。
工作原理
整个工作流以一个简短的状态机运行:
SETUP → GENERATING → HUMAN_CALIBRATION → REPORT → COMPLETED
生成阶段(Generating)。 每个模型对每个条目被查询 k 次。这 k 个样本中出现最多的标签是模型的预测,而与该标签一致的样本比例就是模型的置信度。采样 k 次而非一次,正是让你获得一个经验性的置信度信号,而不是模型对自身臆造出来的一个数字。这些结果会进入一个专门的存储区,永远不会写入标注数据。
人类校准(Human calibration)。 Potato 抽取条目的随机样本或分层样本,并将它们分配给一名或多名人类,由他们通过正常的标注界面进行标注,全程看不到模型的答案。
报告(Report)。 指标在模型标注和人类标注的重叠部分上计算,然后写入磁盘。
这里的盲测是关键所在。由于模型标注存放在独立的存储区,永远不会注入到界面中,人类即便无意之间也不会被它们锚定。盲测是结构性的,而不是靠请标注者"别看"来实现的。
Potato 如何用盲测人类标注来校准评审
配置
一次评审校准就是一个配置块。你写好评审提示词、列出模型,并设定每个模型采样多少次:
judge_calibration:
enabled: true
prompt: | # supports {text}, {labels}, {description}
You are an impartial expert annotator. Classify the sentiment as exactly
one of: positive, negative, neutral.
models:
- endpoint_type: openai # openai | anthropic | ollama | vllm | gemini | ...
model: gpt-4o-mini
api_key: ${OPENAI_API_KEY}
temperature: 0.7 # must be > 0 so the k samples vary
- endpoint_type: ollama
model: llama3.1:8b
base_url: http://localhost:11434
temperature: 0.7
k_samples: 5 # samples per model per item
max_items: 1000 # cap on items the LLMs label (null = all)
sampling:
strategy: stratified # random | stratified | all
sample_size: 200 # how many items humans blind-label
seed: 42
human:
num_raters: 1 # 1 = solo researcher; N adds human-human IAA
gold: single # single | majority
schemas: [sentiment]
output:
dir: judge_calibration_outputWarning: 请设置
temperature > 0。当k_samples > 1而温度为 0 时,所有样本完全相同,置信度会被固定在 1.0,校准报告也就毫无意义。Potato 在检测到这种组合时会发出启动警告。
你可以列出不止一个模型并把它们并排校准,这是在廉价的本地评审和昂贵的托管评审之间做选择的自然方式。
没有 API key 时如何试用
捆绑的示例使用本地的 Ollama 模型,所以你可以完全离线地跑通整个流程。启动 Ollama、拉取模型,然后运行:
ollama pull llama3.2:3b
python potato/flask_server.py start examples/ai-assisted/judge-calibration/config.yaml -p 8000 --debug打开 http://localhost:8000/judge_calibration/admin 进行配置和运行,在 /annotate 处盲测标注样本,然后构建报告并在 /judge_calibration/report 阅读它。
报告告诉你什么
这份报告的目的是用你能写进方法部分的数字来回答"我该信任这个评审吗?":
- 每个模型相对人类金标准的准确率、精确率、召回率、F1。
- Cohen's κ,分别按 人↔模型、模型↔模型、人↔人 三类配对拆分,让你看清评审与人类的一致程度是否能赶上人类彼此之间的一致程度。
- 跨所有评分者的 Fleiss' κ 与 Krippendorff's α。
- 期望校准误差(ECE)、可靠性分箱,以及 Brier 分数:针对置信度失真这一失效模式的答案。
- 每个模型的混淆矩阵,它通常道出了真正的故事:一个在简单类别上表现良好、却在某个困难区分上崩溃的评审。
所有指标都在重叠部分上计算:模型和人类都标注过的条目,并限定在校准样本之内。输出落在 output.dir 下,包括 llm_labels.jsonl、report.json,以及一份可读的 report.html。
它能处理什么
校准在大多数评审使用的分类型方案上得到完全支持,并延伸到更难的类型:
| 类型 | 状态 | 指标 |
|---|---|---|
radio / select | 已支持 | 准确率、P/R/F1、Cohen/Fleiss κ、Krippendorff α、ECE、混淆矩阵 |
likert | 已支持 | 以上各项,外加 MAE 和序数 Krippendorff α |
multiselect | 已支持 | 各标签 P/R/F1、平均 Jaccard、精确匹配准确率、校准 |
span | 实验性 | IoU 匹配的 P/R/F1、平均 IoU、span-F1、span 级校准 |
Span 校准会把评审在 k 个样本中给出的字符偏移区间聚类,并按交并比(intersection-over-union)与金标准匹配;其数值应视为方向性参考,而非精确结果。
校准与对齐之别
Potato 还附带了第二个与本文相关、容易混淆的工作流。Judge Alignment(评审对齐)将单个评审与一份已有的人类金标准集校准,在标注过程中内联展示其裁决,并围绕着不断迭代评分细则、直到一致性上升而构建。
经验法则是:当你正在审查候选评审、想要一个盲测的经验置信度数字时,选校准;当你已经确定了某一个评审、想针对固定的金标准集调整其评分细则时,选对齐。两者在闭环(Closing the Loop)中一并介绍。
LLM 评审不会消失;要评测的东西太多,能手动评测的人太少。校准的意义不是用人类取代评审,而是用一个数字精确地知道:在需要人类介入之前,评审到底能被信任到什么程度。
Judge Calibration 文档涵盖了每一个选项,标注者间一致性指南则深入解释了 kappa 和 alpha 这些指标。