工业智能毕设典型痛点
做工业智能毕设,最怕的不是算法不够 fancy,而是“最后一公里”卡脖子。我去年带学弟做轴承异常检测,光数据就踩了三个坑:
- 数据异构:产线传感器 8 秒一个点,质检记录却是人工 Excel,时间戳对不齐,直接让标签失效。
- 模型迭代慢:每改一次网络结构,就要重跑 30 G 的 3 年历史数据,笔记本风扇起飞,导师还催周报。
- 边缘部署受限:工厂内网不让联网,GPU 卡只有 Jetson Nano 4G,TensorRT 版本老掉牙,PyTorch 1.12 都装不上。
这三座大山,把“毕业”硬生生拖成“延毕”。于是我们把 AI 辅助开发当成“外挂脚手架”,用工具链换时间,终于踩着deadline 交卷。下面把踩过的坑和总结出的范式全盘托出,读者可直接复制到毕设 repo 里跑通。
AI 辅助工具选型对比
先放结论:工业场景下,本地 LLM > Copilot ≈ CodeWhisperer。原因无他,数据出不去是红线。我们对比了 3 类工具在 4 个环节的落地体验:
| 工具 | 数据预处理 | 模型脚本 | API 封装 | 离线可用 |
|---|---|---|---|---|
| GitHub Copilot | 生成 Pandas 代码快,但常引外部 csv 链接 | 能写 Lightning 模板,import 版本老 | FastAPI 脚手架 OK | |
| CodeWhisperer | 注释→代码准确,支持中文注释 | 自动补全训练循环 | 带 AWS Lambda 样板 | |
| 本地 CodeLlama-13B | 需写清晰 prompt,一次生成 200 行无压力 | 可指定 torch2.0 + cuda11.8 | 生成 gRPC/REST 双模板 |
最终方案:
- 笔记本里起 Ollama,13B 量化到 4bit,占用 7G 显存,写代码时边聊边生成。
- 把常用 prompt 固化成
prompts/文件夹,如“生成 torch.dataset 的getitem带滑动窗口”直接复用。 - 所有 AI 产物必须经过
make review触发静态检查(ruff + mypy),红线不ontology 通过。
实战:AI 辅助生成工业时序异常检测模块
下面给出最小可运行示例,全部代码由“本地 LLM + 人工 review” 产出,已在 Jetson Orin 上 24h 连续 infer,内存稳定 1.8G 以下。
1. 需求 prompt
帮我写一个工业时序异常检测模块,要求: 1. 支持多变量传感器 csv,时间列叫 'timestamp',其余浮点。 2. 用 Transformer Encoder 做重构,异常分用 MSE。 3. 提供 REST 接口 /infer,返回 JSON:{"score":float, "label":bool} 4. 代码风格符合 clean code,带类型标注与 docstring。2. 生成结果(节选)
# models/ts_anomaly.py import torch from torch import nn import numpy as np class SensorDataset(torch.utils.data.Dataset): """滑动窗口构造多变量序列样本.""" def __init__(self, csv_path: str, window: int = 60, stride: int = 1): df = pd.read_csv(csv_path, parse_dates=['timestamp']) self.data = df.drop(columns=['timestamp']).astype(np.float32).values self.window = window self.stride = stride def __len__(self): return (len(self.data) - self.window) // self.stride + 1 def __getitem__(self, idx): start = idx * self.stride seq = self.data[start:start+self.window] return torch.tensor(seq) # 重构任务,label=seq 自身 class TSEncoder(nn.Module): """极简 Transformer Encoder,用于时态重构.""" def __init__(self, n_features: int, d_model: int = 64, nhead: int = 4, num_layers: int = 3): super().__init__() self.proj = nn.Linear(n_features, d_model) encoder_layer = nn.TransformerEncoderLayer( d_model=d_model, nhead=nhead, batch_first=True, dim_feedforward=256 ) self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) self.out = nn.Linear(d_model, n_features) def forward(self, x): # x: [B, T, F] x = self.proj(x) z = self.encoder(x) # 同样形状 return self.out(z)# api/serve.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel, conlist import torch, joblib, pandas as pd from models.ts_anomaly import TSEncoder app = FastAPI(title="TS-Anomaly", version="0.1.0") model = TSEncoder.load_from_checkpoint("checkpoints/epoch=99.ckpt") threshold = joblib.load("artifacts/threshold.pkl") # 训练阶段统计的 95% 分位 class InferReq(BaseModel): samples: conlist(conlist(float, min_items=60), min_items=1) # 至少 1 条 60 步序列 @app.post("/infer") def infer(req: InferReq): x = torch.tensor(req.samples, dtype=torch.float32) with torch.no_grad(): rec = model(x) mse = torch.mean((x - rec) ** 2, dim=[1,2]) # 按样本求 MSE results = [{"score": s.item(), "label": s > threshold} for s in mse] return {"count": len(results), "results": results}3. 一键启动脚本
# scripts/run.sh python -m api.serve --host 0.0.0.0 --port 8000 --workers 1Dockerfile 同样让 LLM 生成,加--ulimit memlock=-1避免 Jetson 报mlock失败。
性能 & 安全性分析
冷启动延迟
Transformer 模型 1.3M 参数,TorchScript 加速后首次 infer 1.2s,后续 80ms/seq(60 步)。
解法:启动时先喂一条全 0 数据做 warm-up,把 CUDA kernel 编译完,用户请求进来无感知。输入校验
用 pydantic 的conlist限制维度,避免非法 shape 进入 GPU。曾有人把 59 步序列发进来,直接 OOM,加了校验后再没炸过。模型版本幂等性
每次 CI 打镜像把git-sha写进/app/VERSION,接口/version返回,回滚时 k8s 按标签切流,保证训练-推理同版本权重。边缘侧低功耗
把torch.set_num_threads(2)写死,CPU 占用从 160% 降到 60℃,Jetson 风扇不再狂转。
生产环境避坑指南
不要盲信 AI 生成的业务逻辑
LLM 喜欢“随手 import missing”,曾自动补出from sklearn.metrics import precision_score却用在无监督场景,导致全 0 也 100% precision。务必加单元测试。训练/推理一致性
数据归一化参数必须落盘。我们曾把StandardScaler放在 notebook 里,推理时忘了带,结果现场全部误报。后来强制把 scaler 存joblib,CI 检查路径缺失就失败。日志可追溯
每条预测写request_id + timestamp + model_version + score,存成ndjson,方便回查。工厂质量部问责时能 5 分钟内定位批次。版本回退策略
用蓝绿部署,灰度 10% 流量 30 分钟,监控p99_latency与误报率。一旦指标漂移立即切回旧版本,别迷信“新模型一定更好”。避免硬编码阈值
异常分阈值用滚动窗口实时计算,写死update_threshold.py脚本,每日凌晨重算,防止数据漂移导致漏报。
留给读者的思考
AI 辅助开发把“写重复代码”的时间压缩到原来的 30%,却换不来“对问题本身的理解”。当你把生成结果直接 push 到 main,是否想过:
- 如果传感器采样率从 8s 改成 2s,滑动窗口还适用吗?
- 当产线新增一个温度变量,异常分分布会怎么变?
- 如果工厂要求可解释性报告,Transformer 的 attention 权重能说清哪一帧异常吗?
建议你拉下上面的示例 repo,把window改成 30,再把d_model调到 128,观察延迟与误报率的变化;或者把重构损失换成Huber,看边缘 case 是否更稳。边改边记录,真正的毕设亮点不是“用了 AI 写代码”,而是“知道 AI 帮到哪就该停手”。
祝你毕设一遍过,答辩现场不被问倒。