表里 template 写 `-` 的四个模型:base 与 instruct 的取值规则

2026-08-09

本文所有事实以 hiyouga/LlamaFactory 官方仓库 2026-08-09 的内容为准。我们没有安装、训练或部署过任何模型,文中数字与取值均为仓库文档和源码里写着的值。

LlamaFactory 的 README 里有一张支持模型表,三列:Model、Model size、Template。绝大多数行的 Template 列写的是一个具体取值,比如 llama3qwen3_vldeepseekr1。但有四行写的是一个横杠 -。第一次读表的人很容易把它理解成「这个模型还没适配 template」,然后要么绕开这几个模型,要么去 issue 里搜有没有人提过。这两件事都不用做——横杠对应的是表下注解里的一条明确规则。

这篇只讲这一条规则,以及围绕它最容易读错的两三处地方。整张 53 行的模型表怎么读,我们另有一篇专门讲,这里只把跟横杠直接相关的那几行拎出来。

先看是哪四行

按 README 表格原文,Template 列写 - 的一共 4 行:

ModelModel sizeTemplate
BLOOM/BLOOMZ560M/1.1B/1.7B/3B/7.1B/176B-
GPT-20.1B/0.4B/0.8B/1.5B-
Llama7B/13B/33B/65B-
StarCoder 23B/7B/15B-

之所以要把这四行单独列出来,是因为它们的共同点不在参数量、不在厂商、也不在发布年份——BLOOM 最大到 176B,GPT-2 最小只有 0.1B,两头差了三个数量级;Llama 是初代那一档(注意不是 Llama 2 / Llama 3-3.3 / Llama 4,那三行在表里各自有 llama2llama3llama4)。它们的共同点是这一列的取值规则跟别的行不一样。

注解原文里的那条规则

README 在这张表下面给了 6 条注解,其中第一条就是解释横杠的。原文的意思是:对 “base” 模型template 参数可以从 defaultalpacavicuna 等里面选;但对 “instruct/chat” 模型,务必使用对应的 template。

把这条规则和表对齐,横杠的含义就清楚了:它不是「缺失」,是「这一格没有唯一答案」。表里其它行都在这一格填了具体名字,按注解的说法,只要你用的是 instruct/chat 版本,就务必使用对应的那个;而横杠这四行按注解归到 base 一侧,template 从 default / alpaca / vicuna 这类通用取值里挑,于是这一格就变成了一道要你自己做的选择题。注解说到这里就停了——至于这四行为什么是横杠、别的行为什么不是,README 没有给解释,我们也不替它补。

这条规则的两半是不对称的,读的时候别只记住一半:

  • base 这一半是可选,README 给的是 default / alpaca / vicuna ——注意有个「等」字,说明它没打算把候选列全;
  • instruct/chat 这一半是必须,README 用的是「务必使用对应的」这种措辞,没有留选择空间。

也就是说,横杠出现在表里,本身就是一个信号:你在这一行上要自己做决定,而在其它行上不需要。

为什么这里不给「推荐值」

到这一步,最想问的问题一定是:那这四个模型到底该选 default 还是 alpaca 还是 vicuna

README 没有给答案。它只列了候选,没有给「什么数据用哪个」的对应关系,也没有给默认推荐。我们没有装过、没有训练过,同样给不出来。所以这里只能如实说:该选哪一个取决于你的数据格式和下游用法,官方没给通用值。

这不是敷衍。这一列的性质决定了它不可能有通用值——横杠意味着模型侧不做约束,那么约束就只能来自你自己那份数据长什么样、你训完之后打算怎么把 prompt 拼给它。任何一篇文章拍胸脯告诉你「base 模型一律选某某」,都是在替你的数据做假设。

横杠和名字就叫 empty 的 template 不是一回事

这是本篇里最容易混的一处,单独说。

表里 MiniCPM 4/5 那一行的 Template 列写的是 cpm4/empty——也就是说,这一系列里有一档的 template 名字就叫 empty

