用Qwen3-0.6B做了个地址解析项目,附完整过程
1. 项目背景与目标
在物流、电商等业务场景中,用户提交的收件信息通常以非结构化文本形式存在,例如:“长沙市岳麓区桃花岭路189号润丰园B座1202室 | 电话021-17613435 | 联系人江雨桐”。这类数据难以直接用于系统处理,需要将其转换为结构化的JSON格式。
本项目的目标是:基于轻量级大模型 Qwen3-0.6B 实现高精度的中文地址信息抽取,并通过微调(SFT)显著提升其在特定任务上的表现。整个流程涵盖环境搭建、数据准备、模型微调、效果验证和API部署,形成一个可落地的端到端解决方案。
选择 Qwen3-0.6B 的核心优势在于:
- 参数小、推理快:适合低延迟、高并发的生产环境
- 资源消耗低:可在单卡GPU上高效运行
- 支持LoRA微调:大幅降低训练成本
2. 环境准备与镜像启动
2.1 启动Qwen3-0.6B镜像
本文使用CSDN提供的预置镜像Qwen3-0.6B,该镜像已集成Jupyter Notebook、vLLM、LangChain等常用工具,开箱即用。
操作步骤如下:
- 在CSDN星图平台搜索并启动
Qwen3-0.6B镜像 - 启动后自动进入Jupyter Lab界面
- 打开终端或新建Python脚本进行开发
提示:镜像默认监听端口为8000,可通过
https://gpu-podxxxxx-8000.web.gpu.csdn.net访问服务。
2.2 使用LangChain调用本地模型
通过以下代码可快速接入本地部署的Qwen3-0.6B模型:
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", # 替换为实际地址 api_key="EMPTY", extra_body={ "enable_thinking": True, "return_reasoning": True, }, streaming=True, ) # 测试调用 response = chat_model.invoke("你是谁?") print(response.content)此方法适用于快速原型开发和交互式调试。
3. 数据准备与格式设计
3.1 任务定义与输出结构
目标是从一段文本中提取六个关键字段:
province: 省份全称(如“湖南省”)city: 城市名称(含“市”字,如“长沙市”)district: 区县名称(如“岳麓区”)specific_location: 详细街道地址name: 收件人姓名phone: 完整联系电话
输出必须为标准JSON格式,便于下游系统消费。
3.2 构建训练数据集
由于真实业务数据涉及隐私,我们采用“模型蒸馏”策略生成高质量训练样本:
- 使用强大的教师模型(如Qwen3-235B-A22B)对原始文本进行标注
- 将输入-输出对构造成SFT微调所需的数据格式
每条训练样本遵循如下JSONL格式:
{ "messages": [ { "role": "system", "content": "你是一个专业的信息抽取助手..." }, { "role": "user", "content": "长沙市岳麓区桃花岭路189号...江雨桐" }, { "role": "assistant", "content": "{\"province\": \"湖南省\", ...}" } ] }下载示例数据
cd /root && \ curl -f -o train.jsonl "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250610/azvmpb/train_with_system.jsonl"4. 模型微调全流程
4.1 安装依赖库
使用魔搭社区的ms-swift框架简化微调流程:
pip3 install vllm==0.9.0.1 ms-swift==3.5.04.2 执行微调脚本
创建并执行微调脚本:
cd /root && \ curl -f -o sft.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250623/cggwpz/sft.sh" && \ bash sft.sh核心微调参数说明
| 参数 | 值 | 说明 |
|---|---|---|
--model | Qwen/Qwen3-0.6B | 指定基础模型 |
--train_type | lora | 使用LoRA进行参数高效微调 |
--dataset | train.jsonl | 训练数据路径 |
--num_train_epochs | 10 | 训练轮次 |
--learning_rate | 1e-4 | 学习率 |
--lora_rank | 8 | LoRA矩阵秩,控制表达能力 |
--per_device_train_batch_size | 20 | 单设备批次大小 |
--gradient_accumulation_steps | 16 | 梯度累积步数 |
4.3 权重合并
微调完成后,需将LoRA增量权重与原模型合并:
swift export \ --ckpt_dir "output/checkpoint-50" \ --merge_lora true合并后的模型位于output/checkpoint-50-merged目录,可用于推理部署。
5. 效果验证与评测
5.1 准备测试集
下载独立于训练集的测试数据:
cd /root && \ curl -o test.jsonl "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250610/mhxmdw/test_with_system.jsonl"5.2 评测指标设计
定义严格匹配的准确率(Exact Match Accuracy),即预测JSON与真实标签完全一致才视为正确。
def compare_address_info(actual_address_str, predicted_address_str): try: actual = json.loads(actual_address_str) if actual_address_str else {} predicted = json.loads(predicted_address_str) if predicted_address_str else {} is_same = actual == predicted return {"is_same": is_same, "actual": actual, "predicted": predicted} except json.JSONDecodeError: return {"is_same": False, "error": "JSON解析失败"}5.3 初始模型 vs 微调后模型对比
| 模型状态 | 准确率(400条测试样本) |
|---|---|
| 未微调 + 复杂Prompt | 14% (56/400) |
| 微调后 + 简单Prompt | 98% (392/400) |
结论:经过微调,Qwen3-0.6B 在地址解析任务上的准确率提升了近7倍,且可使用更简洁的系统提示词,进一步提升推理效率。
6. 部署为API服务
6.1 使用vLLM部署高性能服务
运行部署脚本:
curl -o deploy.sh "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250613/hbojjv/deploy.sh" && \ bash deploy.sh服务启动成功后输出:
重要提示: 1. API密钥: sk-xxx 2. 服务地址: http://0.0.0.0:8000 3. 日志查看: tail -f vllm.log 4. 停止服务: kill xxx6.2 外网访问配置
若需公网调用,请在云服务器安全组中开放8000端口,并建议限制来源IP以保障安全。
6.3 调用API示例
Python客户端
from openai import OpenAI client = OpenAI( api_key="sk-xxx", base_url="http://<your-public-ip>:8000/v1" ) response = client.chat.completions.create( model="Qwen3-0.6B-SFT", messages=[ {"role": "system", "content": "你是一个专业的信息抽取助手..."}, {"role": "user", "content": "号码021-3439592西宁市城东区昆仑东路...索南扎西"} ], extra_body={ "chat_template_kwargs": {"enable_thinking": False}, "guided_json": { "type": "object", "properties": { "province": {"type": "string"}, "city": {"type": "string"}, "district": {"type": "string"}, "specific_location": {"type": "string"}, "name": {"type": "string"}, "phone": {"type": "string"} }, "required": ["province", "city", "district", "specific_location", "name", "phone"] } } ) print(response.choices[0].message.content)curl命令行调用
curl -X POST http://xx.xx.xx.xx:8000/v1/chat/completions \ -H "Authorization: Bearer sk-xxx" \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen3-0.6B-SFT", "messages": [ {"role": "system", "content": "..."}, {"role": "user", "content": "号码021-3439592西宁市..."} ], "extra_body": { "chat_template_kwargs": {"enable_thinking": false}, "guided_json": { ... } } }'7. 总结
本文完整展示了如何利用 Qwen3-0.6B 实现一个高精度的中文地址解析系统。通过模型蒸馏与LoRA微调技术,我们将一个小模型在特定任务上的准确率从14%提升至98%,充分体现了“小模型+领域微调”的工程价值。
关键实践建议
- 优先使用模型蒸馏生成训练数据:借助大模型标注能力解决小模型初始性能差的问题
- 合理设计系统提示词:微调后可简化Prompt,提升推理速度
- 关注损失曲线判断拟合状态:避免欠拟合或过拟合
- 建立持续优化机制:根据线上反馈迭代训练数据和模型版本
- 使用guided decoding保证输出格式:防止JSON解析错误
该项目不仅适用于物流填单场景,也可迁移至订单解析、简历信息提取、合同结构化等NLP任务,具备良好的通用性和扩展性。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。