构建基于Qwen3-4B的智能家居轻量化模型
随着物联网(IoT)技术的普及,智能家居设备控制逐渐向自然语言交互升级,但通用大模型在垂直场景(如设备指令解析、条件触发、复杂场景模式)中存在精度不足、响应延迟高和资源占用大的问题。在这种背景下,轻量级模型因其适配边缘设备和低延迟的优势,成为智能家居交互的核心需求。然而,这些模型面临“小参数量与高任务精度”和“有限数据与复杂场景覆盖”两大挑战。为此,本实践基于LLaMA Factory online平台,针对智能家居控制任务(设备开关、参数调节、条件触发、链式操作、场景模式)构建了从数据工程到模型生产化的完整流程,有效解决了轻量级模型在垂直场景中的性能瓶颈,提升了模型的精度和响应速度,满足了智能家居控制的实际需求。
模型微调前后,输出的家居控制指令效果对比如下所示。
- 条件触发型指令
- 链式操作型指令
- 模糊型指令
| 模型 | 原始数据集微调后的模型 | 优化后的数据集微调后的模型 |
|---|---|---|
| 用户指令 | "半小时后请把空气净化器的风速调大到3档位" | "半小时后请把空气净化器的风速调大到3档位" |
| 模型输出 | {"mcp_type": "iot","function": "control_device", "params": {"device_id": "purifier_bedroom_01", "level": 3}, "confirm": false} | {"mcp_type": "sensor_trigger", "function": "create_automation", "params": {"trigger": {"type":"time_delay", "minutes":30}, "action": {"device_id": "purifier_bedroom_01", "arg": {"op": "control_device", "level":3}}}, "confirm": false} |
| 分析 | 指令解读: mcp_type:IoT 控制消息。function:设置风速。params:{设备ID,挡位:3}评价:缺少延时条件,缺少相对调整量(delta),设备端无法确定要“设为多少”或“调多少”。 | 指令解读:mcp_type:IoT 控制消息。function:设置风速。params:{触发条件:30分钟后,动作:给出设备ID,风速减小1。} 评价:触发条件完整,风速相对调整量完整。 |
| 模型 | 原始数据集微调后的模型 | 优化后的数据集微调后的模型 |
|---|---|---|
| 用户指令 | "当检测到漏水时,关闭水阀并发送通知" | "当检测到漏水时,关闭水阀并发送通知" |
| 模型输出 | {"mcp_type": "iot", "function": "handle_emergency", "params": {"device_id": "water_heater_01", "action": "emergency_stop"}, "confirm": false} | {"mcp_type": "sensor_trigger", "function": "create_automation", "params": {"trigger": {"water_leak_sensor_01": "leak"}, "action": [{"device_id": "water_valve_main_01", "arg": {"status": "close"}}, {"device_id": "notifier_01", "arg": {"message": "检测到漏水,请立即处理"}}]}} |
| 分析 | 指令解读: mcp_type:IoT 控制消息。function:处理紧急情况。params:{给出水阀ID,动作:紧急停止}评价:缺少发送通知的动作。 | 指令解读:mcp_type:条件触发类型。function:创建自动化。params:{触发条件:传感器检测到漏水,动作:[关闭水阀], [发送通知]} 评价:触发条件完整,步骤完整。 |
| 模型 | 原始数据集微调后的模型 | 优化后的数据集微调后的模型 |
|---|---|---|
| 用户指令 | "三樓空調溫度调小一點" | "三樓空調溫度调小一點" |
| 模型输出 | {"mcp_type": "iot", "function": "set_temperature", "params": {"device_id": "ac_bedroom_01"}, "confirm": false} | {"mcp_type": "iot", "function": "set_temperature", "params": {"device_id": "ac_bedroom_01", "delta": -1}} |
| 分析 | 指令解读: mcp_type:IoT 控制消息。function:设置温度。params:{空调ID}评价:用户指令为“调小一点”,未要求具体温度,为模糊指令;模型输出缺失调小温度的动作。 | 指令解读: mcp_type:IoT 控制消息。function:设置温度。params:{设备ID,温度调低一度}评价: 满足用户指令,温度减小1度。 |
前提条件
- 用户已经获取LLaMA-Factory Online平台账户和密码,如果需要帮助或尚未注册,可参考注册账户完成注册。
- 当前账号的余额充裕,可满足模型微调服务的需要。点击可了解最新的活动及费用信息,或前往充值,如需了解更多请联系我们。
操作步骤
配置概览
| 配置参数 | 配置项 | 是否预置 | 说明 |
|---|---|---|---|
| 模型 | Qwen3-4B-Instruct | 是 | 经过指令微调,参数量约40亿 (4B),专为遵循指令任务优化。 |
| 数据集 | smart_home、smart_home_fixed | 否(提供下载链接) | 智能家居历史交互日志。 |
| GPU | H800*1(微调)H800*4(模型部署) | - | - |
| 微调方法 | lora | - | 显著降低计算与存储成本,兼具高性能与部署灵活性。 |
资源消耗预览
- 模型微调时长
- 优化后的数据集微调后的模型Evaluate & Predict时长
- 原始数据集微调后的模型Evaluate & Predict时长
环境准备
本实践包含智能家居“数据处理-基础模型选型-参数调优-微调训练-模型效果评估”完整链路,需要单独创建一个python环境,并配置需要的工具。
-
下载 SmartHome 压缩文件。该文件中包含后续处理数据、模型功能测试等步骤所需的数据集、脚本。
进入LLaMA Factory Online平台,登录账号,进入实例空间页面,点击“开始微调”,选择CPU资源2核即可,选择“VScode处理专属数据”或“Jupyter处理专属数据”,进入工作空间后,新建终端,执行下面指令下载并解压文件。# 进入目标目录
cd /workspace
# 下载压缩文件
wget "http://llamafactory-online-assets.oss-cn-beijing.aliyuncs.com/llamafactory-online/docs/v2.0/documents/Practice/smart_home/SmartHome.tar.gz"
# 解压到该目录
tar -xzf SmartHome.tar.gz -C /workspace -
新建终端,逐条执行下面指令配置环境。
# 创建自己的虚拟环境
conda create -n smarthome-lightllm-chat python=3.10 -y
# 激活环境
conda activate smarthome-lightllm-chat
# 安装必要的包
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn vllm torch ipykernel pandas partial_json_parser websockets -
模型部署前期准备。
# 下载lightllm的最新源码 需要挂VPN
git clone https://github.com/ModelTC/lightllm.git
cd lightllm点击下载requirements.txt文件,将该文件放到/workspace目录下,执行下面的命令进行安装环境。
pip install -r requirements.txt
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126
# 安装lightllm
python setup.py install
- 环境准备-->步骤2 中,执行下载lightllm的源码前,需要挂VPN。
- 后续步骤在执行代码时,若提示模块不存在,可在终端运行对应的
pip install [module name]命令,通常能解决该问题。
数据集处理
-
原始数据
smart_home.json已放在路径SmartHome/dataset中,该数据集来自智能家居历史交互日志。数据样本类型分布情况如下。指令类型 数量 问题 iot-基础控制 12747 条 格式需规范、缺少 function 字段、模糊指令操作失效 sensor_trigger-条件判断 3803 条 条件判断失效 chain-链式操作 需执行多个动作 475 条 链式操作失效 sql-查询操作 381 条 - 复杂场景:一设备,多参数 328 条 - optimization 284 条 - 后续计划补充数据类型:
指令类型 数量 来源说明 复杂场景-延时执行+条件判断+多设备联动 55 AI大模型生成+人工标注 异常指令 500 智能家居历史交互日志 -
统一数据格式。
-
数据格式标准化。采用 Alpaca 格式,适配单轮指令任务。
{
"instruction": "用户指令(如“打开客厅空调”)",
"input": "额外输入(可选,如设备状态)",
"output": "JSON格式响应(含mcp_type、function、params字段)"
}提示由于多轮对话复杂,超出本任务需求,故排除 ShareGPT 格式。
-
在“output”中补全缺失的字段 “function”。
进入“SmartHome”文件夹,新建终端,激活python环境
smarthome-lightllm-caht,在命令行输入以下指令运行脚本,完成数据集的“funcion”字段补全。python3 code/function_fixed.py \
-i dataset/smart_home.json \
-o dataset/training_data_output.json \
-r dataset/missing_function_report.csv
提示- python3 后要写:脚本文件的路径
-i 后写:待处理数据集的路径
-o 后写:处理后的数据集存储路径
-r 后写:输出的处理报告的存储路径
用户需要把相应的路径替换成自己的真实路径。 - 补全function的思路为:
读取文件中 "instruction","input","output" 的样本,解析 output 里的 JSON 字符串;如果缺少 "function" 字段,就根据 instruction 文本 + device_id 前缀 + params 里的键自动补全一个合适的函数名(如 set_light_settings、set_humidifier_settings 等),然后把修改后的对象再写回到 output。
- python3 后要写:脚本文件的路径
-
-
解决条件判断失效问题。
针对条件判断失效的问题,使用以下规则改写。累计修改样本1,510 条。-
命中"instruction"中“条件+动作”的指令(如果/若/当/當/的话/的話/分钟后/分鐘後/小时后/小時後),将“output”统一为:
"mcp_type": "sensor_trigger",
"function": "create_automation",
"params": {
"trigger": { ... },
"action": { "device_id": "<原始device_id>", "arg": "<来自power/turn_on|turn_off>" }
} -
相对时间(如“一小时/一小時/半小时/半小時/五分鐘/十分钟/…后”):
trigger 写成:{"time_after": "NhNmNs"},并支持中文数字转换,
例:
一小时/一小時 → "1h"
半小时/半小時 → "30m"
五分钟/五分鐘 → "5m"
十分钟/十分鐘 → "10m" -
绝对时间(如“十点三十分/10:30/十點半/十點十分”):
trigger 写成:{"time": "HH:MM"}(24小时制标准化) -
比较条件(温度/湿度/PM2.5/CO₂/电量等 + 大于/小于/≥/≤/…):
"trigger": {
"temperature" | "humidity" | "pm25" | "co2" | "battery": { "operator": ">/</>=/<=", "value": <数值> }
}
-
-
解决链式操作失效问题。
命中"instruction"中连续操作的指令(如:“先...后.../并且/...然后”等),将“output”的“params”统一为:"params":{
"trigger":{ }, 没有触发条件,"trigger"为空。
"action": [{"device_id": " ", "command": "", "arg":{ }}, {"device_id": "", "command":" ", "arg":{ }}]} -
解决模糊指令操作失效问题。
命中"instruction"中表达模糊的指令(如:“调低一点” “加强” “调弱” “小一点”等),将“output”的“params”统一为:"params":{
"trigger":{ }, 没有触发条件,"trigger"为空。
"action": {"device_id": " ", "command": "", "arg":{ }}}
其中:"arg" 参数,使其体现出明确的控制如:改成自动模式,或者 加参数\"delta\" -
补充数据类型:复杂场景和异常指令。
-
复杂场景——智能家居的复杂场景通常涉及多设备、多传感器、多协议的协同工作,结合用户行为、环境变化和个性化需求,提供智能化的生活体验。
例如:- 睡眠模式,涉及环境光传感器、智能窗帘、空调控制、音响系统等; "instruction": "准备睡觉时,关闭所有灯光,调低卧室空调温度,播放助眠音乐。"
- 老人/儿童看护模式,涉及运动传感器、摄像头、语音助手等。 "instruction": "监测老人的活动,若超过30分钟未检测到移动,发送提醒。"
-
异常指令——指令由于格式不正确、设备不支持、指令不明确等原因导致执行失败。我们希望在实际应用中,系统应能够识别这些错误指令,并提供相应的错误信息和建议。 例如:
{
"instruction": "今天天气怎么样",
"input": "",
"output": "{\"error\": \"NOT_A_CONTROL_COMMAND\", \"message\": \"这是天气查询,不是设备控制\", \"suggestion\": \"请使用天气应用查询\"}"
},
经过上述处理步骤,我们得到smart_home_fixed.json,该数据集已放在SmartHome/dataset路径下,包含 9352 条数据样例,涵盖“基础控制、条件判断、链式操作、SQL查询、复杂场景和异常指令”等场景的高质量数据集。
- 数据处理完后,将原始数据集
smart_home.json和 优化后的数据集smart_home_fixed.json上传到“文件管理”,上传方法参考Jupyther上传或SFTP上传。 - 数据上传后,进入LLaMA-Factory Online平台,点击“文件管理”,找到上传的
smart_home.json和smart_home_fixed.json,点击“数据集检测”完成数据配置。
基模型选型
智能家居交互要求轻量级、快响应、高精度的大模型,来适配边缘设备。面对众多模型,我们不确定哪一个更合适,因此,需要进行基模型选型。本实践初步选定Llama-2-7B-Chat、SmolLM2-1.7B-Instruct、Qwen3-4B-Instruct三个模型,对比它们在智能家居控制任务上的表现,选择表现最好的作为本实践后续微调的基础模型。
-
验证集准备。基准数据用于做模型能力初筛,本实践选择Smart Home Command Dataset 作为基准数据,该数据集旨在用繁体中文训练大型语言模型(llm),用于控制智能家居系统,特别是针对家庭助理系统。数据集包含用户输入的繁体中文,输出是结构化的JSON命令,代表用户控制智能家居设备的意图。
基于该数据集,随机抽取出共300条数据样本作为 验证集 (该数据集已放在
SmartHome/dataset目录下),用于给三个备选模型打分。 -
vLLM 批量验证。使用 vLLM 对大语言模型(Llama-2-7B-Chat,Qwen3-0.6B-Base,Qwen3-4B-Instruct)进行批量验证,并对比它们在智能家居控制任务上的表现。新建终端,逐条执行以下命令。
cd /workspace/SmartHome/code
conda activate smarthome-lightllm-chat
python select_1.py运行完后的结果如下图所示。
提示- 脚本select_1.py中的数据读取路径要修改为您当前的验证集保存路径。
- 若运行过程中报错“缺少某个module”,运行指令 pip install
{module的名字}。
-
该验证脚本的主要思路如下所示。
-
使用 vLLM 库对每个模型执行批量推理,从验证数据集中逐条输入指令,获得模型生成的结构化 JSON 输出。
-
校验JSON输出结构的合法性。
-
使用 JSON Schema 自动验证格式。自定义一个 JSON Schema,并利用 Python 的 jsonschema 库对每条输出进行校验。
-
输出与期望结果对比。 将模型生成的具体内容与验证集中每条样本的 expected_events 期望结果进行对比,以评估模型在内容层面的准确性。每条样本的 expected_events 列出该指令正确的执行动作列表(每个包含应执行的动作类型、设备ID、参数等)。
-
三个模型对比结果如下表所示,Qwen3-4B-Instruct 更适合拿来做智能家居指令微调(schema 通过率 96%、slot 级 F1 0.675,且延迟与 7B 档接近)。
候选模型 参数规模 Schema 通过率 slot-F1 推理延迟 微调显存占用 Llama-2-7B-Chat 7B 13.7% 0.095 538.3 20GB SmolLM2-1.7B-Instruct 1.7B 0 0.016 220.1 5.1GB Qwen3-4B-Instruct 4B 96% 0.675 413.1 12.4GB -
对比结果解读:Schema 通过率可以看整条输出是否是合法 JSON 且字段齐全,Qwen3-4B-Instruct 的Schema 通过率最高;slot-F1可以看每个槽位是否被正确抽取与规范化,结果显示Qwen3-4B-Instruct的正确抽取率与规范化程度最高。在参数规模、推理延迟和微调占用内存方面,4B 量级在成本和能力之间折中良好。综合以上分析,Qwen3-4B-Instruct 更适合拿来做智能家居指令微调。
-
参数调优
针对 LoRA rank、学习率、batch size 三个关键参数,设计三因素三水平实验(共 27 组),以 “高级功能通过率(条件 + 链式)” 为核心指标,筛选最优组合。
-
选取其中4个关键实验:exp1、exp8、exp15、exp22,展示对比过程。选用模型
Qwen3-4B-Instruct,数据集samrt_home_fixed.json进行lora微调,关键参数设置如下表所示,其他参数使用默认值。训练完成后合并模型,合并后的模型已放到workspace/SmartHome/model/Qwen3-4B-Instruct-2507/lora路径下。实验组 LoRA rank 学习率 batch_size exp1 16 1e-5 2 exp8 32 3e-5 4 exp15 32 5e-5 4 exp22 64 3e-5 4 -
测试四种参数组合模型的的高级功能通过率。
修改资源配置为4张H800,打开
user-data/codelab/SmartHome/code/test.ipynb文件,根据文件提示完成LLM服务部署并测试各个实验模型的通过率。- exp1
- exp8
- exp15
- exp22
- 1.2部署LLM服务,步骤2运行命令中,将“--model_dir”修改为
/workspace/SmartHome/model/Qwen3-4B-Instruct-2507/lora/merge_exp1,“--model_name”修改为qwen3-4B-instruct-smarthome_exp1。 - 1.2部署LLM服务,步骤3检查部署是否成功的命令中,也要修改相应的模型名称。
- 部署成功后,新建终端,逐条运行以下指令,测试exp1模型的高级功能通过率。
测试结果如下所示,通过率为:5/9=55.6%。
conda activate smarthome-lightllm-chat
cd /workspace/SmartHome/code
# 测试高级功能通过率
python test_high_level.py \
--model qwen3-4B-instruct-smarthome_exp1 \
--base-url http://localhost:6660/v1 \
--mode balanced
- 1.2部署LLM服务,步骤2运行命令中,将“--model_dir”修改为
/workspace/SmartHome/model/Qwen3-4B-Instruct-2507/lora/merge_exp8,“--model_name”修改为qwen3-4B-instruct-smarthome_exp8。 - 1.2部署LLM服务,步骤3检查部署是否成功的命令中,也要修改相应的模型名称。
- 部署成功后,新建终端,逐条运行以下指令,测试exp1模型的高级功能通过率。
测试结果如下所示,通过率为:5/9=55.6%。
conda activate smarthome-lightllm-chat
cd /workspace/SmartHome/code
# 测试高级功能通过率
python test_high_level.py \
--model qwen3-4B-instruct-smarthome_exp8 \
--base-url http://localhost:6660/v1 \
--mode balanced
- 1.2部署LLM服务,步骤2运行命令中,将“--model_dir”修改为
/workspace/SmartHome/model/Qwen3-4B-Instruct-2507/lora/merge_exp15,“--model_name”修改为qwen3-4B-instruct-smarthome_exp15。 - 1.2部署LLM服务,步骤3检查部署是否成功的命令中,也要修改相应的模型名称。
- 部署成功后,新建终端,逐条运行以下指令,测试exp1模型的高级功能通过率。
测试结果如下所示,通过率为:4/9=44.4%。
conda activate smarthome-lightllm-chat
cd /workspace/SmartHome/code
# 测试高级功能通过率
python test_high_level.py \
--model qwen3-4B-instruct-smarthome_exp15 \
--base-url http://localhost:6660/v1 \
--mode balanced
- 1.2部署LLM服务,步骤2运行命令中,将“--model_dir”修改为
/workspace/SmartHome/model/Qwen3-4B-Instruct-2507/lora/merge_exp22,“--model_name”修改为qwen3-4B-instruct-smarthome_exp22。 - 1.2部署LLM服务,步骤3检查部署是否成功的命令中,也要修改相应的模型名称。
- 部署成功后,新建终端,逐条运行以下指令,测试exp1模型的高级功能通过率。
测试结果如下所示,通过率为:4/9=44.4%。
conda activate smarthome-lightllm-chat
cd /workspace/SmartHome/code
# 测试高级功能通过率
python test_high_level.py \
--model qwen3-4B-instruct-smarthome_exp22 \
--base-url http://localhost:6660/v1 \
--mode balanced
提示测试完一个实验模型的通过率后,要起另一个服务测试下一个模型时,需要关闭当前进程(可以直接关机,重新启动实例)。
对比结果如下:
实验组 LoRA rank 学习率 batch_size 高级功能通过率 loss后期波动幅度(训练稳定性) exp1 16 1e-5 2 55.6% 0.068 exp8 32 3e-5 4 55.6% 0.055 exp15 32 5e-5 4 44.4% 0.05(后期过拟合) exp22 64 3e-5 4 44.4% 0.05(后期过拟合) 
调优结论:
- LoRA rank:32 是性价比最优值,rank=64 虽通过率高 1%,但显存占用增加 2GB(从 16GB→18GB),不符合 “边缘设备轻量化” 目标;
- 学习率:3e-5 是收敛与稳定的平衡点,1e-5 收敛过慢(4 epoch 未达最优),5e-5 易震荡;
- batch size:4(配合 gradient_accumulation_steps=4,有效 batch=16),2 则有效 batch 过小(8),训练效率低;8 则显存溢出(80GB GPU 也无法支撑)。
综上所述,LoRA rank=32,学习率=3e-5,batch size=4参数组合能有效平衡成本,同时测试效果较好。
模型训练
基于前面探索得到的较合适的基础模型-Qwen3-4B-Instruct,较优的参数组合—LoRA rank=32,学习率=3e-5,batch size=4,我们使用LLaMA Factory Online通过实例模式和任务模式运行微调任务,不同模式下的微调/评估操作详情如下所示。
- 任务模式微调
- 实例模式微调
-
进入LLaMA-Factory Online平台,点击“控制台”,进入控制台后点击左侧导航栏的“模型微调”进入页面。
-
选择基础模型和数据集,进行参数配置。
- 本实践使用平台内置的Qwen3-4B-Instruct作为基础模型,数据集选择文件管理处的
smart_home_fixed。 - 其他参数配置参考下图橙色框。参数选择逻辑见下表。
参数 取值 选择依据 lora参数 lora_rank 32 4B模型 + 中等任务复杂度,平衡性能与效率 lora_alpha 64 经验值:2×lora_rank,保证梯度更新幅度 lora_dropout 0.05 防止过拟合,适配中小样本量 target_modul q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj覆盖注意力层与 FFN 层,最大化微调效果 bias none 减少参数数量,降低过拟合风险 训练参数配置 num_train_epochs 4 3 轮欠拟合、5 轮过拟合,4 轮为最优平衡点 per_device_train_batch_size 4 80GB 显存适配,避免 OOM gradient_accumulation_steps 4 有效批次 = 4×4=16,模拟大批次训练 learning_rate 3e-5 经 Grid Search 验证(1e-5 收敛慢、5e-5 震荡) lr_scheduler_type cosine 余弦退火 + 0.1 warmup_ratio,稳定收敛 weight_decay 0.01 抑制过拟合,保护预训练权重 fp16 true 节省 50% 显存,提速 30% gradient_checkpointing True 再省 30% 显存,代价是训练时间增加 10% evaluation_strategy steps 每 200 步评估,及时发现过拟合 load_best_model_at_end True 保存最优模型,避免训练后期退化 - 资源配置。推荐卡数为1卡。
- 选择价格模式。本实践选择“极速尊享”,不同模式的计费说明参考计费说明。
- 开始训练。点击“开始训练”按钮,开始模型训练。
提示配置模型与数据集后,系统将根据所需资源及其相关参数,动态预估任务运行时长及微调费用,您可在页面底部查看预估结果。
- 本实践使用平台内置的Qwen3-4B-Instruct作为基础模型,数据集选择文件管理处的
-
通过任务中心查看任务状态。 在左侧边栏选择”任务中心“,即可看到刚刚提交的任务。可以通过单击任务框,可查看任务的详细信息、超参数、训练追踪和日志。

