前后端分离 + 大模型集成 工业产线监控系统 技术架构与源码分析
灵感来源 本项目基于 BUPT 吴振宇老师的工业互联网课设大作业开发,其中一维卷积神经网络 (1D-CNN) 来源于吴振宇老师。
摘要
本文深度解析一款开源工业智能监控系统的整体架构、技术设计与核心逻辑。系统采用本地深度学习 + 云端大模型双 AI 架构,基于 Vue、FastAPI、PyTorch、Node.js、阿里云通义千问构建,实现工业轴承振动故障识别与 AI 运维问答。本文从架构设计、模块分工、接口交互、核心代码逻辑四个维度拆解项目,同时分析双 AI 架构在工业场景的落地优势。
一、项目背景与架构设计
工业场景痛点:传统设备运维依赖人工经验,故障排查效率低、响应慢;
架构优势:本项目通过本地检测 + 云端问答、三层解耦、代理隔离密钥的创新架构,实现了「高精度设备故障诊断 + 可解释 AI 运维咨询」的完整工业智能运维闭环,架构规范、实用性强、工程化程度高,远超传统单一模型的工业监控系统。
双 AI 架构设计思路:
- 边缘侧(本地):轻量化 PyTorch 模型,实时处理振动数据,低延迟完成故障判定;
- 云端:大语言模型,利用专业知识库输出运维方案,弥补本地模型语义理解短板。
整体架构图

详细数据流架构

