`_nothink` 后缀出现在哪三处,它在区分什么

2026-08-09

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

在 LlamaFactory 的支持模型表里翻一遍 Template 列,带 _nothink 后缀的取值一共只有三个:ernie_nothinkqwen3_nothinkqwen3_5_nothink。这三个后缀不是可选的风格标记,它决定了训练时给模型套哪一套对话模板;而更容易翻车的是,它和数据参数里那个 enable_thinking 是两个东西,各自都要求训练和推理保持一致。

这篇只做一件很窄的事:把这三处找出来,说清后缀在区分什么、它坐在配置的哪一层、改它会牵动哪些地方。至于该选带后缀的还是不带的,本文不会给你一个”推荐值”——官方没给通用建议,我们也没跑过任何一次训练。

先把这三行原样摘出来

README 的支持模型表我们数了一遍,共 53 行(不含表头)。整张表另有专门篇目在讲,这里只摘与 _nothink 直接相关的几行,外加一行做对照:

ModelModel sizeTemplate
ERNIE-4.50.3B/21B/300Bernie_nothink
Qwen3 (MoE/Instruct/Thinking/Next)0.6B/1.7B/4B/8B/14B/32B/80B/235Bqwen3/qwen3_nothink
Qwen3.50.8B/2B/4B/9B/27B/35B/122B/397Bqwen3_5/qwen3_5_nothink
Qwen3.627B/35Bqwen3_6

摘这四行是因为它们正好把三种情况都覆盖了:成对出现(Qwen3、Qwen3.5)、只有带后缀那一个(ERNIE-4.5)、以及同一家族里根本没出现后缀(Qwen3.6)。

顺带说一个读表的坑。Qwen3 那一行里出现了三处斜杠,含义各不相同:Model 列的 (MoE/Instruct/Thinking/Next) 是模型变体,Model size 列的 0.6B/1.7B/... 是参数量枚举,Template 列的 qwen3/qwen3_nothink 才是 template 参数的两个可选取值。这三列的斜杠在整张表里都不是一个意思——比如 falcon/falcon_h1gemma/gemma2granite3/granite4 这几格,Model 列本身就写了不止一个系列(分别是 Falcon/Falcon H1Gemma/Gemma 2/CodeGemmaGranite 3-4),Template 列的斜杠两边是不同的 template 名;至于哪个名字精确对应哪个系列,表格没有逐一标注,我们也不替它对号入座。而 qwen3/qwen3_nothink 这一格,按后面要讲的那条注解,斜杠两边是同一批模型的两种取值。看表时先分清这一点,能省掉不少填错的功夫。

后缀在区分什么:README 自己给了定义

模型表底下有六条注解,其中第二条就是这件事的原文定义:若模型同时有推理版与非推理版,用 _nothink 后缀区分,README 举的例子正是 qwen3qwen3_nothink

所以后缀的语义很干脆:同一批模型权重下,仓库为”带思考过程”和”不带思考过程”两种对话形态各准备了一个 template 名,靠后缀把它们分开。

紧挨着它的第一条注解也值得一起读:对 base 模型,template 可以从 defaultalpacavicuna 这些通用值里选;但对 instruct / chat 模型,务必用对应的 template。这两条注解在 README 里是挨着的,合起来正好给出一个操作顺序:先按第一条定位到你这个模型该用哪一族 template,再按第二条在这一族里决定要不要带后缀。

顺便记一个对照:整张表里 Template 列直接写 - 的有 4 处(BLOOM/BLOOMZ、GPT-2、初代 Llama、StarCoder 2),按第一条注解,那类就是走通用 template 的。表里还有像 MiniCPM 4/5 这样写成 cpm4/empty 的格子,其中一档 template 的名字就叫 empty。也就是说,template 名的构词法在这张表里并不统一,_nothink 只是其中一种约定,别指望所有模型都按同样的规律命名。

它是一个名字,不是一个开关

这一点最容易被想当然。_nothink 不是某个布尔参数的两种状态,它就是 template 这个字段的取值——你在 YAML 里把字符串写成什么,就用哪一套。

template 出现在数据参数这一层。在 src/llamafactory/hparams/data_args.py 里,template 的默认值是 None,也就是说它没有”猜一个给你”的兜底,得你自己填。

写进配置就是一行:

template: qwen3_nothink

以上为按官方参数语义组合的示例,未逐项实测,以官方文档与 llamafactory-cli train -h 的实际输出为准。

