首页
/ FastChat LLM Judge:MT-Bench 与 LLM-as-a-Judge 评测框架完全实战指南

FastChat LLM Judge:MT-Bench 与 LLM-as-a-Judge 评测框架完全实战指南

2026-09-05 17:24:45作者:舒璇辛Bertina

本文基于 FastChat 仓库中的 LLM Judge 文档 展开,系统讲解如何使用 MT-bench 题库和 GPT-4 等强模型作为裁判(LLM-as-a-judge)来自动化评测对话模型:包括环境安装、生成被评测模型的 80 道多轮开放式问题回答、以单答案打分或成对比较两种方式生成裁判判断、汇总展示分数,以及使用 vLLM 等后端加速答案生成的完整流程。读完本文,你可以直接复现 MT-bench 评测流水线,并理解其底层的数据结构与判断解析实现。

MT-Bench 各评测类别得分雷达图

一、LLM-as-a-judge 与 MT-bench 的基本概念

LLM Judge 是 FastChat 中的自动化评测包(fastchat/llm_judge)。其核心思想是:用 GPT-4 这类强模型充当"裁判",对被评测模型的回答进行打分或两两比较,从而免去大量人工标注。它对应的公开工作为 Judging LLM-as-a-judge with MT-Bench and Chatbot Arena(arXiv:2306.05685),MT-bench 即其中定义的评测基准。

MT-bench 的题库定义在 question.jsonl,共 80 道双轮(two-turn)开放式问题。每行 JSON 包含 question_idcategoryturns 字段,例如:

{"question_id": 81, "category": "writing",
 "turns": ["Compose an engaging travel blog post about a recent trip to Hawaii, ...",
           "Rewrite your previous response. Start every sentence with the letter A."]}

第二问通常要求模型改写、总结或约束重写第一问的回答,因此可以考察模型的上下文跟随与指令控制能力。

从源码 common.py 可以看到几个决定评测行为的关键设计:

  • 按类别设置采样温度temperature_configcommon.py#L40-L50):writing/roleplay 用 0.7,math/coding/extraction/reasoning 用 0.0,stem/humanities 用 0.1,未列出的类别默认 0.7。答案生成脚本 gen_model_answer.py 会依据题目类别自动套用该温度(gen_model_answer.py#L99-L102)。
  • 参考答案机制NEED_REF_CATS = ["math", "reasoning", "coding", "arena-hard-200"]common.py#L31)。这些类别的题目在裁判时会额外注入 GPT-4 给出的参考答案(存放在 reference_answer/gpt-4.jsonl),让裁判对照参考答案判断正确性,而不是仅凭表面流畅度打分。
  • 平局阈值TIE_DELTA = 0.1common.py#L28),用于在成对比较中判定两个分数是否算平局。

二、安装

git clone https://gitcode.com/GitHub_Trending/fa/FastChat.git
cd FastChat
pip install -e ".[model_worker,llm_judge]"

pyproject.toml 可以确认 llm_judge 这个 extra 实际引入的依赖:openai<1anthropic>=0.3ray——分别用于调用 OpenAI/Claude API 以及答案生成的多 GPU 并行调度。

三、查看预生成的模型答案与裁判结果

仓库为一批主流模型提供了预生成的 MT-bench 答案和 GPT-4 判断结果。执行下载脚本:

python3 download_mt_bench_pregenerated.py

download_mt_bench_pregenerated.py 中的 filenames 列表定义了要拉取的 31 份模型答案(vicuna、llama-13b、alpaca-13b、claude-v1、gpt-3.5-turbo、gpt-4 等)以及两份裁判结果 gpt-4_single.jsonlgpt-4_pair.jsonl,落盘目录与后续评测输出目录完全一致:

  • data/mt_bench/model_answer/<model>.jsonl
  • data/mt_bench/model_judgment/gpt-4_single.jsonl / gpt-4_pair.jsonl

下载完成后用 QA Browser 在本地浏览:

python3 qa_browser.py --share