二、三大模块技术详解
1. Python AI 诊断后端(FastAPI + PyTorch)
核心职责:加载训练好的故障模型(fault_model.pt),接收前端振动数据,推理返回故障结果; 核心接口:/health 健康检测接口、故障推理接口; 技术亮点:FastAPI 高性能异步接口,适配工业高并发数据请求。
2. Node.js LLM 代理服务
设计目的:隔离前端与阿里云大模型原始接口,统一请求格式、管理密钥、做跨域处理; 核心逻辑:接收前端咨询请求,组装 Prompt 调用通义千问接口,格式化结果返回前端; 依赖说明:Express 搭建服务,Cors 解决跨域,Axios 发起网络请求。
3. Vue 2 前端可视化系统
功能划分:设备状态展示、ECharts 振动曲线绘制、AI 诊断交互、大模型咨询面板、工单管理; 技术选型:Vant 组件库快速搭建页面,适配桌面端工业监控场景。
三、接口交互流程(核心数据流)
完整请求链路分为两大业务流程:
- AI 故障诊断流程:前端 → 调用 8019 端口 FastAPI 接口 → PyTorch 模型推理 → 结果返回前端展示
- AI 运维咨询流程:前端 → 调用 8020 端口 Node 代理 → 代理转发至阿里云通义千问 → 结果格式化返回前端
四、核心代码片段节选
1. Vue 前端 请求接口代码 + 分析
1.1 接口请求封装(推荐放在 src/api/llmService.js/api/diagnose.js)
// src/api/diagnose.js 故障诊断接口
import axios from 'axios'
// 基础地址:AI诊断后端 FastAPI 8019
const diagnoseBaseUrl = 'http://127.0.0.1:8019'
// 设备故障诊断请求
export function getFaultDiagnose(vibrationData) {
return axios({
method: 'POST',
url: `${diagnoseBaseUrl}/diagnose`,
data: {
vibration: vibrationData
},
headers: {
'Content-Type': 'application/json'
}
})
}
// 检查诊断服务健康状态
export function checkDiagnoseHealth() {
return axios.get(`${diagnoseBaseUrl}/health`)
}
llmService.js
// src/api/llmService.js 大模型咨询接口
import axios from 'axios'
// 基础地址:Node代理服务 8020
const llmBaseUrl = 'http://127.0.0.1:8020'
// 发起AI运维咨询
export function askLLM(device, question) {
return axios({
method: 'POST',
url: `${llmBaseUrl}/api/chat`,
data: {
device: device,
question: question
},
headers: {
'Content-Type': 'application/json'
}
})
}
1.2 页面中调用示例(.vue 组件内)
<template>
<div>
<button @click="runDiagnose">AI故障诊断</button>
<button @click="askQuestion">咨询运维问题</button>
</div>
</template>
<script>
import { getFaultDiagnose } from '@/api/diagnose'
import { askLLM } from '@/api/llmService'
export default {
methods: {
async runDiagnose() {
// 模拟振动数据
const mockVib = [0.12, 0.35, 0.22, 0.41, 0.18]
try {
const res = await getFaultDiagnose(mockVib)
console.log("诊断结果:", res.data)
} catch (err) {
console.error("诊断请求失败", err)
}
},
async askQuestion() {
try {
const res = await askLLM("工业轴承", "设备震动偏大如何排查?")
console.log("大模型回复:", res.data)
} catch (err) {
console.error("咨询失败", err)
}
}
}
}
</script>
代码分析
- 接口拆分:把故障诊断和大模型咨询拆成两个独立 API 文件,解耦、便于维护。
- 端口对应:故障诊断 →
127.0.0.1:8019(FastAPI);大模型咨询 →127.0.0.1:8020(Node 代理)。 - 请求方式:业务数据使用
POST + JSON传输,符合前后端交互规范;健康检查使用简单GET。 - 异常处理:页面使用
async/await + try/catch捕获网络异常、服务宕机等错误,前端友好提示。 - 跨域说明:前端直接请求公网大模型会触发浏览器跨域,因此统一转发到 Node 中间层处理。
2. Python FastAPI + PyTorch AI 诊断后端 完整代码 + 分析
文件:ai_backend/ai_service.py
完整代码
from fastapi import FastAPI, Request
import uvicorn
import torch
import numpy as np
# 1. 初始化FastAPI应用
app = FastAPI(title="轴承故障诊断服务")
# 2. 加载PyTorch模型与归一化参数
device = torch.device("cpu")
# 加载训练好的故障模型
model = torch.load("fault_model.pt", map_location=device)
model.eval()
# 加载数据归一化参数
scaler_data = np.load("scaler_params.npz")
mean = scaler_data["mean"]
std = scaler_data["std"]
# 3. 健康检查接口
@app.get("/health")
async def health_check():
return {"status": "ok"}
# 4. 故障诊断核心接口
@app.post("/diagnose")
async def diagnose(request: Request):
# 接收前端JSON数据
data = await request.json()
vib_data = data.get("vibration", [])
# 数据预处理:归一化
arr = np.array(vib_data, dtype=np.float32)
arr = (arr - mean) / std
# 转为模型输入Tensor
input_tensor = torch.from_numpy(arr).unsqueeze(0)
# 模型推理(关闭梯度,提升速度)
with torch.no_grad():
output = model(input_tensor)
pred = torch.argmax(output, dim=0).item()
# 映射诊断结果
label_map = {0: "设备正常", 1: "轴承故障异常"}
result = label_map.get(pred, "未知状态")
return {
"code": 200,
"diagnose_result": result,
"raw_pred": int(pred)
}
if __name__ == "__main__":
# 监听 0.0.0.0:8019
uvicorn.run(app, host="0.0.0.0", port=8019)
代码逐块分析
- 框架与依赖:使用 FastAPI 搭建高性能异步接口,相比 Flask 更适合工业高并发场景;
uvicorn作为 ASGI 服务启动器。 - 模型加载:
map_location=device强制使用 CPU 运行,兼容无显卡环境;model.eval()切换为推理模式,关闭 Dropout/BatchNorm 等训练层。 - 健康接口
/health:供前端 / 运维探测服务是否在线,排查 “连不上 8019” 类问题。 - 数据预处理:前端传来原始振动数据,使用训练时保存的
mean/std做归一化,保证推理分布和训练一致。 - 模型推理:
torch.no_grad()禁用梯度计算,减少内存占用、加快推理;argmax取概率最大类别作为诊断结果。 - 服务配置:
host="0.0.0.0"允许局域网其他设备访问,不止本机127.0.0.1。
3. Node.js Express 调用通义千问 核心代理代码 + 分析
文件:llm-proxy/app.js
const express = require('express')
const axios = require('axios')
const cors = require('cors')
const app = express()
const PORT = 8020
// 中间件
app.use(cors()) // 解决浏览器跨域
app.use(express.json()) // 解析JSON请求体
// ========== 配置阿里云通义千问 ==========
const API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // 替换为自己的Key
const API_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
// 大模型咨询接口
app.post('/api/chat', async (req, res) => {
try {
const { device, question } = req.body
// 组装Prompt(工业运维场景提示词)
const prompt = `你是工业设备运维专家,设备:${device},问题:${question}。请分析故障原因、给出维修建议和风险等级。`
// 调用通义千问接口
const response = await axios.post(
API_URL,
{
model: "qwen-turbo",
input: {
messages: [
{ role: "system", content: "你是专业的工业智能制造运维工程师" },
{ role: "user", content: prompt }
]
},
parameters: {
result_format: "message"
}
},
{
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json"
}
}
)
// 解析大模型返回结果
const llmReply = response.data.output.choices[0].message.content
// 统一格式返回给前端
res.json({
code: 200,
answer: llmReply
})
} catch (error) {
console.error("调用大模型失败:", error.message)
res.status(500).json({
code: 500,
msg: "AI咨询服务异常,请检查API Key或网络"
})
}
})
// 启动服务
app.listen(PORT, () => {
console.log(`LLM代理服务运行在 http://127.0.0.1:${PORT}`)
})
代码分析
- 核心中间件作用:
cors()解决 Vue 前端跨域请求问题,不可省略;express.json()解析前端发来的 JSON 数据。 - 代理层设计意义
- 保护密钥:
API_KEY存放在后端 Node 服务中,不会暴露在前端源码; - 接口适配:统一封装阿里云复杂请求体,前端仅需传递设备、问题,降低前端复杂度;
- 异常收敛:统一捕获大模型调用异常,向前端返回友好错误信息。
- 保护密钥:
- 通义千问请求格式:严格遵循阿里云百炼接口规范,鉴权头为
Authorization: Bearer 你的Key;选用qwen-turbo模型,响应快、适配问答场景;通过system角色设定模型身份,贴合工业运维场景。 - 数据流转:前端传参 → Node 组装 Prompt → 调用云端 LLM → 解析结果 → 格式化返回前端。
常见坑
InvalidApiKey:密钥复制错误、存在空格 / 换行、密钥过期;- 网络不通:设备无法访问外网,无法调用阿里云接口;
- 免费额度用尽:高频请求造成接口限流。
五、工业场景落地优势与优化方向
架构优势:本地模型低延迟、云端大模型强语义,兼顾实时性与专业性;
现存不足:当前使用模拟振动数据、依赖公网大模型接口;
优化方案:接入真实传感器数据、部署私有化大模型、对模型进行轻量化、增加数据持久化与存储功能。
六、部署难点与排错思路
- 端口占用:8019、8020、8080 端口被占用时,可关闭占用进程或修改代码内端口配置;
- 文件缺失:
fault_model.pt、scaler_params.npz需与 Python 服务脚本放在同一目录; - 服务启动顺序:必须依次启动 Python 诊断服务 → Node 代理服务 → Vue 前端,顺序错误会导致接口请求失败;
- 依赖缺失:执行对应
pip/npm命令安装全部依赖,推荐使用国内镜像加速下载。
七、文末
开源地址:https://gitee.com/luan-heran/mal-rom-aifc 如果文章对你有帮助,欢迎点赞、收藏、评论,一起交流学习!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)