
下午整理桌面的时候翻到上周跑的半拉脚本,索性补完跑通了,是对接家里几个ESP32上报的传感数据的,之前每次导csv都乱哄哄的,写正则匹配设备ID又太死,加个本地小模型自动归类标注省事多了。
前置准备的几个坑我先踩过了
重点先说:家庭传感数据别往公网大模型API传,本地跑个小参数开源模型完全够用,数据不出内网也没隐私风险。我这边用的是Ollama拉的qwen2:0.5b版本,占资源很少,旧笔记本都能带动。
- 先装Ollama,去官网下对应系统的安装包一路下一步就行,装完开终端跑命令拉模型:
第一次拉镜像要等会儿,速度看自家网速,拉完会自动进交互界面,直接关了就行,服务后台会跑着。ollama run qwen2:0.5b - Python环境不用装一堆杂七杂八的库,就两个依赖足够:
pandas用来读存传感日志的csv文件,requests调本地的Ollama接口,多余的库我没装,没必要搞复杂。pip install pandas requests
核心脚本其实没几行
之前试过把prompt写得特别复杂,要求模型给分析异常原因啥的,结果小模型经常胡说八道,后来把prompt砍到最简,就要求固定格式输出json,稳定性一下就上来了。
import pandas as pd
import requests
import json
# 读本地存储的传感上报csv,默认字段是ts(时间戳)、device_id(设备ID)、value(上报值)
df = pd.read_csv("sensor_log.csv")
# 本地Ollama默认接口地址,没改端口的话不用动
ollama_api = "http://localhost:11434/api/generate"
def parse_single_row(row):
# prompt别写太复杂,给死输出要求,小模型理解力有限
prompt = f"""
传感原始数据:设备ID{row['device_id']},上报值{row['value']},时间{row['ts']}
直接输出JSON,包含device_type(温湿度/门窗磁/人体感应)、location(客厅/卧室/阳台)、is_abnormal(是/否)三个字段,不要其他内容。
"""
resp = requests.post(ollama_api, json={
"model": "qwen2:0.5b",
"prompt": prompt,
"stream": False,
"temperature": 0 # 温度设0,输出尽量稳定,减少瞎编
})
result = json.loads(resp.json()["response"])
return pd.Series([result["device_type"], result["location"], result["is_abnormal"]])
# 把解析结果拼回原数据表
df[["device_type", "location", "is_abnormal"]] = df.apply(parse_single_row, axis=1)
df.to_csv("parsed_sensor_log.csv", index=False)
小提示:偶尔会遇到模型输出带markdown代码块标记导致json解析失败的情况,自己加个简单的异常捕获就行,解析失败的行标出来人工核对,不用追求100%准确率,家用工具够使就行。这个我还没细测速度,几千行日志大概跑几分钟吧,看设备性能。
对了,要是觉得0.5b的模型太笨,认不准设备,换个7b的qwen2也行,就是跑起来慢些,看自己电脑配置能不能带动。
评论一下?