AI诊断分析
# 故障诊断分析功能实现逻辑 —— 答辩版
> 工业智能运维决策平台 · 核心功能模块答辩
---
## 第1页 · 项目背景与问题
### 行业痛点
> 工业设备故障诊断长期依赖资深专家经验,存在三大问题:
| 痛点 | 现状 | 影响 |
|------|------|------|
| 知识孤岛 | 设备文档分散存储,故障时难以快速检索 | 诊断效率低,平均耗时数小时 |
| 经验依赖 | 高水平专家稀缺,新手无法独立判断 | 人才瓶颈,无法规模化 |
| 信息陈旧 | 故障知识静态,无法获取最新行业方案 | 诊断准确性受限 |
### 本项目目标
**将大语言模型 + RAG 技术引入工业运维,实现:**
- 自然语言输入故障现象 → AI 自动检索相关文档 → 联网补充最新知识 → 生成专业诊断报告
- 核心指标:检索精度 ≥ 0.7,诊断响应 ≤ 30s,支持 3 类工业设备
---
## 第2页 · 技术方案总览
```
┌──────────────────────────────────────────────────────────────┐
│ 故障诊断系统架构 │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ POST /diagnose ┌──────────────────┐ │
│ │ Vue 3 │ ──────────────────────→│ Spring Boot │ │
│ │ 前端交互 │ ←──────────────────────│ FaultRecordCtrl │ │
│ └──────────┘ 诊断结果 JSON └────────┬─────────┘ │
│ │ │
│ ┌────────────────────────────┼──────┐ │
│ │ FaultRecordService │ │ │
│ │ │ │ │
│ │ ┌──────────────────────┐ │ │ │
│ │ │ ① RAG 检索 (向量匹配) │ │ │ │
│ │ │ ② 历史运维 + 故障查询 │ │ │ │
│ │ │ ③ 拼接 5 部分 Prompt │ │ │ │
│ │ │ ④ 大模型诊断 │ │ │ │
│ │ │ ⑤ 结果存 MongoDB │ │ │ │
│ │ └──────────────────────┘ │ │ │
│ └────────────┬───────────────┘ │ │
│ │ │ │
│ ┌─────────────────┐ ┌───────┴──────┐ ┌──────────┐ │ │
│ │ MongoDB │ │ QwenChatModel│ │ 内存向量库│ │ │
│ │ 文档/报告/故障 │ │ qwen-plus │ │ Embedding │ │ │
│ │ 持久化存储 │ │ 联网搜索开启 │ │ Store │ │ │
│ └─────────────────┘ └──────────────┘ └──────────┘ │ │
│ │
└──────────────────────────────────────────────────────────────┘
```
---
## 第3页 · 核心创新:RAG(检索增强生成)
### 为什么不用纯大模型?
| 方案 | 问题 |
|------|------|
| 纯大模型 | 不了解企业内部设备文档,易"幻觉"编造 |
| 微调模型 | 成本高、周期长、文档更新需重新训练 |
| **RAG(本方案)** | ✅ 零训练成本 ✅ 文档即时生效 ✅ 回答可溯源 |
### RAG 实现原理
```
工程师上传的设备文档(PDF/Word/Txt)
│
▼
┌──────────────────────────────┐
│ DocumentSplitters.recursive │ ← 文档分块:500 token/块
│ (重叠 50 token 防语义断裂) │
└────────────┬─────────────────┘
▼
┌──────────────────────────────┐
│ QwenEmbeddingModel │ ← 向量化:文本 → 768维向量
└────────────┬─────────────────┘
▼
┌──────────────────────────────┐
│ InMemoryEmbeddingStore │ ← 向量存储(内存)
└──────────────────────────────┘
当故障发生时:
故障现象 → QwenEmbeddingModel → 向量 → 余弦相似度匹配
→ 返回 Top 3 最相关文档片段(相似度 ≥ 0.7)
→ 作为大模型诊断的"参考资料"
```
### 为什么选内存向量库?
| 考量 | 选择 |
|------|------|
| 场景 | 工业文档量有限(百份级别),无需分布式 |
| 性能 | 内存检索 < 10ms,满足实时性 |
| 部署 | 零外部依赖,系统自包含 |
| 维护 | 重启自动全量重建,保证一致性 |
---
## 第4页 · 诊断 Prompt 工程
### 设计思路
> 并非简单把故障现象丢给大模型,而是**结构化注入三重知识**
```
┌──────────────────────────────────────────┐
│ 诊断 Prompt 5 层结构 │
├──────────────────────────────────────────┤
│ │
│ ① 角色设定 │
│ "资深的工业故障诊断专家" │
│ → 限定回答风格:专业、规范 │
│ │
│ ② 设备知识(RAG 检索) │
│ 从向量库匹配的 Top 3 文档片段 │
│ → 提供该设备相关的操作规程、参数标准 │
│ │
│ ③ 历史运维报告 │
│ 该设备最近一份 AI 生成的运维报告 │
│ → 提供近期运行状态、已发现异常 │
│ │
│ ④ 历史故障记录 │
│ 该设备最近一次故障诊断结果 │
│ → 避免重复诊断,参考已有分析 │
│ │
│ ⑤ 当前故障信息 │
│ 设备类型 + 故障现象(用户输入) │
│ → 本次诊断的核心输入 │
│ │
└──────────────────────────────────────────┘
```
### 容错设计
```java
// 历史报告和故障可能为空(新设备无历史数据)
try { operateStr = operateReportRepository...get(0).getContent(); }
catch (Exception e) {} // 优雅降级,不影响诊断主流程
try { faultStr = getFaultsByDeviceId(deviceId).get(0).getDiagnoseResult(); }
catch (IndexOutOfBoundsException e) {}
```
---
## 第5页 · 技术选型对比
### 大模型选型
| 候选 | 优点 | 缺点 | 是否选用 |
|------|------|------|----------|
| GPT-4 | 综合能力强 | 海外 API,工业数据安全风险,成本高 | ❌ |
| 开源模型 | 本地部署可控 | 需要 GPU 资源,推理速度慢 | ❌ |
| **阿里千问 Qwen-Plus** | 国内合规、联网搜索原生支持、LangChain4j 官方适配 | — | ✅ |
### 选型理由
1. **合规性**:工业数据不出境,阿里云国内节点
2. **联网搜索**:`enableSearch(true)` 一行代码开启,故障诊断可补充最新行业知识
3. **框架适配**:LangChain4j 社区已有 `dashscope` 官方模块,零封装成本
4. **参数调优**:`temperature=0.7` 平衡专业性与创造性;`maxTokens=2048` 保证诊断报告完整性
### 后端框架选型
- **LangChain4j** 而非手写 HTTP 调用:统一管理 RAG 组件(嵌入模型、向量库、检索器),内置文档分块策略
- **Spring Boot 3** 而非 Python FastAPI:团队技术栈统一,与 MongoDB 集成成熟
---
## 第6页 · 数据流与接口设计
### API 设计原则
| 原则 | 体现 |
|------|------|
| RESTful | POST 提交诊断,GET 查询历史,语义清晰 |
| 原子性 | 一次诊断请求 = 检索 + 推理 + 存储,前端一次调用完成 |
| 幂等性 | GET `/faults/{deviceId}` 可重复调用无副作用 |
### 接口清单
```
POST /api/operate/diagnose
Request: { deviceId, deviceType, faultPhenomenon }
Response: [{ id, deviceId, faultPhenomenon, diagnoseResult, createTime }]
SideEffect: 写入 MongoDB fault_records 集合
GET /api/operate/faults/{deviceId}
Response: [{ id, deviceId, faultPhenomenon, diagnoseResult, createTime }]
SideEffect: 无(只读查询)
```
### 数据存储
```
MongoDB Collection: fault_records
{
_id: ObjectId, // 自动生成
deviceId: "device001", // 设备编号
deviceType: "fan", // 风机/水泵/电机
faultPhenomenon: "...", // 原始故障描述
diagnoseResult: "...", // AI 诊断结果(核心产出)
createTime: ISODate // 诊断时间戳
}
```
---
## 第7页 · 实现难点与解决方案
### 难点 1:文档语义检索精度
| 问题 | 检索结果与故障现象不相关 |
|------|--------------------------|
| 原因 | 文档分块过大导致噪声多,过小导致语义不全 |
| **解决** | `recursive(500, 50)` — 500 token / 块 + 50 token 重叠,平衡完整性与精度 |
| 问题 | 低质量片段污染 Prompt |
|------|----------------------|
| **解决** | `minScore=0.7` 阈值过滤,相似度低于 0.7 的片段直接丢弃 |
### 难点 2:新设备无历史数据
| 问题 | 首次诊断时该设备无运维报告和故障记录 |
|------|--------------------------------------|
| **解决** | try-catch 容错,历史数据为空时 Prompt 模板自动跳过对应段落,不影响诊断 |
### 难点 3:大模型联网搜索稳定性
| 问题 | 联网搜索可能超时或返回无关内容 |
|------|-------------------------------|
| **解决** | ① 5 层 Prompt 中 RAG 文档 > 历史记录 > 联网搜索,结构化优先级 ② Prompt 末尾要求"分析专业、步骤清晰",约束输出质量 |
---
## 第8页 · 前端交互设计
### 用户体验设计要点
```
故障诊断 Tab 页布局:
┌─────────────────────────────────────────────┐
│ 概览卡片 │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 诊断记录 N 条 │ │ AI 智能引擎 │ │
│ └──────────────┘ └──────────────┘ │
├─────────────────────────────────────────────┤
│ 输入区 │
│ [设备ID] [风机▾] │
│ ┌─────────────────────────────────┐ │
│ │ 故障现象描述(多行文本,placeholder引导)│ │
│ └─────────────────────────────────┘ │
│ [🔍 诊断故障] ← 有内容前 disabled │
├─────────────────────────────────────────────┤
│ 结果展示区 │
│ ┌─────────────────────────────────┐ │
│ │ 🟠 故障现象:... │ │
│ │ ───────────────────────────── │ │
│ │ 🟢 诊断结果:... [导出 PDF] │ │
│ └─────────────────────────────────┘ │
│ (每张卡片橙色/绿色双色对比,一目了然) │
└─────────────────────────────────────────────┘
```
### 交互细节
| 细节 | 设计意图 |
|------|----------|
| 按钮 disabled | 未输入故障现象时不可点击,防无效请求 |
| 诊断完成自动清空输入 | 减少操作步骤,提升效率 |
| 结果实时刷新列表 | 无需手动刷新,诊断结果即时可见 |
| 空状态引导 | 无记录时展示插图 + 提示文字,降低认知负担 |
| 导出 PDF | 诊断结果可离线归档、打印、分享 |
---
## 第9页 · 系统测试与验证
### 测试场景
| 场景 | 输入 | 预期行为 |
|------|------|----------|
| 正常诊断 | device001, fan, "轴承温度100℃振动大" | 返回专业诊断,含原因分析 + 处理建议 |
| 空输入 | 故障现象为空 | 按钮 disabled,提示"请描述故障现象" |
| 无历史数据 | 全新设备首次诊断 | 正常诊断(历史报告和故障字段为空) |
| 无相关文档 | 故障现象与已有文档无关 | RAG 返回空上下文,模型依靠自身知识诊断 |
| 历史查询 | GET /faults/device001 | 按时间倒序返回该设备所有诊断记录 |
| PDF 导出 | 点击"导出 PDF" | 生成 A4 格式报告,含标题/元信息/现象/结果 |
### 性能指标
- RAG 检索延迟:< 10ms(内存向量库)
- 大模型推理:≈ 5-15s(取决于联网搜索耗时)
- 端到端响应:< 30s
- 并发支持:单机 100+ QPS(Spring Boot + MongoDB 支撑)
---
## 第10页 · 总结与展望
### 核心贡献
| 维度 | 成果 |
|------|------|
| 技术创新 | 将 RAG + 联网大模型引入工业故障诊断,实现知识检索与推理一体化 |
| 工程实践 | 完整的 Spring Boot + Vue 3 + MongoDB 全栈实现,可直接部署 |
| 容错设计 | 历史数据缺失优雅降级,不影响核心诊断流程 |
| 用户体验 | 自然语言交互、实时反馈、PDF 导出,降低使用门槛 |
### 未来方向
```
短期 ──→ 报告/诊断 PDF 导出(已实现)
│
中期 ──→ 设备管理模块、告警规则引擎、趋势对比分析
│
长期 ──→ 用户权限体系、WebSocket 实时推送、多模态故障诊断(图片+文本)
```
---
## 附录 · 核心代码清单
| 文件 | 路径 | 职责 |
|------|------|------|
| App.vue | `industrial-ai-frontend/src/` | 前端诊断交互 + PDF导出 |
| FaultRecordController | `controller/FaultRecordController.java` | 诊断/查询 REST API |
| FaultRecordService | `service/FaultRecordService.java` | 诊断引擎核心逻辑 |
| ChatService | `service/ChatService.java` | RAG 知识库 + 向量检索 |
| Langchain4JConfig | `config/Langchain4JConfig.java` | 千问模型配置 |
| FaultRecord | `entity/FaultRecord.java` | 故障记录实体 |
| FaultRecordRepository | `repository/FaultRecordRepository.java` | MongoDB 数据访问 |