如果你想确认某个 template 名到底存不存在、拼写对不对,README 的第六条注解直接给了两个位置:完整模型清单在 src/llamafactory/extras/constants.py,自定义的 chat template 要加到 src/llamafactory/data/template.py。这两个文件才是最终口径,README 表格是文档,源码是实况,两边不一致时以仓库当前状态为准。

在本地翻这两个文件时,两个平台的做法不一样。Linux / macOS 下:

grep -n "nothink" src/llamafactory/extras/constants.py

Windows PowerShell 下:

Select-String -Pattern "nothink" -Path src\llamafactory\extras\constants.py

这两条只是通用的文本查找做法,不是 LlamaFactory 官方文档里的内容,输出以文件实际内容为准。

别把它和 enable_thinking 混成一件事

搜”关掉思考”的时候,很容易把 _nothink 和另一个参数搅在一起:enable_thinking。它同样在 data_args.py 里,默认值是 True

这两个东西分属两个层次,但共享同一条纪律。template 是”用哪套对话模板”的名字,取值是字符串;enable_thinking 是数据处理侧关于思维链怎么摆放、计不计入损失的开关。data/README.md 里对它的行为有一段专门的 TIP,还提到把它设成 None 时”这个特性相对复杂,使用需谨慎”——那一段我们另有一篇专门讲,这里只取与本篇直接相关的一条:训练与推理时 enable_thinking 必须保持一致

所以你手上其实有两处独立的一致性要求,各管各的:template 名要两侧对齐,enable_thinking 也要两侧对齐。改了其中一个不会自动带上另一个。

训练和推理必须是同一个 template

模型表的六条注解里,有一条把关键词单独用大写强调了:Remember to use the SAME template in training and inference。

这条对 _nothink 尤其要紧,因为带不带后缀在配置文件里只差一个词,肉眼扫过去几乎没有区别。训练用 qwen3、推理侧写成 qwen3_nothink(或者反过来),两个名字都是表里列着的合法取值,光看单侧配置文件看不出哪一侧写岔了。

所以落到操作上,把它当成一条改动纪律更实在:template 是成对的配置项,不是单点配置。你在训练 YAML 里动了 template,就得同时把推理侧的那个值改成一样的。注解原文点名的是 training 与 inference 这两侧,其它环节它没提,我们也不替它扩大范围。review 的时候把两处的 template 行摆在一起比对,是能直接看出来的确认动作。什么情况说明问题不在这儿?如果你两侧配置里的 template 字符串完全相同,那这条规则就已经满足了,别再往这个方向排查。

表里那两处不对称的格子

按注解的说法,_nothink 用来区分”同时有推理版与非推理版”的模型,读起来是个成对的场景。但表里有两处对不上:

  • ERNIE-4.5 那一格只写了 ernie_nothink 一个值,没有配对的、不带后缀的那一半;
  • Qwen3.6 那一格只写了 qwen3_6,同一家族里 Qwen3 和 Qwen3.5 都是成对的,这一行没有出现后缀。

这两处就是表格当前的状态,我们如实说到这里为止。为什么这样写、是不是还没补、后续会不会变,我们都没有核实过,不做推断,也不拿它去评价什么。你要做的只有一件事:别按构词法自己拼一个 ernieqwen3_6_nothink 填进配置。表里没有的名字就当它不存在,实在要确认,回 constants.py 查。

那到底该选哪个

这篇不给推荐值。带不带 _nothink,取决于你要训的是哪种形态的对话数据、下游要不要模型输出思考过程、以及推理侧打算怎么部署——官方没有给通用建议,我们也没有做过任何对比训练,任何”选这个更好”的说法都会超出我们能核实的范围。

能给你的只有可执行的检查清单,全部有原文依据:

  1. 先去表里确认你的模型那一格到底列了几个 template,是一个还是斜杠分开的两个;
  2. 是 base 模型就按第一条注解走通用 template,是 instruct / chat 模型就必须用对应的那一个;
  3. 决定了带不带后缀之后,把训练、推理两侧的 template同时改掉;
  4. 顺手确认 enable_thinking 两侧也一致,它和 template 是两条独立的线;
  5. 拼不准名字就查 src/llamafactory/extras/constants.py,自定义 template 加到 src/llamafactory/data/template.py

_nothink 这个后缀本身没多少玄机,它就是三处命名约定。真正会咬人的是”两侧必须一致”这条纪律,以及”表里没写的名字不要自己造”这条常识。


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

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