-
任务完成后,模型自动保存在"文件管理->模型->output"文件夹中。可在"任务中心->基本信息->模型成果"处查看保存路径。

-
进行模型评估。 点击页面左侧导航栏“模型评估”,进行评估训练配置。 微调模型选择上一步骤微调后的模型,评估数据集选择文件管理处:
smart_home_fixed。其他参数设置见下图橙框。
提示配置模型与数据集后,系统将根据所需资源及其相关参数,动态预估任务运行时长及微调费用,您可在页面底部查看预估结果。
-
可以在“任务中心->模型评估”下看到评估任务的运行状态。

-
点击
图标,进入任务基本信息查看页面。用户可查看评估任务的基本信息、日志,评估结束后,可查看评估结果如下图所示。
评估结果解读:
- predict_bleu-4: 72.3829,生成文本在短语层面与参考有良好重合,精确度较好。
- predict_rouge-1: 76.2083,关键词覆盖良好,模型能命中参考中的大量关键字。
- predict_rouge-2: 76.8263,局部短语连贯性较好,短语搭配合理。
- predict_rouge-l: 82.4938,整体段落结构很接近参考。
总结: 模型生成质量较好(BLEU/ROUGE 都在 70–82 范围,尤其 ROUGE-L 表现很强),但推理吞吐/速度一般(samples/sec ≈1),适合以质量为主的离线或低并发在线场景;若用于高并发在线服务需做推理优化或选更快的模型。
-
模型对话。
-
点击左侧导航栏“模型对话”按钮进入模型对话页面。
-
在微调模型处选择步骤3中显示的模型名称,如下图高亮①所示。点击开始右上角“开始对话”,跳出弹窗“LORA模型对话限时免费”,点击“开始对话”。
-
在输入框中输入问题(高亮②),点击发送(高亮③);在对话框中查看对话详情,如下图高亮④所示。

