背景
大参数模型效果好,但成本高、响应慢。为了在保障效果的同时提升推理速度、降低成本,可首先借助大参数模型完成目标任务的数据生成,并使用这些数据微调小参数模型,使其在特定任务中达到接近大参数模型的表现,这一过程也被称为模型蒸馏。
本方案将以从一句话中提取结构化信息(如收件人、地址、电话)为例,演示如何通过模型蒸馏,让 Qwen3-0.6B 模型在此任务上达到大参数模型的表现。
效果对比

方案路线
数据准备
由于真实的物流填单数据涉及到用户隐私,我们将使用一批虚拟地址描述信息作为输入,并使用 Qwen3-235B-A22B 作为教师模型提取结构化的信息作为输出。
模型微调
在获取教师模型的输入输出后,我们可以使用该数据来微调 Qwen3-0.6B 模型,提升其在此任务场景下的表现。这里我们将使用魔搭社区提供的 ms-swift 框架,即使您不了解微调算法的细节,依然可以借通过一行命令来完成微调任务。
效果验证
最后,为了确保模型在真实业务场景中的稳定性与准确性,建议在部署到生产环境前准备评测数据与评测标准,对微调后的模型进行效果验证。
配置计算环境
大模型微调对计算环境有较高要求,需配套安装合适版本的 GPU 驱动、CUDA(NVIDIA的并行计算平台和编程模型)和 cuDNN(NVIDIA的深度神经网络加速库)。手动通过命令行安装不仅步骤繁琐,而且容易出错。为提升部署效率,可在创建 GPU 云服务器实例时选择带有 GPU 驱动的镜像,省去复杂的命令行操作,快速启动微调任务。此处采用试用的方式进行体验。
在界面中单击立即试用,右侧将实时展示资源创建进程。

单击左侧的远程连接按钮,再单击登录,即可连接到 GPU 云服务器。

准备数据
高质量的数据集可以为微调过程提供充足的输入–输出示例,使小模型能够准确学习并在真实场景中稳定输出准确结果。本方案所需要的数据包含收件人地址信息与对应的结构化信息两部分:

为了将教师模型(Qwen3-235B-A22B)处理该任务的知识蒸馏到 Qwen3-0.6B 中,我们需要先调用教师模型的 API,将收件人的地址信息提取成结构化的 JSON 数据。
调用教师模型生成这些 JSON 数据需要耗费一些时间,需要在终端运行以下命令,来直接下载我们提前准备好的数据。
# 进入 /root 目录
cd /root && \
# 下载训练数据 train.jsonl
curl -f -o train.jsonl "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250610/azvmpb/train_with_system.jsonl"

下载并微调模型
微调模型通常上手门槛较高。通过魔搭社区提供的 ms-swift 框架,仅需一句命令即可快速启动微调任务,大幅降低操作复杂度。
本方案依赖以下两个核心组件:
ms-swift : 魔搭社区提供的训练框架,支持模型的下载、微调和权重合并,极大简化了微调流程。
vllm : 用于部署微调后的模型,支持高性能推理服务,不仅方便验证微调效果,还可用于生成 API,供业务方直接调用。
在终端运行以下命令来安装依赖:
pip3 install vllm==0.9.0.1 ms-swift==3.5.0

运行以下命令可以完成模型下载、微调、合并权重的操作:
# 进入 /root 目录
cd /root && \
# 下载微调脚本 sft.sh
curl -f -o sft.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250623/cggwpz/sft.sh" && \
# 执行微调脚本
bash sft.sh
模型微调核心代码如下,您可以在 sft.sh 文件中看到:
swift sft \
--model Qwen/Qwen3-0.6B \
--train_type lora \
--dataset 'train.jsonl' \
--torch_dtype bfloat16 \
--num_train_epochs 10 \
--per_device_train_batch_size 20 \
--per_device_eval_batch_size 20 \
--learning_rate 1e-4 \
--lora_rank 8 \
--lora_alpha 32 \
--target_modules all-linear \
--gradient_accumulation_steps 16 \
--save_steps 1 \
--save_total_limit 2 \
--logging_steps 2 \
--max_length 2048 \
--output_dir output \
--warmup_ratio 0.05 \
--dataloader_num_workers 4
微调模型大约需要10分钟,期间会实时打印如下所示的模型在训练集与验证集的损失变化情况:

