☰
给模型“减负“:LoRA 微调砍掉 58% 思考 Token 的完整实操(含代码)
2026/10/11 12:48:57 网站建设 项目流程

给模型"减负":LoRA 微调砍掉 58% 思考 Token 的完整实操(含代码)

【免费下载链接】Swift-Qwen3.8-27b项目地址: https://ai.gitcode.com/hf_mirrors/ukisai/Swift-Qwen3.8-27b

2026 年以来,推理模型(reasoning model)的"过度思考"问题逐渐从段子变成真金白银的成本问题:模型会在<think>区块里反复自我验证、列举假设、甚至把简单问题拆成十步推理链,而用户最终看到的正确率并没有显著提升。对 API 计费、高并发 Agent、端侧部署来说,每一千个"想太多"的 Token 都是实打实的延迟与开销。UkisAI 开源的 Swift-Qwen3.8-27B,正是冲着这个痛点来的——它不改架构、不动权重规模,只靠一个 LoRA 适配器,就把思考 Token 的中位数砍掉 58.3%,推理提速约 1.95 倍,而 9 项主流基准上的精度损失不到 1%,甚至有个别科目分数反超原版。本文基于仓库源码与公开评测数据,拆解它的"惩罚式微调"思路,并给出基于 ms-swift 的复刻训练配方与 vLLM / SGLang / Transformers 全链路部署代码。

一、痛点:推理模型为什么"想太多"

Qwen3.8-27B 默认开启思考模式时,模型会在最终答案前输出一段被<think>与</think>包裹的推理过程。推理过程本身是模型能力的一部分,但统计表明其中存在大量冗余:同一思路换着说法重述、对已确认的结论反复验证、为低风险任务生成过长的假设枚举。以仓库 README.md 中公布的基线数据为例,原版模型在 GPQA-Diamond 上平均要写 15,014 个思考 Token,在 AIME 2026 上更是平均 22,014 个——这些 Token 全部要经过前向计算,直接决定首 Token 延迟、总延迟与 KV Cache 占用。

社区评测也印证了这一点:原版 Qwen3.8 系列"表现出色但默认设置易过度思考",大量用户在低难度任务上不得不手动降低reasoning_effort来换速度,代价是精度随之下降。Swift-Qwen3.8-27B 想解决的是更本质的问题:在不牺牲精度的前提下,把模型"学会"的冗余思考习惯改掉。

二、惩罚式微调原理:定位冗余推理 Token

Swift 的训练思路在 README.md 的 Training approach 一节中有明确交代,核心分三步:

  1. 推理标记定位(reasoning-marker identification):对基座模型 Qwen3.8-27B 的大规模推理轨迹(reasoning rollouts)做分析,找出那些"触发过度思考"的标记性 Token——即在推理链中高频出现、但和最终答案正确性相关性极低的 Token。
  2. 惩罚式微调(penalizing):在模型推理(reasoning)阶段对这些标记 Token 的生成施加惩罚,压低它们的条件概率,从而让模型在保留必要推理步骤的同时,跳过"想到了还要再想一遍"的循环。
  3. 迁移增强(transfer component):为了在极限档位(xhigh)下拿到最大收益,Swift 还融合了源自 BottleCap AI 的 ThinkingCap-Qwen3.6-27B 的迁移组件,相当于在"少思考"方向上叠加了一层先验知识。

结果就是更短的推理轨迹,以及官方测试中观察到的"更少的过度思考错误"。注意一个关键点:这属于行为层面的偏好塑造,而非能力压缩——模型权重结构完全没有改动。

仓库的 NOTICE 文件从工程侧佐证了这一点:UkisAI 的贡献是"LoRA adapter trained by UkisAI and merged into the Base Model weights",即用 LoRA 训练出的适配器被合并回基座权重,最终发布的是合并后的完整权重;除此之外只改了 generation_config.json(新增"min_p": 0与"repetition_penalty": 1.0两项采样参数)和 README,其余配置文件均与基座保持一致。也就是说,微调没有动任何一层架构,全靠 LoRA 低秩增量引导行为。

那么"惩罚"具体落在哪些 Token 上?从 tokenizer_config.json 可以看到,<think>与</think>分别对应 248068、248069 两个常规(非 special)Token,是思考区的边界标记;而 chat_template.jinja 在生成 prompt 时会在add_generation_prompt阶段强制写入<think>\n引导模型进入推理。惩罚式微调的目标正是推理区内部那些"凑数型"Token——它不删<think>结构(保留推理能力),而是让模型在同样的结构里"少写废话"。

