对比测试:微调前后Qwen3-0.6B效果差异明显
2026/4/16 11:39:18 网站建设 项目流程

对比测试:微调前后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.json

3.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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

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

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

立即咨询