评测默认 5-shot、种子 42:LlamaFactory 的七个评测参数

2026-08-09

本文所有事实以 hiyouga/LlamaFactory 官方仓库 2026-08-09 的内容为准。文中所有默认值都是从 src/llamafactory/hparams/evaluation_args.pyfield(default=...) 里读出来的。我们没有安装、训练或评测过任何模型,不描述任何评测结果。

src/llamafactory/hparams/ 这个目录下,evaluation_args.py 是最容易被跳过的一个文件——它只有七个字段,比微调参数那一大摞短得多。但恰恰是这七个字段决定了「你以为你在测什么」和「它实际在测什么」之间会不会出现偏差,因为它们全都有默认值,你不写,它们就按默认值生效。

最典型的两个:评测默认是 5-shotn_shot 默认 5),默认语言是 enlang 默认 "en")。这两个值都不是「未设置」,是实打实写在源码里的默认。

先把七个字段摆出来

参数默认值
task_dir"evaluation"
batch_size4
seed42
lang"en"
n_shot5
save_dirNone
download_modeDownloadMode.REUSE_DATASET_IF_EXISTS

这张表不长,但读它有个前提要先立住:这些是 field(default=...) 里的值,不是官方推荐的评测口径。 默认值的含义只有一条——你没显式写,就用这个。它不代表项目方认为「评测就该这么测」,也不代表这组取值在你的任务上合适。下面每一条都按这个前提来读。

逐个说:它们各自钉住的是哪一层

task_dir:默认是相对目录名 "evaluation"

它的默认值是一个不带任何前缀的字符串 "evaluation",不是绝对路径。这一点值得单独指出来:源码里给的就是一个裸目录名,至于它具体相对什么位置解析、找不到时会怎样,属于我们没有核对过的实现细节,本文不推断——真要确认,只能看你手上这个版本 -h 的实际输出和实现代码。

你能从默认值本身确定的只有一件事:这个字段指向的是「装评测数据集的那个文件夹」,而且默认它就在名为 evaluation 的目录里。

batch_size:默认 4

这是评测侧自己的批大小字段,默认 4

要注意的是它和训练侧的批大小不是同一个参数hparams/ 目录下还有一个 training_args.py,那个文件里的字段我们没有抽取,因此本文不描述它包含什么——只说结构上的事实:训练与评测的参数被拆在不同文件里,各有各的字段名。你在配置里改了训练那一侧的批大小,不等于评测这一侧跟着变。

seed:默认 42,注意它是「固定」不是「随机」

seed 默认 42

这个字段最容易被误读的地方在于:它默认不是「每次随机」,而是「每次都固定为 42」。 field(default=42) 的语义就是你不写它,它就是 42。所以两次没改配置的评测之间,这个随机来源是被钉死在同一个值上的。

反过来说也成立:如果你比较两次评测的差异,先确认这个字段有没有被人动过——不同的 seed 值和相同的 seed 值,是两种完全不同的比较前提。至于该不该改、改成多少,取决于你的评测设计,官方没给通用值。

lang:默认 "en"

默认语言是 "en"

对中文场景的读者来说,这大概是七个字段里最需要留意的一个:你什么都不写,它按 en 走。 这个字段可以取哪些值、取别的值会带来什么区别,源码之外我们没有核实的依据,请以 llamafactory-cli 对应子命令 -h 的实际输出为准。这里只陈述默认值本身。

n_shot:默认 5

字段名义上,n_shot 是 few-shot 评测里给出的示例条数,默认 5

这条也是「默认值不是零」的典型:不显式设置,评测走的就是 5-shot,而不是不给示例。如果你手上有一份别处得来的评测数字,想跟自己跑出来的对比,那么两边是不是同一个 n_shot,属于必须先对齐的前提之一。

同样地,5 这个数在你的任务上是多是少,我们不做判断,也不给推荐值。

save_dir:默认 None

save_dir 默认是 None,即默认不指定评测结果的保存目录。

