跳到主要内容

构建基于Qwen3-4B的智能家居轻量化模型

更新时间:2025-10-24 15:20:00
预置模型/数据集使用超便捷高性能GPU卡智能家居存储钜惠LoRA微调

随着物联网(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。}
评价:触发条件完整,风速相对调整量完整。

前提条件

  • 用户已经获取LLaMA-Factory Online平台账户和密码,如果需要帮助或尚未注册,可参考注册账户完成注册。
  • 当前账号的余额充裕,可满足模型微调服务的需要。点击可了解最新的活动费用信息,或前往充值,如需了解更多请联系我们

操作步骤

配置概览

配置参数配置项是否预置说明
模型Qwen3-4B-Instruct经过指令微调,参数量约40亿 (4B),专为遵循指令任务优化。
数据集smart_home、smart_home_fixed否(提供下载链接)智能家居历史交互日志。
GPUH800*1(微调)
H800*4(模型部署)
--
微调方法lora-显著降低计算与存储成本,兼具高性能与部署灵活性。

资源消耗预览

时长

使用推荐资源(H800*1)进行实例模式微调时微调过程总时长约2h20min。

环境准备

本实践包含智能家居“数据处理-基础模型选型-参数调优-微调训练-模型效果评估”完整链路,需要单独创建一个python环境,并配置需要的工具。

  1. 下载 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
  2. 新建终端,逐条执行下面指令配置环境。

    # 创建自己的虚拟环境  
    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
  3. 模型部署前期准备。

    # 下载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] 命令,通常能解决该问题。

数据集处理

  1. 原始数据smart_home.json已放在路径SmartHome/dataset中,该数据集来自智能家居历史交互日志。数据样本类型分布情况如下。

    指令类型数量问题
    iot-基础控制12747 条格式需规范、缺少 function 字段模糊指令操作失效
    sensor_trigger-条件判断3803 条条件判断失效
    chain-链式操作 需执行多个动作475 条链式操作失效
    sql-查询操作381 条-
    复杂场景:一设备,多参数328 条-
    optimization284 条-

    后续计划补充数据类型:

    指令类型数量来源说明
    复杂场景-延时执行+条件判断+多设备联动55AI大模型生成+人工标注
    异常指令500智能家居历史交互日志
  2. 统一数据格式。

    • 数据格式标准化。采用 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

      01

      提示
      • python3 后要写:脚本文件的路径
        -i 后写:待处理数据集的路径
        -o 后写:处理后的数据集存储路径
        -r 后写:输出的处理报告的存储路径
        用户需要把相应的路径替换成自己的真实路径。
      • 补全function的思路为:
        读取文件中 "instruction","input","output" 的样本,解析 output 里的 JSON 字符串;如果缺少 "function" 字段,就根据 instruction 文本 + device_id 前缀 + params 里的键自动补全一个合适的函数名(如 set_light_settings、set_humidifier_settings 等),然后把修改后的对象再写回到 output。
  3. 解决条件判断失效问题。
    针对条件判断失效的问题,使用以下规则改写。累计修改样本1,510 条。

    1. 命中"instruction"中“条件+动作”的指令(如果/若/当/當/的话/的話/分钟后/分鐘後/小时后/小時後),将“output”统一为:

      "mcp_type": "sensor_trigger",
      "function": "create_automation",
      "params": {
      "trigger": { ... },
      "action": { "device_id": "<原始device_id>", "arg": "<来自power/turn_on|turn_off>" }
      }
    2. 相对时间(如“一小时/一小時/半小时/半小時/五分鐘/十分钟/…后”):

      trigger 写成:{"time_after": "NhNmNs"},并支持中文数字转换,  
      例:
      一小时/一小時 → "1h"
      半小时/半小時 → "30m"
      五分钟/五分鐘 → "5m"
      十分钟/十分鐘 → "10m"
    3. 绝对时间(如“十点三十分/10:30/十點半/十點十分”):

      trigger 写成:{"time": "HH:MM"}(24小时制标准化)
    4. 比较条件(温度/湿度/PM2.5/CO₂/电量等 + 大于/小于/≥/≤/…):

      "trigger": {
      "temperature" | "humidity" | "pm25" | "co2" | "battery": { "operator": ">/</>=/<=", "value": <数值> }
      }
  4. 解决链式操作失效问题。
    命中"instruction"中连续操作的指令(如:“先...后.../并且/...然后”等),将“output”的“params”统一为:

    "params":{
    "trigger":{ }, 没有触发条件,"trigger"为空。
    "action": [{"device_id": " ", "command": "", "arg":{ }}, {"device_id": "", "command":" ", "arg":{ }}]}
  5. 解决模糊指令操作失效问题。
    命中"instruction"中表达模糊的指令(如:“调低一点” “加强” “调弱” “小一点”等),将“output”的“params”统一为:

    "params":{
    "trigger":{ }, 没有触发条件,"trigger"为空。
    "action": {"device_id": " ", "command": "", "arg":{ }}}

    其中:"arg" 参数,使其体现出明确的控制如:改成自动模式,或者 加参数\"delta\"
  6. 补充数据类型:复杂场景和异常指令。

  • 复杂场景——智能家居的复杂场景通常涉及多设备、多传感器、多协议的协同工作,结合用户行为、环境变化和个性化需求,提供智能化的生活体验。
    例如:

    • 睡眠模式,涉及环境光传感器、智能窗帘、空调控制、音响系统等; "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.jsonsmart_home_fixed.json ,点击“数据集检测”完成数据配置。