三、仓库解剖:LoRA 适配器合并后的模型长什么样

既然改动发生在权重而非架构,那发布产物里最值得看的其实是两个文件:架构定义 config.json 和对话模板 chat_template.jinja。

混合注意力架构(基座自带,Swift 继承)。config.json显示这是 64 层 Transformer,其中 48 层为linear_attention(Mamba 风格的线性注意力,SSM 状态以 float32 计算,显存占用恒定),16 层为full_attention,按"3 线性 + 1 全注意力"的节奏(full_attention_interval: 4)交错排布。全注意力层采用 GQA 分组(num_attention_heads: 24,num_key_value_heads: 4,即 6:1),配合partial_rotary_factor: 0.25的部分 RoPE 与rope_theta: 10000000,支撑max_position_embeddings: 262144(262K)的超长上下文。此外mtp_num_hidden_layers: 1说明权重中还保留了基座的 MTP(Multi-Token Prediction)头,可用于自推测解码(后文部署部分会用到)。vision_config表明这是图文多模态模型,视觉塔 27 层、patch 16、含视频时序建模。

reasoning_effort 三档开关。chat_template.jinja 是理解 Swift"减负可调"的关键:模板内置了reasoning_effort参数(支持xhigh/medium/low,默认xhigh),并在系统提示中注入对应指令——xhigh要求"carefully through the task, validate key assumptions, consider plausible alternatives",low则要求"keep your thinking brief and focused, moving directly to the conclusion"。这意味着同一次部署,可以通过 API 实时切换推理深度,而不需要换模型:高难度任务用 xhigh 保精度,日常问答切 low 压延迟。这正是"给模型减负"的产品化出口。

采样配置。generation_config.json 与 README 的评测复现说明一致:temperature 1.0、top_p 0.95、top_k 20、min_p 0、repetition_penalty 1.0,全部 9 项基准在 5 个随机种子(0–4)上取平均。全量权重约 55.56 GB(model.safetensors.index.json 的total_size),拆成 18 个分片发布。仓库还附带了 swift-speed-demo.mp4 演示视频(提示词取自 LiveCodeBench v6 样例),直观展示思考量缩减前后的差异。

四、基于 ms-swift 的 LoRA 复刻配方(含代码)

需要说明的是:仓库发布的是合并后的权重,UkisAI 未公开训练脚本与精确超参(这在该领域很常见)。但"定位标记 Token + 惩罚 + LoRA"的完整链路,完全可以用魔搭社区的 ms-swift 框架在 Qwen3.8-27B 基座上自行复刻。ms-swift 是 ModelScope 开源的统一微调框架,支持 LoRA / QLoRA / 全参微调、多模态与 Megatron 并行,也是社区里 Qwen 系列 LoRA 微调的主流工具。以下配方基于 ms-swift 的公开用法与社区实践整理,属于"参考实现"而非原版训练配置,跑通后按需调整数据规模与惩罚强度即可。

第 1 步:安装与数据准备。ms-swift 通过 pip 安装;LoRA 微调的数据集采用对话格式(JSONL),每条样本是 role/content 序列。若想复刻"惩罚冗余思考",建议数据中同时包含"长思考 + 正确答案"与"短思考 + 正确答案"两类样本,并把思考区放在<think>标签内,让模型在监督学习阶段直接学到"短思考也能答对"的分布:

pip install 'ms-swift[llm]' -U
{"messages": [{"role": "user", "content": "计算 17×23 的结果。"}, {"role": "assistant", "content": "<think>17×23=17×20+17×3=340+51=391。</think> 结果是 391。"}]} {"messages": [{"role": "user", "content": "中国首都是哪座城市?"}, {"role": "assistant", "content": "<think>北京。</think> 北京。"}]}

第 2 步:LoRA 训练。核心超参围绕"低秩、小步长、短周期"设计——LoRA 的初衷就是在少量可训练参数上做偏好修正,秩太高容易破坏基座能力,学习率过大会导致灾难性遗忘:

swift sft \ --model Qwen/Qwen3.8-27B \ --train_type lora \ --lora_rank 16 \ --lora_alpha 32 \ --lora_dropout 0.05 \ --target_modules all-linear \ --dataset train.jsonl \ --num_train_epochs 2 \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --learning_rate 1e-5 \ --lr_scheduler_type cosine \ --warmup_ratio 0.05 \ --max_length 4096 \ --gradient_checkpointing true \ --output_dir output/swift-qwen3.8-27b