None 这种默认值在这个仓库里很常见,同一张参数卡里就有一批:导出用的 export_dir 默认 Noneswanlab_logdir 默认 Noneref_modelreward_model 默认也都是 None。读到 None 的时候,唯一能确定的是「代码里没有给它一个具体值」,具体不给值时走什么分支,得看实现,本文不推断。

download_mode:默认「若已存在则复用」

download_mode 默认是 DownloadMode.REUSE_DATASET_IF_EXISTS

这个枚举名本身把语义写清楚了:数据集已经在本地了就复用,不重新下载。 这是七个字段里唯一一个默认值自带语义解释的——其它六个是数字、字符串或 None,这一个是枚举常量。

这组参数不管的三件事

看清楚边界,比背下默认值更有用。hparams/ 目录下的文件是这样分的(实读目录):

src/llamafactory/hparams/
  __init__.py
  data_args.py
  evaluation_args.py
  finetuning_args.py
  generating_args.py
  megatron_bridge_args.py
  model_args.py
  parser.py
  training_args.py

也就是说,仓库把超参按数据 / 模型 / 微调 / 生成 / 评测 / 训练 / Megatron 桥接分成了 8 个文件。评测这一组只占其中一个,于是它明确不管这三件事:

  • 不管用哪个模型、怎么量化。 model_name_or_pathquantization_bittrust_remote_code 这些在 model_args.py
  • 不管数据长什么样。 数据侧的字段在 data_args.py
  • 不管采样怎么做。 这一条最容易找错地方:temperaturetop_ptop_kmax_new_tokens 全在 generating_args.py,不在 evaluation_args.py。顺带说一个很多人会记岔的值——generating_args.pytemperature 的默认是 0.95top_p0.7,跟不少人凭印象记住的那一组并不一样。关于生成参数我们另有一篇专门讲,这里只提醒你:在评测参数里翻采样设置,是翻不到的。

另外,megatron_bridge_args.pyparser.pytraining_args.py 这三个文件的字段我们没有抽取,所以本文不描述它们的内容,只承认它们在结构上存在。

三个容易读错的地方

第一,默认值不是基准线。 前面说过一遍,这里再钉一次:n_shot=5seed=42lang="en" 是代码默认,不是「官方评测基准的设定」。拿它去跟任何第三方公布的评测数字对齐之前,先确认对方用的是什么口径。

第二,评测参数少不代表评测简单。 七个字段确实比微调那边少得多,但从目录结构上看,模型、数据、生成三层的参数各自在别的文件里。所以你要完整记录一次评测用了什么配置,要翻的不止 evaluation_args.py 这一个文件。

第三,别把默认值抄成配置模板。 参数与默认值随版本变动。要确认你手上这个版本的实际取值,唯一可靠的办法是看 -h 的实际输出,而不是抄一篇文章里的表——包括这一篇。

那么,这七个字段该怎么设

诚实的答案是:取决于你的评测任务、评测数据和硬件,官方没有给出通用值,我们也没有跑过任何一次评测,不给推荐值。

能给的只有一条可执行的动作:把这七个字段当成一份「评测口径清单」,在你记录任何一个评测结果的时候,连同这七个值一起记下来。以后无论是自己前后对比,还是跟别人的数字比,先比这七行,再比分数。默认值帮你少写了配置,但它同时也意味着——没写下来的那部分口径,是隐式生效的。

至于评测走的是哪条命令、llamafactory-cli 的子命令各自怎么分工,不在这七个字段的范围内,我们另有一篇专门讲。


本文依据 LlamaFactory 官方仓库(github.com/hiyouga/LlamaFactory)的 README、data/README.mdexamples/ 下的配置与 src/llamafactory/hparams/ 的参数定义整理,核对日 2026-08-09。本文内容为仓库源码与文档口径,我们没有安装、训练或部署过任何模型,文中显存数字均为官方标注的估算值(README 原文标 * estimated)而非实测占用。参数与默认值随版本变动,请以 llamafactory-cli train -h 的实际输出为准。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。