基模型选型

智能家居交互要求轻量级、快响应、高精度的大模型,来适配边缘设备。面对众多模型,我们不确定哪一个更合适,因此,需要进行基模型选型。本实践初步选定Llama-2-7B-ChatSmolLM2-1.7B-InstructQwen3-4B-Instruct三个模型,对比它们在智能家居控制任务上的表现,选择表现最好的作为本实践后续微调的基础模型。

  1. 验证集准备。基准数据用于做模型能力初筛,本实践选择Smart Home Command Dataset 作为基准数据,该数据集旨在用繁体中文训练大型语言模型(llm),用于控制智能家居系统,特别是针对家庭助理系统。数据集包含用户输入的繁体中文,输出是结构化的JSON命令,代表用户控制智能家居设备的意图。

    基于该数据集,随机抽取出共300条数据样本作为 验证集 (该数据集已放在SmartHome/dataset目录下),用于给三个备选模型打分。

  2. 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的名字}
  • 该验证脚本的主要思路如下所示。

    1. 使用 vLLM 库对每个模型执行批量推理,从验证数据集中逐条输入指令,获得模型生成的结构化 JSON 输出。

    2. 校验JSON输出结构的合法性。

    3. 使用 JSON Schema 自动验证格式。自定义一个 JSON Schema,并利用 Python 的 jsonschema 库对每条输出进行校验。

    4. 输出与期望结果对比。 将模型生成的具体内容与验证集中每条样本的 expected_events 期望结果进行对比,以评估模型在内容层面的准确性。每条样本的 expected_events 列出该指令正确的执行动作列表(每个包含应执行的动作类型、设备ID、参数等)。

    • 三个模型对比结果如下表所示,Qwen3-4B-Instruct 更适合拿来做智能家居指令微调(schema 通过率 96%、slot 级 F1 0.675,且延迟与 7B 档接近)。

      候选模型参数规模Schema 通过率slot-F1推理延迟微调显存占用
      Llama-2-7B-Chat7B13.7%0.095538.320GB
      SmolLM2-1.7B-Instruct1.7B00.016220.15.1GB
      Qwen3-4B-Instruct4B96%0.675413.112.4GB
    • 对比结果解读:Schema 通过率可以看整条输出是否是合法 JSON 且字段齐全,Qwen3-4B-Instruct 的Schema 通过率最高;slot-F1可以看每个槽位是否被正确抽取与规范化,结果显示Qwen3-4B-Instruct的正确抽取率与规范化程度最高。在参数规模、推理延迟和微调占用内存方面,4B 量级在成本和能力之间折中良好。综合以上分析,Qwen3-4B-Instruct 更适合拿来做智能家居指令微调。

参数调优

