FastChat LLM Judge:MT-Bench 与 LLM-as-a-Judge 评测框架完全实战指南
本文基于 FastChat 仓库中的 LLM Judge 文档 展开,系统讲解如何使用 MT-bench 题库和 GPT-4 等强模型作为裁判(LLM-as-a-judge)来自动化评测对话模型:包括环境安装、生成被评测模型的 80 道多轮开放式问题回答、以单答案打分或成对比较两种方式生成裁判判断、汇总展示分数,以及使用 vLLM 等后端加速答案生成的完整流程。读完本文,你可以直接复现 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_id、category 和 turns 字段,例如:
{"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_config,common.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.1(common.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<1、anthropic>=0.3、ray——分别用于调用 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.jsonl 与 gpt-4_pair.jsonl,落盘目录与后续评测输出目录完全一致:
data/mt_bench/model_answer/<model>.jsonldata/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-turn、single-math-v1-multi-turn; - 成对类:
pair-v2、pair-math-v1、pair-v2-multi-turn、pair-math-v1-multi-turn(输出格式[[A]]/[[B]]/[[C]],C 表示平局)。
gen_judgment.py 中 make_judge_single / make_judge_pairwise 会一次性注册这四组 Judge,运行时按题目类别与轮数路由:math/reasoning/coding 等 NEED_REF_CATS 类别走带参考答案的模板,双轮题目走 -multi-turn 模板并只评估第二轮回答(见 gen_judgment.py#L234-L289)。
成对比较的反位置偏差机制。在 pairwise 模式下,common.py 的 play_a_match_pair(common.py#L313-L360)会对同一题调换 A/B 位置调用裁判两次(g1 与 g2);只有两次结论一致才记为胜负,否则记为 inconsistent。这从实现层面消除了"先出现的答案占优"的位置偏差。裁判调用的容错参数为 API_MAX_RETRY = 16、API_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 生成可显著提速:
- 启动 vLLM worker:
vllm serve [MODEL-PATH] --dtype auto
[MODEL-PATH] 同样是本地目录或 HF 仓库 ID。
- 把 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-base 对 openai.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.py、judge_prompts.jsonl、question.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)接入同一套裁判与展示逻辑。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