模型输出结果解读
用户指令 "将卧室空气净化器的湿度设为2档" "半小时后请把空气净化器的风速调小一点" 模型输出 {"mcp_type": "iot","function": "set_humidity", "params": {"device_id": "purifier_bedroom_01", "humidity": 2}, "confirm": false}{"mcp_type": "sensor_trigger", "function": "create_automation", "params": {"trigger": {"type":"time_delay", "minutes":30}, "action": {"device_id": "purifier_bedroom_01", "arg": {"op": "control_device", "level_delta":-1}}}, "confirm": false}指令解读 mcp_type:IoT 控制消息。function:设置湿度。params:{设备ID,湿度挡位:2}mcp_type:IoT 控制消息。function:创建自动化风速控制。params:{触发条件:30分钟后,动作:{给出设备ID,风速减小1。}}
-
-
使用已注册的LLaMA Factory Online账号登录平台,选择[实例空间]菜单项,进入实例空间页面,如下图所示。

-
单击上图“开始微调”按钮,进入[配置资源]页面,选择GPU资源,卡数填写
1,其他参数保持为默认值。 -
单击“启动”按钮,待实例启动后,点击[LLaMA-Factory快速微调模型]页签,进入LLaMA Factory Online在线WebUI微调配置页面,语言选择
zh,如下图高亮①所示;模型名称选择Qwen3-4B-Instruct,如下图高亮②所示;系统默认填充模型路径/shared-only/models/Qwen/Qwen3-4B-Instruct-2507,如下图高亮③所示。 -
微调方法选择
lora,如下图高亮④所示;选择“train”标签,训练方式保持Supervised Fine-Tuning,如下图高亮⑤所示;数据路径保持/workspace/llamafactory/data,如下图高亮⑥所示;数据集选择smart_home_fixed,如下图高亮⑦所示。
-
其余参数参照上图橙色框设置,参数选择逻辑见下表。
参数 取值 选择依据 lora参数 lora_rank 32 4B模型 + 中等任务复杂度,平衡性能与效率 lora_alpha 64 经验值:2×lora_rank,保证梯度更新幅度 lora_dropout 0.05 防止过拟合,适配中小样本量 target_modul q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj覆盖注意力层与 FFN 层,最大化微调效果 bias none 减少参数数量,降低过拟合风险 训练参数配置 num_train_epochs 4 3 轮欠拟合、5 轮过拟合,4 轮为最优平衡点 per_device_train_batch_size 4 80GB 显存适配,避免 OOM gradient_accumulation_steps 4 有效批次 = 4×4=16,模拟大批次训练 learning_rate 3e-5 经 Grid Search 验证(1e-5 收敛慢、5e-5 震荡) lr_scheduler_type cosine 余弦退火 + 0.1 warmup_ratio,稳定收敛 weight_decay 0.01 抑制过拟合,保护预训练权重 fp16 true 节省 50% 显存,提速 30% gradient_checkpointing True 再省 30% 显存,代价是训练时间增加 10% evaluation_strategy steps 每 200 步评估,及时发现过拟合 load_best_model_at_end True 保存最优模型,避免训练后期退化 -
参数配置完成后,点击“开始”按钮启动微调任务。页面底部将实时显示微调过程中的日志信息,例如下图高亮①所示;同时展示当前微调进度及Loss变化曲线。经过多轮微调后,例如下图高亮②所示,从图中可以看出Loss逐渐趋于收敛。微调完成后,系统提示“训练完毕”,例如下图高亮③所示。

