构建基于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(推荐) | - | - |
| 微调方法 | lora | - | 显著降低计算与存储成本,兼具高性能与部署灵活性。 |
资源消耗预览
- 模型微调时长
- 优化后的数据集微调后的模型Evaluate & Predict时长
- 原始数据集微调后的模型Evaluate & Predict时长
数据集处理
-
下载原始数据集,该数据集来自智能家居历史交互日志。数据样本类型分布情况如下。
指令类型 数量 问题 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”。点击下载脚本,使用脚本补全。
进入LLaMA Factory Online平台,账号登录,进入实例空间页面,点击“开始微调”,选择“VScode处理专属数据”或“Jupyter处理专属数据”,进入工作空间后,新建终端,在命令行输入以下指令运行脚本,完成数据集的“funcion”字段补全。
python3 /workspace/function_fixed.py \
-i /workspace/user-data/datasets/smart_home.json \
-o /workspace/user-data/datasets/training_data_output.json \
-r /workspace/user-data/datasets/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,包含 9352 条数据样例,涵盖“基础控制、条件判断、链式操作、SQL查询、复杂场景和异常指令”等场景的高质量数据集。
- 数据处理完后,将原始数据集
smart_home.json和 优化后的数据集smart_home_fixed.json上传到“文件管理”,上传方法参考Jupyther上传或SFTP上传。 - 数据上传后,进入LLaMA-Factory Online平台,点击“文件管理”,找到上传的
smart_home.json和smart_home_fixed.json,点击“数据集检测”完成数据配置。
模型训练
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,原始数据微调后的模型在文本与参考匹配度、词级召回/覆盖、局部短语匹配、整体结构/顺序一致性上明显低于优化后模型。
对比两个数据集微调后的模型评估结果可以看出,优化后的数据集微调模型在文本相似度/生成质量指标上有明显提升(语义/表述更接近参考,整体质量显著好于原始数据集微调后的模型)。
总结
用户可通过LLaMA Factory Online平台预置的模型,使用本实践提供的数据集完成快速微调与效果验证。从上述实践案例可以看出,基于Qwen3-4B-Instruct模型,采用LoRA方法在优化后的smart_home_fixed数据集上进行指令微调后,模型输出指令在:条件判断指令、链式指令、模糊指令的处理上均有显著提升。
本实践构建了满足“小参数量与高任务精度”和“有限数据与复杂场景覆盖”要求的智能家居轻量化模型,提供了可复用的技术路径。本实践也验证了高质量数据的重要性(在质不在量),数据问题需 “精准修复” 而非 “盲目增强”。未来可扩展 ShareGPT 格式,适配 “上下文记忆” 需求。