几个参数的选择逻辑:

  • lora_rank 16 / alpha 32:中等秩、2 倍缩放,是 Qwen 系 LoRA 微调的经验起点,兼顾可塑性(足够表达"少思考"的偏好)与稳定性(不至于把推理能力洗掉);
  • target_modules all-linear:ms-swift 默认覆盖全部线性层,让偏好修正均匀分布在整个网络中;若显存紧张可改用 QLoRA(--quant_bits 4)在消费级显卡上训练;
  • learning_rate 1e-5+cosine调度:惩罚式微调本质是微扰而非重建,小学习率避免对基座分布造成剧烈偏移;
  • 训练周期 2、max_length 4096:思考 Token 削减任务样本量不必大,重点在数据里"短思考-正确"样本的比例与质量。

第 3 步:合并与评测。训练产出的是 LoRA 适配器,发布或部署前需要合并回基座权重(Swift 官方正是这样发布的,见 NOTICE):

swift export \ --model Qwen/Qwen3.8-27B \ --ckpt output/swift-qwen3.8-27b/vx-xxx/checkpoint-xxx \ --merge_lora true \ --output_dir output/swift-qwen3.8-27b-merged

合并完成后,建议立即用第 5 节的评测流程对照基座跑一遍基准,重点看两个指标:思考 Token 的均值/中位数削减幅度和精度的损失是否在 1% 以内。如果精度掉得多,优先降低学习率或增大秩;如果 Token 没降下来,则检查数据中"短思考"样本占比,并考虑对标记 Token 做更激进的惩罚权重。

五、评测验证:C-Eval、LiveCodeBench 与推理速度对比

这一节的全部数字均来自仓库 README.md 的公开评测表:同一份 Qwen3.8-27B BF16 基座,对比"基座"与"基座 + Swift 适配器",采样配置统一(temperature 1.0、top_p 0.95、top_k 20),每个基准 5 个种子取平均。注意评测设置里的一个重要细节:所有推理强度均使用thinking xhigh——也就是说,Swift 是在"最费 Token"的档位上完成削减的,含金量比在 low 档上做文章高得多。

基准基座分数Swift 分数思考 Token(均值)削减
GPQA-Diamond88.38%88.28%↓41.0%(中位数 ↓58.3%)
C-Eval90.00%90.62%↓46.1%
MMLU-Pro85.47%84.95%↓46.2%
IFBench73.53%71.80%↓42.2%
AIME 202698.67%94.00%↓26.7%
HMMT (Nov 2025)99.33%96.00%↓31.1%
ERQA(多模态)67.45%66.30%↓50.6%
Terminal-Bench 2.166.74%65.84%↓26.5%
LiveCodeBench v676.76%81.55%↓24.3%

三个值得展开的结论:

  1. "58%"来自中位数,最保守地讲也不小于 41%。GPQA-Diamond 上基座平均 15,014 个思考 Token、中位数 6,642;Swift 平均 8,855(↓41.0%)、中位数 2,771(↓58.3%)。中位数比均值削减更狠,说明 Swift 主要砍掉了那些"拖尾"的超长推理样本——这正是过度思考最严重的场景。标题中的"58%"对应中位数,均值口径下是 41% 起步,二者口径不同但方向一致。

  2. 精度损失 <1%,且代码类任务不降反升。9 项基准中,幅度最大的损失是 AIME 的 -4.67pp 和 HMMT 的 -3.33pp(数学竞赛本身就是长推理收益最高的场景,属于预期的取舍区),其余科目损失均在 1.7pp 以内,C-Eval 反而从 90.00% 涨到 90.62%,LiveCodeBench v6 从 76.76% 涨到 81.55%(+4.79pp)——短而准的推理轨迹对代码生成这类任务格外友好,"少想"反而降低了在错误路径上越走越远的概率。

  3. 推理提速约 1.95 倍。README 给出的 x1.95 speed-up 是"在若干任务上"的实测结果,其来源完全可解释:自回归解码的总延迟约等于 Token 数 × 每 Token 延迟,思考 Token 减少 41%–58%,端到端吞吐自然接近翻倍;而 262K 上下文下的 KV Cache 占用也随之线性下降,对长上下文任务(Agent 多轮、文档分析)的收益更大。

跨档位验证:Swift 的削减在 xhigh / medium / low 三档都成立——均值思考量分别下降 41.0%、22.7%、25.8%。官方还在 GPQA-Diamond 上做了 198 题 × 5 种子 × 3 配置的成对对比:Swift@xhigh 得 88.28%(Token 8,855),基座@xhigh 得 88.38%(15,014),基座@medium 得 84.14%(4,451)。结论很清晰:Swift 用接近 medium 一半的 Token 数守住了 xhigh 的精度——在"少思考、高精度"两个目标上同时优于基座的任何单档位。

