Qwen3.8-27B 的思考模式为什么老是关不掉:三层各管一段,别在错的层找开关
Qwen3.8-27B 的思考模式默认是开着的。想关掉、或者想控制思考的深浅,你会发现网上的说法五花八门:有人说改模板变量,有人说传 enable_thinking,有人说用 reasoning_effort,还有人说加个参数就能让思考内容不返回。
这些说法可能都对,只是它们说的不是同一层。
Qwen3.8-27B 从模型到你的代码之间隔着三层,每一层都有自己的一套控制机制,参数名还长得很像。在错的层找开关,就会出现「我明明传了参数却没效果」的情况。 这篇把三层拆开。
这篇的依据
三层的事实各有来源,采集时间 2026-08-24:
- 模板层:
Qwen/Qwen3.8-27B仓库里的chat_template.jinja - 框架层:vLLM 主干仓库的
vllm/reasoning/目录 - API 层:OpenRouter 的 endpoints 接口返回
我们没有调用过这个模型、没有实际测试过任何一个参数的效果。 本文讲的是各层机制的职责划分,不是参数用法教程——具体参数怎么写,请以你所用框架或平台的当期文档为准。
第一层:模板层,行为的源头
最底下这一层是 chat_template.jinja,它决定输入最终被渲染成什么样的 token 序列。
这一层的几个关键事实本站已经拆过:
思考默认是开的。 模板里的默认行为就是启用思考,你不显式关它,它就一直在(见 思考模式默认开着)。
preserve_thinking 控制思考内容的保留。 这个变量决定历史轮次的思考内容要不要留在上下文里(见 preserve_thinking 控制什么)。
reasoning_effort 名义上三档,模板里只有两档有分支。 这是个很典型的「文档和实现对不上」的例子(见 reasoning_effort 三档)。
这一层是行为的真正源头。 无论上面两层怎么包装,最后都要落到模板渲染出的那串 token 上。模板里没有的分支,上层传什么参数都变不出来——上面那个「三档只有两档有分支」的事实,正是这个道理的直接体现。
第二层:框架层,负责把思考内容切出来
中间这一层是推理框架。它管的事和模板不一样:模板管「怎么让模型思考」,框架管「思考完了怎么把这段内容拆出来」。
模型输出的是一整串 token,思考部分和最终回答混在里面。要在 API 响应里把它们分成两个字段,就需要有人去解析这串输出、找到边界、切开。
vLLM 为此专门有一个 vllm/reasoning/ 目录,采集时里面有三十来个文件,按模型系列分门别类——DeepSeek、Gemma、GLM、Kimi、MiniMax、Mistral 等等各有各的解析器,其中也包括 Qwen3 系列的那一个。
每个模型系列都要单独写一个解析器,这件事本身就说明了问题:各家模型标记思考内容的方式不一样,没有通用格式。有的用特殊 token 包裹,有的用固定字符串分隔,边界规则各不相同。
这一层对使用者的实际意义:
它决定思考内容能不能被单独拿到。 如果框架没有对应的解析器,或者你没有启用它,那思考内容就会混在正常回答里一起返回——模型确实思考了,只是没人帮你分开。
它不改变模型是否思考。 解析器是输出侧的处理,它在模型已经生成完之后才工作。指望通过解析器配置来关掉思考,方向就错了——那是模板层的事。
第三层:API 层,把前两层包装成参数
最上面是你实际调用的那个 API。以 OpenRouter 为例,它的 endpoints 接口里每个供应商都声明了支持的参数,跟思考相关的有三个:
| 参数 | 大致职责 |
|---|---|
reasoning | 思考相关的总体配置 |
include_reasoning | 思考内容要不要回传给你 |
reasoning_effort | 思考的努力档位 |
(这份清单的完整内容和查法见 OpenRouter 上八家供应商给的参数并不一样。)
注意 include_reasoning 和 reasoning_effort 的性质完全不同。
include_reasoning 是传输层的开关——模型照常思考,只是决定这段内容要不要出现在返回给你的 JSON 里。关掉它不会让模型少想,只会让你看不到。
reasoning_effort 则会一路传到模板层去影响模型的实际行为。但前面说了,模板里只有两档有分支——所以你传三个不同的值,实际可能只有两种效果。
三层放在一起,才能解释那些困惑
把三层的职责并排列出来:
模板层决定模型思不思考、思考多深。这是行为的源头。
框架层决定思考内容能不能被切分成独立字段。这是输出的加工。
API 层把前两层的能力包装成参数暴露给你。这是接口的封装。
几个常见困惑,用这个划分就能解释:
「我传了参数,思考还在。」 检查一下你传的是不是 include_reasoning 这类传输层参数——它只管返不返回,不管思不思考。
「思考内容和回答混在一起。」 这是框架层解析器的事,看看你的部署有没有启用对应的解析器。
「我传了三个不同的 effort 值,感觉只有两种表现。」 这符合模板层的实现情况——那里只有两个分支。
「同一份代码换个供应商行为就变了。」 三层里的任何一层都可能因供应商而异。OpenRouter 上八家供应商的 supported_parameters 就不完全相同,底层用的框架和版本更是各不相同。
排查时的建议顺序
遇到思考行为不符合预期,按从上往下的顺序查最省事:
先查 API 层:你传的这个参数,当前供应商的 supported_parameters 里有吗?不在列表里的参数可能被静默忽略。
再查框架层:如果问题是「思考内容的呈现形式不对」,那是解析器的范畴。
最后查模板层:如果问题是「模型的思考行为本身不对」,那就得回到 chat_template.jinja(逐段拆解见 chat_template 四类消息怎么渲染)。这一层是最终解释权所在——模板里没有的分支,上面传什么都没用。
小结
- Qwen3.8-27B 的思考行为由三层共同决定,职责各不相同
- 模板层决定思不思考、思考多深,是行为源头;思考默认开启
- 框架层负责把思考内容从输出里切出来,各模型系列需要各自的解析器;它不影响模型是否思考
- API 层把能力包装成参数;
include_reasoning管返不返回,reasoning_effort会传到模板层 - 模板里没有的分支,上层传什么参数都变不出来——三档只有两档有分支就是明证
- 排查按 API 层 → 框架层 → 模板层的顺序走
这个三层划分不只适用于这一个模型。 现在带思考能力的模型越来越多,几乎都是这个结构:模型自己有一套行为约定,框架负责解析输出,平台再包装成参数。参数名各家不同,但层次是一样的。下次换个模型遇到类似困惑,同样可以按这三层去定位——先问「这个参数属于哪一层」,往往比直接搜参数名有效得多。
更多拆解在 Qwen3.8-27B 专题。