当出现以下信息表明模型微调已完成:

完成该步骤会在output/v0-xxx-xxx路径下生成带有 merged 后缀的文件夹,为微调后的模型文件。
我们可以在output/v0-xxx-xxx路径下中找到 images 文件夹,打开 train_loss.png(反映训练集损失) 与 eval_loss.png(反映验证集损失),根据损失值的变化趋势初步判断当前模型的训练效果:
在结束训练前 train_loss 与 eval_loss 仍有下降趋势(欠拟合),那么就可以增加 num_train_epochs(训练轮次,与训练深度正相关) 参数,或适当增大 lora_rank(低秩矩阵的秩,秩越大,模型能表达更复杂的任务,但更容易过度训练)的值后再进行训练,加大模型的对训练数据的拟合程度;
在结束训练前 train_loss 持续下降,eval_loss 开始变大(过拟合),可以减少 num_train_epochs 参数,或适当减小lora_rank的值后再进行训练,防止模型过度训练;
在结束训练前 train_loss 与 eval_loss 均处于平稳状态(良好拟合),可以进行后续步骤。本方案的 train_loss 与 eval_loss 变化如下表所示:

验证效果
在将微调后的模型部署到实际业务环境前,建议先对其效果进行系统性的评测。只有通过充分验证,才能确保模型具备良好的稳定性和准确性,避免上线后出现意料之外的问题。
测试数据的格式应与训练数据一致,以确保评测的可比性,但内容上,测试数据应使用区别于训练数据的全新样本用于测试。这样可以更准确地反映模型在新数据上的泛化能力,避免因“见过的样本”导致分数虚高。
运行以下命令获取准备好的测试数据:
cd /root && \
# 下载测试数据 test.jsonl
curl -o test.jsonl "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250610/mhxmdw/test_with_system.jsonl"
评测标准应紧贴实际业务目标。以本方案为例,除了判断生成的 JSON 字符串是否合法,还应该关注对应 Key、Value 的值是否正确。主要核心代码如下:
def compare_address_info(actual_address_str, predicted_address_str):
"""比较两个JSON字符串表示的地址信息是否相同"""
try:
# 解析实际地址信息
if actual_address_str:
actual_address_json = json.loads(actual_address_str)
else:
actual_address_json = {
}
# 解析预测地址信息
if predicted_address_str:
predicted_address_json = json.loads(predicted_address_str)
else:
predicted_address_json = {
}
# 直接比较两个JSON对象是否完全相同
is_same = actual_address_json == predicted_address_json
return {
"is_same": is_same,
"actual_address_parsed": actual_address_json,
"predicted_address_parsed": predicted_address_json,
"comparison_error": None
}
except json.JSONDecodeError as e:
return {
"is_same": False,
"actual_address_parsed": None,
"predicted_address_parsed": None,
"comparison_error": f"JSON解析错误: {str(e)}"
}
except Exception as e:
return {
"is_same": False,
"actual_address_parsed": None,
"predicted_address_parsed": None,
"comparison_error": f"比较错误: {str(e)}"
}
针对 Qwen3-0.6B 模型设计了多版提示词,选取效果最好的系统提示词为:
你是一个专业的信息抽取助手,专门负责从中文文本中提取收件人的结构化信息。
## 任务说明
请根据给定的输入文本,准确提取并生成包含以下六个字段的JSON格式输出:
- province: 省份/直辖市/自治区(必须是完整的官方名称,如"河南省"、"上海市"、"新疆维吾尔自治区"等)
- city: 城市名称(包含"市"字,如"郑州市"、"西安市"等)
- district: 区县名称(包含"区"、"县"等,如"金水区"、"雁塔区"等)
- specific_location: 具体地址(街道、门牌号、小区、楼栋等详细信息)
- name: 收件人姓名(完整的中文姓名)
- phone: 联系电话(完整的电话号码,包括区号)
## 抽取规则
1. **地址信息处理**:
- 必须准确识别省、市、区的层级关系
- 省份名称必须使用官方全称(如"河南省"而非"河南")
- 直辖市的province和city字段应该相同(如都填"上海市")
- specific_location应包含详细的街道地址、小区名称、楼栋号等
2. **姓名识别**:
- 准确提取完整的中文姓名,包括复姓
- 包括少数民族姓名
3. **电话号码处理**:
- 提取完整的电话号码,保持原有格式
## 输出格式
请严格按照以下JSON格式输出,不要添加任何解释性文字:
{
"province": "省份名称",
"city": "城市名称",
"district": "区县名称",
"specific_location": "详细地址",
"name": "收件人姓名",
"phone": "联系电话"
}
使用上述系统提示词与测试样本对没有微调的本地 Qwen3-0.6B 模型进行评测:
# 进入 /root 目录
cd /root && \
# 下载并执行验证脚本
curl -o evaluate_without_sft.py "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250617/ksrneh/evaluate_without_sft.py" && \
curl -o evaluate_without_sft.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250617/cmvbcz/evaluate_without_sft.sh" && \
bash evaluate_without_sft.sh
执行后可以看到,尽管优化了提示词,测试样本准确率仅有14%:

使用测试样本对微调后的模型进行评测:
# 进入 /root 目录
cd /root && \
# 下载并执行验证脚本
curl -o evaluate.py "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250612/bzszyc/evaluate.py" && \
curl -o evaluate.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250612/xtgxql/evaluate.sh" && \
bash evaluate.sh
针对微调后的模型,我们使用了更简单的提示词,这可以提升模型推理时的响应速度:
你是一个专业的信息抽取助手,专门负责从中文文本中提取收件人的JSON信息,包含的Key有province(省份)、city(城市名称)、district(区县名称)、specific_location(街道、门牌号、小区、楼栋等详细信息)、name(收件人姓名)、phone(联系电话)
即使使用了更简单的提示词,微调模型的准确率也达到 98%,相比微调前的 14% 准确率有了大幅提升。

应用到生产环境
我们此处使用的数据集为通用的物流填单示例,无法覆盖真实业务中的全部情况,如字段缺失、填写错误等。在实际场景中,还可以进一步采用真实数据对模型进行进一步评估或持续优化,提升模型的泛化性能。
同时,我们要认识到,模型训练并非“一劳永逸”,而是一个持续迭代、动态优化的过程。尽管微调后的模型在测试集上可能表现优异,但其在真实业务场景中的效果仍需进一步验证。所以需要建立完善的模型监控体系,持续跟踪其在实际任务中的指标表现,并据此判断是否需要进一步优化模型,例如引入更多样化的训练样本、调整训练轮次,或重新设计数据标注策略,以提升模型在真实环境下的适应能力与稳定性。
运行以下脚本可以使用 vLLM 框架部署微调后的模型,并发布为 API 服务:
# 下载部署脚本 deploy.sh
curl -o deploy.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250613/hbojjv/deploy.sh" && \
# 后台运行部署脚本
bash deploy.sh
当看到如下信息时,表明 API 服务已成功部署:

部署成功后,业务方可以参考以下代码来接入您的 API 服务:
from openai import OpenAI
from pydantic import BaseModel
class Labels(BaseModel):
province: str
city: str
district: str
specific_location: str
name: str
phone: str
JSON_SCHEMA = Labels.model_json_schema()
def main(user_message: str) -> None:
"""示例:调用 Chat Completions 接口抽取地址信息。"""
client = OpenAI(
# 建议您配置环境变量
api_key="sk-xxx",
# 替换xx.xx.xx.xx为您的公网IP
base_url="http://xx.xx.xx.xx:8000/v1",
)
completion = client.chat.completions.create(
model="Qwen3-0.6B-SFT",
messages=[
{
"role": "system",
"content": "你是一个专业的信息抽取助手,专门负责从中文文本中提取收件人的JSON信息,包含的Key有province(省份)、city(城市名称)、district(区县名称)、specific_location(街道、门牌号、小区、楼栋等详细信息)、name(收件人姓名)、phone(联系电话)"
},
{
"role": "user",
"content": user_message,
},
],
extra_body={
"chat_template_kwargs": {
"enable_thinking": False},
"guided_json": JSON_SCHEMA,
},
)
print(completion.choices[0].message.content)
if __name__ == "__main__":
main("号码021-3439592西宁市城东区昆仑东路289号海湖新区万新广场3号楼18层索南扎西")