- 优化后的数据集微调后的模型对话
- 原始数据集微调后的模型对话
-
切换至“chat”界面,选择上一步骤已经训练完成的检查点路径,如下图高亮①所示;单击“加载模型”按钮,如下图高亮②所示;模型加载后,在输入框处填入提问(高亮③),点击“提交”(高亮④);在下图高亮⑤观察模型回答。

进行对话前,先使用原始数据集微调模型,参考步骤1-6即可,只需要将数据集换为原始数据集 smart_home.json。
-
单击下图高亮①所示的“卸载模型”按钮,卸载优化后数据集微调的模型;清空“检查点路径”,替换成原始数据集微调后模型的LoRA配置(高亮②),单击“加载模型”按钮(下图高亮③所示),加载原始数据集微调后的
Qwen3-4B-Instruct模型进行对话,其余配置保持不变。在输入框处填入提问(高亮④),点击“提交”(高亮⑤);在下图高亮⑥观察模型回答。
通过对比微调模型与原生模型的输出结果可以发现,优化后数据集微调的模型在条件判断、链式任务中,输出的指令更加完整。
- 优化后的数据集微调后的模型评估
- 原始数据集微调后的模型评估
-
切换至“Evaluate & Predict”页面,选择优化后数据集微调的模型检查点路径,例如下图高亮③所示;然后选择的
smart_home_fixed数据集,并根据实际需求配置评估参数(本实践的参数设置如下图所示)。
-
参数配置完成后,点击“开始”按钮即可启动评估,页面底部将实时显示评估过程中的日志信息,评估完成后,记录评估结果,结果如下所示。
{
"predict_bleu-4": 88.09032782292557,
"predict_model_preparation_time": 0.0042,
"predict_rouge-1": 91.78391787852867,
"predict_rouge-2": 90.21634605431993,
"predict_rouge-l": 93.44998544696323,
"predict_runtime": 9920.9523,
"predict_samples_per_second": 0.943,
"predict_steps_per_second": 0.236
}结果解读:BLEU-4 = 88.09,ROUGE-1 = 91.78,ROUGE-2 = 90.22,ROUGE-L = 93.45,说明生成文本在 n-gram 和整体结构上与参考高度一致,生成质量/准确性显著提升。但predict_runtime = 9920.95 s,predict_samples_per_second = 0.943,predict_steps_per_second = 0.236,说明推理耗时明显更高,吞吐只有原始数据微调后模型的约 0.46 倍。该模型适用于对质量/准确性要求高、允许较高延迟或离线批处理的场景。
进行评估前,先使用原始数据集微调模型,参考步骤1-6即可,只需要将数据集换为原始数据集 smart_home.json。
-
切换至“Evaluate & Predict”页面,清空检查点路径配置,替换成原始数据集微调后模型的LoRA配置(高亮①),评估数据集选择
smart_home_fixed数据集,并根据实际需求配置评估参数(本实践的参数设置如下图所示)。
-
完成配置后,点击“开始”按钮即可启动评估,页面底部将实时显示评估过程中的日志信息,评估完成后,记录评估结果,结果如下所示。
{
"predict_bleu-4": 65.02279472840034,
"predict_model_preparation_time": 0.0041,
"predict_rouge-1": 84.27162691402908,
"predict_rouge-2": 81.33605353934986,
"predict_rouge-l": 85.93883407827202,
"predict_runtime": 4549.6848,
"predict_samples_per_second": 2.056,
"predict_steps_per_second": 0.514
}结果解读:BLEU-4 = 65.02,ROUGE-1 = 84.27,ROUGE-2 = 81.34,ROUGE-L = 85.94,原始数据微调后的模型在文本与参考匹配度、词级召回/覆盖、局部短语匹配、整体结构/顺序一致性上明显低于优化后模型。
对比两个数据集微调后的模型评估结果可以看出,优化后的数据集微调模型在文本相似度/生成质量指标上有明显提升(语义/表述更接近参考,整体质量显著好于原始数据集微调后的模型)。
模型效果评估
-
将上一步骤中微调后的模型进行合并。参考LoRA合并。
-
部署LLM服务,测试功能通过率。 参考参数调优-->步骤2进行LLM服务部署。
-
LLM服务部署成功后,新建终端,逐条运行以下指令,测试微调后模型的高级功能通过率。
conda activate smarthome-lightllm-chat
cd /workspace/SmartHome/code
# 测试高级功能通过率
python test_final.py \
--model {model_name} \ # 与部署服务时的模型名称一致
--base-url http://localhost:6660/v1 \ # 与部署服务时的端口号一致
--mode balanced
| 测试类型 | 测试用例 | 通过率 |
|---|---|---|
| 基础功能 | 打开客厅灯、关闭卧室空调等5条 | 100% |
| 高级功能 | 如果卧室温度低于18度就开启暖气、离家模式等18条 | 88% |
可以看到,相较于选型时的基础模型的低匹配率,微调后的模型功能通过率得到了显著提升。
总结
用户可通过LLaMA-Factory Online平台预置的模型,使用本实践提供的数据集完成智能家居指令模型的“数据处理-基础模型选型-参数调优-微调训练-模型效果评估”完整链路,实现快速微调与效果验证。从上述实践案例可以看出,基于Qwen3-4B-Instruct模型,采用LoRA方法在优化后的smart_home_fixed数据集上进行指令微调后,模型输出指令在:条件判断指令、链式指令、模糊指令的处理上均有显著提升。
本实践从模型选型 -> 参数调优,构建了满足“小参数量与高任务精度”和“有限数据与复杂场景覆盖”要求的智能家居轻量化模型,提供了可复用的技术路径。未来可扩展 ShareGPT 格式,适配 “上下文记忆” 需求。
实践tips
- 数据优先:微调过程中数据质量非常重要,质量 > 数量。 数据问题需 “精准修复” 而非 “盲目增强”,效果不好可能是数据质量不好。
- 参数调优:科学依据 > 经验主义。例如:LoRA rank 选择时,基于 “模型大小(4B)+ 任务复杂度(中等)+ 显存(80GB)”综合考虑,而非固定值;学习率调度:cosine+warmup 比 linear 更稳定,3e-5 是经 Grid Search 验证的最优值(1e-5 太慢、5e-5 震荡)。