empty 是一个真实存在的取值,你要在配置里写 template: empty;横杠 - 是表格里的一个占位符,你不能在配置里写 template: -。两者在表里长得有点像(都传达「没有专属格式」的意味),但一个是要照抄进 YAML 的字符串,另一个是排版记号,写混了配置直接就不对。

顺带说一句同样容易混进来的第三样东西:_nothink 后缀。它在整张表里出现在 3 处——ernie_nothinkqwen3_nothinkqwen3_5_nothink。按注解的说法,那是用来区分同一个模型的推理版与非推理版的,跟 base / instruct 这一轴完全是两个维度。关于 _nothink 我们另有一篇专门讲,这里只提醒一句:别把「有没有 _nothink」和「是不是 base」当成同一件事。

判断依据落在哪个文件上

规则读懂了,实际操作里还有一步:怎么确认手上这个模型在这套体系里算哪一档、对应的 template 叫什么。

注解第 6 条给了两个可核查的落点:

  • 完整模型清单src/llamafactory/extras/constants.py。README 那张表是给人看的摘要,真正被代码消费的枚举在这个文件里。
  • 自定义 chat template 加到 src/llamafactory/data/template.py。也就是说,如果你的模型或者你的数据格式在现成取值里对不上,扩展点在这个文件,而不是在 YAML 里硬拼。

这两条的实用价值在于:当 README 表格和你手上的模型对不上时(比如同一系列出了新版本、或者你用的是别人二次训练过的权重),去 constants.py 里比对,比在网上搜别人的 YAML 靠谱。

另外,注解里还有两种带星号的标记要单独说,因为它们和 template 取值无关但常被一起读进去:标 * 的模型需要从 main 分支安装 transformers,并用 DISABLE_VERSION_CHECK=1 跳过版本检查;标 ** 的模型则需要安装特定版本transformers。这两条讲的是依赖,不是 template。

那个环境变量的写法分平台,别抄混了:

# Linux / macOS
export DISABLE_VERSION_CHECK=1
:: Windows
set DISABLE_VERSION_CHECK=1

(以上为按官方给出的变量名组合的示例,未逐项实测,以官方文档与 llamafactory-cli train -h 的实际输出为准。)

选完之后还有一步:两侧要一致

README 这几条注解里有一条是全大写强调的:训练和推理必须用同一个 template(原文用 SAME 这个词做了加粗)。

这条对本篇的意义是:base 模型这一档,你在训练侧从 default / alpaca / vicuna 里挑了哪个,推理侧就得是哪个。表里写了具体名字的那些行,两侧照着同一格抄就完事;而横杠这四行,两侧对齐要你自己记住——你做过一次选择,这个选择就必须被带到推理配置里去。这也是横杠那几行比别的行更容易出问题的地方:不是选错,是选完忘了同步。

template 一致性这件事本身够写一整篇,我们另有一篇专门讲,这里只把它和 base 档的关联点标出来。

什么情况说明问题不在这一列

最后收一下边界,免得把所有毛病都往 template 上归因。

  • 如果你用的模型在表里有具体 template 名(不是横杠),那这篇讲的选择题根本不存在于你的场景里,按那一格给的取值来就行,去别处排查。顺带提醒:有些格里用斜杠列了不止一个名字(比如 Gemma/Gemma 2/CodeGemma 那行写的是 gemma/gemma2),那对应的是同一行里的不同档,别随手抄第一个。
  • 如果你的问题出在依赖版本上(比如带 * / ** 标记的那些模型),那是 transformers 版本的事,跟 template 取值是两条线。
  • 如果你的问题出在训练方式上(Full-tuning、Freeze-tuning、LoRA、QLoRA、OFT、QOFT 这一维),那是另一张表的事——README 把训练方法矩阵单独列成一张表,而模型表只有 Model、Model size、Template 三列,没有按微调方式再分列。那张矩阵怎么读,我们另有一篇专门讲。

把这一列的规则记成一句话就够用:表里写具体名字的,照抄;表里写横杠的,说明这是 base 档、这一格由你的数据决定,选完之后训练和推理两边保持同一个值。


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

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