针对 LoRA rank、学习率、batch size 三个关键参数,设计三因素三水平实验(共 27 组),以 “高级功能通过率(条件 + 链式)” 为核心指标,筛选最优组合。

  1. 选取其中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
    exp1161e-52
    exp8323e-54
    exp15325e-54
    exp22643e-54
  2. 测试四种参数组合模型的的高级功能通过率。

    修改资源配置为4张H800,打开user-data/codelab/SmartHome/code/test.ipynb文件,根据文件提示完成LLM服务部署并测试各个实验模型的通过率。

    1. 1.2部署LLM服务,步骤2运行命令中,将“--model_dir”修改为 /workspace/SmartHome/model/Qwen3-4B-Instruct-2507/lora/merge_exp1,“--model_name”修改为qwen3-4B-instruct-smarthome_exp1
    2. 1.2部署LLM服务,步骤3检查部署是否成功的命令中,也要修改相应的模型名称。
    3. 部署成功后,新建终端,逐条运行以下指令,测试exp1模型的高级功能通过率。
      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
      测试结果如下所示,通过率为:5/9=55.6%。 开始微调
    提示

    测试完一个实验模型的通过率后,要起另一个服务测试下一个模型时,需要关闭当前进程(可以直接关机,重新启动实例)。

    对比结果如下:

    实验组LoRA rank学习率batch_size高级功能通过率loss后期波动幅度(训练稳定性)
    exp1161e-5255.6%0.068
    exp8323e-5455.6%0.055
    exp15325e-5444.4%0.05(后期过拟合)
    exp22643e-5444.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通过实例模式和任务模式运行微调任务,不同模式下的微调/评估操作详情如下所示。

  1. 进入LLaMA-Factory Online平台,点击“控制台”,进入控制台后点击左侧导航栏的“模型微调”进入页面。

  2. 选择基础模型和数据集,进行参数配置。

    • 本实践使用平台内置的Qwen3-4B-Instruct作为基础模型,数据集选择文件管理处的smart_home_fixed
    • 其他参数配置参考下图橙色框。参数选择逻辑见下表。
      参数取值选择依据
      lora参数
      lora_rank324B模型 + 中等任务复杂度,平衡性能与效率
      lora_alpha64经验值:2×lora_rank,保证梯度更新幅度
      lora_dropout0.05防止过拟合,适配中小样本量
      target_modulq_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj覆盖注意力层与 FFN 层,最大化微调效果
      biasnone减少参数数量,降低过拟合风险
      训练参数配置
      num_train_epochs43 轮欠拟合、5 轮过拟合,4 轮为最优平衡点
      per_device_train_batch_size480GB 显存适配,避免 OOM
      gradient_accumulation_steps4有效批次 = 4×4=16,模拟大批次训练
      learning_rate3e-5经 Grid Search 验证(1e-5 收敛慢、5e-5 震荡)
      lr_scheduler_typecosine余弦退火 + 0.1 warmup_ratio,稳定收敛
      weight_decay0.01抑制过拟合,保护预训练权重
      fp16true节省 50% 显存,提速 30%
      gradient_checkpointingTrue再省 30% 显存,代价是训练时间增加 10%
      evaluation_strategysteps每 200 步评估,及时发现过拟合
      load_best_model_at_endTrue保存最优模型,避免训练后期退化
    • 资源配置。推荐卡数为1卡。
    • 选择价格模式。本实践选择“极速尊享”,不同模式的计费说明参考计费说明
    • 开始训练。点击“开始训练”按钮,开始模型训练。

    开始微调

    提示

    配置模型与数据集后,系统将根据所需资源及其相关参数,动态预估任务运行时长及微调费用,您可在页面底部查看预估结果。

  3. 通过任务中心查看任务状态。 在左侧边栏选择”任务中心“,即可看到刚刚提交的任务。可以通过单击任务框,可查看任务的详细信息、超参数、训练追踪和日志。 开始微调

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

    开始微调

  5. 进行模型评估。 点击页面左侧导航栏“模型评估”,进行评估训练配置。 微调模型选择上一步骤微调后的模型,评估数据集选择文件管理处:smart_home_fixed。其他参数设置见下图橙框。

    模型评估

    提示

    配置模型与数据集后,系统将根据所需资源及其相关参数,动态预估任务运行时长及微调费用,您可在页面底部查看预估结果。

  6. 可以在“任务中心->模型评估”下看到评估任务的运行状态。

    开始微调

  7. 点击swanapi图标,进入任务基本信息查看页面。用户可查看评估任务的基本信息、日志,评估结束后,可查看评估结果如下图所示。

    模型评估

    评估结果解读

    • 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),适合以质量为主的离线或低并发在线场景;若用于高并发在线服务需做推理优化或选更快的模型。
  8. 模型对话。

    • 点击左侧导航栏“模型对话”按钮进入模型对话页面。

    • 在微调模型处选择步骤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。}}

模型效果评估

  1. 将上一步骤中微调后的模型进行合并。参考LoRA合并

  2. 部署LLM服务,测试功能通过率。 参考参数调优-->步骤2进行LLM服务部署。

  3. 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 震荡)。