Dify+RAGFlow:泵類(lèi)設(shè)備預(yù)測(cè)維護(hù)系統(tǒng)案例分享
上篇文章介紹到的 Dify+RAGFLow 的協(xié)同使用文章里,提到了一個(gè)泵類(lèi)設(shè)備預(yù)測(cè)性維護(hù)智能系統(tǒng)。后來(lái)陸續(xù)有人私信咨詢(xún)實(shí)施細(xì)節(jié),這篇做個(gè)統(tǒng)一的介紹。
Dify+RAGFlow:1+1>2的混合架構(gòu),詳細(xì)教程+實(shí)施案例
項(xiàng)目定位是,利用 Dify 的工作流編排能力和 RAGFlow 的知識(shí)庫(kù)組件,結(jié)合模擬的設(shè)備傳感器數(shù)據(jù) (IoT) 和企業(yè)資源數(shù)據(jù) (CMMS, MES, ERP),構(gòu)建一個(gè)針對(duì)離心式冷卻液泵的預(yù)測(cè)性維護(hù)系統(tǒng)原型。
注:為遵守保密協(xié)議,本文及相關(guān)代碼在原項(xiàng)目基礎(chǔ)上使用了模擬數(shù)據(jù)和接口進(jìn)行演示。所展示的工作流設(shè)計(jì)、節(jié)點(diǎn)交互等與實(shí)際項(xiàng)目邏輯相似,僅供各位參考。
以下,enjoy:
1、項(xiàng)目背景
作者早年從事金融信貸領(lǐng)域時(shí),在長(zhǎng)珠三角走訪過(guò)大大小小幾百家工廠,其中以機(jī)械加工、注塑行業(yè)為主,但不管什么細(xì)分行業(yè),設(shè)備的穩(wěn)定運(yùn)行對(duì)企業(yè)來(lái)說(shuō)都是日常經(jīng)營(yíng)的頭等大事。尤其是像 CNC 加工中心使用的冷卻液泵這類(lèi)關(guān)鍵輔助設(shè)備,意外停機(jī)會(huì)導(dǎo)致生產(chǎn)中斷,直接影響訂單排查計(jì)劃。
傳統(tǒng)的定期維護(hù) (Preventive Maintenance, PM) 往往過(guò)于保守或未能及時(shí)發(fā)現(xiàn)潛在問(wèn)題,而事后維修 (Corrective Maintenance, CM) 成本高昂。這篇要介紹的預(yù)測(cè)性維護(hù) (Predictive Maintenance, PdM) 主要目的是通過(guò)監(jiān)測(cè)離心泵設(shè)備狀態(tài),在故障實(shí)際發(fā)生前安排維護(hù),最大限度地減少停機(jī)時(shí)間、降低維護(hù)成本、提高設(shè)備利用率。
泵類(lèi)型: 離心式冷卻液泵 (Centrifugal Coolant Pump)
泵型號(hào) : CoolFlow Pro 5000
設(shè)備 ID: PUMP-CNC-001
使用場(chǎng)景: 安裝在一臺(tái)中型 CNC 立式加工中心 (Machine ID: VMC-03) 上,用于循環(huán)供給水基切削液,冷卻刀具和工件。該機(jī)床主要加工鋼材和鋁合金零件,實(shí)行兩班倒工作制 (16小時(shí)/天)。泵已運(yùn)行約 18 個(gè)月。
關(guān)鍵監(jiān)測(cè)參數(shù): 振動(dòng) (mm/s RMS), 溫度 (°C), 出口壓力 (Bar), 流量 (L/min)。
2、數(shù)據(jù)構(gòu)成
參照真實(shí)的業(yè)務(wù)場(chǎng)景,我構(gòu)建了一套模擬 API (mock_api.py) 和相應(yīng)的 JSON 數(shù)據(jù)文件,代表不同系統(tǒng)的數(shù)據(jù)源:
1、IoT 數(shù)據(jù) (`IOT.json` & `/api/pump/status`):
* 包含泵的實(shí)時(shí)傳感器讀數(shù),如時(shí)間戳 (`timestamp`)、軸向/徑向振動(dòng) (`vibration_axial`/`radial`)、電機(jī)/軸承溫度 (`temperature_motor`/`bearing`)、出口壓力 (`pressure_outlet`)、流量 (`flow_rate`)。
* 模擬了數(shù)據(jù)隨時(shí)間變化,包含正常和逐漸異常的狀態(tài)。
2、MES 數(shù)據(jù) (`MES.json` & `/api/mes/pump/operation`):
* 提供泵的運(yùn)行日志,關(guān)聯(lián)的設(shè)備 (`associated_machineId`),運(yùn)行小時(shí)數(shù) (`operating_hours`),處理的工單 (`jobs_processed`) 等。
* 有助于了解泵的工作負(fù)載和上下文。
3、CMMS 數(shù)據(jù) (`CMMS.json` & `/api/cmms/pump/history`):
* 包含歷史維護(hù)記錄 (`maintenance_records`):工單號(hào)、日期、類(lèi)型、描述、更換部件、停機(jī)時(shí)間等。
* 包含相關(guān)故障信息 (`related_failures_info`):其他泵(或本機(jī)歷史)的故障案例,包括癥狀、故障模式、根本原因、糾正措施。這是重要的知識(shí)來(lái)源。
4、ERP 數(shù)據(jù) (`ERP.json` & `/api/erp/spare_parts`):
* 提供備件信息:零件 ID (`partId`)、名稱(chēng) (`name`)、描述、適用泵型號(hào)、供應(yīng)商、庫(kù)存水平 (`stock_level`)、單價(jià) (`unit_price`)、采購(gòu)提前期 (`lead_time_days`)。
* 用于生成維護(hù)建議時(shí)考慮備件可用性。
模擬維護(hù)完成后,實(shí)際執(zhí)行情況的反饋數(shù)據(jù),用于評(píng)估預(yù)測(cè)準(zhǔn)確性和閉環(huán)優(yōu)化。
3、工作流整體思路
由 RAGFlow 負(fù)責(zé)處理知識(shí)庫(kù),工作流基于 Dify 構(gòu)建,核心思路是:
狀態(tài)監(jiān)測(cè) -> 異常判斷 -> 深度分析與建議 -> 報(bào)告生成。
獲取狀態(tài): 通過(guò) GET_IOT_DATA 節(jié)點(diǎn)調(diào)用模擬 API 獲取指定 pumpId 的最新傳感器數(shù)據(jù)。
解析數(shù)據(jù): 使用 CODE 節(jié)點(diǎn)解析返回的 JSON 字符串,提取關(guān)鍵指標(biāo),并判斷是否需要維護(hù) (needs_maintenance 標(biāo)志)。
條件分流: IF/ELSE 節(jié)點(diǎn)根據(jù) needs_maintenance 標(biāo)志決定流程走向。
ELSE (正常): 流向 ANSWER 節(jié)點(diǎn),輸出簡(jiǎn)單的狀態(tài)正常信息。
IF (異常): 啟動(dòng)預(yù)測(cè)性維護(hù)流程。
信息整合 (IF 分支):
調(diào)用 GET_CMMS_DATA 和 GET_MES_DATA 獲取歷史維護(hù)和運(yùn)行數(shù)據(jù)。
調(diào)用 KNOWLEDGE_RETRIEVAL 節(jié)點(diǎn),結(jié)合當(dāng)前異常指標(biāo)查詢(xún)知識(shí)庫(kù) (離心泵設(shè)備手冊(cè) pdf、歷史維修案例 excel)。
故障預(yù)測(cè) (IF 分支): 調(diào)用 FAULT_PREDICTION(LLM 節(jié)點(diǎn)),將整合后的信息(實(shí)時(shí)數(shù)據(jù)、歷史數(shù)據(jù)、知識(shí)庫(kù)信息)提供給 LLM,要求其分析可能的故障模式并預(yù)測(cè)需要更換的關(guān)鍵備件 ID。
備件 ID 提取 (IF 分支): 使用 EXTRACT_PART_ID (CODE 節(jié)點(diǎn)) 從 FAULT_PREDICTION 的文本輸出中解析出 required_partId。
ERP 查詢(xún) (IF 分支): 調(diào)用 GET_ERP_DATA (HTTP 節(jié)點(diǎn)),使用 extracted_part_id 作為參數(shù)查詢(xún)具體備件信息 。
ERP 數(shù)據(jù)解析 (IF 分支): 使用 PARSE_ERP_DATA(CODE 節(jié)點(diǎn)) 解析 GET_ERP_DATA 返回的 JSON 字符串為列表。
生成維護(hù)建議 (IF 分支): 調(diào)用 SUGGESTIONS(LLM 節(jié)點(diǎn)),將故障預(yù)測(cè)結(jié)果和解析后的 ERP 備件信息列表提供給 LLM,要求生成詳細(xì)的維護(hù)步驟、備件清單和時(shí)間建議。
最終輸出: 通過(guò) ANSWER 2 節(jié)點(diǎn)展示維護(hù)建議或最終報(bào)告。
4、關(guān)鍵節(jié)點(diǎn)介紹
**START:** 定義工作流入口參數(shù) (`pumpId`)。
**GET\_... (HTTP Request):** 與模擬 API 交互,獲取各類(lèi)數(shù)據(jù)。
**CODE (解析 IoT):** 解析 IoT JSON,提取關(guān)鍵指標(biāo),**計(jì)算 `needs_maintenance` 標(biāo)志**。
**IF/ELSE:** 根據(jù) `needs_maintenance` 標(biāo)志進(jìn)行流程分支。
**KNOWLEDGE_RETRIEVAL:** (可選) 連接外部知識(shí)庫(kù)進(jìn)行 RAG 查詢(xún)。
**FAULT_PREDICTION (LLM):** 基于多源信息進(jìn)行故障診斷與預(yù)測(cè)。
**EXTRACT_PART_ID (CODE):** 從 LLM 輸出中解析結(jié)構(gòu)化信息 (Part ID)。
**PARSE_ERP_DATA (CODE):** 解析 ERP 返回的 JSON 列表字符串。
**SUGGESTIONS (LLM):** 結(jié)合故障預(yù)測(cè)和備件信息生成維護(hù)建議。
**ANSWER / ANSWER 2:** 輸出最終結(jié)果。
5、主要報(bào)錯(cuò)與解決過(guò)程參考
基于我前期在上手熟悉 Dify 工作流搭建中踩過(guò)的坑,結(jié)合這個(gè)項(xiàng)目做個(gè)對(duì)照說(shuō)明,各位可以大致做個(gè)參考:
1. HTTP 請(qǐng)求:URL 與參數(shù)混淆
* **節(jié)點(diǎn):** `GET_IOT_DATA`
* **報(bào)錯(cuò):** `Invalid non-printable ASCII character...`
* **原因:** 同時(shí)在 URL 字段和 PARAMS 字段中定義了查詢(xún)參數(shù)。
* **解決:** URL 只寫(xiě)基礎(chǔ)路徑,參數(shù)在 PARAMS 中定義 (推薦: `{{start.pumpId}}`)。
2. HTTP 請(qǐng)求:網(wǎng)絡(luò)訪問(wèn) & CORS
* **節(jié)點(diǎn):** 所有 HTTP 請(qǐng)求節(jié)點(diǎn)
* **報(bào)錯(cuò):** Dify 404,但 API 日志顯示 200 OK。
* **原因:** API 服務(wù)監(jiān)聽(tīng)地址限制;缺少 CORS 配置。
* **解決:**
* API (`mock_api.py`): 啟動(dòng)時(shí) `host='0.0.0.0'`。
* API (`mock_api.py`): 安裝 `flask-cors` 并啟用 `CORS(app)`。
3. 數(shù)據(jù)處理:JSON 字符串解析
* **節(jié)點(diǎn):** `CODE` (解析 IoT), `IF/ELSE`, `ANSWER`
* **報(bào)錯(cuò):** `IF/ELSE` 條件不生效;`ANSWER` 直接輸出占位符。
* **原因:** HTTP 節(jié)點(diǎn)返回的 `body` 是 JSON **字符串**,而非結(jié)構(gòu)化對(duì)象。
* **解決:** 在 HTTP 節(jié)點(diǎn)后加 `CODE` 節(jié)點(diǎn),用 `json.loads()` 解析 `body` 字符串,輸出解析后的對(duì)象/列表供后續(xù)節(jié)點(diǎn)使用。
4. IF/ELSE 節(jié)點(diǎn):數(shù)值比較類(lèi)型問(wèn)題
* **節(jié)點(diǎn):** `IF/ELSE`
* **報(bào)錯(cuò):** 數(shù)值比較條件 (`> 6.0`) 不生效。
* **原因:** `IF/ELSE` 可能將變量視為字符串進(jìn)行比較。
* **解決:** 將比較邏輯移入 `CODE` 節(jié)點(diǎn),輸出簡(jiǎn)單標(biāo)志位 (如 `"1"`/`"0"` 字符串),`IF/ELSE` 只判斷此標(biāo)志位。
5. CODE 節(jié)點(diǎn):Python 語(yǔ)法 & 類(lèi)型錯(cuò)誤
* **節(jié)點(diǎn):** 所有 `CODE` 節(jié)點(diǎn)
* **報(bào)錯(cuò):** `IndentationError`, `NameError`, `Output variable 'xxx' must be a [Type]`。
* **原因:** 縮進(jìn)錯(cuò)誤;變量未定義;Dify 輸出類(lèi)型配置與代碼返回不符。
* **解決:** 嚴(yán)格檢查 Python 縮進(jìn);確保 `return` 前所有變量已定義賦值;確保 Dify 中輸出變量的**名稱(chēng)和類(lèi)型**與代碼 `return` **完全匹配** (e.g., Part ID 是 String)。
6. TEMPLATE 節(jié)點(diǎn):Jinja2 語(yǔ)法 & 數(shù)據(jù)錯(cuò)誤
* **節(jié)點(diǎn):** `TEMPLATE`
* **報(bào)錯(cuò):** `jinja2.exceptions.TemplateSyntaxError`。
* **原因:** 括號(hào)錯(cuò)誤 (`{{{` vs `{{`, `}} }`); 控制結(jié)構(gòu)括號(hào)錯(cuò)誤 (`{{%` vs `{%`); 變量名不匹配;在未解析數(shù)據(jù)上訪問(wèn)屬性。
* **解決:** 修正 Jinja2 語(yǔ)法;確保模板變量名與輸入變量名**完全一致**;對(duì)列表/字典數(shù)據(jù),**先用 CODE 解析**再傳入模板,并使用 `{% for %}` 訪問(wèn)循環(huán)變量屬性 (`{{ part.name }}`)。
6、從模擬到生產(chǎn)切換注意事項(xiàng)
看完上述內(nèi)容,如果你計(jì)劃將基于 mock_api.py 測(cè)試成功的工作流切換到對(duì)接真實(shí)的生產(chǎn)環(huán)境,需要注意替換數(shù)據(jù)源接入點(diǎn),并適配數(shù)據(jù)格式。
主要步驟如下:
1. 獲取真實(shí) API 信息:** 獲取真實(shí)的 IoT、CMMS、MES、ERP 系統(tǒng)的 API 詳細(xì)信息:
* **URL 端點(diǎn) (Endpoint):** 每個(gè)系統(tǒng)提供數(shù)據(jù)的具體網(wǎng)址。
* **請(qǐng)求方法 (Method):** GET, POST, PUT, DELETE 等。
* **認(rèn)證方式 (Authentication):** 如何驗(yàn)證 Dify 的訪問(wèn)權(quán)限?可能是 API Key (放在 Header 或 Query Param)、OAuth 2.0 Token (放在 Header)、用戶(hù)名密碼等。
* **請(qǐng)求參數(shù)/體 (Parameters/Body):** 如何指定要查詢(xún)的設(shè)備 ID、時(shí)間范圍、零件 ID 等?是在 URL 參數(shù)中,還是在 POST 請(qǐng)求的 Body 中?Body 的格式是 JSON、XML 還是其他?
* **響應(yīng)格式 (Response Format):** 真實(shí)系統(tǒng)返回的數(shù)據(jù)結(jié)構(gòu)是怎樣的?與模擬的 JSON 結(jié)構(gòu)是否一致?
2. 修改 Dify HTTP Request 節(jié)點(diǎn):
* 定位工作流中所有調(diào)用模擬 API 的 HTTP Request 節(jié)點(diǎn) (`GET_IOT_DATA`, `GET_CMMS_DATA`, `GET_MES_DATA`, `GET_ERP_DATA`)。
* **更新 URL:** 將節(jié)點(diǎn)的 URL 字段替換為真實(shí) API 的端點(diǎn)。
* **調(diào)整方法:** 根據(jù)真實(shí) API 要求修改請(qǐng)求方法 (GET/POST 等)。
* **配置認(rèn)證:** 在節(jié)點(diǎn)的 `Headers` 或 `Params` 部分添加必要的認(rèn)證信息 (如 `Authorization: Bearer <token>`, `X-API-Key: <key>`)。
* **適配參數(shù)/體:** 根據(jù)真實(shí) API 要求修改 `Params` 或 `Body` 的內(nèi)容和格式。
3. 適配數(shù)據(jù)解析 (關(guān)鍵步驟??):
* 真實(shí) API 返回的數(shù)據(jù)結(jié)構(gòu)**極有可能**與模擬 JSON 不同。
* 因此,所有緊跟在 HTTP Request 節(jié)點(diǎn)之后的 `CODE` 節(jié)點(diǎn)(如解析 IoT 的 `CODE` 節(jié)點(diǎn), `PARSE_ERP_DATA` 節(jié)點(diǎn),以及可能需要為 CMMS/MES 新增的解析節(jié)點(diǎn))**必須進(jìn)行修改**。
* 需要根據(jù)真實(shí) API 返回的 JSON (或其他格式) 結(jié)構(gòu),調(diào)整 Python 代碼中 `json.loads()` 之后訪問(wèn)數(shù)據(jù)的方式(字典鍵名、列表索引、嵌套結(jié)構(gòu)等),以確保存儲(chǔ)到 Dify 輸出變量中的是后續(xù)節(jié)點(diǎn)期望的數(shù)據(jù)。
* **這是最容易出錯(cuò)的環(huán)節(jié),需要仔細(xì)比對(duì)真實(shí) API 的響應(yīng)并耐心調(diào)試** `CODE` **節(jié)點(diǎn)的 Python 代碼。
4. 端到端測(cè)試:** 修改完成后,使用真實(shí)的設(shè)備 ID 或測(cè)試 ID 進(jìn)行完整的端到端測(cè)試,驗(yàn)證:
* 是否能成功從所有真實(shí)系統(tǒng)中獲取數(shù)據(jù)。
* 數(shù)據(jù)解析是否正確。
* LLM 節(jié)點(diǎn)接收到的上下文是否符合預(yù)期。
* 整個(gè)流程是否能按預(yù)期運(yùn)行。
網(wǎng)絡(luò)連通性: 確保運(yùn)行 Dify 的環(huán)境能夠訪問(wèn)到企業(yè)內(nèi)網(wǎng)的真實(shí)系統(tǒng) API 地址。
權(quán)限管理: 確保 Dify 使用的 API Key 或憑證具有訪問(wèn)所需數(shù)據(jù)的正確權(quán)限。
數(shù)據(jù)格式差異: 重點(diǎn)關(guān)注真實(shí) API 與模擬 API 在數(shù)據(jù)結(jié)構(gòu)上的差異,并適配解析邏輯。
性能與頻率: 真實(shí) API 可能有調(diào)用頻率限制或響應(yīng)時(shí)間較長(zhǎng),需要考慮工作流的性能和可能的超時(shí)設(shè)置。
錯(cuò)誤處理: 針對(duì)真實(shí) API 可能出現(xiàn)的各種錯(cuò)誤(網(wǎng)絡(luò)錯(cuò)誤、認(rèn)證失敗、無(wú)效參數(shù)、系統(tǒng)內(nèi)部錯(cuò)誤等),在 Dify 工作流中增加更健壯的錯(cuò)誤處理邏輯。
7、后續(xù)拓展方向
增加報(bào)告模板 (TEMPLATE): 引入并調(diào)試 TEMPLATE 節(jié)點(diǎn),利用 Jinja2 生成結(jié)構(gòu)更清晰、格式更專(zhuān)業(yè)的 HTML、Markdown、PDF 報(bào)告 (需要額外工具集成)。
定時(shí)觸發(fā)與批量處理: 增加定時(shí)任務(wù)觸發(fā)器 (如 Dify 的計(jì)劃任務(wù)或外部調(diào)度系統(tǒng)調(diào)用 API),定期檢查設(shè)備狀態(tài),而不是僅通過(guò)手動(dòng)輸入 pumpId 觸發(fā)。
集成到業(yè)務(wù)系統(tǒng):
告警通知: 在檢測(cè)到異常時(shí),通過(guò) HTTP 請(qǐng)求節(jié)點(diǎn)調(diào)用企業(yè)微信、釘釘、郵件等的 API 發(fā)送告警通知。
工單系統(tǒng)集成: 將 `SUGGESTIONS` 生成的維護(hù)建議通過(guò) API 推送到 CMMS 系統(tǒng),自動(dòng)創(chuàng)建維護(hù)工單。
API 暴露: 將整個(gè) Dify 工作流封裝為 API,供其他業(yè)務(wù)系統(tǒng)(如設(shè)備監(jiān)控大屏、生產(chǎn)管理系統(tǒng))調(diào)用。
閉環(huán)反饋機(jī)制: 實(shí)現(xiàn) /api/cmms/report/update 接口,接收維護(hù)完成后的實(shí)際結(jié)果。設(shè)計(jì)新的 Dify 工作流或節(jié)點(diǎn)來(lái)處理這些反饋,分析預(yù)測(cè)準(zhǔn)確性,并將分析結(jié)果存入數(shù)據(jù)庫(kù)或知識(shí)庫(kù),用于持續(xù)優(yōu)化模型或 Prompt。
更復(fù)雜的故障預(yù)測(cè)模型: FAULT_PREDICTION 可以替換為更專(zhuān)業(yè)的機(jī)器學(xué)習(xí)模型服務(wù)接口,或者使用更強(qiáng)大的 LLM 并優(yōu)化 Prompt 以進(jìn)行更精確的故障定位和剩余壽命預(yù)測(cè) (RUL)。
知識(shí)庫(kù)增強(qiáng): 持續(xù)豐富 RAGFlow (MinerU、 Mistral OCR等工具的測(cè)評(píng)后續(xù)會(huì)專(zhuān)門(mén)寫(xiě)一篇) 中的內(nèi)容,加入更多設(shè)備類(lèi)型、故障案例和解決方案。
用戶(hù)交互優(yōu)化: 利用 Dify 的 Agent 或 Web App 能力,創(chuàng)建更友好的用戶(hù)界面,允許用戶(hù)查詢(xún)特定設(shè)備狀態(tài)、歷史記錄或手動(dòng)觸發(fā)分析。
8、項(xiàng)目資料包
有需要項(xiàng)目源碼的盆友可以付費(fèi)后查看下方百度云盤(pán)鏈接(包含Code節(jié)點(diǎn)代碼)