qa_browser.py 是一个 Gradio 应用,可按题查看各模型的两轮回答及裁判解释。文档特别提示:这套浏览工具之后也可以直接用来查看你自己跑出来的答案——因为自跑流程的输出路径与预生成数据完全相同。

四、MT-bench 完整评测流程

Step 1:生成被评测模型的答案

python gen_model_answer.py --model-path [MODEL-PATH] --model-id [MODEL-ID]

例如:

python gen_model_answer.py --model-path lmsys/vicuna-7b-v1.5 --model-id vicuna-7b-v1.5
  • [MODEL-PATH]:权重路径,可以是本地目录或 Hugging Face 仓库 ID;
  • [MODEL-ID]:你给模型起的名字,将作为输出文件名的唯一标识。

答案保存到 data/mt_bench/model_answer/[MODEL-ID].jsonl

注意 prompt 模板:脚本内部通过 get_conversation_template(model_id) 为每个模型组装对话模板,因此 --model-id 必须是模板注册表里已支持的名称,否则模板不对会导致答案质量失真。支持的模型清单及如何为新模型注册模板,见 model_support.md 中 "How to support a new model" 一节。

文档额外提到的两个并行参数,其含义可由 gen_model_answer.py 的参数解析确认:

  • --num-gpus-per-model:单个模型占用的 GPU 数(大模型如 65B 需要 >1);
  • --num-gpus-total:总 GPU 数。当 num_gpus_total // num_gpus_per_model > 1 时,脚本会用 Ray 把 80 道题切片到多个进程并行生成(gen_model_answer.py#L275-L279)。

结合源码,完整参数一览如下:

参数 默认值 说明
--model-path 必填 权重路径(本地目录或 HF 仓库 ID)
--model-id 必填 模型的自定义名称,决定输出文件名与模板选择
--bench-name mt_bench 题库名,对应 data/<bench>/question.jsonl
--question-begin / --question-end 调试用,只跑题目区间的切片
--answer-file data/<bench>/model_answer/<model-id>.jsonl 答案输出文件
--max-new-token 1024 每题每轮最大生成 token 数
--num-choices 1 每题生成的候选答案数
--num-gpus-per-model 1 每模型 GPU 数(模型并行)
--num-gpus-total 1 总 GPU 数(数据并行,启用 Ray)
--max-gpu-memory 每 GPU 上模型权重的最大显存
--dtype 覆盖精度:float32/float16/bfloat16
--revision main 加载的模型 revision

实现细节上,每题按 torch.manual_seed(i) 生成 num_choices 个候选,逐轮追加对话、按模板的 stop_token_ids/stop_str 截断输出,并以 JSONL 追加写入;脚本结束前调用 reorg_answer_file()question_id 排序并去重,保证幂等可重跑。

文档提示:若答案生成太慢,可跳到下文「使用 vLLM 等后端加速」一节,通过推理引擎把吞吐提升约 20 倍。

Step 2:生成 GPT-4 裁判判断

MT-bench 支持三种裁判模式,MT-bench 官方推荐默认使用 single(单答案打分) 模式:让 GPT-4 直接对模型每轮回答打 1–10 分,最后对所有轮次取平均。

export OPENAI_API_KEY=XXXXXX   # 设置 OpenAI API key
python gen_judgment.py --model-list [LIST-OF-MODEL-ID] --parallel [num-concurrent-api-call]

例如:

python gen_judgment.py --model-list vicuna-13b-v1.3 alpaca-13b llama-13b claude-v1 gpt-3.5-turbo gpt-4 --parallel 2

判断结果保存到 data/mt_bench/model_judgment/gpt-4_single.jsonl

结合 gen_judgment.py 的源码,这一步的完整参数与内部机制如下:

参数 默认值 说明
--mode single 取值 single / pairwise-baseline / pairwise-all
--judge-model gpt-4 裁判模型名
--judge-file data/judge_prompts.jsonl 裁判 prompt 模板文件
--baseline-model gpt-3.5-turbo pairwise-baseline 模式的对照模型
--model-list 无(取答案目录下全部模型) 待评模型 ID 列表
--parallel 1 并发 API 调用数(ThreadPoolExecutor
--first-n 调试用,只评前 n 条
--bench-name mt_bench 题库名

裁判 prompt 模板集judge_prompts.jsonl 定义了 8 个模板,按「单答/成对 × 通用/数学 × 单轮/双轮」组合:

  • 单答类:single-v1(通用,输出格式 [[rating]],1–10 分)、single-math-v1(含参考答案)、single-v1-multi-turnsingle-math-v1-multi-turn
  • 成对类:pair-v2pair-math-v1pair-v2-multi-turnpair-math-v1-multi-turn(输出格式 [[A]]/[[B]]/[[C]],C 表示平局)。

gen_judgment.pymake_judge_single / make_judge_pairwise 会一次性注册这四组 Judge,运行时按题目类别与轮数路由:math/reasoning/codingNEED_REF_CATS 类别走带参考答案的模板,双轮题目走 -multi-turn 模板并只评估第二轮回答(见 gen_judgment.py#L234-L289)。

成对比较的反位置偏差机制。在 pairwise 模式下,common.pyplay_a_match_paircommon.py#L313-L360)会对同一题调换 A/B 位置调用裁判两次(g1 与 g2);只有两次结论一致才记为胜负,否则记为 inconsistent。这从实现层面消除了"先出现的答案占优"的位置偏差。裁判调用的容错参数为 API_MAX_RETRY = 16API_RETRY_SLEEP = 10 秒,失败重试耗尽时输出标记 $ERROR$common.py#L24-L26)。分数解析使用正则 [[(\d+\.?\d*)]](含单括号备份模式)提取 [[rating]]

运行前的一致性检查。脚本在真正发起 API 调用前会 check_data():确认每个模型对每道题都有答案、需要参考答案的裁判都具备对应参考数据,并在打印 match 统计(题目数、match 总数、输出路径)后等待回车确认,避免浪费 API 配额。

其他两种裁判模式:基于胜率的比较

除了单答案打分,还支持两种基于 win rate 的模式:

Option 2:pairwise-baseline(对照基线模型,默认 gpt-3.5-turbo)

python gen_judgment.py --mode pairwise-baseline --model-list vicuna-13b-v1.3 alpaca-13b llama-13b --parallel 2

判断保存到 data/mt_bench/model_judgment/gpt-4_pair.jsonl,然后:

python show_result.py --mode pairwise-baseline

Option 3:pairwise-all(全部模型两两比较)

python gen_judgment.py --mode pairwise-all --model-list [LIST-OF-MODEL-ID] --parallel [num-concurrent-api-call]
python show_result.py --mode pairwise-all

当模型数量增多时该模式 API 开销更大,但给出的比较信息也更全面(每对模型都有直接对局数据)。

Step 3:展示 MT-bench 分数

# 展示指定模型的分数
python show_result.py --model-list vicuna-13b-v1.3 alpaca-13b llama-13b claude-v1 gpt-3.5-turbo gpt-4

# 展示所有模型的分数
python show_result.py

show_result.py 的默认 --mode single 读取 data/mt_bench/model_judgment/gpt-4_single.jsonl,过滤掉 score == -1 的解析失败记录后分三张表输出:First turn(第一轮平均分)、Second turn(第二轮平均分)和 Average(两轮总分均值),均按分数降序。

pairwise 模式(display_result_pairwise)则统计每个模型的胜/负/平场次,并计算 win_rate_adjusted——每次平局按 0.5 胜 + 0.5 负计入(show_result.py#L84-L89),最终按该调整后的胜率排序。--input-file 可覆盖默认判断文件路径,--bench-name 可指向其他题库(如 vicuna_bench)。

如何获取 GPT-3.5 / GPT-4 / Claude 的答案

要把 API 模型也纳入评测,用 gen_api_answer.py 生成它们的答案:

python gen_api_answer.py --model [MODEL-NAME]

该脚本对 OPENAI_MODEL_LIST / ANTHROPIC_MODEL_LIST 中的模型分别走 OpenAI 或 Anthropic 通道(见 common.py 中的 chat_completion_openai / chat_completion_anthropic),温度选择优先级为:--force-temperature > 题目自带 required_temperature > 类别温度表 > 默认 0.7,同样支持 --parallel 并发与 --num-choices。答案落盘到 data/mt_bench/model_answer/[MODEL-NAME].jsonl,之后即可像本地模型一样参与 Step 2/3。

使用 vLLM 等后端加速答案生成

对 vLLM 支持的模型,用推理引擎替代原生 transformers 生成可显著提速:

  1. 启动 vLLM worker:
vllm serve [MODEL-PATH] --dtype auto

[MODEL-PATH] 同样是本地目录或 HF 仓库 ID。

  1. 把 vLLM 的 OpenAI 兼容接口作为答案来源:
python gen_api_answer.py --model [MODEL-NAME] --openai-api-base http://localhost:8000/v1 --parallel 50

其中 [MODEL-NAME] 是第 1 步中启动的模型名,--parallel 50 表示对 vLLM worker 的并发 API 调用数。对应实现即 gen_api_answer.py#L119-L120--openai-api-baseopenai.api_base 的重定向——同一套答案格式,只是后端从本地推理换成了高吞吐推理服务。

五、人-机裁判一致性验证

仓库开源了 3.3K 条人工标注:6 个模型对 80 道 MT-bench 题目回答的人工判断,对应数据集为 lmsys/mt_bench_human_judgments。配套脚本 compute_agreement.py 可本地复算 GPT-4 成对裁判与人类标注的一致性:

python compute_agreement.py --judges gpt4-pair human --votefiles human_judgments.json gpt4_pair_judgments.json
python compute_agreement.py --judges human human --votefiles human_judgments.json

该脚本按 (question_id, model_a, model_b) 归一化游戏键(模型名排序 + 平票翻转),再统计裁判对之间的同意率。原论文报告的结论是:GPT-4 裁判与人类的一致性超过 80%,达到了人类与人类之间的一致性水平。

六、相关数据集与引用

与本包相关的两个公开数据集(Hugging Face lmsys 组织下):

  • Chatbot Arena Conversation Dataset:真人对战的 Arena 对话数据;
  • MT-bench Human Annotation Dataset:上文提到的 3.3K 条人工判断。

若使用了本代码或数据集,请按文档要求引用论文:

@misc{zheng2023judging,
      title={Judging LLM-as-a-judge with MT-Bench and Chatbot Arena},
      author={Lianmin Zheng and Wei-Lin Chiang and Ying Sheng and Siyuan Zhuang and Zhanghao Wu and Yonghao Zhuang and Zi Lin and Zhuohan Li and Dacheng Li and Eric. P Xing and Hao Zhang and Joseph E. Gonzalez and Ion Stoica},
      year={2023},
      eprint={2306.05685},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}

七、小结:评测流水线的关键文件索引

环节 命令 关键文件
下载预生成数据 python3 download_mt_bench_pregenerated.py download_mt_bench_pregenerated.py
本地浏览答案 python3 qa_browser.py --share qa_browser.py
生成模型答案 python gen_model_answer.py ... gen_model_answer.py
生成裁判判断 python gen_judgment.py --mode ... gen_judgment.py
展示分数 python show_result.py ... show_result.py
生成 API 模型答案 python gen_api_answer.py ... gen_api_answer.py
一致性计算 python compute_agreement.py ... compute_agreement.py
公共数据结构 common.pyjudge_prompts.jsonlquestion.jsonl

整套流程的目录约定非常统一:data/mt_bench/question.jsonl(题库)、data/mt_bench/model_answer/<model>.jsonl(答案)、data/mt_bench/model_judgment/gpt-4_{single,pair}.jsonl(判断)。只要按此约定产出文件,各脚本即可互相衔接,也方便把自定义题库(换 --bench-name)接入同一套裁判与展示逻辑。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.83 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.79 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
988
506
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384