量化后的减负是否保值:这是社区最关心的问题(INT4/AWQ 低显存部署会不会把 Token 节省冲掉)。README 的 INT4 评测表显示:GPQA W4A16 混合精度量化下,思考 Token 均值 ↓32.1%、中位数 ↓50.2%;AIME 在 W4A16 下分数持平(84.00% vs 84.00%),在 AWQ INT4 下反而从 82.67% 涨到 84.00%;并且 AIME 的截断(output-cap 失败)样本减少了31–33%——因为思考变短,撞上输出上限的概率更低。对显存只够跑 INT4 的部署方来说,这套"短思考 + 低权重"的组合正是它的目标场景。

六、部署实操:Transformers / vLLM / SGLang / MTP(含代码)

仓库在 README.md 中提供了四种开箱即用的部署方式,全部兼容reasoning_effort与思考模式开关。

Transformers 直接加载(注意这是多模态模型,用AutoModelForImageTextToText而非纯文本类):

import torch from transformers import AutoModelForImageTextToText, AutoProcessor model_id = "ukisai/Swift-Qwen3.8-27b" processor = AutoProcessor.from_pretrained(model_id) model = AutoModelForImageTextToText.from_pretrained( model_id, torch_dtype=torch.bfloat16, device_map="auto", )

vLLM 生产级服务(关键参数:--reasoning-parser qwen3负责解析思考区,--max-model-len 262144吃满长上下文,--enable-auto-tool-choice开启 Agent 工具调用):

vllm serve ukisai/Swift-Qwen3.8-27b \ --dtype bfloat16 \ --tensor-parallel-size 1 \ --max-model-len 262144 \ --reasoning-parser qwen3 \ --enable-auto-tool-choice \ --tool-call-parser qwen3_coder \ --port 8000

SGLang 备选:

python -m sglang.launch_server \ --model-path ukisai/Swift-Qwen3.8-27b \ --dtype bfloat16 \ --tp-size 1 \ --context-length 262144 \ --reasoning-parser qwen3 \ --tool-call-parser qwen3_coder \ --port 8000

MTP 自推测解码:由于权重保留了基座的 MTP 头(config.json 中mtp_num_hidden_layers: 1,model.safetensors.index.json 中可见mtp.*权重),可以在上述命令后追加推测解码参数,让"短思考"与"推测解码"叠加——注意这是推理侧的第二重加速,与微调无关:

# vLLM --speculative-config '{"method":"mtp","num_speculative_tokens":3}' # SGLang --speculative-algorithm EAGLE --speculative-num-steps 3 \ --speculative-eagle-topk 1 --speculative-num-draft-tokens 4

运行时调节推理深度:利用 chat_template.jinja 内置的reasoning_effort参数,同一次部署即可在 xhigh / medium / low 之间切换;enable_thinking=false则完全关闭思考区(模板会输出空<think>\n\n</think>占位)。生产环境建议把"高难度请求走 xhigh、日常请求走 low"做成路由策略,把 Token 预算花在刀刃上。

结语:Token 减负的边界与适用场景

Swift-Qwen3.8-27B 的完整证据链(README.md 的训练思路与 9 项评测、NOTICE 的变更清单、chat_template.jinja 的档位机制)把"LoRA 减负"这件事讲得很清楚:它不改变模型的知识上限,而是修剪推理链中的冗余枝节。因此它的适用边界同样清晰——在数学竞赛等"长推理=高精度"的任务上,AIME -4.67pp 的代价是真实的;但在通用推理、中文评测(C-Eval +0.62pp)、代码生成(LiveCodeBench +4.79pp)、Agent 多轮与低显存量化场景下,它把"思考 Token 减少 41%–58%、推理提速近 2 倍、精度损失 <1%"同时做到了。对按 Token 计费的 API 调用方、高并发 Agent 后端和消费级硬件部署者来说,这等于在不换架构的前提下,给每个请求的推理预算做了一次系统性瘦身。而 ms-swift 的 LoRA 配方让这套思路可以迁移到自己的模型与数据上——减负不是目的,把省下的算力投给真正需要深度思考的任务,才是目的。

【免费下载链接】Swift-Qwen3.8-27b项目地址: https://ai.gitcode.com/hf_mirrors/ukisai/Swift-Qwen3.8-27b

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询