灵感来源 本项目基于 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 组件库快速搭建页面,适配桌面端工业监控场景。

三、接口交互流程(核心数据流)

完整请求链路分为两大业务流程:

  1. AI 故障诊断流程:前端 → 调用 8019 端口 FastAPI 接口 → PyTorch 模型推理 → 结果返回前端展示
  2. 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)
代码逐块分析
  1. 框架与依赖:使用 FastAPI 搭建高性能异步接口,相比 Flask 更适合工业高并发场景;uvicorn 作为 ASGI 服务启动器。
  2. 模型加载map_location=device 强制使用 CPU 运行,兼容无显卡环境;model.eval() 切换为推理模式,关闭 Dropout/BatchNorm 等训练层。
  3. 健康接口 /health:供前端 / 运维探测服务是否在线,排查 “连不上 8019” 类问题。
  4. 数据预处理:前端传来原始振动数据,使用训练时保存的 mean/std 做归一化,保证推理分布和训练一致。
  5. 模型推理torch.no_grad() 禁用梯度计算,减少内存占用、加快推理;argmax 取概率最大类别作为诊断结果。
  6. 服务配置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 数据。
  • 代理层设计意义
    1. 保护密钥:API_KEY 存放在后端 Node 服务中,不会暴露在前端源码;
    2. 接口适配:统一封装阿里云复杂请求体,前端仅需传递设备、问题,降低前端复杂度;
    3. 异常收敛:统一捕获大模型调用异常,向前端返回友好错误信息。
  • 通义千问请求格式:严格遵循阿里云百炼接口规范,鉴权头为 Authorization: Bearer 你的Key;选用 qwen-turbo 模型,响应快、适配问答场景;通过 system 角色设定模型身份,贴合工业运维场景。
  • 数据流转:前端传参 → Node 组装 Prompt → 调用云端 LLM → 解析结果 → 格式化返回前端。
常见坑
  1. InvalidApiKey:密钥复制错误、存在空格 / 换行、密钥过期;
  2. 网络不通:设备无法访问外网,无法调用阿里云接口;
  3. 免费额度用尽:高频请求造成接口限流。

五、工业场景落地优势与优化方向

架构优势:本地模型低延迟、云端大模型强语义,兼顾实时性与专业性;

现存不足:当前使用模拟振动数据、依赖公网大模型接口;

优化方案:接入真实传感器数据、部署私有化大模型、对模型进行轻量化、增加数据持久化与存储功能。

六、部署难点与排错思路

  1. 端口占用:8019、8020、8080 端口被占用时,可关闭占用进程或修改代码内端口配置;
  2. 文件缺失:fault_model.ptscaler_params.npz 需与 Python 服务脚本放在同一目录;
  3. 服务启动顺序:必须依次启动 Python 诊断服务 → Node 代理服务 → Vue 前端,顺序错误会导致接口请求失败;
  4. 依赖缺失:执行对应 pip / npm 命令安装全部依赖,推荐使用国内镜像加速下载。

七、文末

开源地址:https://gitee.com/luan-heran/mal-rom-aifc 如果文章对你有帮助,欢迎点赞、收藏、评论,一起交流学习!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