对比测试:微调前后Qwen3-0.6B效果差异明显
本文将通过一次完整的对比测试,展示Qwen3-0.6B在微调前后的实际表现差异。我们将使用一个信息抽取任务作为测试场景,验证模型在结构化数据提取能力上的提升。整个过程涵盖环境搭建、模型调用、微调流程和效果对比,适合有一定基础但希望深入理解模型行为变化的读者。
1. 实验背景与目标
1.1 为什么选择Qwen3-0.6B?
Qwen3(千问3)是阿里巴巴集团于2025年4月29日开源的新一代通义千问大语言模型系列,涵盖6款密集模型和2款混合专家(MoE)架构模型,参数量从0.6B至235B。其中,Qwen3-0.6B是该系列中最小的版本,具备以下特点:
- 轻量级设计,适合消费级显卡部署
- 支持本地运行,推理速度快
- 可用于快速原型开发和边缘计算场景
尽管其参数规模较小,但在经过适当微调后,仍能在特定任务上达到接近大模型的效果。
1.2 微调能带来什么改变?
预训练语言模型虽然具备广泛的知识和通用对话能力,但在面对结构化输出任务时往往表现不稳定。例如,在需要以 JSON 格式返回姓名、地址、邮箱等字段的场景中,原始模型可能:
- 输出格式不规范
- 遗漏关键字段
- 包含无关内容或推理过程
而通过监督微调(SFT),我们可以让模型“学会”按照指定格式响应,显著提升任务完成度和稳定性。
本次实验的目标就是验证这一点:微调是否能让Qwen3-0.6B在信息抽取任务中实现更准确、更规范的输出?
2. 环境准备与模型调用
2.1 启动镜像并进入Jupyter
我们使用CSDN提供的Qwen3-0.6B镜像环境,启动后即可访问内置的 Jupyter Notebook 服务。该环境已预装 Transformers、LangChain、Peft 等常用库,省去繁琐依赖安装步骤。
登录后打开 Jupyter,创建一个新的.ipynb文件开始操作。
2.2 使用LangChain调用原始模型
首先测试未经微调的 Qwen3-0.6B 模型表现。以下是通过 LangChain 接口调用模型的标准方式:
from langchain_openai import ChatOpenAI import os chat_model = ChatOpenAI( model="Qwen-0.6B", temperature=0.5, base_url="https://gpu-pod694e6fd3bffbd265df09695a-8000.web.gpu.csdn.net/v1", # 替换为当前Jupyter地址 api_key="EMPTY", extra_body={ "enable_thinking": True, "return_reasoning": True, }, streaming=True, ) response = chat_model.invoke("你是谁?") print(response)说明:
base_url需根据实际部署环境替换;api_key="EMPTY"表示无需认证;extra_body中启用了思维链(CoT)功能,便于观察模型推理过程。
3. 微调流程简要回顾
为了进行公平对比,我们需要先完成一次完整的微调流程。以下是对参考博文《新手零基础复现Qwen3-0.6B微调项目指南》的精炼总结。
3.1 数据集准备
我们使用的是一份模拟用户投诉文本的数据集fake_sft.json,每条样本包含如下字段:
{ "system": "将文本中的name、address、email、question提取出来...", "instruction": "请处理以下用户反馈:", "input": "张伟,北京市朝阳区建国路88号...", "output": "{\"name\": \"张伟\", \"address\": \"北京市朝阳区建国路88号\"...}" }下载命令如下:
!wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1a0sf5C209CLW5824TJkUM4olMy0zZWpg' -O fake_sft.json3.2 数据预处理
加载分词器并对输入进行格式化处理:
from transformers import AutoTokenizer model_id = "Qwen/Qwen3-0.6B" tokenizer = AutoTokenizer.from_pretrained(model_id, use_fast=False) def process_func(example): MAX_LENGTH = 1024 instruction = tokenizer( f"<s>><|im_start|>system\n{example['system']}<|im_end|>\n" f"<|im_start|>user\n{example['instruction'] + example['input']}<|im_end|>\n" f"<|im_start|>assistant\n<think>\n\n</think>\n\n", add_special_tokens=False ) response = tokenizer(f"{example['output']}", add_special_tokens=False) input_ids = instruction["input_ids"] + response["input_ids"] + [tokenizer.pad_token_id] attention_mask = instruction["attention_mask"] + response["attention_mask"] + [1] labels = [-100] * len(instruction["input_ids"]) + response["input_ids"] + [tokenizer.pad_token_id] if len(input_ids) > MAX_LENGTH: input_ids = input_ids[:MAX_LENGTH] attention_mask = attention_mask[:MAX_LENGTH] labels = labels[:MAX_LENGTH] return { "input_ids": input_ids, "attention_mask": attention_mask, "labels": labels }3.3 LoRA微调配置
采用参数高效微调方法 LoRA,仅训练部分注意力层的低秩矩阵:
from peft import LoraConfig, get_peft_model config = LoraConfig( task_type="CAUSAL_LM", target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1 ) model = get_peft_model(model, config) print(model.print_trainable_parameters()) # 显示可训练参数比例最终可训练参数占比约为0.57%,极大降低显存消耗。
3.4 训练参数设置
from transformers import TrainingArguments args = TrainingArguments( output_dir="Qwen3_instruct_lora", per_device_train_batch_size=4, gradient_accumulation_steps=4, logging_steps=1, num_train_epochs=3, save_steps=50, learning_rate=1e-4, save_on_each_node=True, gradient_checkpointing=True, report_to="none", )训练耗时约3小时(RTX 4090),最终生成adapter_model.bin权重文件。
4. 效果对比测试
现在我们分别用原始模型和微调后的模型处理相同的输入文本,观察输出差异。
4.1 测试样本
龙琳,宁夏回族自治区璐市城东林街g座 955491,nafan@example.com。小区垃圾堆积成山,晚上噪音扰人清梦,停车难上加难,简直无法忍受!太插件了阿萨德看见啊啥的健康仨都会撒娇看到撒谎的、任务要求:提取 name、address、email、question,并以 JSON 格式输出。
4.2 原始模型输出(未微调)
调用原始模型执行任务:
messages = [ {"role": "system", "content": "将文本中的name、address、email、question提取出来,以json格式输出..."}, {"role": "user", "content": prompt} ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_tensors="pt", return_dict=True, enable_thinking=False ).to('cuda') with torch.no_grad(): outputs = model.generate(**inputs, max_length=2500, do_sample=True, top_k=1) print(tokenizer.decode(outputs[0], skip_special_tokens=True))输出结果:
我需要从这段文字中提取出姓名、地址、电子邮件以及提出的问题。让我逐步分析: 1. 姓名:文中提到“龙琳”,这应该是用户的姓名。 2. 地址:文中提到“宁夏回族自治区璐市城东林街g座 955491”,这是用户的地址。 3. 电子邮件:文中提到“nafan@example.com”,这是用户的电子邮件。 4. 问题:用户反映的问题包括“小区垃圾堆积成山,晚上噪音扰人清梦,停车难上加难,简直无法忍受”。 根据以上分析,整理成JSON格式如下: { "name": "龙琳", "address": "宁夏回族自治区璐市城东林街g座 955491", "email": "nafan@example.com", "question": "小区垃圾堆积成山,晚上噪音扰人清梦,停车难上加难,简直无法忍受" }提取内容基本正确
包含大量推理说明
❌ 不符合“只返回JSON”的指令要求
4.3 微调后模型输出(LoRA适配)
加载微调权重并重新生成:
from peft import PeftModel model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16) model = PeftModel.from_pretrained(model, "Qwen3_instruct_lora/checkpoint-50") # 再次调用生成代码...输出结果:
{ "name": "龙琳", "address": "宁夏回自治区璐市城东林街g座 955491", "email": "nafan@example.com", "question": "小区垃圾堆积成山,晚上噪音扰人清梦,停车难上加难,简直无法忍受" }完全符合 JSON 格式要求
无多余解释文字
字段完整且对齐
4.4 对比分析总结
| 维度 | 原始模型 | 微调后模型 |
|---|---|---|
| 输出格式 | 文本+JSON混合 | 纯JSON |
| 是否包含推理过程 | 是 | 否 |
| 字段完整性 | 完整 | 完整 |
| 指令遵循能力 | 弱 | 强 |
| 实际可用性 | 需二次解析 | 可直接使用 |
核心结论:微调显著提升了模型对结构化输出指令的遵循能力,使其更适合自动化系统集成。
5. 进一步优化建议
虽然本次微调已取得良好效果,但仍有一些改进空间:
5.1 数据质量提升
当前数据集为人工构造的模拟数据,存在少量拼写错误(如“璐市”应为“路市”)。建议:
- 使用真实用户反馈清洗数据
- 增加多样化的表达形式
- 添加边界案例(如缺失字段、模糊表述)
5.2 输出校验机制
即使微调后模型输出较稳定,也建议在生产环境中加入后处理校验:
import json def safe_parse_json(text): try: return json.loads(text.strip()) except json.JSONDecodeError: # 尝试修复常见错误 text = text.replace("\n", "").replace("```json", "").replace("```", "") try: return json.loads(text) except: return {"error": "无法解析输出"}5.3 多轮对话支持
当前模型仅支持单轮提取任务。若需支持连续交互(如补充信息、修改字段),可在微调数据中引入多轮对话模板,增强上下文理解能力。
6. 总结
6.1 微调价值再认识
本次对比测试清晰地展示了微调的价值:
- 原始模型:知识丰富但行为不可控,适合开放问答
- 微调模型:行为可控、输出规范,适合工业级应用
对于需要高一致性输出的任务(如信息抽取、表单填写、API响应生成),微调几乎是必选项。
6.2 Qwen3-0.6B 的适用场景
结合本次实验,我们认为 Qwen3-0.6B 特别适合以下场景:
- 轻量级 NLP 工具开发
- 企业内部自动化助手
- 边缘设备上的本地化部署
- 快速验证产品原型
它不是用来替代大模型的,而是作为一个低成本、高响应速度的专用工具模型。
6.3 下一步可以做什么?
- 将微调后的模型封装为 FastAPI 服务
- 构建前端页面实现批量上传与导出
- 在更大规模的真实数据上评估准确率
- 尝试量化压缩以进一步降低部署成本
只要掌握微调方法,即使是 0.6B 这样的小模型,也能在特定任务上发挥巨大价值。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。